spring ioc加载流程
一、总框架加载流程
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加载流程相关推荐
- spring启动加载流程
上次看了spring的加载流程,今天发现或多都忘记了,今天又看了一下,顺便总结一下: 标题spring的web项目启动: 1.首先web容器(比如Tomcat)会读取配置在web.xml中的监听器,从 ...
- Spring初始化加载流程分析
关于Spring框架的介绍,网上有很多非常好的详细的文章,如果在本篇博客中没有了解到自己想要的东西,个人能力有限,只能使用博客记录一下自己目前了解的知识点了! 本篇博客将大致介绍一下Spring框架的 ...
- spring配置文件加载流程
转自:http://silmon.javaeye.com/blog/283515 Spring配置文件是集成了Spring框架的项目的核心,引擎从哪里开始,中间都执行了哪些操作,小谈一下它的执行流程. ...
- spring bean加载过程_Spring源码剖析3:Spring IOC容器的加载过程
本文转自五月的仓颉 https://www.cnblogs.com/xrq730 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https ...
- Spring的bean加载流程
IOC容器就像是一个工厂,里面有很多流水线生产出一个个产品(bean).bean的加载流程大概分为: 容器启动阶段 bean加载阶段 容器启动阶段: 1.配置元信息 当你生产物品的时候总得知道产品得规 ...
- 【Spring源码分析】Bean加载流程概览
代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...
- beaninfo详解源码解析 java_【Spring源码分析】Bean加载流程概览
代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...
- Spring源码分析:Bean加载流程概览及配置文件读取
很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是Java Web的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已 ...
- Spring如何加载XSD文件
http://blog.csdn.net/bluishglc/article/details/7596118 本文原文连接: http://blog.csdn.net/bluishglc/articl ...
最新文章
- python基础之循环与迭代器
- zookeeper分布式锁代码实例
- excel 如何用vba将某一条记录移动到另一张工作表中_EXCEL常用快捷键
- sqlserver isnull函数使用
- vsan Linux 网络磁盘,理解vSAN中的磁盘空间占用
- java.lang.ArrayIndexOutOfBoundsException
- TeamViewer会议功能有什么用?
- 不足百行代码 实体数组转DataTable通用类
- [Python]小甲鱼Python视频第020课(函数:内嵌函数和闭包)课后题及参考解答
- Windows Server 2008 R2的教程36篇!
- Modbus转Profinet网关与ARX-MA100微型空气质量监测系统配置案例
- IOT:基于oblog的应用
- tftp服务器怎么开启linux,CentOS 6.4 tftp服务器配置--使用tftp下载并启动内核
- java游戏繁体字名字,繁体字游戏名字你知道有几个?
- 指针使用入门与 unsafe.Pointer
- android 模拟器终端 了解及部分命令
- 网络安全:为大家介绍5种常见的加密算法
- 【成电860考研】经验贴汇总(公共课+专业课+复试)-扒遍所有网站:信软群、王道、知乎、csdn等,截止21年7月整理出的所有帖子-共15篇
- git did not exit cleanly (exit code 128)简单处理方法
- Gallary(中)
热门文章
- 该网页脚本造成Internet Explorer运行速度减慢!若继续运行会更慢,至无法响应!
- ALV分类合计功能实现
- ALV报表中处理双击行项目事件
- 聚焦2020年财报:进击的恒大汽车,“变态”的智能汽车
- php socket 用户名密码,PHP用socket模拟post之fsocketopen
- 医学计算机应用第五版题库,医科医学计算机应用题库
- 计算机一级挂科率,[转]计算机一级难吗?看了它想挂科,难难难难把此(精)
- ios查看帧率的软件_程序员必看!直播软件开发弱网下保障高清流畅推流的方法...
- 项目编译失败_Swift源码编译让底层更清晰
- Buuctf(PWN)ciscn_2019_c_1