这里先说总结再讲解源码,先理清脉络再深入细节才不会迷失在细节当中。Spring的启动过程主要可以分为两部分: 初始化的过程可以看到初始化beanFactory为DefaultListableBeanFactory。这里可以看到AnnotationConfigApplicationContext虽然本身是一个beanFactory(实现了BeanFactory接口),但是依赖查找,依赖注入的过程是依赖内部的beanFactory来实现的(典型的代理模式) 另外需要注意的一点是,在容器初始化的过程中注册了6个Bean 首先我们要知道,给 Spring 容器提供 BeanFactoryPostProcessor 或者 BeanDefinitionRegistryPostProcessor 的 Bean 对象的方式有两种: 手动注册BeanFactoryPostProcessor 并提供给 Spring 管理,是利用 常见注册bean对象到spring容器的方式: @Component、@Controller、@Service、@Repository 方式,此为自动创建 @Bean 方式,配置类方法加上 @Bean 注解 @Import 方式 实现 BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry FactoryBean接口 XML配置文件:通过在XML配置文件中使用 动态地给Java对象添加字段并赋值,并不是在已经实例化的对象上去完成的。基于cglib,commons-beanutils库实现思路为: 相当于是复制类定义,然后新建个类定义处理。和 spring 的在 重要类
生命周期
入口
// 创建ioc容器, sMainConfig为配置类
ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);
// AnnotationConfigApplicationContext
public class AnnotationConfigApplicationContext extends GenericApplicationContext implements AnnotationConfigRegistry {
// 读取注解的Bean定义读取器
private final AnnotatedBeanDefinitionReader reader;
// 扫描指定类路径中注解Bean定义的扫描器
private final ClassPathBeanDefinitionScanner scanner;
// 无参构造函数
public AnnotationConfigApplicationContext() {
// 查看new AnnotatedBeanDefinitionReader(this)源码可以发现
// 此时往容器中注入了5个处理器
// ConfigurationClassPostProcessor 这个内置的,唯一的实现了BeanDefinitionRegistryPostProcessor的后置处理器是解析其他通过注解注入的bean的类。
// AutowiredAnnotationBeanPostProcessor 用来实现依赖注入的功能
// CommonAnnotationBeanPostProcessor
// EventListenerMethodProcessor
// DefaultEventListenerFactory
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
// 最常用的构造函数,通过将涉及的配置类传递给该构造函数,实现将相应配置类中的Bean自动注册到容器中
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
// (1) 调用无参构造函数
this();
// (2) 将配置类信息封装成BeanDefinition对象保存到beanDefinitionMap容器中
register(annotatedClasses);
// (3)刷新容器,触发容器对注解Bean的载入、解析和注册
refresh();
}
}
手动添加 BeanFactoryPostProcessor
ApplicationContext#addBeanFactoryPostProcessor api 进行 添加 ,例如public class MyApplication {
public static void main(String[] args) throws IOException {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.addBeanFactoryPostProcessor(new ManB());
ctx.addBeanFactoryPostProcessor(new ManSubY());
ctx.register(AppConfig.class);
ctx.refresh();
}
}
BeanFactoryPostProcessors执行顺序

Spring容器注册bean方式
以上,都是需要ConfigurationClassPostProcessor 这个内置 BeanDefinitionRegistryPostProcessor 进行扫描,然后加载番外
BeanFactoryPostProcessor 中添加属性是相通的,因为此时还没对bean进行实例化。参考