spring源码 之 AnnotatedBeanDefinitionReader

1,601 阅读1分钟

作用

用于注解BeanDefinition的读取解析

在哪里初始化:

	public AnnotationConfigApplicationContext() {
		this.reader = new AnnotatedBeanDefinitionReader(this);
		this.scanner = new ClassPathBeanDefinitionScanner(this);
	}

初始化 AnnotationConfigApplicationContext 上下文的时候同时初始化AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner

初始化的时候做了什么事情

	public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
	    // 省略非主流程代码......
	    //注册spring自带的 BeanFactoryPostProcessor 和 BeanPostProcessor
		
		(this.registry);
	}

AnnotationConfigUtils.registerAnnotationConfigProcessors 做了什么事情

   // 往bean工厂设置了用于排序的类
    beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
    //这个不懂  todo
    beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
    
    //接下来很重要
    //往bean工厂注册 ConfigurationClassPostProcessor //(是一种BeanDefinitionRegistryPostProcessor)很重要,后面讲
	RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
	def.setSource(source);
	beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));    
	
	//接下来不贴代码,都是往bean工厂注册 BeanPostProcessor
	// 重点 跟@Autowired  @Value  @Inject 有关 
	AutowiredAnnotationBeanPostProcessor 
	// 重点 和@PostConstruct  @Resource @PreDestroy 有关
	CommonAnnotationBeanPostProcessor
	PersistenceAnnotationBeanPostProcessor
	EventListenerMethodProcessor
	DefaultEventListenerFactory

所以初始化就是往bean工厂添加几个spring自带的PostProcessor

需要关注的方法


	public void registerBean(Class<?> annotatedClass, String name, Class<? extends Annotation>... qualifiers) {
	    // 传入一个class 解析成beandefinition
		AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass);
		
	     // 。。。 省略一堆代码,认为是解析beandefinition的过程,比如解析
	     //是否有@Lazy 然后设置懒加载属性,解析是否有 Primary //然后设置Primary属性
	    //接下来就是注册beandefinition到bean工厂中,在另外一个类中DefaultListabl // eBeanFactory#registerBeanDefinition 专门解析,其实比较简单,就是往
	    // map中put
		BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
		definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
		BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
	}

总结

AnnotatedBeanDefinitionReader 在spring上下文初始化的时候调用,AnnotatedBeanDefinitionReader自己在初始化的时候会往bean工厂注册spring自带的beanFactoryPostProcessor和beanPostProcessor,这些注册到bean工厂的list中,后面会使用到。AnnotatedBeanDefinitionReader#register 可以往bean工厂注册beanDefinition