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