一、总框架加载流程

1.applicationContext创建beanFactory->

2.beanFactory通过XMLbeandefineReader解析文件,获取BeanDefinition,并注册到beanfactory中。这时只是把定义放到工厂,并没有真正生成实例。

3.中间会调用beanfactoryPostProcesser的BEAN,在这种可以自定义加载扩展BEAN的流程。

4.finishBeanFactoryInitialization对所有非延迟加载的单例BEAN进行实例化,此时会创建对象,然后会先调用beanPostProcesser的before接口,插入属性, 然后注入属性到对象中,后面调用beanPostProcesser的after接口修改属性。通过beanWrapperImpl.

二、XML方式加载流程。

1.使用ClassPathXmlApplicationContext加载BEAN创建的XML文件。

ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("spring1.xml");
PeopleBean peopleBean = (PeopleBean) classPathXmlApplicationContext.getBean("people1");
System.out.println(" name: "+ peopleBean.getName());
IPeopleService peopleService  = (IPeopleService) classPathXmlApplicationContext.getBean("peopleService");

三、通过注解扫描加载流程。

1.使用ClassPathXmlApplicationContext加载BEAN创建的XML文件。

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:p="http://www.springframework.org/schema/p"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--使用context命名空间,通知spring扫描指定目录,进行注解的解析--><context:component-scan base-package="com.tpw.newday.service.people"/><bean id="people1" class="com.tpw.newday.bean.PeopleBean"><property name="name" value="zhangsan"/></bean><bean id="people2" class="com.tpw.newday.bean.PeopleBean"><property name="name" value="lisi"/></bean><bean id="people3" class="com.tpw.newday.bean.PeopleBean"><property name="name" value="wangwu"/></bean><bean id="peopleConfig" class="com.tpw.newday.config.PeopleConf"></bean><bean id="peopleService" class="com.tpw.newday.service.people.PeopleServiceImpl"><property name="peopleBean1" ref="people1"/><property name="peopleBean2" ref="people2"/></bean></beans>

PeopleServiceImpl源码:

package com.tpw.newday.service.people;import cn.hutool.json.JSONUtil;
import com.tpw.newday.bean.PeopleBean;
import lombok.Data;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;import javax.annotation.Resource;/*** <h3>newday</h3>* <p></p>** @author : lipengyao* @date : 2021-06-25 09:53:24**/@Data
public class PeopleServiceImpl implements  IPeopleService,InitializingBean,BeanNameAware,BeanClassLoaderAware
,BeanFactoryAware{private PeopleBean peopleBean1;private PeopleBean peopleBean2;@Resource(name = "people3")private PeopleBean peopleBean3;@Overridepublic void save(PeopleBean peopleBean) {System.out.println("PeopleServiceImpl--> save peopleBean:" + JSONUtil.toJsonStr(peopleBean));}@Overridepublic PeopleBean getPeople(int index) {PeopleBean peopleBean = null;switch (index){case 1:peopleBean = peopleBean1;break;case 2:peopleBean = peopleBean2;break;case 3:peopleBean = peopleBean3;break;}System.out.println("PeopleServiceImpl--> getPeople peopleBean:" + JSONUtil.toJsonStr(peopleBean));return peopleBean;}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("PeopleServiceImpl--> afterPropertiesSet PeopleServiceImpl:" );}@Overridepublic void setBeanClassLoader(ClassLoader classLoader) {System.out.println(" PeopleServiceImpl-->setBeanClassLoader name:" +  classLoader.getClass().getName());}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {PeopleBean peopleBeanxx = (PeopleBean) beanFactory.getBean("people1");System.out.println(" PeopleServiceImpl-->setBeanFactory name:" +  peopleBeanxx.getName());}@Overridepublic void setBeanName(String name) {System.out.println(" PeopleServiceImpl--> setBeanName name:" + name );}
}

2.spring的XML解析器解析component-scan标签时,会触发composerScanParser,此类为自动扫描指定包下的component注解类到beanfactory,然后再注入configPostProcesser,

AutowiredAnnotationBeanPostProcessor,
CommonAnnotationBeanPostProcessor,

internalEventListenerProcessor,

internalEventListenerFactory,

internalPersistenceAnnotationProcessor,

3.在每个BEAN实例化后,会首先调用系统中MergedBeanDefinitionPostProcessor所有接口的

postProcessMergedBeanDefinition,

