Spring-beans之BeanFactory初始化

学而时习之,不亦乐乎?

一:元数据读取

BeanFactory 核心功能是根据名字或者类获取对象,getBean

BeanDefinitionRegistry 负责注册BeanDefinition,registerBeanDefinition

BeanDefinition 封装创建对象的元数据信息

Resource 封装资源文件

BeanDefinitionReader 读取BeanDefinition并注册到BeanDefinitionRegistry,loadBeanDefinitions

XmlBeanDefinitionReader 通过加载xml文件注册BeanDefinition

DocumentLoader 读取、校验、转换xml文件为Document

BeanDefinitionDocumentReader 解析Document,注册BeanDefinition, registerBeanDefinitions

BeanDefinitionParserDelegate 解析具体标签

BeanDefinitionReaderUtils 提供静态方法注册BeanDefinition到BeanDefinitionRegistry

 二:getBean流程

【RootBeanDefinition】

InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation

SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors

【Bean】

MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition

SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference

InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation

【populate】

InstantiationAwareBeanPostProcessor.postProcessPropertyValues

【invokeAwareMethods】

BeanPostProcessor.postProcessBeforeInitialization

【invokeInitMethods】

BeanPostProcessor.postProcessAfterInitialization

三:自定义标签

BeanDefinitionParserDelegate 自己解析默认标签,使用名称空间处理器解析自定义标签

NamespaceHandlerResolver 读取META-INF/spring.handlers文件,获取自定义标签对应的处理器

http://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler
http://www.springframework.org/schema/jee=org.springframework.ejb.config.JeeNamespaceHandler
http://www.springframework.org/schema/lang=org.springframework.scripting.config.LangNamespaceHandler
http://www.springframework.org/schema/task=org.springframework.scheduling.config.TaskNamespaceHandler
http://www.springframework.org/schema/cache=org.springframework.cache.config.CacheNamespaceHandler

NamespaceHandler 处理自定义名称空间

NamespaceHandlerSupport 对名称空间处理分离

	/**
	 * Stores the {@link BeanDefinitionParser} implementations keyed by the
	 * local name of the {@link Element Elements} they handle.
	 */
	private final Map<String, BeanDefinitionParser> parsers = new HashMap<>();

	/**
	 * Stores the {@link BeanDefinitionDecorator} implementations keyed by the
	 * local name of the {@link Element Elements} they handle.
	 */
	private final Map<String, BeanDefinitionDecorator> decorators = new HashMap<>();

	/**
	 * Stores the {@link BeanDefinitionDecorator} implementations keyed by the local
	 * name of the {@link Attr Attrs} they handle.
	 */
	private final Map<String, BeanDefinitionDecorator> attributeDecorators = new HashMap<>();

 自定义的名称空间处理器context

public class ContextNamespaceHandler extends NamespaceHandlerSupport {

	@Override
	public void init() {
		registerBeanDefinitionParser("property-placeholder", new PropertyPlaceholderBeanDefinitionParser());
		registerBeanDefinitionParser("property-override", new PropertyOverrideBeanDefinitionParser());
		registerBeanDefinitionParser("annotation-config", new AnnotationConfigBeanDefinitionParser());
		registerBeanDefinitionParser("component-scan", new ComponentScanBeanDefinitionParser());
		registerBeanDefinitionParser("load-time-weaver", new LoadTimeWeaverBeanDefinitionParser());
		registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser());
		registerBeanDefinitionParser("mbean-export", new MBeanExportBeanDefinitionParser());
		registerBeanDefinitionParser("mbean-server", new MBeanServerBeanDefinitionParser());
	}

}

BeanDefinitionParser 解析自定义的名称空间标签

BeanDefinitionDecorator 修饰自定义的名称空间属性

原文地址:https://www.cnblogs.com/zby9527/p/13094155.html