Spring的bean创建顺序

原创 2017年03月19日 20:28:21

解答以下疑惑:

  • Spring配置文件里bean,究竟是按什么样的顺序加载呢?
  • Spring项目在部署时,究竟创建了多少各beanFactory呢?按什么顺序创建?


长话短说,总结成如下几点:

Rule1

首先读取WEB-INF/web.xml文件,该文件内一般会配置spring-configspring-mvc。按顺序加载对应的xml文件。


Rule2

web.xml中还有除springmvc和默认的servlet之外的servlet(如servlet-test),那么这些servlet会按照定义的顺序执行,但一定是在默认servlet之后,springmvc之前执行,并且,若这些servlet都会分别对应一个ApplicationContext,当然也意味着分别拥有一个beanFactory。这些ApplicationContext(包括springmvc的那个),他们的parent ApplicationContext均是默认servlet对应的那个ApplicationContextRoot ApplicationContext)。

因此,若springmvc里的某个Controller尝试通过auto wire注解来注入servlet-test里面的service,那么在运行时会抛出”Could not autowire field …”异常,因为springspringmvc那个servlet中的beanFactory(包括其父beanFactory)中找不到对应的bean


Rule3

在加载某个包含beanxml文件时,按照bean的类型1BeanFactoryPostProcessor类的bean2BeanPostProcessor类的bean3)普通bean,包括import进来的(bean标签和scan标签指定的);的顺序进行加载。同类型的bean按照定义顺序加载。所有bean默认是单例的。

因此,对于BeanFactoryPostProcessorBeanPostProcessor类型的bean,即使被放置在最后面,也会先加载哦。这种设计还是挺人性化的^_^


Rule4

component-scan生成的bean的默认id是类名(首字母小写),例如testService1

<bean>标签生成的bean的默认id:包名.类名#数字,例如qk.spring.beanFactory.service1.TestService1#0

如果component-scanbean标签生成的bean有冲突(即beanid相同),并且都是单例(默认是单例),那么不会重复创建,只保留最先创建出来的那个。


Rule5:

创建BeanFactory时,按照如下顺序:

(见AbstractAutowireCapableBeanFactory#initializeBean(…)。里面分为AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization(…)AbstractAutowireCapableBeanFactory#postProcessObjectFromFactoryBean(…)

1)创建BeanFactoryPostProcessor

2)创建BeanPostProcessor

3)注册内置的BeanPostProcessorApplicationContextAwareProcessor(见AbstractApplicationContext#prepareBeanFactory(…)),ServletContextAwareProcessor见(AbstractRefreshableWebApplicationContext#postProcessBeanFactory(…));

4)执行BeanFactoryPostProcessor(可能会add一些beanPostProcessor);

5)注册配置文件中的BeanPostProcessor(如top代理,config);

6)执行beanPostProcessor



Rule6:单个bean加载过程

按照如下顺序:

1)构造函数;

2BeanPostProcessor#postProcessBeforeInitialization(…)

3)设置property

4InitializingBean#afterPropertiesSet();

5BeanPostProcessor#postProcessAfterInitialization(…)

6FactoryBean#getObject()的顺序构造bean实例。



这里是样例project


版权声明:本文为博主原创文章,未经博主允许不得转载。

Spring-Bean初始化顺序

InitializingBean     Spirng的InitializingBean为bean提供了定义初始化方法的方式。InitializingBean是一个接口,它仅仅包含一个方法:after...
  • hsgao_water
  • hsgao_water
  • 2016年09月01日 18:07
  • 5660

spring 所有bean 加载顺序

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

spring中bean的创建顺序

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

spring的bean加载顺序样例项目

  • 2017年03月19日 20:26
  • 14KB
  • 下载

Spring容器中的Bean几种初始化方法和销毁方法的先后顺序

Spring 容器中的 Bean 是有生命周期的,Spring 允许 Bean 在初始化完成后以及销毁前执行特定的操作。下面是常用的三种指定特定操作的方法: 通过实现InitializingBe...
  • caihaijiang
  • caihaijiang
  • 2013年03月03日 17:10
  • 67655

Spring bean 加载执行顺序

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

使用Spring @DependsOn控制bean加载顺序

使用Spring @DependsOn控制bean加载顺序 #> spring容器载入bean顺序是不确定的,spring框架没有约定特定顺序逻辑规范。但spring保证如果A依赖B(如beanA中有...
  • neweastsun
  • neweastsun
  • 2017年12月11日 18:26
  • 184

Spring容器中的Bean几种初始化方法和销毁方法的先后顺序

Spring 容器中的 Bean 是有生命周期的,Spring 允许 Bean 在初始化完成后以及销毁前执行特定的操作。下面是常用的三种指定特定操作的方法: 通过实现InitializingBe...
  • zmx729618
  • zmx729618
  • 2016年04月06日 13:44
  • 1046

spring的bean定义真的和顺序无关?

http://narcissusoyf.iteye.com/blog/705511 在使用Ibatis的时候,如果某个sql的定义出现在引用sql的定义之后的话,笨笨的ibatis是会报错的。。这让...
  • caolaosanahnu
  • caolaosanahnu
  • 2013年11月25日 09:30
  • 529

spring bean 加载顺序

http://hougbin.iteye.com/blog/1273031 问题来源: 有一个bean为A,一个bean为B。想要A在容器实例化的时候的一个属性name赋值为B的一个方法fun...
  • zb402230366
  • zb402230366
  • 2013年12月02日 16:23
  • 674
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring的bean创建顺序
举报原因:
原因补充:

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