CommonAnnotationBeanPostProcessor类就会在这个实现中查找当前类所有带有resource注解的属性和方法,并且保存到InjectionMetadata中。并将属性设置到BeanFactory的externPropertiesmap中,AutowiredAnnotationBeanPostProcessor则是查找带有autowired,注解的属性和方法,原理一样。

4.在填充对象属性时populateBean函数会调用所有实现

InstantiationAwareBeanPostProcessor接口的对象的postProcessProperties方法,将上面保存的属性通过反射设置到对象属性中。

spring ioc加载流程相关推荐

  1. spring启动加载流程

    上次看了spring的加载流程,今天发现或多都忘记了,今天又看了一下,顺便总结一下: 标题spring的web项目启动: 1.首先web容器(比如Tomcat)会读取配置在web.xml中的监听器,从 ...

  2. Spring初始化加载流程分析

    关于Spring框架的介绍,网上有很多非常好的详细的文章,如果在本篇博客中没有了解到自己想要的东西,个人能力有限,只能使用博客记录一下自己目前了解的知识点了! 本篇博客将大致介绍一下Spring框架的 ...

  3. spring配置文件加载流程

    转自:http://silmon.javaeye.com/blog/283515 Spring配置文件是集成了Spring框架的项目的核心,引擎从哪里开始,中间都执行了哪些操作,小谈一下它的执行流程. ...

  4. spring bean加载过程_Spring源码剖析3:Spring IOC容器的加载过程

    本文转自五月的仓颉 https://www.cnblogs.com/xrq730 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https ...

  5. Spring的bean加载流程

    IOC容器就像是一个工厂,里面有很多流水线生产出一个个产品(bean).bean的加载流程大概分为: 容器启动阶段 bean加载阶段 容器启动阶段: 1.配置元信息 当你生产物品的时候总得知道产品得规 ...

  6. 【Spring源码分析】Bean加载流程概览

    代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...

  7. beaninfo详解源码解析 java_【Spring源码分析】Bean加载流程概览

    代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...

  8. Spring源码分析:Bean加载流程概览及配置文件读取

    很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是Java Web的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已 ...

  9. Spring如何加载XSD文件

    http://blog.csdn.net/bluishglc/article/details/7596118 本文原文连接: http://blog.csdn.net/bluishglc/articl ...

最新文章

  1. python基础之循环与迭代器
  2. zookeeper分布式锁代码实例
  3. excel 如何用vba将某一条记录移动到另一张工作表中_EXCEL常用快捷键
  4. sqlserver isnull函数使用
  5. vsan Linux 网络磁盘,理解vSAN中的磁盘空间占用
  6. java.lang.ArrayIndexOutOfBoundsException
  7. TeamViewer会议功能有什么用?
  8. 不足百行代码 实体数组转DataTable通用类
  9. [Python]小甲鱼Python视频第020课(函数:内嵌函数和闭包)课后题及参考解答
  10. Windows Server 2008 R2的教程36篇!
  11. Modbus转Profinet网关与ARX-MA100微型空气质量监测系统配置案例
  12. IOT:基于oblog的应用
  13. tftp服务器怎么开启linux,CentOS 6.4 tftp服务器配置--使用tftp下载并启动内核
  14. java游戏繁体字名字,繁体字游戏名字你知道有几个?
  15. 指针使用入门与 unsafe.Pointer
  16. android 模拟器终端 了解及部分命令
  17. 网络安全:为大家介绍5种常见的加密算法
  18. 【成电860考研】经验贴汇总(公共课+专业课+复试)-扒遍所有网站:信软群、王道、知乎、csdn等,截止21年7月整理出的所有帖子-共15篇
  19. git did not exit cleanly (exit code 128)简单处理方法
  20. Gallary(中)

热门文章

  1. 该网页脚本造成Internet Explorer运行速度减慢!若继续运行会更慢,至无法响应!
  2. ALV分类合计功能实现
  3. ALV报表中处理双击行项目事件
  4. 聚焦2020年财报:进击的恒大汽车,“变态”的智能汽车
  5. php socket 用户名密码,PHP用socket模拟post之fsocketopen
  6. 医学计算机应用第五版题库,医科医学计算机应用题库
  7. 计算机一级挂科率,[转]计算机一级难吗?看了它想挂科,难难难难把此(精)
  8. ios查看帧率的软件_程序员必看!直播软件开发弱网下保障高清流畅推流的方法...
  9. 项目编译失败_Swift源码编译让底层更清晰
  10. Buuctf(PWN)ciscn_2019_c_1