spring源码分析| 第一篇:内置后置处理器及自定义配置注册解析

1. 注册过程解析(语言层面)

  • 解析说明

    由于spring代码加载过程非常复杂,在此先通过语言描述大体介绍对象注册进spring容器的过程,下面会通过解析spring中重点源码来分析每一步骤

  • 创建spring容器: new AnnotationConfigApplicationContext()

    public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
    	this();
    	register(componentClasses);
    	refresh();
    }
    
  • 执行AnnotationConfigApplicationContext父类构造方法,即创建bean工厂:new DefaultListableBeanFactory()

  • 执行构造方法中this()方法:主要创建了AnnotatedBeanDefinitionReaderClassPathBeanDefinitionScanner两个类

    1.AnnotatedBeanDefinitionReader: 执行构造方法,完成后置处理器的创建,转为beanDefinition,重点关注ConfigurationClassPostProcessor
    2.ClassPathBeanDefinitionScanner: 扫描类路径下bean,并将其变为beanDefinition交注册进spring容器

  • 执行构造方法中register(componentClasses)方法: 完成后置处理器(spring创建,自定义)的创建,传入配置类转换为beanDefinition并注册至spring容器

  • 执行构造方法中refresh()方法: 解析配置类,将所有自定义对象扫描、解析并转换为beanDefinition,最终注册至spring容器

2. 注册过程解析(代码层面)

2.1 构造方法解析

AnnotationConfigApplicationContext acc = new AnnotationConfigApplicationContext(AppConfig.class);

public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
		this();
		register(componentClasses);
		refresh();
	}

构造方法中包含以下三部份:
1. this(): 创建spring的bean工厂(DefaultListableBeanFactory)
2. register(): 创建spring所需后置处理器(beanPostProcessor,beanFactoryPostProcessor),同时将创建的后置处理器、自定义配置类注册进spring容器
3. refresh(): 解析注册进spring容器的配置类,根据配置的componScan地址解析基础包下自定义bean,并将解析的bean注册进spring容器

2.2 this()方法解析

public class AnnotationConfigApplicationContext extends GenericApplicationContext implements AnnotationConfigRegistry {

private final AnnotatedBeanDefinitionReader reader;
private final ClassPathBeanDefinitionScanner scanner;

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

解析方法:
1.AnnotationConfigApplicationContext继承至GenericApplicationContext,则执行父类构造方法,创建bean工厂(DefaultListableBeanFactory)

public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry {

private final DefaultListableBeanFactory beanFactory;

public GenericApplicationContext() {
	this.beanFactory = new DefaultListableBeanFactory();
}

2.执行AnnotatedBeanDefinitionReader()构造方法,调用registerAnnotationConfigProcessors方法,创建spring内置beanPostProcessor和BeanFactoryPostProcessor

 public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
		BeanDefinitionRegistry registry, @Nullable Object source) {
	// 获取beanFactory
	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<>(8);
	// 注册spring内置五个后置处理器
	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));
	}

	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));
	}

	// Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
	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;
}

1.创建spring内置处理器,其中重点关注ConfigurationClassPostProcessor,该后置处理器用于处理添加了@Configuration注解配置类
2.执行registerPostProcessor()将创建的内置处理器注册至spring容器中
3.ConfigurationClassPostProcessor继承至beanFactoryPostProcessor,其余4个后置处理器实现beanPOstProcessor,后续会介绍两者差异

在这里插入图片描述
执行结果::
在这里插入图片描述
3.ClassPathBeanDefinitionScanner:扫描bean,并将其转为beanDefinition同时注册至spring容器中,我们用不了,在此就不做解析

2.3 register()方法解析

