--------------------------------------------------
Spring 主要是管理 bean,包括配置,创建,装配,作用域,生命周期及各种增强,各种扩展
--------------------------------------------------
通过 BeanDefinition 把 bean 的定义和 bean 的创建分开,扩展很容易
--------------------------------------------------
只要定义好 BeanDefinition , spring 就会创建对应的 bean
------------------------------------------------
BeanFactoryPostProcessor
容器初始化的时候 实例化 Bean 之前 读取/修改 Bean 的信息,实现 bean 的动态代理
是扩展 spring 容器功能的重要接口
---------------------
ConfigurationClassPostProcessor 通过 BeanDefinitionRegistryPostProcessor 实现 bean 的动态注册
把基于 java 的 bean 配置,基于注解的 bean 配置, 解析成 beanDefinition,注册到 BeanFactory
@Configuration @ComponentScan @Import @ImportResource @PropertySource @Component @Bean @Conditional
BeanFactory.beanDefinitionMap
BeanFactory.beanDefinitionNames
------------------------------------------------
调用 ImportBeanDefinitionRegistrar 实现 bean 的动态注册
------------------------------------------------
@EnableAspectJAutoProxy 通过 ImportBeanDefinitionRegistrar 接口实现注解 aop 入口类
AnnotationAwareAspectJAutoProxyCreator 的动态注册
---------------------
MapperScannerRegistrar
生成 mybatis mapper 接口的动态代理
--------------------------------------------------
BeanPostProcessor 是 Bean 的后置处理器,大部分在 Bean 的初始化方法 [ InitializingBean 以及 init-method ] 前后执行
支持 @PostConstruct, @PreDestroy, @Resource, @Value
---------------------------------
AutowiredAnnotationBeanPostProcessor
@Autowired 注解的注入
---------------------------------
SmartInstantiationAwareBeanPostProcessor 解决循环依赖
---------------------
getEarlyBeanReference
解决循环依赖时,从三级缓存里拿bean
---------------------
determineCandidateConstructors
有 @Autowired 注解的构造函数,在实例化之前执行
---------------------
DestructionAwareBeanPostProcessor
postProcessBeforeDestruction
---------------------------------
CommonAnnotationBeanPostProcessor
@PostConstruct @PreDestroy @Resource
---------------------------------
InstantiationAwareBeanPostProcessor
postProcessProperties di
--------------------------------------------------
BeanDefinition
id, class,scope,依赖的 bean,是否是单例类,是否是懒加载,
父子 bean, 工厂方法,工厂 bean, init-method, destroy-method
--------------------------------------------------