`
dxm1986
  • 浏览: 429162 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring加载Bean顺序【转】

 
阅读更多

问题来源:

有一个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的加载顺序

三,附近

      测试代码

 

 

http://guoliangqi.iteye.com/blog/632697

 

 

分享到:
评论

相关推荐

    Spring Bean 加载顺序 .

    Spring Bean 加载顺序 实验小例子

    spring的bean加载顺序样例项目

    该项目展示spring配置文件的那些bean的加载顺序

    让spring解决控制springboot中bean的加载顺序的问题.docx

    只需要把需要注册进容器的bean声明为@Component即可,spring会自动扫描到这个Bean完成初始化并加载到spring上下文容器。 而当你在项目启动时需要提前做一个业务的初始化工作时,或者你正在开发某个中间件需要完成...

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

    主要介绍了Spring bean 加载执行顺序实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    Spring多种加载Bean方式解析

    本篇文章主要介绍了Spring多种加载Bean方式解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    尚硅谷]_佟刚_Spring IOC 容器中 Bean 的生命周期.pdf

    3、import用于导入其他配置文件的Bean定义,这是为了加载多个配置文件,当然也可以把这些配置文件构造为一个数组(new String[] {“config1.xml”, config2.xml})传给ApplicationContext实现进行加载多个配置文件,...

    基于SpringBoot构造器注入循环依赖及解决方式

    当Spring正在加载所有Bean时,Spring尝试以能正常创建Bean的顺序去创建Bean。 例如,有如下依赖: Bean A → Bean B → Bean C Spring先创建beanC,接着创建bean B(将C注入B中),最后创建bean A(将B注

    Spring.3.x企业应用开发实战(完整版).part2

    10.4.1 Spring通过单实例化Bean简化多线程问题 10.4.2 启动独立线程调用事务方法 10.5 联合军种作战的混乱 10.5.1 Spring事务管理器的应对 10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼...

    Spring.html

    ClassPathXmlApplicationContext:使用这个工厂创建对象,他会根据scope智能判断是否懒加载,如果是单例则创建容器时就会创建里面bean的实例,如果是多例在获取使用时才会创建bean实例 ...

    beandemo.rar

    代码主要展示了Spring在初始化的过程中,各个回调函数的调用顺序,也可以在此基础上进行扩展研究,有助于了解Spring的加载过程

    Spring3.x企业应用开发实战(完整版) part1

    10.4.1 Spring通过单实例化Bean简化多线程问题 10.4.2 启动独立线程调用事务方法 10.5 联合军种作战的混乱 10.5.1 Spring事务管理器的应对 10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼...

    Spring面试题

    在 XML 文件中定义的 Bean 是被消极加载的,这意味在需要 bean 之前,bean 本身不会被初始化。要从 BeanFactory 检索 bean,只需调用 getBean() 方法,传入将要检索的 bean 的名称即可,如清单 2 所示。 清单 2. ...

    springboot知识点整理

    2.10 外部配置加载顺序 36 2.11 自动配置原理 37 2.12 @Conditional派生注解 41 3 Spring Boot与日志 42 3.1 日志框架分类和选择 42 3.2 SLF4j使用 43 3.3 其他日志框架统一转换成slf4j+logback 44 3.4 Spring Boot...

    spring框架技术+第2天+xmind思维导图

    bean懒加载lazyInit;懒加载;容器中实现懒加载.dependsOn属性;depends-on 在正式的程序开始之前,要预先加载一部分内容.依赖注入三种方式【手动装配-非注解方式】;构造函数注入 index:可省略,参数下标,默认从0...

    ssh(structs,spring,hibernate)框架中的上传下载

    这是Hibernate3引入的新特性,对于包含重量级大数据的表字段,这种抽取方式提高了对大字段操作的灵活性,否则加载Tfile对象的结果集时如果总是返回fileContent,这种批量的数据抽取将可以引起数据库的"洪泛效应"。...

    spring-experiement

    该项目测试了运行静态块和Spring bean初始化的顺序 实验:静态块可以访问自动装配的对象吗? 先要明白Static块是什么时候运行的 静态块是在类第一次被加载的时候运行 spring的对象初始化是在什么时候运行的 假设bean...

    尚硅谷Spring boot核心技术篇(上)

    SpringBoot_配置-外部配置加载顺序 19、尚硅谷_SpringBoot_配置-自动配置原理 20、尚硅谷_SpringBoot_配置-@Conditional&自动配置报告 21、尚硅谷_SpringBoot_日志-日志框架分类和选择 22、尚硅谷_SpringBoot_日志-...

    基于Redis的分布式配置管理中心.zip

    配置项的加载顺序 Redis &gt; 文件缓存 &gt; 配置文件(app.properties) 即Redis和文件缓存中都找不到配置项时,客户端会从配置文件(app.properties)中加载。 在本地开发环境,可以不连接Redis,只使用配置文件(app....

    17-IoC配置-import导入配置文件

    Spring容器加载多个配置文件(了解) new classPathxmlApplicationcontext ( "config1.xml " , "config2.xml" ); Spring容器中的bean定义冲突问题 同id的bean,后定义的覆盖先定义的 导入配置文件可以理解为...

    LSFramework:手写山寨版spring学习aop,ioc思想的demo,没看过spring的源码,因为实在是太庞大了,参考部分网上博客和开源代码完成

    LS框架 项目介绍 手写山寨版“ spring”,学习aop,ioc思想的demo,没看过spring的源码,因为实在是太庞大了,参考...2018.07.02调整jdbc模块,修复bug,想起没测试注解事务是否正常,测试后发现因为loader加载顺序以及

Global site tag (gtag.js) - Google Analytics