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


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

对list的中的bean的某属性排序的方法

对list的中的bean的某属性排序的方法 我们经常会碰到多装到list的bean中的某个属性排序 下面介绍一种简单的方法使用Collections类的sort方法进行排序 先建立一个要排序的bean...
  • morwind_01
  • morwind_01
  • 2008年08月28日 10:55
  • 4535

关于Comparable<T>解决List<bean>,依据bean的某个属性对list进行排序

之前在开发的过程中遇到调用Dao,返回一个list集合,需要对list进行排序,排序的标准假如是bean.creatTime(),在从数据库中查询的时候,可以再sql语句中加一个 order by c...
  • Mr_Hou2016
  • Mr_Hou2016
  • 2017年05月12日 16:22
  • 490

Spring-Bean初始化顺序

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

Spring框架下类的初始化顺序

序言   之前的已经分析过在不使用框架的情况下,类中各个部分的初始化或执行顺序,后来我在开发中使用了Spring,发现初始化顺序与之前的稍有不同,特别是其初始化以xml配置文档作为驱动,xml中先定...
  • z69183787
  • z69183787
  • 2014年05月09日 09:29
  • 11706

spring 所有bean 加载顺序

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

spring注入一个实体bean的集合并指定顺序

本文向一个bean中注入一个接口实体bean的集合,并指定各个实体bean在集合中的顺序,然后在被注入bean中按顺序调用集合中的bean实体中的方法。核心实现时在实体类上使用@Order注解来定制各...
  • yxtouch
  • yxtouch
  • 2017年04月27日 20:07
  • 1453

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

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

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

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

Spring bean加载顺序 depends-on

今天遇到了一个问题。 在Spring工程中,Bean1在init()的时候用到了Bean2的static属性,所以需要Bean2的初始化必须在Bean1()之前。查了一下,这个时候需要用depend...
  • zuoyexingchennn
  • zuoyexingchennn
  • 2015年07月20日 10:48
  • 557

Spring Bean 加载顺序 .

  • 2016年10月13日 16:18
  • 5KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring的bean创建顺序
举报原因:
原因补充:

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