Spring原始碼學習之路---IOC初探(二)
原文地址:https://blog.csdn.net/zuoxiaolong8810/article/details/8550421
上一章當中我沒有提及具體的搭建環境的步驟,一個是不得不承認有點懶,另外一個我覺得如果上章所述的那些環境都還不會搭建的話,研究spring的原始碼還有些過早。
如果你有興趣的話,相信已經搭建好了學習研究的環境,接下來就可以進入正題了。
網上也有很多關於spring原始碼學習的文章以及帖子,講的也都不錯,但是有些可能高估了讀者的能力,該深入的地方反倒一句帶過,我現在也是在一步一步研究,和大家的進度一樣,所以可能在我的角度來和各位探討,更加容易。
首先我們來說一下IOC,IOC是spring最核心的理念,包括AOP也要屈居第二,那麼IOC到底是什麼呢,四個字,控制反轉。
網上有不少是這麼解釋IOC的,說IOC是將物件的建立和依賴關係交給容器,這句話我相信不少人都知道,在我個人的理解,IOC就是讓我們的開發變的更簡單了。
為什麼這麼說呢,光說沒意思,直接上程式碼。
- public class Person {
- public void work(){
- System.out.println("I am working");
- }
- }
上面這個是Person類,如果我們還有一個Company公司類,公司要開張需要人來工作,所以我們可能需要這樣。
- public class Company {
- public Person person;
- public Company(Person person){
- this.person = person;
- }
- public void open(){
- person.work();
- System.out.println("I am opening");
- }
- }
好了,這樣可以了,雖說和現實有些區別,畢竟沒有一個人的公司,但是就是這麼個意思。必須要有人在公司裡,公司才能開張。
有了spring上述情況我們是怎麼寫的呢?Person類不變,Company就可以簡單些了。
- public class Company {
- @Autowired
- public Person person;
- public void open(){
- person.work();
- System.out.println("I am opening");
- }
- }
OK了,使用註解後,spring裡的寫法是這樣的,是不是簡單很多?或許你可能會說,這才減少了多少程式碼,但是事實上是,真正的專案中,不可能有這麼簡單的依賴關係,或許是2層,3層甚至N層。
當然,可能我們有時候用的XML,XML和註解的區別就在於這裡,註解可以快速的完成依賴的注入,但是缺點也很明顯,那就是比如我公司裡不需要人了,我需要的是機器,那麼我還要手動改程式碼,將Person換成機器(這裡應該是英文,英語不好,懶得查了,只記得念“磨洗”),而如果是XML配置,那麼我們只需要改下配置檔案就可以。維護起來會方便很多,當然XML的缺點也很明顯,那就是依賴關係複雜的時候,XML檔案會比較臃腫,所以我們一般的做法是將XML分離開來。
說到這裡,有些扯遠了,但是我覺得以上可以足夠說明IOC的好處,知道了IOC的好處,我們自然就要知道怎麼來實現IOC了。
或許看了spring的原始碼,第一感覺是很蒙,包太多,我也很蒙,但是研究東西就是得沉下心來,先來關注一下這個介面,BeanFactory,附上程式碼。
- /*
- * Copyright 2002-2010 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- package org.springframework.beans.factory;
- import org.springframework.beans.BeansException;
- /**
- * The root interface for accessing a Spring bean container.
- * This is the basic client view of a bean container;
- * further interfaces such as {@link ListableBeanFactory} and
- * {@link org.springframework.beans.factory.config.ConfigurableBeanFactory}
- * are available for specific purposes.
- *
- * <p>This interface is implemented by objects that hold a number of bean definitions,
- * each uniquely identified by a String name. Depending on the bean definition,
- * the factory will return either an independent instance of a contained object
- * (the Prototype design pattern), or a single shared instance (a superior
- * alternative to the Singleton design pattern, in which the instance is a
- * singleton in the scope of the factory). Which type of instance will be returned
- * depends on the bean factory configuration: the API is the same. Since Spring
- * 2.0, further scopes are available depending on the concrete application
- * context (e.g. "request" and "session" scopes in a web environment).
- *
- * <p>The point of this approach is that the BeanFactory is a central registry
- * of application components, and centralizes configuration of application
- * components (no more do individual objects need to read properties files,
- * for example). See chapters 4 and 11 of "Expert One-on-One J2EE Design and
- * Development" for a discussion of the benefits of this approach.
- *
- * <p>Note that it is generally better to rely on Dependency Injection
- * ("push" configuration) to configure application objects through setters
- * or constructors, rather than use any form of "pull" configuration like a
- * BeanFactory lookup. Spring's Dependency Injection functionality is
- * implemented using this BeanFactory interface and its subinterfaces.
- *
- * <p>Normally a BeanFactory will load bean definitions stored in a configuration
- * source (such as an XML document), and use the <code>org.springframework.beans</code>
- * package to configure the beans. However, an implementation could simply return
- * Java objects it creates as necessary directly in Java code. There are no
- * constraints on how the definitions could be stored: LDAP, RDBMS, XML,
- * properties file, etc. Implementations are encouraged to support references
- * amongst beans (Dependency Injection).
- *
- * <p>In contrast to the methods in {@link ListableBeanFactory}, all of the
- * operations in this interface will also check parent factories if this is a
- * {@link HierarchicalBeanFactory}. If a bean is not found in this factory instance,
- * the immediate parent factory will be asked. Beans in this factory instance
- * are supposed to override beans of the same name in any parent factory.
- *
- * <p>Bean factory implementations should support the standard bean lifecycle interfaces
- * as far as possible. The full set of initialization methods and their standard order is:<br>
- * 1. BeanNameAware's <code>setBeanName</code><br>
- * 2. BeanClassLoaderAware's <code>setBeanClassLoader</code><br>
- * 3. BeanFactoryAware's <code>setBeanFactory</code><br>
- * 4. ResourceLoaderAware's <code>setResourceLoader</code>
- * (only applicable when running in an application context)<br>
- * 5. ApplicationEventPublisherAware's <code>setApplicationEventPublisher</code>
- * (only applicable when running in an application context)<br>
- * 6. MessageSourceAware's <code>setMessageSource</code>
- * (only applicable when running in an application context)<br>
- * 7. ApplicationContextAware's <code>setApplicationContext</code>
- * (only applicable when running in an application context)<br>
- * 8. ServletContextAware's <code>setServletContext</code>
- * (only applicable when running in a web application context)<br>
- * 9. <code>postProcessBeforeInitialization</code> methods of BeanPostProcessors<br>
- * 10. InitializingBean's <code>afterPropertiesSet</code><br>
- * 11. a custom init-method definition<br>
- * 12. <code>postProcessAfterInitialization</code> methods of BeanPostProcessors
- *
- * <p>On shutdown of a bean factory, the following lifecycle methods apply:<br>
- * 1. DisposableBean's <code>destroy</code><br>
- * 2. a custom destroy-method definition
- *
- * @author Rod Johnson
- * @author Juergen Hoeller
- * @since 13 April 2001
- * @see BeanNameAware#setBeanName
- * @see BeanClassLoaderAware#setBeanClassLoader
- * @see BeanFactoryAware#setBeanFactory
- * @see org.springframework.context.ResourceLoaderAware#setResourceLoader
- * @see org.springframework.context.ApplicationEventPublisherAware#setApplicationEventPublisher
- * @see org.springframework.context.MessageSourceAware#setMessageSource
- * @see org.springframework.context.ApplicationContextAware#setApplicationContext
- * @see org.springframework.web.context.ServletContextAware#setServletContext
- * @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization
- * @see InitializingBean#afterPropertiesSet
- * @see org.springframework.beans.factory.support.RootBeanDefinition#getInitMethodName
- * @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization
- * @see DisposableBean#destroy
- * @see org.springframework.beans.factory.support.RootBeanDefinition#getDestroyMethodName
- */
- public interface BeanFactory {
- /**
- * Used to dereference a {@link FactoryBean} instance and distinguish it from
- * beans <i>created</i> by the FactoryBean. For example, if the bean named
- * <code>myJndiObject</code> is a FactoryBean, getting <code>&myJndiObject</code>
- * will return the factory, not the instance returned by the factory.
- */
- String FACTORY_BEAN_PREFIX = "&";
- /**
- * Return an instance, which may be shared or independent, of the specified bean.
- * <p>This method allows a Spring BeanFactory to be used as a replacement for the
- * Singleton or Prototype design pattern. Callers may retain references to
- * returned objects in the case of Singleton beans.
- * <p>Translates aliases back to the corresponding canonical bean name.
- * Will ask the parent factory if the bean cannot be found in this factory instance.
- * @param name the name of the bean to retrieve
- * @return an instance of the bean
- * @throws NoSuchBeanDefinitionException if there is no bean definition
- * with the specified name
- * @throws BeansException if the bean could not be obtained
- */
- Object getBean(String name) throws BeansException;
- /**
- * Return an instance, which may be shared or independent, of the specified bean.
- * <p>Behaves the same as {@link #getBean(String)}, but provides a measure of type
- * safety by throwing a BeanNotOfRequiredTypeException if the bean is not of the
- * required type. This means that ClassCastException can't be thrown on casting
- * the result correctly, as can happen with {@link #getBean(String)}.
- * <p>Translates aliases back to the corresponding canonical bean name.
- * Will ask the parent factory if the bean cannot be found in this factory instance.
- * @param name the name of the bean to retrieve
- * @param requiredType type the bean must match. Can be an interface or superclass
- * of the actual class, or <code>null</code> for any match. For example, if the value
- * is <code>Object.class</code>, this method will succeed whatever the class of the
- * returned instance.
- * @return an instance of the bean
- * @throws NoSuchBeanDefinitionException if there's no such bean definition
- * @throws BeanNotOfRequiredTypeException if the bean is not of the required type
- * @throws BeansException if the bean could not be created
- */
- <T> T getBean(String name, Class<T> requiredType) throws BeansException;
- /**
- * Return the bean instance that uniquely matches the given object type, if any.
- * @param requiredType type the bean must match; can be an interface or superclass.
- * {@literal null} is disallowed.
- * <p>This method goes into {@link ListableBeanFactory} by-type lookup territory
- * but may also be translated into a conventional by-name lookup based on the name
- * of the given type. For more extensive retrieval operations across sets of beans,
- * use {@link ListableBeanFactory} and/or {@link BeanFactoryUtils}.
- * @return an instance of the single bean matching the required type
- * @throws NoSuchBeanDefinitionException if there is not exactly one matching bean found
- * @since 3.0
- * @see ListableBeanFactory
- */
- <T> T getBean(Class<T> requiredType) throws BeansException;
- /**
- * Return an instance, which may be shared or independent, of the specified bean.
- * <p>Allows for specifying explicit constructor arguments / factory method arguments,
- * overriding the specified default arguments (if any) in the bean definition.
- * @param name the name of the bean to retrieve
- * @param args arguments to use if creating a prototype using explicit arguments to a
- * static factory method. It is invalid to use a non-null args value in any other case.
- * @return an instance of the bean
- * @throws NoSuchBeanDefinitionException if there's no such bean definition
- * @throws BeanDefinitionStoreException if arguments have been given but
- * the affected bean isn't a prototype
- * @throws BeansException if the bean could not be created
- * @since 2.5
- */
- Object getBean(String name, Object... args) throws BeansException;
- /**
- * Does this bean factory contain a bean with the given name? More specifically,
- * is {@link #getBean} able to obtain a bean instance for the given name?
- * <p>Translates aliases back to the corresponding canonical bean name.
- * Will ask the parent factory if the bean cannot be found in this factory instance.
- * @param name the name of the bean to query
- * @return whether a bean with the given name is defined
- */
- boolean containsBean(String name);
- /**
- * Is this bean a shared singleton? That is, will {@link #getBean} always
- * return the same instance?
- * <p>Note: This method returning <code>false</code> does not clearly indicate
- * independent instances. It indicates non-singleton instances, which may correspond
- * to a scoped bean as well. Use the {@link #isPrototype} operation to explicitly
- * check for independent instances.
- * <p>Translates aliases back to the corresponding canonical bean name.
- * Will ask the parent factory if the bean cannot be found in this factory instance.
- * @param name the name of the bean to query
- * @return whether this bean corresponds to a singleton instance
- * @throws NoSuchBeanDefinitionException if there is no bean with the given name
- * @see #getBean
- * @see #isPrototype
- */
- boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
- /**
- * Is this bean a prototype? That is, will {@link #getBean} always return
- * independent instances?
- * <p>Note: This method returning <code>false</code> does not clearly indicate
- * a singleton object. It indicates non-independent instances, which may correspond
- * to a scoped bean as well. Use the {@link #isSingleton} operation to explicitly
- * check for a shared singleton instance.
- * <p>Translates aliases back to the corresponding canonical bean name.
- * Will ask the parent factory if the bean cannot be found in this factory instance.
- * @param name the name of the bean to query
- * @return whether this bean will always deliver independent instances
- * @throws NoSuchBeanDefinitionException if there is no bean with the given name
- * @since 2.0.3
- * @see #getBean
- * @see #isSingleton
- */
- boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
- /**
- * Check whether the bean with the given name matches the specified type.
- * More specifically, check whether a {@link #getBean} call for the given name
- * would return an object that is assignable to the specified target type.
- * <p>Translates aliases back to the corresponding canonical bean name.
- * Will ask the parent factory if the bean cannot be found in this factory instance.
- * @param name the name of the bean to query
- * @param targetType the type to match against
- * @return <code>true</code> if the bean type matches,
- * <code>false</code> if it doesn't match or cannot be determined yet
- * @throws NoSuchBeanDefinitionException if there is no bean with the given name
- * @since 2.0.1
- * @see #getBean
- * @see #getType
- */
- boolean isTypeMatch(String name, Class targetType) throws NoSuchBeanDefinitionException;
- /**
- * Determine the type of the bean with the given name. More specifically,
- * determine the type of object that {@link #getBean} would return for the given name.
- * <p>For a {@link FactoryBean}, return the type of object that the FactoryBean creates,
- * as exposed by {@link FactoryBean#getObjectType()}.
- * <p>Translates aliases back to the corresponding canonical bean name.
- * Will ask the parent factory if the bean cannot be found in this factory instance.
- * @param name the name of the bean to query
- * @return the type of the bean, or <code>null</code> if not determinable
- * @throws NoSuchBeanDefinitionException if there is no bean with the given name
- * @since 1.1.2
- * @see #getBean
- * @see #isTypeMatch
- */
- Class<?> getType(String name) throws NoSuchBeanDefinitionException;
- /**
- * Return the aliases for the given bean name, if any.
- * All of those aliases point to the same bean when used in a {@link #getBean} call.
- * <p>If the given name is an alias, the corresponding original bean name
- * and other aliases (if any) will be returned, with the original bean name
- * being the first element in the array.
- * <p>Will ask the parent factory if the bean cannot be found in this factory instance.
- * @param name the bean name to check for aliases
- * @return the aliases, or an empty array if none
- * @see #getBean
- */
- String[] getAliases(String name);
- }
這個便是spring核心的Bean工廠定義,上面的author說是2001年寫的,已經歷史久遠了,這個類是spring中所有bean工廠,也就是俗稱的IOC容器的祖宗,各種IOC容器都只是它的實現或者為了滿足特別需求的擴充套件實現,包括我們平時用的最多的ApplicationContext。從上面的方法就可以看出,這些工廠的實現最大的作用就是根據bean的名稱亦或型別等等,來返回一個bean的例項。
一個工廠如果想擁有這樣的功能,那麼它一定需要以下幾個因素:
1.需要持有各種bean的定義,否則無法正確的完成bean的例項化。
2.需要持有bean之間的依賴關係,否則在bean例項化的過程中也會出現問題。例如上例,如果我們只是各自持有Person和Company,卻不知道他們的依賴關係,那麼在Company初始化以後,呼叫open方法時,就會報空指標。這是因為Company其實並沒有真正的被正確初始化。
3.以上兩種都要依賴於我們所寫的依賴關係的定義,暫且認為是XML檔案(其實可以是各種各樣的),那麼我們需要一個工具來完成XML檔案的讀取。
我目前想到的,只需要滿足以上三種條件,便可以建立一個bean工廠,來生產各種bean。當然,spring有更高階的做法,以上只是我們直觀的去想如何實現IOC。
其實在上述過程中仍舊有一些問題,比如第一步,我們需要持有bean的定義,如何持有?這是一個問題。我們知道spring的XML配置檔案中,有一個屬性是lazy-init,這就說明,bean在何時例項化我們是可以控制的。這個屬性預設是false,但是我們可以將這個屬性設定為true,也就是說spring容器初始化以後,配置了延遲載入的各種bean都還未產生,它們只在需要的時候出現。
所以我們無法直接的建立一個Map<String,Object>來持有這些bean的例項,在這裡要注意,我們要儲存的是bean的定義,而非例項。
那麼接下來,又是一個祖宗級別的介面要出現了,來看BeanDefinition。
- /*
- * Copyright 2002-2009 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- package org.springframework.beans.factory.config;
- import org.springframework.beans.BeanMetadataElement;
- import org.springframework.beans.MutablePropertyValues;
- import org.springframework.core.AttributeAccessor;
- /**
- * A BeanDefinition describes a bean instance, which has property values,
- * constructor argument values, and further information supplied by
- * concrete implementations.
- *
- * <p>This is just a minimal interface: The main intention is to allow a
- * {@link BeanFactoryPostProcessor} such as {@link PropertyPlaceholderConfigurer}
- * to introspect and modify property values and other bean metadata.
- *
- * @author Juergen Hoeller
- * @author Rob Harrop
- * @since 19.03.2004
- * @see ConfigurableListableBeanFactory#getBeanDefinition
- * @see org.springframework.beans.factory.support.RootBeanDefinition
- * @see org.springframework.beans.factory.support.ChildBeanDefinition
- */
- public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
- /**
- * Scope identifier for the standard singleton scope: "singleton".
- * <p>Note that extended bean factories might support further scopes.
- * @see #setScope
- */
- String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
- /**
- * Scope identifier for the standard prototype scope: "prototype".
- * <p>Note that extended bean factories might support further scopes.
- * @see #setScope
- */
- String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
- /**
- * Role hint indicating that a <code>BeanDefinition</code> is a major part
- * of the application. Typically corresponds to a user-defined bean.
- */
- int ROLE_APPLICATION = 0;
- /**
- * Role hint indicating that a <code>BeanDefinition</code> is a supporting
- * part of some larger configuration, typically an outer
- * {@link org.springframework.beans.factory.parsing.ComponentDefinition}.
- * <code>SUPPORT</code> beans are considered important enough to be aware
- * of when looking more closely at a particular
- * {@link org.springframework.beans.factory.parsing.ComponentDefinition},
- * but not when looking at the overall configuration of an application.
- */
- int ROLE_SUPPORT = 1;
- /**
- * Role hint indicating that a <code>BeanDefinition</code> is providing an
- * entirely background role and has no relevance to the end-user. This hint is
- * used when registering beans that are completely part of the internal workings
- * of a {@link org.springframework.beans.factory.parsing.ComponentDefinition}.
- */
- int ROLE_INFRASTRUCTURE = 2;
- /**
- * Return the name of the parent definition of this bean definition, if any.
- */
- String getParentName();
- /**
- * Set the name of the parent definition of this bean definition, if any.
- */
- void setParentName(String parentName);
- /**
- * Return the current bean class name of this bean definition.
- * <p>Note that this does not have to be the actual class name used at runtime, in
- * case of a child definition overriding/inheriting the class name from its parent.
- * Hence, do <i>not</i> consider this to be the definitive bean type at runtime but
- * rather only use it for parsing purposes at the individual bean definition level.
- */
- String getBeanClassName();
- /**
- * Override the bean class name of this bean definition.
- * <p>The class name can be modified during bean factory post-processing,
- * typically replacing the original class name with a parsed variant of it.
- */
- void setBeanClassName(String beanClassName);
- /**
- * Return the factory bean name, if any.
- */
- String getFactoryBeanName();
- /**
- * Specify the factory bean to use, if any.
- */
- void setFactoryBeanName(String factoryBeanName);
- /**
- * Return a factory method, if any.
- */
- String getFactoryMethodName();
- /**
- * Specify a factory method, if any. This method will be invoked with
- * constructor arguments, or with no arguments if none are specified.
- * The method will be invoked on the specifed factory bean, if any,
- * or as static method on the local bean class else.
- * @param factoryMethodName static factory method name,
- * or <code>null</code> if normal constructor creation should be used
- * @see #getBeanClassName()
- */
- void setFactoryMethodName(String factoryMethodName);
- /**
- * Return the name of the current target scope for this bean,
- * or <code>null</code> if not known yet.
- */
- String getScope();
- /**
- * Override the target scope of this bean, specifying a new scope name.
- * @see #SCOPE_SINGLETON
- * @see #SCOPE_PROTOTYPE
- */
- void setScope(String scope);
- /**
- * Return whether this bean should be lazily initialized, i.e. not
- * eagerly instantiated on startup. Only applicable to a singleton bean.
- */
- boolean isLazyInit();
- /**
- * Set whether this bean should be lazily initialized.
- * <p>If <code>false</code>, the bean will get instantiated on startup by bean
- * factories that perform eager initialization of singletons.
- */
- void setLazyInit(boolean lazyInit);
- /**
- * Return the bean names that this bean depends on.
- */
- String[] getDependsOn();
- /**
- * Set the names of the beans that this bean depends on being initialized.
- * The bean factory will guarantee that these beans get initialized first.
- */
- void setDependsOn(String[] dependsOn);
- /**
- * Return whether this bean is a candidate for getting autowired into some other bean.
- */
- boolean isAutowireCandidate();
- /**
- * Set whether this bean is a candidate for getting autowired into some other bean.
- */
- void setAutowireCandidate(boolean autowireCandidate);
- /**
- * Return whether this bean is a primary autowire candidate.
- * If this value is true for exactly one bean among multiple
- * matching candidates, it will serve as a tie-breaker.
- */
- boolean isPrimary();
- /**
- * Set whether this bean is a primary autowire candidate.
- * <p>If this value is true for exactly one bean among multiple
- * matching candidates, it will serve as a tie-breaker.
- */
- void setPrimary(boolean primary);
- /**
- * Return the constructor argument values for this bean.
- * <p>The returned instance can be modified during bean factory post-processing.
- * @return the ConstructorArgumentValues object (never <code>null</code>)
- */
- ConstructorArgumentValues getConstructorArgumentValues();
- /**
- * Return the property values to be applied to a new instance of the bean.
- * <p>The returned instance can be modified during bean factory post-processing.
- * @return the MutablePropertyValues object (never <code>null</code>)
- */
- MutablePropertyValues getPropertyValues();
- /**
- * Return whether this a <b>Singleton</b>, with a single, shared instance
- * returned on all calls.
- * @see #SCOPE_SINGLETON
- */
- boolean isSingleton();
- /**
- * Return whether this a <b>Prototype</b>, with an independent instance
- * returned for each call.
- * @see #SCOPE_PROTOTYPE
- */
- boolean isPrototype();
- /**
- * Return whether this bean is "abstract", that is, not meant to be instantiated.
- */
- boolean isAbstract();
- /**
- * Get the role hint for this <code>BeanDefinition</code>. The role hint
- * provides tools with an indication of the importance of a particular
- * <code>BeanDefinition</code>.
- * @see #ROLE_APPLICATION
- * @see #ROLE_INFRASTRUCTURE
- * @see #ROLE_SUPPORT
- */
- int getRole();
- /**
- * Return a human-readable description of this bean definition.
- */
- String getDescription();
- /**
- * Return a description of the resource that this bean definition
- * came from (for the purpose of showing context in case of errors).
- */
- String getResourceDescription();
- /**
- * Return the originating BeanDefinition, or <code>null</code> if none.
- * Allows for retrieving the decorated bean definition, if any.
- * <p>Note that this method returns the immediate originator. Iterate through the
- * originator chain to find the original BeanDefinition as defined by the user.
- */
- BeanDefinition getOriginatingBeanDefinition();
- }
顧名思義,這個便是spring中的bean定義介面,所以其實我們工廠裡持有的bean定義,就是一堆這個玩意,或者是他的實現類和子介面。這個介面並非直接的祖宗介面,他所繼承的兩個介面一個是core下面的AttributeAccessor,繼承這個介面就以為這我們的bean定義介面同樣具有處理屬性的能力,而另外一個是beans下面的BeanMetadataElement,字面翻譯這個介面就是bean的後設資料元素,它可以獲得bean的配置定義的一個元素。在XML檔案中來說,就是會持有一個bean標籤。
仔細觀看,能發現beanDefinition中有兩個方法分別是String[] getDependsOn()和void setDependsOn(String[] dependsOn),這兩個方法就是獲取依賴的beanName和設定依賴的beanName,這樣就好辦了,只要我們有一個BeanDefinition,就可以完全的產生一個完整的bean例項。
今天就先到這裡吧,我也是邊看邊寫的,與其說跟我一起學,其實這個系列的應該叫原始碼學習筆記,更多的還是看到哪裡,寫到哪裡,談不上跟我一起學。
如果文中有不周到的地方,希望各位儘管指出。
相關文章
- Spring原始碼剖析2:初探Spring IOC核心流程Spring原始碼
- Spring原始碼剖析1:初探Spring IOC核心流程Spring原始碼
- 【spring原始碼學習】spring的IOC容器之BeanFactoryPostProcessor介面學習Spring原始碼Bean
- 【spring原始碼學習】Spring的IOC容器之BeanPostProcessor介面學習Spring原始碼Bean
- Spring原始碼分析之IoC(二)Spring原始碼
- Linux學習之路(三)Shell指令碼初探Linux指令碼
- Spring5原始碼 - Spring IOC 註解複習Spring原始碼
- 【spring原始碼學習】spring的IOC容器在初始化bean過程Spring原始碼Bean
- spring Ioc 的學習Spring
- spring-IOC容器原始碼分析(二)BeanDefinition註冊流程Spring原始碼Bean
- Spring原始碼之IOC(一)BeanDefinition原始碼解析Spring原始碼Bean
- Spring:原始碼解讀Spring IOC原理Spring原始碼
- Spring學習之——手寫Spring原始碼V2.0(實現IOC、DI、MVC、AOP)Spring原始碼MVC
- Spring原始碼分析之IoC(一)Spring原始碼
- Spring-IOC原始碼淺析Spring原始碼
- spring原始碼解析之IOC容器(二)------載入和註冊Spring原始碼
- Spring Ioc原始碼分析系列--Bean例項化過程(二)Spring原始碼Bean
- redis原始碼學習之工作流程初探Redis原始碼
- Mybatis 原始碼學習(二)MyBatis原始碼
- spring學習:spring原始碼_BeanDefinitionSpring原始碼Bean
- 從原始碼看Spring中IOC容器的實現(二):IOC容器的初始化原始碼Spring
- Spring IOC原始碼深度剖析:Spring IoC迴圈依賴問題Spring原始碼
- Spring學習筆記-IoC容器Spring筆記
- 【spring 原始碼】IOC 之 ClassPathXmlApplicationContextSpring原始碼XMLAPPContext
- Spring原始碼閱讀-IoC容器解析Spring原始碼
- spring原始碼解析之IOC容器(一)Spring原始碼
- Spring IOC容器核心流程原始碼分析Spring原始碼
- 《Spring原始碼分析》IOC的實現Spring原始碼
- 深入理解Spring IOC原始碼分析Spring原始碼
- 學習RadonDB原始碼(二)原始碼
- Spring 高階原始碼核心思想:Spring IoCSpring原始碼
- 手寫Spring ioc 框架,狠狠的“Spring 原始碼Spring框架原始碼
- Spring原始碼分析:Spring IOC容器初始化Spring原始碼
- 【spring原始碼學習】spring的IOC容器之自定義xml配置標籤擴充套件namspaceHandler向IOC容器中註冊beanSpring原始碼XML套件Bean
- 學習Spring 開發指南------Spring初探Spring
- Spring原始碼深度解析(郝佳)-學習-原始碼解析-基於註解注入(二)Spring原始碼
- Spring原始碼分析(二)bean的例項化和IOC依賴注入Spring原始碼Bean依賴注入
- spring原始碼深度解析— IOC 之 bean 建立Spring原始碼Bean