Spring 源码(二)注册内置的BeanPostProcessor的BeanDefinition到容器

发起注册

调用链路:

registerAnnotationConfigProcessors:163, AnnotationConfigUtils (org.springframework.context.annotation)
registerAnnotationConfigProcessors:134, AnnotationConfigUtils (org.springframework.context.annotation)
<init>:83, AnnotatedBeanDefinitionReader (org.springframework.context.annotation)
<init>:66, AnnotatedBeanDefinitionReader (org.springframework.context.annotation)
<init>:61, AnnotationConfigApplicationContext (org.springframework.context.annotation)
<init>:82, AnnotationConfigApplicationContext (org.springframework.context.annotation)

源码:

// 注册 Spring 内置后置处理器的 BeanDefinition
public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
		BeanDefinitionRegistry registry, Object source) {

	DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
	if (beanFactory != null) {
		if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {
			beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
		}
		if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {
			beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
		}
	}

	Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<BeanDefinitionHolder>(4);

	if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
		RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
		def.setSource(source);
		beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
	}
	// 对注解@Autowired的实现
	if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
		RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
		def.setSource(source);
		beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
	}
	// 对注解 @Required 的实现
	if (!registry.containsBeanDefinition(REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
		RootBeanDefinition def = new RootBeanDefinition(RequiredAnnotationBeanPostProcessor.class);
		def.setSource(source);
		beanDefs.add(registerPostProcessor(registry, def, REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
	}

	// Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
	// 对JSR-250的支持,如对 @Resource、@PostConstruct和@PreDestroy 的实现
	if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
		RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
		def.setSource(source);
		beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
	}

	// Check for JPA support, and if present add the PersistenceAnnotationBeanPostProcessor.
	if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {
		RootBeanDefinition def = new RootBeanDefinition();
		try {
			def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,
					AnnotationConfigUtils.class.getClassLoader()));
		}
		catch (ClassNotFoundException ex) {
			throw new IllegalStateException(
					"Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);
		}
		def.setSource(source);
		beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
	}

	if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {
		RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);
		def.setSource(source);
		beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));
	}
	if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {
		RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);
		def.setSource(source);
		beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));
	}

	return beanDefs;
}

注册Bean定义到容器

调用链路:

registerBeanDefinition:861, DefaultListableBeanFactory (org.springframework.beans.factory.support)
registerBeanDefinition:315, GenericApplicationContext (org.springframework.context.support)
registerPostProcessor:218, AnnotationConfigUtils (org.springframework.context.annotation)
registerAnnotationConfigProcessors:163, AnnotationConfigUtils (org.springframework.context.annotation)
registerAnnotationConfigProcessors:134, AnnotationConfigUtils (org.springframework.context.annotation)
<init>:83, AnnotatedBeanDefinitionReader (org.springframework.context.annotation)
<init>:66, AnnotatedBeanDefinitionReader (org.springframework.context.annotation)
<init>:61, AnnotationConfigApplicationContext (org.springframework.context.annotation)
<init>:82, AnnotationConfigApplicationContext (org.springframework.context.annotation)

源码:

//---------------------------------------------------------------------
// Implementation of BeanDefinitionRegistry interface
//---------------------------------------------------------------------
// 将BeanDefinition注册到容器
@Override
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
		throws BeanDefinitionStoreException {

	...
	if (hasBeanCreationStarted()) {
		// Cannot modify startup-time collection elements anymore (for stable iteration)
		synchronized (this.beanDefinitionMap) {
			this.beanDefinitionMap.put(beanName, beanDefinition);
			List<String> updatedDefinitions = new ArrayList<String>(this.beanDefinitionNames.size() + 1);
			updatedDefinitions.addAll(this.beanDefinitionNames);
			updatedDefinitions.add(beanName);
			this.beanDefinitionNames = updatedDefinitions;
			if (this.manualSingletonNames.contains(beanName)) {
				Set<String> updatedSingletons = new LinkedHashSet<String>(this.manualSingletonNames);
				updatedSingletons.remove(beanName);
				this.manualSingletonNames = updatedSingletons;
			}
		}
	}
	else {
		// Still in startup registration phase
		this.beanDefinitionMap.put(beanName, beanDefinition);
		this.beanDefinitionNames.add(beanName);
		this.manualSingletonNames.remove(beanName);
	}
	...
}

这里需要注意的两个后置处理器分别是:

  • AutowiredAnnotationBeanPostProcessor:对注解@Autowired的实现
  • CommonAnnotationBeanPostProcessor: 对JSR-250的支持,如对 @Resource、@PostConstruct和@PreDestroy 的实现

我们注册Bean的定义都是通过 BeanDefinitionRegistry 来实现的。

发布了203 篇原创文章 · 获赞 145 · 访问量 85万+

猜你喜欢

转载自blog.csdn.net/xiaolyuh123/article/details/103289811