zoukankan      html  css  js  c++  java
  • 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 修饰自定义的名称空间属性

  • 相关阅读:
    MySql数据类型详解
    MySQL日期数据类型、MySQL时间类型使用总结
    sqlcmd
    sqlserver 复制
    Do waiting or suspended tasks tie up a worker thread?
    用GDB 调试Java程序
    X64相关文章
    How do I find what queries were executing in a SQL memory dump?-----stack
    解决Sublime Text 3中文显示乱码(tab中文方块)问题
    GIT 详解
  • 原文地址:https://www.cnblogs.com/zby9527/p/13094155.html
Copyright © 2011-2022 走看看