Spring生命周期
- 一、Spring的生命周期的做的比较重要的事
- 二、创建一个“BeanDefinition读取器”
- 三、创建一个“BeanDefinition扫描器”
- 四、刷新bean
- bean生命周期
- 小结:Spring的生命周期包括以下三个阶段:
一、Spring的生命周期的做的比较重要的事
- 创建一个“BeanDefinition读取器”
- 创建一个“BeanDefinition扫描器”
- 刷新bean
下面分别分析下这些事都分别做了什么操作。
二、创建一个“BeanDefinition读取器”
在创建BeanDefinition读取器对象的时候,里面会完成7个类的注册。这7个类都非常核心。
1、AnnotationAwareOrderComparator(比较器)
2、ContextAnnotationAutowireCandidateResolver(自动装配解析)
3、AutowiredAnnotationBeanPostProcessor(自动装配后置处理器)
4、ConfigurationClassPostProcessor (配置类后置处理器)
5、CommonAnnotationBeanPostProcessor (普通注解后置处理器)
6、EventListenerMethodProcessor(事件监听器处理器)
7、DefaultEventListenerFactory(事件监听器工厂)
向这7个类我们称呼他为 “后置处理器”,这7个后置处理器都会被加到DefaultListableBeanFactory里面,这7个后置处理器作用依次介绍一下
1、AnnotationAwareOrderComparator(比较器)
解析:@Order和@Priority等注解。
2、ContextAnnotationAutowireCandidateResolver
可以提供处理延迟加载的功能的功能。 它的主要职责是判断一个 Bean 是否适合作为自动装配的候选者,并负责处理与依赖注入相关的特定注解,尤其是 @Lazy和 @Qualifier。
可以把它想象成 Spring 在执行@Autowired注入时的一个 “决策官”和“注解处理器”。当 Spring 需要将一个 Bean(例如 MyService)注入到另一个 Bean(例如 MyController)时,这个解析器会介入,决定注入哪个 Bean以及如何注入。
3、AutowiredAnnotationBeanPostProcessor
(自动装配后置处理器,每个bean执行真正的依赖"注入",支持三种自动装配注解@Autowired,@Value,JSR-330 @Inject)
3.1 AutowiredAnnotationBeanPostProcessor和ContextAnnotationAutowireCandidateResolver区别
- AutowiredAnnotationBeanPostProcessor 是“注入执行者”。它负责发现哪些字段、方法或构造器需要自动注入(即找到@Autowired等注解),并执行注入动作。
- ContextAnnotationAutowireCandidateResolver 是“候选决策者”。当“注入执行者”需要注入一个Bean时,它负责判断多个同类型Bean中哪一个最合适,以及决定如何提供这个Bean(例如,是直接给实例还是给一个延迟代理)。它们共同协作,完成了从“识别注入点”到“解析并注入正确Bean”的完整流程。
4、ConfigurationClassPostProcessor
ConfigurationClassPostProcessor是一个BeanFactoryPostProcessor,它的核心职责是解析和处理所有被**@Configuration**注解标记的配置类,并最终将配置类中定义的Bean(如@Bean方法、@ComponentScan扫描到的组件、@Import导入的配置等)注册到Spring容器中。
您可以把它想象成一个"配置类解析引擎"。没有它,您的@Configuration、@Bean、@ComponentScan等注解将完全不起作用。
5、CommonAnnotationBeanPostProcessor (普通注解后置处理器)
是一个BeanPostProcessor,它的核心职责是处理一系列“通用”的注解,主要包括Java EE的 JSR-250 注解(如 @Resource, @PostConstruct, @PreDestroy)以及JAX-WS 相关的注解(如 @WebServiceRef)。
Spring 为了支持 Java 标准注解而提供的一个集成处理器。没有它,@Resource注入和@PostConstruct/@PreDestroy生命周期回调将无法工作。
6、EventListenerMethodProcessor
简单来说:它就像一个星探,负责找出所有有潜力的苗子(被 @EventListener标记的方法),然后交给制作人(EventListenerFactory)去包装成明星(ApplicationListener),最后和经纪公司(ApplicationEventMulticaster)签约。
7、DefaultEventListenerFactory
简单来说:它就像一个制作人,负责将素人(普通方法)包装成一个符合行业标准(ApplicationListener接口)的出道艺人,并规定好他上台后要表演的具体内容(反射调用原方法)。
二者的区别:
1.发现与注册:找到这个被 @EventListener标记的方法,并将其“注册”到 Spring 的事件广播器(ApplicationEventMulticaster)中,使其能被后续的事件触发。
2.适配与执行:将这个普通的 Java 方法“包装”成一个 Spring 标准的事件监听器对象(ApplicationListener),以便事件广播器能够以统一的方式调用它。
EventListenerMethodProcessor负责第一件事(发现与注册),而 DefaultEventListenerFactory负责第二件事(适配与执行)。
三、创建一个“BeanDefinition扫描器”
1、它的主要作用是扫描指定包路径下的类,检测带有特定注解(如@Component及其派生注解@Service、@Repository、@Controller等)的类,并将它们注册为BeanDefinition。
2、将符合条件的类转换为 ScannedGenericBeanDefinition并注册到BeanDefinitionRegistry
3、在Spring启动过程中,扫描器并不是在容器启动的最开始就立即执行扫描,而是通过后置处理器(如ConfigurationClassPostProcessor)触发扫描。
真正触发扫描的是在ConfigurationClassPostProcessor这个后置处理器中。它处理所有@Configuration类,并解析@ComponentScan注解,然后使用扫描器来扫描指定的包。
四、刷新bean
刷新bean里面做了很多操作,比如那些bean要被加入到spring的生命周期里面去,那些bean要被代理等等等。都是在这里执行的。注意:刷新是一个同步代码块的操作
1、为刷新做准备工作。准备工作包括设置启动时间,是否激活标识位,初始化属性源(property source)配置,初始化“earlyApplicationListeners事件监听器”和“earlyApplicationEvents应用程序事件”
2、对DefaultListableBeanFactory初始化
3、beanFactory的预准备工作。这里非常重要
4、调用bean工厂处理器。
5、实例化并注册所有BeanPostProcessor
6、初始化MessageSource组件
7、初始化事件派发器
8、给容器中将所有项目里面的ApplicationListener注册进来
9、初始化所有剩下的单实例 Bean(没有配置赖加载的 lazy!=true)
10、完成BeanFactory的初始化创建工作;IOC容器就创建完成
bean生命周期
实例化:通过反射创建对象。
属性填充:属性值非自动装配。
初始化:如数据源赋值、校验属性。
销毁:IOC容器销毁关闭,关闭数据源。
小结:Spring的生命周期包括以下三个阶段:
1、实例化阶段:在Spring IoC容器启动时,会读取配置文件或XML文件,并创建所有配置的bean。在实例化阶段,Spring容器会调用BeanFactoryPostProcessor和BeanPostProcessor接口中的方法。
2、初始化阶段:在实例化阶段完成后,Spring框架会对Bean进行初始化。在这个阶段,Spring框架会调用Bean的初始化方法(例如,调用Bean的setter方法设置属性值)并执行各种初始化操作,例如数据源的初始化、连接的建立等。
3、销毁阶段:当Bean不再被使用时,Spring框架会对Bean进行销毁。在销毁阶段,Spring框架会调用Bean的销毁方法并执行各种清理操作,例如数据源的关闭、连接的释放等。
实例化 (创建对象)
↓
属性注入 (依赖注入)
↓
Aware接口回调
↓
BeanPostProcessor前置处理
↓
初始化方法 (@PostConstruct/afterPropertiesSet/init-method)
↓
BeanPostProcessor后置处理
↓
Bean就绪可用
实例化和初始化的区别
实例化(Instantiation)
实例化是Bean生命周期的第一步。在这个阶段,Spring容器根据配置(如XML配置、Java配置或注解)创建Bean的实例。这个过程通常是通过构造函数(或工厂方法)来完成的,创建一个新的对象实例。此时,对象已经被创建,但它的属性还没有被设置,也没有调用任何初始化方法。
方式:通常通过构造函数创建对象。
状态:对象已经被分配内存空间,但属性为默认值(如null、0等),对象已创建,但属性未设置
初始化(Initialization)
初始化是在实例化之后的一个阶段。在这个阶段,Spring容器会对Bean进行配置,包括设置属性(依赖注入)和执行一些初始化回调方法。初始化阶段包括以下步骤:
依赖注入:Spring容器将配置的属性值或依赖的其他Bean注入到当前Bean中(通过setter方法或字段注入)。
实现特定接口的初始化方法:如果Bean实现了InitializingBean接口,Spring会调用其afterPropertiesSet()方法。
自定义初始化方法:如果通过配置(如@Bean(initMethod = “init”)或XML中的init-method属性)指定了初始化方法,Spring会调用这个方法。
目的:完成Bean的配置,执行初始化逻辑(如建立数据库连接、预加载数据等)。
状态:依赖注入、调用初始化方法(如afterPropertiesSet()或自定义方法) 对象属性已设置,可以执行初始化操作
3352

被折叠的 条评论
为什么被折叠?



