createBean解析
spring当中单例bean的创建原理,其中涉及到了非常多阶段及各种处理器的调用
启动代码
通过注解配置类AppConfig启动一个容器,其中添加了一个自定义的beanFactoryPostProcessor, 注意:这个类是直接添加到beanFactoryPostProcessors中的,没有被spring当成bean放到单例map中
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext();
ac.addBeanFactoryPostProcessor(new CustomBeanFactoryPostProcessor());
ac.register(AppConfig.class);
ac.refresh();
new AnnotationConfigApplicationContext
完成的初始化:
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
初始化了AnnotatedBeanDefinitionReader又完成了spring内置几大处理器的注册
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
生成了对应RootBeanDefinition,并通过registry加到了map中
beanName | beanClass |
---|---|
org.springframework.context.annotation.internalConfigurationAnnotationProcessor | ConfigurationClassPostProcessor |
org.springframework.context.annotation.internalAutowiredAnnotationProcessor | AutowiredAnnotationBeanPostProcessor |
org.springframework.context.annotation.internalCommonAnnotationProcessor | CommonAnnotationBeanPostProcessor |
org.springframework.context.event.internalEventListenerProcessor | EventListenerMethodProcessor |
org.springframework.context.event.internalEventListenerFactory | DefaultEventListenerFactory |
register 注册了自己的配置类
通过构造ApplicationContext时产生的reader解读这个注解类,并把配置类当成一个AnnotatedGenericBeanDefinition放入map中等待后续实例化。中间处理了一些common的注解信息并填冲到bd里,比如@Lazy,@Primary,@Role,@DependsOn, @Description等
BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
refresh 方法解析
refresh方法中是个模板方法,里面定义了很多阶段操作,其中主要分析以下几个
invokeBeanFactoryPostProcessors(beanFactory)
主要完成了下面一个操作,其中getBeanFa