Please enable JavaScript.
Coggle requires JavaScript to display documents.
SpringIoc, 在AnnotationConfigUtils类的registerAnnotationConfigProcessors方法被注册…
SpringIoc
BeanFactory
ApplicationContext
- 扩展了BeanFactory 提供事件发布,资源加载,国际化等的功能
- BeanFactoryPostProcessor
- BeanPostProcessor 以及其他特殊类型bean的自动识别 比如各种注解
- 容器启动后bean实例的自动初始化
- 常用的有ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、XmlWebApplicationContext、AnnotationConfigApplicationContext
内置的BeanPostProcessor
- ApplicationContextAwareProcessor 向Bean中注册各种aware接口
在容器的refresh方法的prepareBeanFactory中调用
- BeanValidationPostProcessor 内部有个boolean 类型的属性afterInitialization
- 如果为false则在 postProcessBeforeInitialization 之前校验
- 如果为true则在postProcessAfterInitialization 校验
- AbstractAutoProxyCreator 实现了SmartInstantiationAwareBeanPostProcessor 接口 在实例化之前返回代理对象
- 子类AnnotationAwareAspectJAutoProxyCreator 会扫描出Spring容器中带有@Aspect注解的bean,然后在getAdvicesAndAdvisorsForBean方法中会根据这个aspect查看是否被拦截,如果被拦截那么就wrap成代理类。
- 2 more items...
管理注册对象
- BeanDefinitionRegistry 负责注册和管路Bean内部是一个ConcurrentHashMap 存放Bean对象
- BeanDefinition 存放bean的class和属性信息用于BeanFactory构造Bean
- BeanDefinitionReader 根据外部文件读取Bean定义比如xml、properties
- DefaultListableBeanFactory 注册管理生成bean,继承了BeanDefinitionRegistry 和BeanFactory
FactoryBean
- 使用工厂方法可以解耦实例与调用者之间的关系,如果实例发生变化只需要修改工厂即可,不需要去修改调用者
- 如果是非静态的工厂方法则需要生成一个工厂的实例Bean来调用方法这个实例bean 注册到spring种就是FactoryBean
- 实现FactoryBean接口就可以变成工厂实例
BeanFactoryAware
- 实现此接口的Bean会再实例化时会将容器注入到Bean中即可调用其方法
Bean的生命周期
- 启动阶段 BeanDefinitionReader 读取文件生成BeanDefinition
- 实例化阶段: 实例化对象->装载依赖Bean->生命周期回调->处理对象->注册回调接口
- BeanFactoryPostProcessor 可以再容器实例化对象之前修改BeanDefinition
实例化过程
- 实例化Bean对象
- 设置Bean对象属性 通过BeanWrapper
- 检查Aware相关的接口并设置依赖
- BeanPostProcessor 前置处理
- 检查是否实现Initializtion以决定是否调用afterProperties方法
- 检查是否有自定义的init-method
- BeanPostProcessor 后置处理
- 注册必要的接口
- 是否实现DispoableBean接口
- 是否配置自定义的destroy 方法
- BeanFactory是延时加载 ApplicationContext则会再refresh中加载所有Bean
- getBean() 显示加载和如果有依赖Bean B则先加载B
- 生成的实例是由BeanWrapper包裹的,通过PropertyEditor实现类型转换,和设置对象属性
- ApplicationContext 使用BeanPostProcessor方式设置aware接口 包括(resource,event,message,applictionContext) aware
- applicationContextAware接口会向Bean中注入ApllicationContext对象
- BeanPostProcessor 处理符合条件的实例化后的对象,比如如何构造、属性值的修改、构造器的选择等等。
该接口默认有两个方法:
- postProcessBeforeInitialization 可返回包装后的实例对象,返回null会不调用后继Processors
- postProcessAfterInitialization 对Bean进行后置处理
InstantiationAwareBeanPostProcessor 接口
- postProcessBeforeInstantiation 在实例化之前调用,可生成任何类型的值替代实例化对象,如果调用后续流程将只会走 上面的postProcessAfterInitialization 方法
- postProcessAfterInstantiation 对象已经实例化如果返回false将忽略属性值设置
- postProcessPropertyValues 实例化后对属性值进行修改
SmartInstantiationAwareBeanPostProcessor 继承上面接口多3个方法
- predictBeanType 预测Bean类型
- determineCandidateConstructors 选择合适构造器
- getEarlyBeanReference 解决循环引用的问题:通过提前暴露实例在ObjectFactory中,再设置属性的对象实例来实现,从ObjectFactory 获取Bean就通过该方法
-
DestructionAwareBeanPostProcessor
- postProcessBeforeDestruction 容器被销毁之前调用
-
-