private <T> void doRegisterBean(Class<T> beanClass, @Nullable String name,
		@Nullable Class<? extends Annotation>[] qualifiers, @Nullable Supplier<T> supplier,
		@Nullable BeanDefinitionCustomizer[] customizers) {

	AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(beanClass);
	if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {
		return;
	}

	abd.setInstanceSupplier(supplier);
	ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);
	abd.setScope(scopeMetadata.getScopeName());
	String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));

	AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
	if (qualifiers != null) {
		for (Class<? extends Annotation> qualifier : qualifiers) {
			if (Primary.class == qualifier) {
				abd.setPrimary(true);
			}
			else if (Lazy.class == qualifier) {
				abd.setLazyInit(true);
			}
			else {
				abd.addQualifier(new AutowireCandidateQualifier(qualifier));
			}
		}
	}
	if (customizers != null) {
		for (BeanDefinitionCustomizer customizer : customizers) {
			customizer.customize(abd);
		}
	}

	BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
	definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
	BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
}

1.创建AnnotatedGenericBeanDefinition,所有注解类均使用该beanDefinition
2.设置注解BeanDefinition元数据和通用注解黙认值,包含scope,lazy,Description
3.将beanDefinition包装成BeanDefinitionHolder,无实际意义,便于传参
4.执行BeanDefinitionReaderUtils.registerBeanDefinition()将传入配置类注册至spring容器

public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
		throws BeanDefinitionStoreException {

	Assert.hasText(beanName, "Bean name must not be empty");
	Assert.notNull(beanDefinition, "BeanDefinition must not be null");

	if (beanDefinition instanceof AbstractBeanDefinition) {
		try {
			((AbstractBeanDefinition) beanDefinition).validate();
		}
		catch (BeanDefinitionValidationException ex) {
			throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
					"Validation of bean definition failed", ex);
		}
	}

	BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName);
	if (existingDefinition != null) {
		if (!isAllowBeanDefinitionOverriding()) {
			throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);
		}
		else if (existingDefinition.getRole() < beanDefinition.getRole()) {
			// e.g. was ROLE_APPLICATION, now overriding with ROLE_SUPPORT or ROLE_INFRASTRUCTURE
			if (logger.isInfoEnabled()) {
				logger.info("Overriding user-defined bean definition for bean '" + beanName +
						"' with a framework-generated bean definition: replacing [" +
						existingDefinition + "] with [" + beanDefinition + "]");
			}
		}
		else if (!beanDefinition.equals(existingDefinition)) {
			if (logger.isDebugEnabled()) {
				logger.debug("Overriding bean definition for bean '" + beanName +
						"' with a different definition: replacing [" + existingDefinition +
						"] with [" + beanDefinition + "]");
			}
		}
		else {
			if (logger.isTraceEnabled()) {
				logger.trace("Overriding bean definition for bean '" + beanName +
						"' with an equivalent definition: replacing [" + existingDefinition +
						"] with [" + beanDefinition + "]");
			}
		}
		this.beanDefinitionMap.put(beanName, beanDefinition);
	}
	else {
		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<>(this.beanDefinitionNames.size() + 1);
				updatedDefinitions.addAll(this.beanDefinitionNames);
				updatedDefinitions.add(beanName);
				this.beanDefinitionNames = updatedDefinitions;
				removeManualSingletonName(beanName);
			}
		}
		else {
			// Still in startup registration phase
			this.beanDefinitionMap.put(beanName, beanDefinition);
			this.beanDefinitionNames.add(beanName);
			removeManualSingletonName(beanName);
		}
		this.frozenBeanDefinitionNames = null;
	}

	if (existingDefinition != null || containsSingleton(beanName)) {
		resetBeanDefinition(beanName);
	}
}

配置类注册进spring容器过程如下图:
实际将上述处理的beanDefinition保存至beanFactory(DefaultListableBeanFactory)中的beanDefinitionMap中,完成此步操作后,beanFacroy的beanDefinitionMap中包含6个对象,即上述创建的6个后置处理器和自定义传入的配置类,如下图
执行结果如下,从下图可看出执行完register()方法后,beanDefinitionMap中增加了appConfig的映射
在这里插入图片描述

2.4 refresh()方法解析

refresh()主要解析自定义后置处理器、自定义对象注册至spring容器,涉及动西较多,详情见文章spring源码分析| 第二篇:自定义后置处理器及自定义对象注册解析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章