IOC核心实现原理
文章目录
前言
IOC容器核心实现原理
一、Definition
注解配置Bean还是XML方式配置,都要经过一个过程就是创建这些类对应BeanDefinition【BeanDefinition是spring用来描述一个类的,类似于Java描述一个类是Class类对象】,spring通过BeanDefinition来实例化Bean
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、BeanFactory、ApplicationContext
AppliationContext继承了BeanFactory,ApplicationContext提供了比BeanFactory更丰富的功能,BeanFactory默认实现类DefaultListableBeanFactory
三、Bean属性赋值阶段
在根据类信息转载成BeanDefinition对象时不会对属性进行处理,而是借助BeanWrapperBean包装类
对属性进行初始化。是在一个Bean对象创建之后将其装载成一个BeanWrapper对象。
PostProcessor
后置处理器
或增强处理器
用于扩展功能使用
PostProcesser(Interface) | function |
---|---|
BeanDefinitionRegistryPostProcessor | Extension to the standard BeanFactoryPostProcessor SPI , allowing for the registration of further bean definitions |
BeanFactoryPostProcessor | custom modification of an application context’s bean definitions |
BeanPostProcessor | custom modification of new bean instances — for example, checking for marker interfaces or wrapping beans withproxies |
abstract | function |
---|---|
PlaceholderConfigurerSupport BeanFactoryPostProcesser抽象类 | Abstract base class for property resource configurers that resolve placeholders(占位符) in bean definition property values |
implements | function |
---|---|
ConfigurationClassPostProcessor BeanDefinitionRegistryPostProcessor实现类 扩展:springboot自动装配原理 | This post processor is priority-ordered as it is important that any @Bean methods declared in @Configuration classes have their corresponding bean definitions registered before any other BeanFactoryPostProcessor executes |
在调用BeanFactoryPostProcesser之前属性值如下
调用invokeBeanFactoryPostProcessors(beanFactory);
这个方法之后,属性为
- 自定义BeanFactory后置处理器(可以定义多个,可以@order设置优先级)
实现接口BeanFactoryPostProcesser 重写方法,在实现类加上@Component |
---|
四、初始化Bean属性
1、实例化
这个过程创建Bean对象
2、初始化
知识储备: 比如spring内置属性BeanFactory 、ApplicationContext,这两个属性要怎么初始化赋值? ps:容器对象不止这两个
- Aware接口没有如何方法
- BeanFactoryAware接口
setBeanFactory()
- ApplicationContextAware接口
setApplicationContextAware()
这两个方法可以在Bean初始化阶段被spring调用进行BeanFactory、ApplicationContext,这两个属性初始化反射方式
- BeanFactoryAware接口
属性赋值分为用户自定义属性
赋值,容器对象
赋值【通过set方法】
容器对象对应set方法所在接口如下
问题:既然是set方法,那这些容器对象能不能我们为其写个set方法来实现注入?
五、Bean扩展
BeanPostProcesser
Bean后置处理器
两个方法
- postProcessBeforeInitialization
初始化前置处理器
- 执行初始化
- postProcessAfterInitialization
初始化后置处理器
AOP【基于代理】是在Bean扩展进行实现,其一实现类`
下面这张图片中
初始化的步骤
更准确是执行初始化方法init-method
其实是可以用来进行属性初始化赋值,但是在上面属性已经初始化了,这个可以使用。spring是通过invokeInitMethods调用。
注解@AutoWired @Value在Bean生命周期哪个部分
spring扩展部分留在BeanPostProcesser