Spring篇(4-1)--Spring Bean 是什么及其生命周期阶段

本文详细介绍了SpringBean的概念、生命周期的四个关键阶段(实例化、属性赋值、初始化、销毁),并深入探讨了生命周期中的扩展点,包括BeanPostProcessor、InstantiationAwareBeanPostProcessor等接口的应用场景,以及Aware接口和生命周期接口的使用。

 一、Spring Bean是什么


  • Spring Bean是被实例的,组装的及被Spring容器管理的Java对象。Spring容器会自动完成@Bean对象的实例化

二、Spring Bean生命周期


Spring Bean的生命周期只有四个阶段:

        实例化 -> 属性赋值 -> 初始化 -> 销毁
        1.实例化Instantiation
        2.属性赋值Populate
        3.初始化Initialization
        4.销毁Destruction

主要逻辑都在doCreate()方法中,逻辑清晰,就是顺序调用以下三个方法,这三个方法与三个生命周期阶段一一对应。        1.createBeanInstance() --> 实例化
        2.populateBean() --> 属性赋值
        3.initializeBean() --> 初始化

// 忽略了无关代码
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
      throws BeanCreationException {

   // Instantiate the bean.
   BeanWrapper instanceWrapper = null;
   if (instanceWrapper == null) {
       // 实例化阶段!
      instanceWrapper = createBeanInstance(beanName, mbd, args);
   }

   // Initialize the bean instance.
   Object exposedObject = bean;
   try {
       // 属性赋值阶段!
      populateBean(beanName, mbd, instanceWrapper);
       // 初始化阶段!
      exposedObject = initializeBean(beanName, exposedObject, mbd);
   }

   
}

至于销毁,是在容器关闭时调用的,详见ConfigurableApplicationContext#close()


 三、Spring Bean生命周期的扩展点


常用扩展点有两大类:

        第一大类:影响多个Bean的接口
        第二大类:只调用一次的接口

1.第一大类:影响多个Bean的接口

        (1)BeanPostProcessor:作用于初始化阶段的前后
        (2)InstantiationAwareBeanPostProcessor:作用于实例化阶段的前后
            InstantiationAwareBeanPostProcessor实际上继承了BeanPostProcessor接口


2.第二大类:只调用一次的接口

        (1)Aware类型的接口
            Aware类型接口的作用就是让我们能够拿到Spring容器中的一些资源。Aware之前的名字就是可以拿到什么资源,例如BeanNameAware可以拿到BeanName,以此类推。
            Aware都是在初始化阶段之前调用的。
            Aware接口具体可以分为两组:
            Aware Group1:
                1)BeanNameAware
                2)BeanClassLoaderAware
                3)BeanFactoryAware
            Aware Group2:
                1)EnvironmentAware
                2)EmbeddedValueResolverAware//实现该接口能够获取Spring EL解析器,用户的自定义注解需要支持spel表达式的时候可以使用,非常方便。
                3)ApplicationContextAware
                (ResourceLoaderAware\ApplicationEventPublisherAware\MessageSourceAware)//这几个接口其返回值实质上都是当前的ApplicationContext对象,因为ApplicationContext是一个复合接口。


        (2)生命周期接口
            实例化和属性赋值都是Spring帮助我们做的,能够自己实现的有初始化和销毁两个生命周期阶段。
            1)InitializingBean对应生命周期的初始化阶段。另外,因为Aware方法都是执行在初始化方法之前,所以可以在初始化方法中放心大胆的使用Aware接口获取的资源,这也是我们自定义扩展Spring的常用方法。
            2)DisposableBean类似于InitializingBean,对应生命周期的销毁阶段,以ConfigurableApplicationContext#close()方法作为入口,实现是通过循环获取所有实现了DisposableBean接口的Bean,然后调用其destory()方法。

四、Spring Bean加载过程


一个Bean的加载会经历这么几个阶段(用绿色标记):

1.获取BeanName,对传入的name进行解析,转化为可以从Map中获取到BeanDefinition的bean name。
2.合并Bean定义,对父类的定义进行合并和覆盖,如果父类还有父类,会进行递归合并,以获取完整的Bean定义信息。
3.实例化,使用构造或者工厂方法创建Bean实例。
4.属性填充,寻找并且注入依赖,依赖的Bean还会递归调用getBean方法获取。
5.初始化,调用自定义的初始化方法。
6.获取最终的Bean,如果FactoryBean需要调用getObject方法,如果需要类型转换调用TypeConverter进行转化。

整个流程最为复杂的是对循环依赖的解决方案。

 更多内容:

Spring篇(1)--SpringBoot是什么?原理是怎么样的?

Spring篇(2)--Spring IOC基本流程原理

Spring篇(3)--Spring Aop基本流程原理

Spring篇(4-1)--Spring Bean 是什么及其生命周期阶段

Spring篇(4-2)--Spring BeanFactory与FactoryBean 区别

Spring篇(5-1)--Spring事务流程原理

Spring篇(5-2)--Spring事务传播行为

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

sun cat

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

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

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

打赏作者

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

抵扣说明:

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

余额充值