spring容器源码

本文详细解析了Spring容器启动过程,包括BeanDefinition的注册、BeanFactory的创建与配置、Bean的初始化流程,以及事件驱动模型的实现。深入理解Spring如何管理和创建Bean,以及后置处理器的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中用到

Object object = applicationContext.getBean(name)

在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。

BeanFacotry
The root interface for accessing a Spring bean container.This is the basic client view of a bean container.

源码注释:用于访问Spring bean容器的根接口。这是bean容器的基本客户端视图
BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等。
BeanFactory接口方法如下图
在这里插入图片描述

ApplicationContext

ApplicationContext是BeanFactory子接口
ApplicationContext以一种更向面向框架的方式工作以及对上下文进行分层和实现继承

Central interface to provide configuration for an application.

源码注释:用于为应用程序提供配置的中央接口。

BeanFacotry和ApplicationContext继承关系

在这里插入图片描述

BeanDefinition
A BeanDefinition describes a bean instance, which has property values,
 constructor argument values, and further information supplied by
 concrete implementations.
 BeanDefinition描述了一个bean实例,它具有属性值,
  构造函数参数值,要是提供的更多信息需
  具体实现。
BeanDefinitionRegistry
Interface for registries that hold bean definitions, for example RootBeanDefinition
 and ChildBeanDefinition instances. Typically implemented by BeanFactories that
 internally work with the AbstractBeanDefinition hierarchy.
 
 <p>This is the only interface in Spring's bean factory packages that encapsulates
 <i>registration</i> of bean definitions. The standard BeanFactory interfaces
 only cover access to a <i>fully configured factory instance</i>.
 
 <p>Spring's bean definition readers expect to work on an implementation of this
 interface. Known implementors within the Spring core are DefaultListableBeanFactory
 and GenericApplicationContext.
 包含bean定义的注册表的接口,例如RootBeanDefinition
  和ChildBeanDefinition实例。 通常由BeanFactories实现
  内部使用AbstractBeanDefinition层次结构。
 
  <p>这是Spring封装的bean工厂包中唯一的接口
  <i>注册</ i> bean定义。 标准的BeanFactory接口
  仅涵盖对<i>完全配置的工厂实例</ i>的访问权限。
 
  <p> Spring的bean定义读者希望能够实现这一点
  界面。 Spring core中的已知实现者是DefaultListableBeanFactory
  和GenericApplicationContext。
DefaultListableBeanFactory
interfaces: a full-fledged bean factory
 based on bean definition objects.
  <p>Typical usage is registering all bean definitions first (possibly read
 from a bean definition file), before accessing beans. Bean definition lookup
 is therefore an inexpensive operation in a local bean definition table,
 operating on pre-built bean definition metadata objects.
 
 <p>Can be used as a standalone bean factory, or as a superclass for custom
 bean factories. Note that readers for specific bean definition formats are
 typically implemented separately rather than as bean factory subclasses:
 see for example {@link PropertiesBeanDefinitionReader} and
 {@link org.springframework.beans.factory.xml.XmlBeanDefinitionReader}.
接口:一个成熟的bean工厂
  基于bean定义对象。
   <p>典型用法是首先注册所有bean定义(可能已读取
  访问bean之前,来自bean定义文件)。 Bean定义查找
  因此在本地bean定义表中是一个轻量的操作,
  在预构建的bean定义元数据对象上运行。
 
  <p>可以用作独立的bean工厂,也可以用作自定义的超类
  bean工厂。 请注意,特定bean定义格式的readers是
  通常单独实现,而不是作为bean工厂子类实现:
  参见例如{@link PropertiesBeanDefinitionReader}{@link org.springframework.beans.factory.xml.XmlBeanDefinitionReader}
BeanPostProcessor
Factory hook that allows for custom modification of new bean instances,e.g. checking for marker interfaces or wrapping them with proxies. 

ApplicationContexts can autodetect BeanPostProcessor beans in theirbean definitions and apply them to any beans subsequently created.Plain bean factories allow for programmatic registration of post-processors,applying to all beans created through this factory. 

Typically, post-processors that populate beans via marker interfacesor the like will implement postProcessBeforeInitialization,while post-processors that wrap beans with proxies will normallyimplement postProcessAfterInitialization.

