spring bean 加载顺序

转载 2014年05月14日 19:50:01

出处:http://hougbin.iteye.com/blog/1273031

问题来源:

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

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

private B b;
private String name = b.funb();

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

解决办法为如下代码,同时学习下spring中  InitializingBean   ,对象构造方法   ,  init-method   的执行顺序。

 

Java代码  收藏代码
  1. public class A implements InitializingBean {  
  2.   
  3.  private B b;  
  4.  private String name; // = b.funb();  
  5.   
  6.  public void setB(B b) {  
  7.   System.out.println("A.setB initialed");  
  8.   this.b = b;  
  9.  }  
  10.   
  11.  public A() {  
  12.   System.out.println("A initialed");  
  13.  }  
  14.   
  15.  public void init() {  
  16.   System.out.println("init");  
  17.   this.name = b.funb();  
  18.  }  
  19.   
  20.  @Override  
  21.  public String toString() {  
  22.   return super.toString() + this.name;  
  23.  }  
  24.   
  25.  public void afterPropertiesSet() throws Exception {  
  26.   
  27.   //其实放在这里也可以  
  28.   
  29.   //this.name = b.funb();  
  30.   System.out.println("afterPropertiesSet");  
  31.   
  32.  }  
  33.   
  34. }  
  35.   
  36. public class B {  
  37.   
  38.  public String funb() {  
  39.   System.out.println("funb");  
  40.   return "B.funb";  
  41.  }  
  42.   
  43.  public B() {  
  44.   System.out.println("B initialed");  
  45.  }  
  46. }  

 

 

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 initialed
B initialed
A.setB initialed
afterPropertiesSet
init
funb
testspring.A@50d89cB.funb

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

加载顺序也可以看到为:

先构造函数——>然后是b的set方法注入——>InitializingBean   的afterPropertiesSet方法——>init-method方法

 

总结为:

以下内容是从书中摘录来的,但是我发现即使摘录一遍,对其内容的理解也会更加深入!  
一、Spring装配Bean的过程   
1. 实例化;  
2. 设置属性值;  
3. 如果实现了BeanNameAware接口,调用setBeanName设置Bean的ID或者Name;  
4. 如果实现BeanFactoryAware接口,调用setBeanFactory 设置BeanFactory;  
5. 如果实现ApplicationContextAware,调用setApplicationContext设置ApplicationContext  
6. 调用BeanPostProcessor的预先初始化方法;  
7. 调用InitializingBean的afterPropertiesSet()方法;  
8. 调用定制init-method方法;  
9. 调用BeanPostProcessor的后初始化方法;  


Spring容器关闭过程   
1. 调用DisposableBean的destroy();  
2. 调用定制的destroy-method方法;

 

 

一,单一Bean

  • 装载

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

  • spring容器关闭

1. 调用DisposableBean的destroy(); 
2. 调用定制的destroy-method方法;

 

二,多个Bean的先后顺序

  • 优先加载BeanPostProcessor的实现Bean
  • 按Bean文件和Bean的定义顺序按bean的装载顺序(即使加载多个spring文件时存在id覆盖)
  • “设置属性值”(第2步)时,遇到ref,则在“实例化”(第1步)之后先加载ref的id对应的bean
  • AbstractFactoryBean的子类,在第6步之后,会调用createInstance方法,之后会调用getObjectType方法
  • BeanFactoryUtils类也会改变Bean的加载顺序
分享到:

spring 所有bean 加载顺序

问题来源: 有一个bean为A,一个bean为B。想要A在容器实例化的时候的一个属性name赋值为B的一个方法funB的返回值。 如果只是在A里单纯的写着: private B b;...
  • zshake
  • zshake
  • 2014年12月05日 11:42
  • 11950

spring注解bean加载顺序问题(一)

最近在项目中遇到了一个问题:关于bean的加载顺序问题,在这里简单讲解一下. 背景:项目框架组成:wicket+jdbc+spring,并且spring用的是注解方式,注解配置如下:       ...
  • sidongxue2
  • sidongxue2
  • 2014年07月22日 01:21
  • 9766

关于spring加载applicationContext初始化bean顺序的问题

ApplicationContext.xml内容如下: "1.0" encoding="UTF-8"?> "http://www.springframework.org/schema/beans"...
  • ocean20
  • ocean20
  • 2011年07月01日 11:31
  • 7735

看看Spring的源码——Bean加载过程

首先Web项目使用Spring是通过在web.xml里面配置org.springframework.web.context.ContextLoaderListener初始化IOC容器的。 liste...
  • u013684110
  • u013684110
  • 2016年07月07日 15:48
  • 2558

警告 spring boot 加载beans的顺序

beanFactory bean前处理 bean后处理(解决 可能是Bean加载的顺序有问题 1 XML配置的情况 更改XML文件中Bean的加载顺序 2 通过标签类注入的情况 改变某些配置更改注入的...
  • u010416101
  • u010416101
  • 2016年05月01日 16:11
  • 5027

spring、web服务器加载bean顺序

最近在项目中用到listener,并需要在listener的构造方法中做一些动作,其中需要调用其他的service类,这个类加载使用@Autowired注入。后考虑利用setter方式注入,发现Nul...
  • u014797658
  • u014797658
  • 2015年09月07日 17:08
  • 2561

spring加载bean实例化顺序

问题来源: 有一个bean为 A,一个bean为B。想要A在容器实例化的时候的一个属性name赋值为B的一个方法funB的返回值。 如果只是在A里单纯的写着: private B b; priv...
  • wangqingqi20005
  • wangqingqi20005
  • 2016年06月03日 16:35
  • 2465

Spring bean 加载执行顺序

问题来源: 有一个bean为A,一个bean为B。想要A在容器实例化的时候的一个属性name赋值为B的一个方法funB的返回值。 如果只是在A里单纯的写着: private B b;...
  • shanshan3548
  • shanshan3548
  • 2015年02月11日 14:56
  • 6137

Spring的bean创建顺序

解答以下疑惑: Spring配置文件里bean,究竟是按什么样的顺序加载呢?Spring项目在部署时,究竟创建了多少各beanFactory呢?按什么顺序创建? 长话短说,总结成如下几点: ...
  • sky_ground
  • sky_ground
  • 2017年03月19日 20:28
  • 3160

spring boot 使用属性加载顺序

1.命令行中传入的参数 2.SPRING_APPLICATION_JSON中的属性。SPRING_APPLICATION_JSON是以JSON格式配置再系统环境变量中的内容 3.java:...
  • kuangvquanshui
  • kuangvquanshui
  • 2017年12月19日 15:24
  • 94
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spring bean 加载顺序
举报原因:
原因补充:

(最多只允许输入30个字)