玖叶教程网

前端编程开发入门

spring中bean的生命周期,及在生命周期中的作用

原文作者:深山猿

最近在看春天的源码,所以总结下spring的生命周期和各个阶段的作用。spring
的生命周期概括起来主要如下:

  1. 实例化
  2. 属性注入ioc注入;
  3. 实现了BeanNameAware则执行setBeanName方法;
  4. 实现了BeanFactoryAware则执行setBeanFactory方法;
  5. 实现了ApplicationContextAware执行setApplicationContest方法;
  6. BeanPostProcessor执行postProcessBeforeInitiliaztion;
  7. 实现了InitiliazingBean执行属性设置方法;
  8. 配置文件定义了init-method则执行对应初始化方法;
  9. BeanPostProcessor执行postProcessorfterInitilization;
  10. Bean可以使用;
  11. 关闭容器
  12. DisposableBean执行销毁方法;
  13. 配置文件定义了destory-method则执行destory-method;

下面进行简单的分析。
1-2步进行实例化和各种属性的填充,你所用的自动装配等注解也会在这个时候生效
3-5步是执行***感知接口中的方法,本质上就是把spring中的组件(如applicationContext,beanFactory等)通过接口的方式传给实体类,关于**** Aware的接口的使用和作用以BeanFactoryAware为例:

你的类实现了BeanFactoryAware接口,就要实现setBeanFactory方法,该方法的本质就是在实例化bean的时候,会通过setBeanFactory将beanFactory提供给你,然后你就可以使用beanFactory了。
如果想了解beanFactory和ApplicationContext的。区别和关系参考这里
6和9步是BeanPostProcessor的应用的
先对的BeanPostProcessor的使用做出如下说明:

  • beanPostPocesser被实现并注释解后,所有的bean在初始化时都会被执行所有beanPostPocessor实现类的postProcessBeforeInitialization和postProcessAfterInitialization方法,注意两个所有;
  • 多个类实现了beanPostPocessor,如果存在返回为空,则仅有一个类的postProcessBeforeInitialization方法执行了;
  • 如果仅需要对某特定类处理可以在postProcessInitialization和postProcessAfterInitialization方法内部使用方法的实例,请针对某个特定类的处理;
  • 在实现的方法内修改返回的实例,即按照您的要求返回需要的代理类或别的类,这个会在下面继续说明用法;

下面看下BeanPostProcessor的实际使用:
第一个BeanPostProcessor的实现类PostProcessor。

第二个BeanPostprocessor的实现类PostProcessorImpl。

第三个类,实现了InitializingBean接口。

执行代码:

结果如下:

源码中对postProcessBeforeInstantiation的解释是给BeanPostProcessor的一个返回代理而不是目标的bean实例的机会。
实际我在实例1中返回factory.getBean( “后处理器”);这段代码生效了,ac.getBean( “postProcessorInclude”) ,不再是返回PostProcessorImpl的实体类,而是后处理器的实体类。
源码如下:

第7步:实现了InitiliazingBean则在afterPropertiesSet方法之后执行,需要说明的是:
上面的代码第三个类PostProcessorInclude的afterPropertiesSet方法就不会执行。因为在postProcessBeforeInitialization方法中被替换,不再继续进行执行,如果将返回return factory.getBean(“ postProcessor”);注释掉,你会发现afterPropertiesSet方法会正常执行。
至于别的7 8 10 11 12 13就不再解释了,比较简单。


最后,我是一名从事了多年开发的JAVA老程序员,今年年初我花了一个月整理了一份最适合2019年学习的java学习干货,可以送给每一位喜欢java的小伙伴,想要获取的可以关注我的头条号并在后台私信我:01,即可免费获取。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言