工厂允许自定义修改新的bean实例,例如检查标记接口或用代理包装它们。

ApplicationContexts可以在其bean定义中自动检测BeanPostProcessor bean,并将它们应用于随后创建的任何bean .Plain bean工厂允许对后处理器进行编程注册,适用于通过此工厂创建的所有bean。

通常,通过标记接口等填充bean的后处理器将实现postProcessBeforeInitialization,而使用代理包装bean的后处理器通常会实现postProcessAfterInitialization。

总结

配置文件解析为BeanDefinition对象,被注册到了 DefaultListableBeanFactory(实现BeanDefinitionRegistry接口), 保存在beanDefinitionMap(ConcurrentHashMap)。
GenericApplicationContext 是ApplicationContext实现类,有final的DefaultListableBeanFactory成员变量,最终取到beanDefinitionMap中的bean。

在这里插入图片描述
spring全文:https://www.jianshu.com/p/619fe7164afb?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
spring容器文:https://www.cnblogs.com/digdeep/p/4518571.html
spring源码深度解析—容器的基本实现:https://blog.youkuaiyun.com/uftjtt/article/details/79896110

Spring容器的refresh()【创建刷新】;
1、prepareRefresh()刷新前的预处理;
	1)、initPropertySources()初始化一些属性设置;子类自定义个性化的属性设置方法;
	2)、getEnvironment().validateRequiredProperties();检验属性的合法等
	3)、earlyApplicationEvents= new LinkedHashSet<ApplicationEvent>();保存容器中的一些早期的事件;
2、obtainFreshBeanFactory();获取BeanFactory;
	1)、refreshBeanFactory();刷新【创建】BeanFactory;
			创建了一个this.beanFactory = new DefaultListableBeanFactory();
			设置id;
	2)、getBeanFactory();返回刚才GenericApplicationContext创建的BeanFactory对象;
	3)、将创建的BeanFactory【DefaultListableBeanFactory】返回;
3、prepareBeanFactory(beanFactory);BeanFactory的预准备工作(BeanFactory进行一些设置);
	1)、设置BeanFactory的类加载器、支持表达式解析器...
	2)、添加部分BeanPostProcessor【ApplicationContextAwareProcessor】
	3)、设置忽略的自动装配的接口EnvironmentAware、EmbeddedValueResolverAware、xxx;
	4)、注册可以解析的自动装配;我们能直接在任何组件中自动注入:
			BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
	5)、添加BeanPostProcessor【ApplicationListenerDetector】
	6)、添加编译时的AspectJ;
	7)、给BeanFactory中注册一些能用的组件;
		environment【ConfigurableEnvironment】、
		systemProperties【Map<String, Object>】、
		systemEnvironment【Map<String, Object>4、postProcessBeanFactory(beanFactory);BeanFactory准备工作完成后进行的后置处理工作;
	1)、子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步的设置
======================以上是BeanFactory的创建及预准备工作==================================
5、invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor的方法;
	BeanFactoryPostProcessor:BeanFactory的后置处理器。在BeanFactory标准初始化之后执行的;
	两个接口:BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor
	1)、执行BeanFactoryPostProcessor的方法;
		先执行BeanDefinitionRegistryPostProcessor
		1)、获取所有的BeanDefinitionRegistryPostProcessor;
		2)、看先执行实现了PriorityOrdered优先级接口的BeanDefinitionRegistryPostProcessor、
			postProcessor.postProcessBeanDefinitionRegistry(registry)
		3)、在执行实现了Ordered顺序接口的BeanDefinitionRegistryPostProcessor;
			postProcessor.postProcessBeanDefinitionRegistry(registry)
		4)、最后执行没有实现任何优先级或者是顺序接口的BeanDefinitionRegistryPostProcessors;
			postProcessor.postProcessBeanDefinitionRegistry(registry)
			
		
		再执行BeanFactoryPostProcessor的方法
		1)、获取所有的BeanFactoryPostProcessor
		2)、看先执行实现了PriorityOrdered优先级接口的BeanFactoryPostProcessor、
			postProcessor.postProcessBeanFactory()
		3)、在执行实现了Ordered顺序接口的BeanFactoryPostProcessor;
			postProcessor.postProcessBeanFactory()
		4)、最后执行没有实现任何优先级或者是顺序接口的BeanFactoryPostProcessor;
			postProcessor.postProcessBeanFactory()
