文前提示:如果移动端访问时未显示侧栏,可点击左侧按钮以查看侧栏目录。
这篇文档仅仅是我自己的笔记。比如,我会整理 Spring 的常见注解,但并不会对注解本身做进一步解释,只起目录与导航的作用——因为这些内容的详情在官方文档中可以很轻松地查到。但譬如 Bean 的生命周期,我则会重点分析并记录。
Spring
IoC与DI
常用注解、接口
@Configuration
@ComponentScan
,@Import
@Bean
@Component
@Controller
(@RestController
),@Service
,@Repository
@Scope
@Lazy
接口
FactoryBean
@Conditional
、接口Conditional
及一系列派生注解@Profile
Spring Boot 如此强大,最主要的原因就是其在底层广泛而灵活地使用了
@Conditional
。如果说最初基于 XML 配置的 Spring 设计哲学是配置优于代码,那么后来基于注解的 Spring 为我们大幅减少甚至几乎完全消灭了冗长繁琐的 XML 配置,而 Spring Boot 在这基础上更进一步,通过让约定优于配置,让一个刚入门的开发者也能够轻松上手。@Autowired
,@Resource
在源码中,
@Autowired
实际上是由AutowiredAnnotationBeanPostProcessor
实现的,这是一个专门用于处理@Autowired
的一种特殊的BeanPostProcessor
,在每个 Bean 或组件被创建后调用其特殊的postProcessProperties
方法或postProcessBeforeInitialization
方法,通过反射分析目标 Bean 的全部注解、字段、方法、构造器等等,然后对具有@Autowired
注解修饰的对象尝试在容器中进行匹配,如果匹配成功则注入依赖。@Qualifier
,@Primary
接口
...Aware
@Value
@PropertySource
接口
InitializingBean
与DisposableBean
@PreConstruct
,@PreDestory
接口
BeanPostProcessor
生命周期
Bean 生命周期:
- 初始化容器自身,加载配置类、解析元数据,随后初始化、创建 Bean;
- 创建阶段,在创建的过程中容器调用被初始化 Bean
的构造器,在这一阶段中待被依赖对象进入运行阶段后,被
@Autowired
与@Resource
修饰的对象由容器为其进行依赖注入(这里可能触发递归初始化); - 初始化阶段及其前置、后置拦截处理,优先初始化
BeanPostProcessor
,接着是其他 Bean 与组件:- 一个配置类中若显式注册了被
@Bean
修饰、返回类型为BeanPostProcessor
的方法,且该方法应返回一个重写了postProcessBeforeInitialization
方法的BeanPostProcessor
类的一个实例(注册至容器),则后续创建的所有 Bean 与组件均会在这一步调用postProcessBeforeInitialization
方法,而且BeanPostProcessor
方法自身虽然被@Bean
修饰但会被容器特殊对待,不会被其他BeanPostProcessor
处理; - 初始化阶段,流程为:
- 若返回类具有被
@PostConstruct
修饰的方法,则调用该方法; - 若返回类实现了接口
InitializingBean
的afterPropertiesSet
方法,则调用该方法; - 调用
@Bean
注解的属性initMethod
所指定的方法,该方法可以在其他类中;
- 若返回类具有被
- 一个配置类中若显式注册了被
@Bean
修饰、返回类型为BeanPostProcessor
的方法,且该方法应返回一个实现了postProcessAfterInitialization
方法的BeanPostProcessor
类的一个实例(注册至容器),则后续创建的所有 Bean 与组件均会在这一步调用postProcessAfterInitialization
方法,而且BeanPostProcessor
方法自身虽然被@Bean
修饰但会被容器特殊对待,不会被其他BeanPostProcessor
处理。
- 一个配置类中若显式注册了被
- 运行阶段;
- 销毁阶段:
- 若返回类具有被
@PreDestory
修饰的方法,则调用该方法; - 若返回类实现了接口
DisposableBean
的destroy
方法,则调用该方法; - 调用
@Bean
注解的属性destroyMethod
所指定的方法,该方法可以在其他类中; - 销毁容器自身。
- 若返回类具有被
Component 生命周期:
- 初始化容器自身,加载配置类、解析元数据,随后初始化、创建组件;
- 创建阶段,在创建的过程中容器调用被初始化组件的构造器,在这一阶段中待被依赖对象进入运行阶段后,被
@Autowired
与@Resource
修饰的对象由容器为其进行依赖注入(这里可能触发递归初始化); - 初始化阶段及其前置、后置拦截处理,优先初始化
BeanPostProcessor
,接着是其他 Bean 与组件:- 一个组件若实现了接口
BeanPostProcessor
的方法postProcessBeforeInitialization
(注册至容器),则后续创建的所有 Bean 与组件均会在这一步调用postProcessBeforeInitialization
方法; - 初始化阶段,流程为:
- 调用组件中被
@PostConstruct
修饰的方法; - 调用被组件实现的接口
InitializingBean
的afterPropertiesSet
方法;
- 调用组件中被
- 一个组件若实现了接口
BeanPostProcessor
的方法postProcessAfterInitialization
(注册至容器),则后续创建的所有 Bean 与组件均会在这一步调用postProcessAfterInitialization
方法。
- 一个组件若实现了接口
- 运行阶段;
- 销毁阶段:
- 调用组件中被
@PreDestory
修饰的方法; - 调用被组件实现的接口
DisposableBean
的destroy
方法; - 销毁容器自身。
- 调用组件中被