Spring bean 加载执行顺序实例解析
本文研究的主要是Spring bean 加载执行顺序的相关内容,具体如下。 问题来源: 有一个bean为A,一个bean为B。想要A在容器实例化的时候的一个属性name赋值为B的一个方法funB的返回值。 如果只是在A里单纯的写着:
会报错说nullpointException,因为这个时候b还没被set进来,所以为null。 解决办法为如下代码,同时学习下spring中 InitializingBean ,对象构造方法 , init-method 的执行顺序。 public class A implements InitializingBean { private B b; private String name; // = b.funb(); public void setB(B b) { System.out.println("A.setB initialed"); this.b = b; } public A() { System.out.println("A initialed"); } public void init() { System.out.println("init"); this.name = b.funb(); } @Override public String toString() { return super.toString() + this.name; } public void afterPropertiesSet() throws Exception { //其实放在这里也可以 //this.name = b.funb(); System.out.println("afterPropertiesSet"); } } public class B { public String funb() { System.out.println("funb"); return "B.funb"; } public B() { System.out.println("B initialed"); } } spring配置文件 <beans default-autowire="byName"> <bean id="a" class="testspring.A" init-method="init"> </bean> <bean id="b" class="testspring.B"> </bean> </beans> 测试代码: public static void main(String[] args) { ApplicationContext context = new FileSystemXmlApplicationContext( "src/testspring/bean.xml"); A a = (A) context.getBean("a"); System.out.println(a); } 程序输出为:
从这里看到A的name属性在bean加载完成的时候也被成功设置为B的funB方法的返回值了,要点就是用init-method来实现。 加载顺序也可以看到为: 先构造函数――>然后是b的set方法注入――>InitializingBean 的afterPropertiesSet方法――>init-method方法 总结为:以下内容是从书中摘录来的,但是我发现即使摘录一遍,对其内容的理解也会更加深入! 一、Spring装配Bean的过程 1. 实例化; Spring容器关闭过程 1. 调用DisposableBean的destroy(); 一、单一Bean 装载 1. 实例化; spring容器关闭 1. 调用DisposableBean的destroy(); 二、多个Bean的先后顺序 优先加载BeanPostProcessor的实现Bean 总结以上就是本文关于Spring bean 加载执行顺序实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持! 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |