美文网首页
Spring源码学习③-生命周期

Spring源码学习③-生命周期

作者: 曾慧婷 | 来源:发表于2019-04-14 13:00 被阅读0次

    Bean生命周期:

        Bean创建=》初始化=》销毁的过程,我们称之为Bean的生命周期。

        Spring里面,是由容器来管理Bean的生命周期。

        我们可以自定义初始化和销毁方法,容器在Bean进行到当前生命周期的时候,就会调用我们自定义的初期化和销毁方法。

    调用顺序如下:

        ① 构造对象(对象创建)

            单实例:容器启动的时候,创建对象

            多实例:在每次获取对象的时候,创建对象

        ② BeanPostProcessor. postProcessBeforeInitialization(对象创建完成,赋值之后初始化方法调用之前)

        ③ 初始化

            对象创建完成,并赋值好之后,调用初始化方法。(包含我们自定义的初始化方法)

        ④ BeanPostProcessor.postProcessAfterInitialization(初始化方法调用之后)

        ⑤ 销毁

            单实例:容器关闭的时候,销毁对象。

                对于单实例Bean来说,构造和初始化都是在容器创建的时候执行的。构造和初始化方法调用完毕,容器启动成功。销毁是在容器关闭的时候执行的。执行完销毁方法后,容器关闭成功。

            多实例:容器只负责创建,不负责管理该Bean对象(创建之后就教给用户来管理,所以不会调用销毁方法。)。

    其中:

    第一:Spring Bean配置后置器BeanProcessor的执行原理:

        1)、遍历得到容器中所有的BeanPostProcessor,挨个执行BeforeInitialization。一旦其中一个返回null,则直接跳出循环。不会再继续执行后面的BeanPostProcessor

        2)、populateBean(beanName, mbd, instanceWrapper);-----(给Bean进行赋值)

                 赋值完之后,进行初始化

                 initializeBean(beanName, exposedObject, mbd);

                 {

                  wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);

                   invokeInitMethods(beanName, wrappedBean, mbd);

                  wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

                }

    第二:

        如何自定义初始化方法:

            ①、通过@Bean注解指定init-method,detroy-method来指定初始化和销毁方法。

            ②、通过实现Spring提供的两个接口:InitializingBean和DisposableBean来指定初始化和销毁方法。(分别重写两个接口的afterPropertiesSet和destroy方法)

            ③、使用JSR250(java规范)提供的两个注解来指定(注意下面两个注解不属于Spring,是属于J2EE的):

                    @PostConstruct 在Bean创建完成并且属性赋值完毕后,执行

                    @PreDestroy 在容器销毁Bean之前通知我们执行清理工作

            ④、使用Spring提供的interface BeanPostProcessor,Bean的后置处理器来指定(此处并非指定初始化或销毁方法,而是在初始化方法调用前后通过后置处理器来设置某些处理)

                    在Bean调用初始化方法前后进行一些处理工作

                    postProcessBeforeInitialization:初始化之前工作(afterPropertiesSet or a custom init-method之前)

                    postProcessAfterInitialization:初始化之后工作

    第三:

        Spring底层对BeanPostProcessor的使用:

            Bean赋值,获取容器对象,@AutoWired(AutowiredAnnotationBeanPostProcessor),生命周期注解功能(@PostConstruct/@PreDestroy)等等,都是通过后置处理器来实现的。

    相关文章

      网友评论

          本文标题:Spring源码学习③-生命周期

          本文链接:https://www.haomeiwen.com/subject/wbfeiqtx.html