1. 在配置类上写 @ComponentScan
注解来进行包扫描
- 在Spring中,通过在配置类上添加
@ComponentScan
注解可以自动扫描指定包及其子包下的所有标注有特定注解(如@Component, @Service, @Repository, @Controller等)的类,并将它们作为Bean注册到IoC容器中。例如:
@Configuration
@ComponentScan("com.example.myapp")
public class AppConfig {
// ...
}
2. 你对Spring IoC容器的定义:
- Spring IoC (Inversion of Control 控制反转) 容器是Spring框架的核心部分,它负责管理应用对象的生命周期和依赖关系。它是一个容器,因为它存储并管理着应用程序中的Bean实例;同时,它执行IoC原则,即由容器控制程序之间的依赖关系,而非传统编程方式中由程序代码直接控制。
3. XML配置文件的形式和配置类的形式的区别
XML形式配置:传统的Spring应用通常采用XML文件来声明Bean的定义,包括Bean的属性、构造器参数、依赖关系等,这种方式比较直观且结构清晰,但相对较为冗长,可读性不如注解。
配置类形式(Java-based配置):从Spring 3.x开始支持基于Java的配置,通过@Configuration、@Bean等注解编写类来替代XML配置,这种形式更贴近Java编程模型,可以利用Java的强大功能如类型安全、IDE辅助和元编程能力,同时也更加内聚和模块化。
4. FilterType.CUSTOM
自定义类型如何使用?
- 在Spring的
@ComponentScan
中,FilterType.CUSTOM
允许用户自定义过滤规则。通过实现TypeFilter
接口或使用lambda表达式定义一个Predicate逻辑来筛选哪些类应被包含或排除在组件扫描范围内。例如:
@ComponentScan(includeFilters = @Filter(type = FilterType.CUSTOM, classes = MyCustomTypeFilter.class))
其中,MyCustomTypeFilter
需要实现org.springframework.core.type.TypeFilter
接口。
5. 排除用法 excludeFilters
excludeFilters
属性用于在@ComponentScan
中排除特定类型的组件扫描,不将它们注册为Bean。例如:
@ComponentScan(excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = {SomeExcludedAnnotation.class}))
上述代码会排除标记有SomeExcludedAnnotation
注解的所有类。
6. 说说 @ComponentScan.Filter type
的类
@ComponentScan.Filter
的type
属性指定了过滤器类型,它可以是诸如ANNOTATION、ASSIGNABLE_TYPE、ASPECTJ、CUSTOM等预设类型,分别对应按注解、按给定类或其子类、按AspectJ表达式以及自定义过滤规则进行筛选。
7. 什么是Bean的生命周期?
- Bean的生命周期是指在Spring IoC容器中一个Bean从创建到销毁所经历的一系列过程,包括初始化、依赖注入、Bean的使用以及最终销毁。这个过程中涉及的方法调用包括:实例化、设置属性、调用
@PostConstruct
注解的方法、在容器中可用、调用@PreDestroy
注解的方法等。
8. 如何通过@Scope
指定的作用域方法取值?
- 使用
@Scope
注解可以指定Bean的作用域,比如单例(Singleton)、原型(Prototype)或其他自定义作用域。例如:
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class PrototypeBean {
// ...
}
可以通过设置value
属性的字符串值来自定义作用域。
9. 如何通过实现 FactoryBean
接口来实现注册组件?
- 实现
org.springframework.beans.factory.FactoryBean
接口后,可以通过自定义的方式来生产Bean实例。当Spring容器遇到这样的FactoryBean时,不会直接实例化该类,而是调用其getObject()
方法获取实际要注入到其他Bean的实例。
10. AnnotationConfigApplicationContext
的创建为我们做了什么?
- 创建
AnnotationConfigApplicationContext
实例时,它会根据传入的配置类自动执行组件扫描、依赖注入、Bean的初始化等工作,构建并启动一个完全基于注解的Spring IoC容器,从而无需XML配置文件即可加载和管理应用上下文。
11. 如何通过 InitializingBean
和 DisposableBean
的两个接口实现?
InitializingBean
接口提供了afterPropertiesSet()
方法,在所有必需的属性设置完成后由Spring容器自动调用,用于初始化工作。DisposableBean
接口则提供了destroy()
方法,当Bean不再需要时由容器调用来清理资源或执行释放操作。
12. 我们自己的组件如何使用 Spring IoC 底层组件?
- 我们可以通过构造函数、setter方法或字段注入的方式,将IoC容器中托管的其他Bean作为依赖注入到我们自定义的组件中。此外,还可以通过
@Autowired
注解实现自动装配。
13. 控制反转(IOC)有什么作用
- 控制反转的主要作用是降低组件间的耦合度,使应用程序各组件之间解耦,提高系统的灵活性和可维护性。通过容器统一管理和维护对象的生命周期及相互依赖关系,开发者只需关注业务逻辑本身,而不需要显式地创建或管理对象。
14. IOC的优点是什么?
- IOC的优点包括:
- 解耦: 各组件之间松散耦合,更容易进行单元测试和独立开发。
- 依赖管理: 容器负责管理组件间的依赖关系,简化了依赖注入的过程。
- 可配置与可扩展: 组件的行为可通过配置文件或注解动态改变,便于扩展新的功能和服务。
- 资源管理: 容器能有效地管理和回收资源,如数据库连接、线程池等。
15. Spring IOC 的实现机制
- Spring IoC的实现机制主要包括两个核心概念:依赖注入(DI)和Bean工厂。Spring IoC容器在启动时读取配置信息,通过反射机制实例化Bean,处理Bean之间的依赖关系,并按照Bean定义中的策略进行初始化和装配。在运行时,根据请求获取Bean实例并管理其生命周期。整个过程体现了控制反转的思想,使得应用程序的对象创建和依赖管理交由容器来控制。