6、registerBeanPostProcessors(beanFactory);注册BeanPostProcessor(Bean的后置处理器)【 intercept bean creation】
		不同接口类型的BeanPostProcessor;在Bean创建前后的执行时机是不一样的
		BeanPostProcessor、
		DestructionAwareBeanPostProcessor、
		InstantiationAwareBeanPostProcessor、
		SmartInstantiationAwareBeanPostProcessor、
		MergedBeanDefinitionPostProcessor【internalPostProcessors】、
		
		1)、获取所有的 BeanPostProcessor;后置处理器都默认可以通过PriorityOrdered、Ordered接口来执行优先级
		2)、先注册PriorityOrdered优先级接口的BeanPostProcessor;
			把每一个BeanPostProcessor;添加到BeanFactory中
			beanFactory.addBeanPostProcessor(postProcessor);
		3)、再注册Ordered接口的
		4)、最后注册没有实现任何优先级接口的
		5)、最终注册MergedBeanDefinitionPostProcessor;
		6)、注册一个ApplicationListenerDetector;来在Bean创建完成后检查是否是ApplicationListener,如果是
			applicationContext.addApplicationListener((ApplicationListener<?>) bean);
7、initMessageSource();初始化MessageSource组件(做国际化功能;消息绑定,消息解析);
		1)、获取BeanFactory
		2)、看容器中是否有id为messageSource的,类型是MessageSource的组件
			如果有赋值给messageSource,如果没有自己创建一个DelegatingMessageSource;
				MessageSource:取出国际化配置文件中的某个key的值;能按照区域信息获取;
		3)、把创建好的MessageSource注册在容器中,以后获取国际化配置文件的值的时候,可以自动注入MessageSource;
			beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);	
			MessageSource.getMessage(String code, Object[] args, String defaultMessage, Locale locale);
8、initApplicationEventMulticaster();初始化事件派发器;
		1)、获取BeanFactory
		2)、从BeanFactory中获取applicationEventMulticaster的ApplicationEventMulticaster;
		3)、如果上一步没有配置;创建一个SimpleApplicationEventMulticaster
		4)、将创建的ApplicationEventMulticaster添加到BeanFactory中,以后其他组件直接自动注入
9、onRefresh();留给子容器(子类)
		1、子类重写这个方法,在容器刷新的时候可以自定义逻辑;
10、registerListeners();给容器中将所有项目里面的ApplicationListener注册进来;
		1、从容器中拿到所有的ApplicationListener
		2、将每个监听器添加到事件派发器中;
			getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
		3、派发之前步骤产生的事件;
