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
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 修饰自定义的名称空间属性

浙公网安备 33010602011771号