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

  • 相关阅读:
    jquery $.each遍历json数组方法
    JQuery插件编写
    创建JAVASCRIPT对象3种方法
    微信开发流程
    有关索引那点事
    获取数据库内所有的表和表内字段的信息
    asp.net MVC4 异步文件上传
    QT学习:01 工程文件详解
    QT学习:00 介绍
    Linux 系统编程 学习 总结
  • 原文地址:https://www.cnblogs.com/zby9527/p/13094155.html
Copyright © 2011-2022 走看看