zoukankan      html  css  js  c++  java
  • BeanDefinitionParserDelegate与资源解析

    继续上一次的分析

    XmlBeanDefinitionReader.java 中

    1、registerBeanDefinitions方法

    documentReader.registerBeanDefinitions(doc, createReaderContext(resource));

    注册Bean definition, 第二个参数是createReaderContext(resource)

    2、createReaderContext方法

    3、XmlReaderContext

    XmlReaderContext继承自ReaderContext,和XmlBeanDefinitionReader一起使用,提供了访问NamespaceHandlerResolver

    4、registerBeanDefinitions方法

    方法作用:见方法的英文描述

    5、doRegisterBeanDefinitions方法,参数为xml文档的根元素

    /**
    	 * Register each bean definition within the given root {@code <beans/>} element.
    	 * @throws IllegalStateException if {@code <beans profile="..."} attribute is present
    	 * and Environment property has not been set
    	 * @see #setEnvironment
    	 */
    	protected void doRegisterBeanDefinitions(Element root) {
    		String profileSpec = root.getAttribute(PROFILE_ATTRIBUTE);
    		if (StringUtils.hasText(profileSpec)) {
    			Assert.state(this.environment != null, "environment property must not be null");
    			String[] specifiedProfiles = StringUtils.tokenizeToStringArray(profileSpec, BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS);
    			if (!this.environment.acceptsProfiles(specifiedProfiles)) {
    				return;
    			}
    		}
    
    		// any nested <beans> elements will cause recursion in this method. In
    		// order to propagate and preserve <beans> default-* attributes correctly,
    		// keep track of the current (parent) delegate, which may be null. Create
    		// the new (child) delegate with a reference to the parent for fallback purposes,
    		// then ultimately reset this.delegate back to its original (parent) reference.
    		// this behavior emulates a stack of delegates without actually necessitating one.
    		BeanDefinitionParserDelegate parent = this.delegate;
    		this.delegate = createHelper(readerContext, root, parent);
    
    		preProcessXml(root);
    		parseBeanDefinitions(root, this.delegate);
    		postProcessXml(root);
    
    		this.delegate = parent;
    	}
    

      这里用到了模板方法的设计模式

    preProcessXml(root);
    parseBeanDefinitions(root, this.delegate);
    postProcessXml(root);
    这三个方法执行顺序是不变的。子类可以重写preProcessXml方法和postProcessXml方法, 实现对XML配置文件的自定义扩展。类似于JUnit中的setUp,testXXX与tearDown方法

    6、BeanDefinitionParserDelegate类: 有状态的委托类,用来解析Xml中bean的定义

    定义的成员变量

    public static final String BEANS_NAMESPACE_URI = "http://www.springframework.org/schema/beans";
    
        public static final String MULTI_VALUE_ATTRIBUTE_DELIMITERS = ",; ";
    
        /** @deprecated as of Spring 3.1 in favor of {@link #MULTI_VALUE_ATTRIBUTE_DELIMITERS} */
        public static final String BEAN_NAME_DELIMITERS = MULTI_VALUE_ATTRIBUTE_DELIMITERS;
    
        /**
         * Value of a T/F attribute that represents true.
         * Anything else represents false. Case seNsItive.
         */
        public static final String TRUE_VALUE = "true";
    
        public static final String FALSE_VALUE = "false";
    
        public static final String DEFAULT_VALUE = "default";
    
        public static final String DESCRIPTION_ELEMENT = "description";
    
        public static final String AUTOWIRE_NO_VALUE = "no";
    
        public static final String AUTOWIRE_BY_NAME_VALUE = "byName";
    
        public static final String AUTOWIRE_BY_TYPE_VALUE = "byType";
    
        public static final String AUTOWIRE_CONSTRUCTOR_VALUE = "constructor";
    
        public static final String AUTOWIRE_AUTODETECT_VALUE = "autodetect";
    
        public static final String DEPENDENCY_CHECK_ALL_ATTRIBUTE_VALUE = "all";
    
        public static final String DEPENDENCY_CHECK_SIMPLE_ATTRIBUTE_VALUE = "simple";
    
        public static final String DEPENDENCY_CHECK_OBJECTS_ATTRIBUTE_VALUE = "objects";
    
        public static final String NAME_ATTRIBUTE = "name";
    
        public static final String BEAN_ELEMENT = "bean";
    
        public static final String META_ELEMENT = "meta";
    
        public static final String ID_ATTRIBUTE = "id";
    
        public static final String PARENT_ATTRIBUTE = "parent";
    
        public static final String CLASS_ATTRIBUTE = "class";
    
        public static final String ABSTRACT_ATTRIBUTE = "abstract";
    
        public static final String SCOPE_ATTRIBUTE = "scope";
    
        public static final String SINGLETON_ATTRIBUTE = "singleton";
    
        public static final String LAZY_INIT_ATTRIBUTE = "lazy-init";
    
        public static final String AUTOWIRE_ATTRIBUTE = "autowire";
    
        public static final String AUTOWIRE_CANDIDATE_ATTRIBUTE = "autowire-candidate";
    
        public static final String PRIMARY_ATTRIBUTE = "primary";
    
        public static final String DEPENDENCY_CHECK_ATTRIBUTE = "dependency-check";
    
        public static final String DEPENDS_ON_ATTRIBUTE = "depends-on";
    
        public static final String INIT_METHOD_ATTRIBUTE = "init-method";
    
        public static final String DESTROY_METHOD_ATTRIBUTE = "destroy-method";
    
        public static final String FACTORY_METHOD_ATTRIBUTE = "factory-method";
    
        public static final String FACTORY_BEAN_ATTRIBUTE = "factory-bean";
    
        public static final String CONSTRUCTOR_ARG_ELEMENT = "constructor-arg";
    
        public static final String INDEX_ATTRIBUTE = "index";
    
        public static final String TYPE_ATTRIBUTE = "type";
    
        public static final String VALUE_TYPE_ATTRIBUTE = "value-type";
    
        public static final String KEY_TYPE_ATTRIBUTE = "key-type";
    
        public static final String PROPERTY_ELEMENT = "property";
    
        public static final String REF_ATTRIBUTE = "ref";
    
        public static final String VALUE_ATTRIBUTE = "value";
    
        public static final String LOOKUP_METHOD_ELEMENT = "lookup-method";
    
        public static final String REPLACED_METHOD_ELEMENT = "replaced-method";
    
        public static final String REPLACER_ATTRIBUTE = "replacer";
    
        public static final String ARG_TYPE_ELEMENT = "arg-type";
    
        public static final String ARG_TYPE_MATCH_ATTRIBUTE = "match";
    
        public static final String REF_ELEMENT = "ref";
    
        public static final String IDREF_ELEMENT = "idref";
    
        public static final String BEAN_REF_ATTRIBUTE = "bean";
    
        public static final String LOCAL_REF_ATTRIBUTE = "local";
    
        public static final String PARENT_REF_ATTRIBUTE = "parent";
    
        public static final String VALUE_ELEMENT = "value";
    
        public static final String NULL_ELEMENT = "null";
    
        public static final String ARRAY_ELEMENT = "array";
    
        public static final String LIST_ELEMENT = "list";
    
        public static final String SET_ELEMENT = "set";
    
        public static final String MAP_ELEMENT = "map";
    
        public static final String ENTRY_ELEMENT = "entry";
    
        public static final String KEY_ELEMENT = "key";
    
        public static final String KEY_ATTRIBUTE = "key";
    
        public static final String KEY_REF_ATTRIBUTE = "key-ref";
    
        public static final String VALUE_REF_ATTRIBUTE = "value-ref";
    
        public static final String PROPS_ELEMENT = "props";
    
        public static final String PROP_ELEMENT = "prop";
    
        public static final String MERGE_ATTRIBUTE = "merge";
    
        public static final String QUALIFIER_ELEMENT = "qualifier";
    
        public static final String QUALIFIER_ATTRIBUTE_ELEMENT = "attribute";
    
        public static final String DEFAULT_LAZY_INIT_ATTRIBUTE = "default-lazy-init";
    
        public static final String DEFAULT_MERGE_ATTRIBUTE = "default-merge";
    
        public static final String DEFAULT_AUTOWIRE_ATTRIBUTE = "default-autowire";
    
        public static final String DEFAULT_DEPENDENCY_CHECK_ATTRIBUTE = "default-dependency-check";
    
        public static final String DEFAULT_AUTOWIRE_CANDIDATES_ATTRIBUTE = "default-autowire-candidates";
    
        public static final String DEFAULT_INIT_METHOD_ATTRIBUTE = "default-init-method";
    
        public static final String DEFAULT_DESTROY_METHOD_ATTRIBUTE = "default-destroy-method";
    
    
        protected final Log logger = LogFactory.getLog(getClass());
    
        private final XmlReaderContext readerContext;
    
        private final DocumentDefaultsDefinition defaults = new DocumentDefaultsDefinition();
    
        private final ParseState parseState = new ParseState();
    
        private Environment environment;
    
        /**
         * Stores all used bean names so we can enforce uniqueness on a per
         * beans-element basis. Duplicate bean ids/names may not exist within the
         * same level of beans element nesting, but may be duplicated across levels.
         */
        private final Set<String> usedNames = new HashSet<String>();
    View Code

    7、createHelper方法

    	protected BeanDefinitionParserDelegate createHelper(XmlReaderContext readerContext, Element root, BeanDefinitionParserDelegate parentDelegate) {
    		BeanDefinitionParserDelegate delegate = new BeanDefinitionParserDelegate(readerContext, environment);
    		delegate.initDefaults(root, parentDelegate);
    		return delegate;
    	}
    

    this.readerContext.fireDefaultsRegistered(this.defaults);  

    激发默认值的注册

    8、initDefaults方法

    	/**
    	 * Initialize the default lazy-init, autowire, dependency check settings,
    	 * init-method, destroy-method and merge settings. Support nested 'beans'
    	 * element use cases by falling back to the given parent in case the
    	 * defaults are not explicitly set locally.
    	 * @see #populateDefaults(DocumentDefaultsDefinition, DocumentDefaultsDefinition, org.w3c.dom.Element)
    	 * @see #getDefaults()
    	 */
    	public void initDefaults(Element root, BeanDefinitionParserDelegate parent) {
    		populateDefaults(this.defaults, (parent != null ? parent.defaults : null), root);
    		this.readerContext.fireDefaultsRegistered(this.defaults);
    	}
    

      

    9、populateDefaults方法   装配根元素beans的默认值

    	/**
    	 * Populate the given DocumentDefaultsDefinition instance with the default lazy-init,
    	 * autowire, dependency check settings, init-method, destroy-method and merge settings.
    	 * Support nested 'beans' element use cases by falling back to
    	 * <literal>parentDefaults</literal> in case the defaults are not explicitly set
    	 * locally.
    	 * @param defaults the defaults to populate
    	 * @param parentDefaults the parent BeanDefinitionParserDelegate (if any) defaults to fall back to
    	 * @param root the root element of the current bean definition document (or nested beans element)
    	 */
    	protected void populateDefaults(DocumentDefaultsDefinition defaults, DocumentDefaultsDefinition parentDefaults, Element root) {
    		String lazyInit = root.getAttribute(DEFAULT_LAZY_INIT_ATTRIBUTE);
    		if (DEFAULT_VALUE.equals(lazyInit)) {
    			lazyInit = parentDefaults != null ? parentDefaults.getLazyInit() : FALSE_VALUE;
    		}
    		defaults.setLazyInit(lazyInit);
    
    		String merge = root.getAttribute(DEFAULT_MERGE_ATTRIBUTE);
    		if (DEFAULT_VALUE.equals(merge)) {
    			merge = parentDefaults != null ? parentDefaults.getMerge() : FALSE_VALUE;
    		}
    		defaults.setMerge(merge);
    
    		String autowire = root.getAttribute(DEFAULT_AUTOWIRE_ATTRIBUTE);
    		if (DEFAULT_VALUE.equals(autowire)) {
    			autowire = parentDefaults != null ? parentDefaults.getAutowire() : AUTOWIRE_NO_VALUE;
    		}
    		defaults.setAutowire(autowire);
    
    		// don't fall back to parentDefaults for dependency-check as it's no
    		// longer supported in <beans> as of 3.0. Therefore, no nested <beans>
    		// would ever need to fall back to it.
    		defaults.setDependencyCheck(root.getAttribute(DEFAULT_DEPENDENCY_CHECK_ATTRIBUTE));
    
    		if (root.hasAttribute(DEFAULT_AUTOWIRE_CANDIDATES_ATTRIBUTE)) {
    			defaults.setAutowireCandidates(root.getAttribute(DEFAULT_AUTOWIRE_CANDIDATES_ATTRIBUTE));
    		}
    		else if (parentDefaults != null) {
    			defaults.setAutowireCandidates(parentDefaults.getAutowireCandidates());
    		}
    
    		if (root.hasAttribute(DEFAULT_INIT_METHOD_ATTRIBUTE)) {
    			defaults.setInitMethod(root.getAttribute(DEFAULT_INIT_METHOD_ATTRIBUTE));
    		}
    		else if (parentDefaults != null) {
    			defaults.setInitMethod(parentDefaults.getInitMethod());
    		}
    
    		if (root.hasAttribute(DEFAULT_DESTROY_METHOD_ATTRIBUTE)) {
    			defaults.setDestroyMethod(root.getAttribute(DEFAULT_DESTROY_METHOD_ATTRIBUTE));
    		}
    		else if (parentDefaults != null) {
    			defaults.setDestroyMethod(parentDefaults.getDestroyMethod());
    		}
    
    		defaults.setSource(this.readerContext.extractSource(root));
    	}
    

      

  • 相关阅读:
    php验证码
    php上传
    ajax的用法 资料
    ajax如何使用
    AJAX
    基础概念梳理 :
    ICompare 可比较接口
    强类型 和弱类型 c#
    .ne 基础(2)
    .net 基础(一)
  • 原文地址:https://www.cnblogs.com/linlf03/p/11180682.html
Copyright © 2011-2022 走看看