Spring系列(二) AnnotationConfigApplicationContext

AnnotationConfigApplicationContext

创建AnnotationConfigApplicationContext

  • 构造传入注解配置类,一步式解析 扫描 创建spring 容器
AnnotationConfigApplicationContext context 
    =new AnnotationConfigApplicationContext(AppConfig.class);

这种方式最简单,但不能预先添加自己的BeanFactoryPostProcessor到容器中优先于Spring内置的processor处理

如果有自定义的BeanDefinitionRegistryPostProcessor,会在spring内置处理器执行后以下阶段执行,通过beanDefinitionNames中取

// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
boolean reiterate = true;
while (reiterate) {
   
 	reiterate = false;
 	postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
 	...
 	currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
 	...
 	invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, 					  ...
}
  • 无参构造,逐步初始化
    不需要将BeanRegistryPostProcessor注册为bean时,可手动注册自定义的BeanRegistryPostProcessor后再,这时会优先执行自定义的processor

    AnnotationConfigApplicationContext ctx =new AnnotationConfigApplicationContext();
    //在invokeBeanFactoryPostProcessor时,取内部后置处理器可以取到
    ctx.addBeanFactoryPostProcessor(new CustomBeanRegistryPostProcessor());
    ctx.register(AppConfig.class);
    ctx.refresh();

register/scan

为容器中定义bean 寻找方式
  1. 传入注解类:AnnotatedBeanDefinitionReader先将该配置类封装为AnnotatedGenericBeanDefinition并通过registry注册该beanDefinition到容器中,在ConfigurationClassPostProcessor处理时会通过ConfigurationClassParser的doProcessConfigurationClass

    protected final SourceClass doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass)  throws IOException {
         
    			  processMemberClasses(configClass, sourceClass);
    			  ...
                  		  Set<BeanDefinitionHolder> scannedBeanDefinitions =
    						this.componentScanParser.parse(componentScan, sourceClass.getMetadata().getClassName());
    			...
    	}

    其中由ComponentScanAnnotationParser parse解析,里面再通过ClassPathBeanDefinitionScanner去扫描解析获得BeanDefinitionHolder,所扫面出来带注解的类将以ScannedGenericBeanDefinition形式存在beanFactory

    public Set<BeanDefinitionHolder> parse(AnnotationAttributes componentScan, final String declaringClass) 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值