本文研究的主要是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对应的beanSpring bean加载执行顺序实例解析