11、finishBeanFactoryInitialization(beanFactory);初始化所有剩下的单实例bean;
	1、beanFactory.preInstantiateSingletons();初始化后剩下的单实例bean
		1)、获取容器中的所有Bean,依次进行初始化和创建对象
		2)、获取Bean的定义信息;RootBeanDefinition
		3)、Bean不是抽象的,是单实例的,是懒加载;
			1)、判断是否是FactoryBean;是否是实现FactoryBean接口的Bean;
			2)、不是工厂Bean。利用getBean(beanName);创建对象
				0、getBean(beanName); ioc.getBean();
				1、doGetBean(name, null, null, false);
				2、先获取缓存中保存的单实例Bean。如果能获取到说明这个Bean之前被创建过(所有创建过的单实例Bean都会被缓存起来)
					从private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);获取的
				3、缓存中获取不到,开始Bean的创建对象流程;
				4、标记当前bean已经被创建
				5、获取Bean的定义信息;
				6、【获取当前Bean依赖的其他Bean;如果有按照getBean()把依赖的Bean先创建出来;】
				7、启动单实例Bean的创建流程;
					1)、createBean(beanName, mbd, args);
					2)、Object bean = resolveBeforeInstantiation(beanName, mbdToUse);让BeanPostProcessor先拦截返回代理对象;
						【InstantiationAwareBeanPostProcessor】:提前执行;
						先触发:postProcessBeforeInstantiation()如果有返回值:触发postProcessAfterInitialization()3)、如果前面的InstantiationAwareBeanPostProcessor没有返回代理对象;调用44)、Object beanInstance = doCreateBean(beanName, mbdToUse, args);创建Bean
						 1)、【创建Bean实例】;createBeanInstance(beanName, mbd, args);
						 	利用工厂方法或者对象的构造器创建出Bean实例;
						 2)、applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
						 	调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition(mbd, beanType, beanName);
						 3)、【Bean属性赋值】populateBean(beanName, mbd, instanceWrapper);
						 	赋值之前:
						 	1)、拿到InstantiationAwareBeanPostProcessor后置处理器;
						 		postProcessAfterInstantiation()2)、拿到InstantiationAwareBeanPostProcessor后置处理器;
						 		postProcessPropertyValues()=====赋值之前:===
						 	3)、应用Bean属性的值;为属性利用setter方法等进行赋值;
						 		applyPropertyValues(beanName, mbd, bw, pvs);
						 4)、【Bean初始化】initializeBean(beanName, exposedObject, mbd);
						 	1)、【执行Aware接口方法】invokeAwareMethods(beanName, bean);执行xxxAware接口的方法
						 		BeanNameAware\BeanClassLoaderAware\BeanFactoryAware
						 	2)、【执行后置处理器初始化之前】applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
						 		BeanPostProcessor.postProcessBeforeInitialization();
						 	3)、【执行初始化方法】invokeInitMethods(beanName, wrappedBean, mbd);
						 		1)、是否是InitializingBean接口的实现;执行接口规定的初始化;
						 		2)、是否自定义初始化方法;
						 	4)、【执行后置处理器初始化之后】applyBeanPostProcessorsAfterInitialization
						 		BeanPostProcessor.postProcessAfterInitialization()5)、注册Bean的销毁方法;
					5)、将创建的Bean添加到缓存中singletonObjects;
				ioc容器就是这些Map;很多的Map里面保存了单实例Bean,环境信息。。。。;
		所有Bean都利用getBean创建完成以后;
			检查所有的Bean是否是SmartInitializingSingleton接口的;如果是;就执行afterSingletonsInstantiated()12、finishRefresh();完成BeanFactory的初始化创建工作;IOC容器就创建完成;
		1)、initLifecycleProcessor();初始化和生命周期有关的后置处理器;LifecycleProcessor
			默认从容器中找是否有lifecycleProcessor的组件【LifecycleProcessor】;如果没有new DefaultLifecycleProcessor();
			加入到容器;
			
			写一个LifecycleProcessor的实现类,可以在BeanFactory
				void onRefresh();
				void onClose();	
		2)、	getLifecycleProcessor().onRefresh();
			拿到前面定义的生命周期处理器(BeanFactory);回调onRefresh()3)、publishEvent(new ContextRefreshedEvent(this));发布容器刷新完成事件;
		4)、liveBeansView.registerApplicationContext(this);
	
	======总结===========
	1)、Spring容器在启动的时候,先会保存所有注册进来的Bean的定义信息;
		1)、xml注册bean;<bean>
		2)、注解注册Bean;@Service、@Component、@Bean、xxx
	2)、Spring容器会合适的时机创建这些Bean
		1)、用到这个bean的时候;利用getBean创建bean;创建好以后保存在容器中;
		2)、统一创建剩下所有的bean的时候;finishBeanFactoryInitialization()3)、后置处理器;BeanPostProcessor
		1)、每一个bean创建完成,都会使用各种后置处理器进行处理;来增强bean的功能;
			AutowiredAnnotationBeanPostProcessor:处理自动注入
			AnnotationAwareAspectJAutoProxyCreator:来做AOP功能;
			xxx....
			增强的功能注解:
			AsyncAnnotationBeanPostProcessor
			....
	4)、事件驱动模型;
		ApplicationListener;事件监听;
		ApplicationEventMulticaster;事件派发:
	
			
					
						 		
						 	
					
								
							
							
							
						
						
						
							
						
						
					
				
				
				
			

		
	
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值