Spring bean加载执行顺序实例解析

  

本文研究的主要是Spring bean加载执行顺序的相关内容,具体如下。

  

<强>问题

  

有一个bean为A,一个bean为B想要一个在容器实例化的时候的一个属性名称赋值为B的一个方法funB的返回值。

  

如果只是在一个里单纯的写着:

  

<代码>私人B B;
  私人字符串名称=b.funb();

  

会报错说nullpointException,因为这个时候b还没被设置进来,所以为null。

  

解决办法为如下代码,同时学习下春天中InitializingBean,, init方法的执行顺序。

        公共类实现InitializingBean {   私人B B;   私人字符串名称;//=b.funb ();   公共空间setB (B B) {   System.out.println (“。setB追杀”);   这一点。b=b;   }   公众(){   system . out。println(“追杀”);   }   公共空间init () {   System.out.println (“init”);   this.name=b.funb ();   }   @Override   公共字符串toString () {   返回super.toString () + this.name;   }   公共空间afterPropertiesSet()抛出异常{//其实放在这里也可以//this.name=b.funb ();   System.out.println (“afterPropertiesSet”);   }   }   公共类B {   公共字符串funb () {   System.out.println (“funb”);   返回“B.funb”;   }   公共B () {   system . out。println(绣字母“B”);   }   }      

春配置文件

        & lt;豆类default-autowire=氨鹈北?   & lt; bean id=癮”类=皌estspring。“init方法=癷nit”比;   & lt;/bean>   & lt; bean id=癰”类=皌estspring.B”比;   & lt;/bean>   & lt;/beans>      

测试代码:

        公共静态void main (String [] args) {   ApplicationContext上下文=new FileSystemXmlApplicationContext (   “src/testspring/bean.xml”);   一个=(一)context.getBean (“A”);   System.out.println(一个);   }      

程序输出为:

  
  


签署作实   绣字母B
  一个。setB签署
  afterPropertiesSet
  init
  funb
  testspring.A@50d89cB.funb

     

从这里看到的名称属性在豆加载完成的时候也被成功设置为B的funB方法的返回值了,要点就是用init方法来实现。

  

加载顺序也可以看到为:

  

<强>先构造函数——祝辞,然后是b组的方法注入——祝辞InitializingBean的afterPropertiesSet方法——在init方法方法

  

<>强总结为:

  

以下内容是从书中摘录来的,但是我发现即使摘录一遍,对其内容的理解也会更加深入!
  

  

<强>一、弹簧装配Bean的过程
  

  

1。实例化;
  2. 设置属性值;
  3.如果实现了BeanNameAware接口,调用setBeanName设置Bean的ID或者名称;
  4. 如果实现BeanFactoryAware接口,调用setBeanFactory设置BeanFactory;
  5. 如果实现ApplicationContextAware,调用setApplicationContext设置ApplicationContext
  6. 调用BeanPostProcessor的预先初始化方法;
  7. 调用InitializingBean的afterPropertiesSet()方法;
  8. 调用定制init方法方法;
  9. 调用BeanPostProcessor的后初始化方法;

  

<强>春容器关闭过程
  

  

1。调用DisposableBean的破坏();
  2. 调用定制的销毁方法方法;

  

<强>一、单一豆
  

  

<>强装载
  

  

1。实例化;
  2. 设置属性值;
  3.如果实现了BeanNameAware接口,调用setBeanName设置Bean的ID或者名称;
  4. 如果实现BeanFactoryAware接口,调用setBeanFactory设置BeanFactory;
  5. 如果实现ApplicationContextAware,调用setApplicationContext设置ApplicationContext
  6. 调用BeanPostProcessor的预先初始化方法;
  7. 调用InitializingBean的afterPropertiesSet()方法;
  8. 调用定制init方法方法;
  9. 调用BeanPostProcessor的后初始化方法;
  

  

<强>春容器关闭
  

  

1。调用DisposableBean的破坏();
  2. 调用定制的销毁方法方法;
  

  

<强>二,多个Bean的先后顺序
  

  

优先加载BeanPostProcessor的实现Bean
  按Bean文件和Bean的定义顺序按Bean的装载顺序(即使加载多个春文件时存在id覆盖)
  “设置属性值”(第2步)时,遇到裁判,则在“实例化”(第1步)之后先加载ref的id对应的bean

Spring bean加载执行顺序实例解析