Spring生命周期

一、Spring的生命周期的做的比较重要的事

  1. 创建一个“BeanDefinition读取器”
  2. 创建一个“BeanDefinition扫描器”
  3. 刷新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扫描器”

扫描器,是用来扫描指定包下面的类上的注解,但是我们类上面用的@Service,@Bean不是通过这个扫描器扫到的。

四、刷新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的销毁方法并执行各种清理操作,例如数据源的关闭、连接的释放等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信仰_273993243

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值