Spring 源码
Spring 通过 BeanDefinition 把 Bean 的定义过程和创建过程分开,使得容器的横向扩展 动态创建 bean, 和纵向扩展 对 bean 做增强都很容易实现
动态创建 bean 变得更简单,无需关心 bean 的创建过程,只要定义好 BeanDefinition 注册到容器就好,
spring 会完成 bean 的创建工作
BeanFactory.beanDefinitionMap
BeanFactory.beanDefinitionNames
Spring 提供了两类接口做扩展
第一类接口用于定义阶段,通过动态注册 BeanDefinition,来实现 Bean 的动态创建, 比如
mybatis 里的 MapperScannerRegistrar 通过 spring 里的 ImportBeanDefinitionRegistrar 接口来完成 mapper 接口的动态代理
Spring 里的 ConfigurationClassPostProcessor 通过 BeanDefinitionRegistryPostProcessor 接口
把基于 java 的 bean 配置,基于注解的 bean 配置, 解析成 beanDefinition,注册到 BeanFactory
@Configuration @ComponentScan @Import @ImportResource @PropertySource @Component @Bean @Conditional
BeanFactory.beanDefinitionMap
BeanFactory.beanDefinitionNames
第二类接口用于创建阶段,对 Bean 做增强, 比如,
SmartInstantiationAwareBeanPostP