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)。默认的servlet,是通过参数contextConfigLocation来指定一个xml文件。

因此,若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时,按照如下顺序(beanpostprocessor不会处理beanFactory,虽然他也是个bean)):

见(org.springframework.context.support.AbstractApplicationContext

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

0)创建beanFactory,并尽可能初始化,此时普通bean还未创建;

1)创建spring自己的部分BeanPostProcessor;

2)创建并执行BeanFactoryPostProcessor(包括自定义的)

3)创建并注册剩余的内置BeanPostProcessorApplicationContextAwareProcessor(见AbstractApplicationContext#prepareBeanFactory(…)),ServletContextAwareProcessor见(AbstractRefreshableWebApplicationContext#postProcessBeanFactory(…));

4)创建并注册自定义的BeanPostProcessor(如top代理,config)(AbstractApplicationContext#refresh());

5)创建普通bean(同时应用bean post processor)。





Rule6:单个bean加载过程

按照如下顺序:

1)构造函数;

2BeanPostProcessor#postProcessBeforeInitialization(…)

3)设置property

4InitializingBean#afterPropertiesSet();

5BeanPostProcessor#postProcessAfterInitialization(…)

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



这里是样例project


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sky_ground/article/details/63688397

Spring源码阅读——Bean的加载和获取过程

我们经常使用Spring,并且也都了解其大概原理。我想我们一定会对Spring源码的解读有迫切的渴望。 我也如此。所以,我打算阅读一下Spring的源码。再此之前,我也为此准备了很多。包括,去复习熟练...
  • qq_18860653
  • qq_18860653
  • 2016年11月18日 16:13
  • 7838

spring 所有bean 加载顺序

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

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

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

spring的bean加载顺序样例项目

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

Spring Bean 的加载顺序

一,单一Bean 装载 1. 实例化;  2. 设置属性值;  3. 如果实现了BeanNameAware接口,调用setBeanName设置Bean的ID或者Name;  4. 如...
  • hk_CSDN
  • hk_CSDN
  • 2017年09月05日 09:44
  • 191

spring 所有bean 加载顺序

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

spring 所有bean 加载顺序

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

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

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

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

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

spring缓存机制-基本原理(五)

spring是一个轻量级开源框架,以IoC(Inverse of Control:控制反转)和AOP(Aspect Oriented Programming:面向切面编程)为内核, 兼具功能强大的的...
  • sidongxue2
  • sidongxue2
  • 2014年06月15日 14:00
  • 4282
收藏助手
不良信息举报
您举报文章:Spring的bean创建顺序
举报原因:
原因补充:

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