• Spring注解版学习笔记——bean的生命周期与Spring的钩子接口


    几个常见概念的简单介绍:

    1、ApplicationContext,BeanFactory

    ApplicationContext:spring框架本身,IOC,AOP等核心功能都是在这里面实现的。

    BeanFactory:ApplicationContext 是 BeanFactory 的子接口,BeanFactory 中实现了bean对象的定义信息保存,单例对象保存,获取(依据beanName,类或接口类型获取)。

    如果说BeanFactory是Sping的心脏,那么ApplicationContext就是完整的身躯了。

    BeanFactory的三个子接口:
     * HierarchicalBeanFactory:提供父容器的访问功能
     * ListableBeanFactory:提供了批量获取Bean的方法(最常见)
     * AutowireCapableBeanFactory:在BeanFactory基础上实现对已存在实例的管理

    2、BeanDefinition

      1 /**
      2  * A BeanDefinition describes a bean instance, which has property values,
      3  * constructor argument values, and further information supplied by
      4  * concrete implementations.
      5  *
      6  * <p>This is just a minimal interface: The main intention is to allow a
      7  * {@link BeanFactoryPostProcessor} to introspect and modify property values
      8  * and other bean metadata.
      9  *
     10  * @author Juergen Hoeller
     11  * @author Rob Harrop
     12  * @since 19.03.2004
     13  * @see ConfigurableListableBeanFactory#getBeanDefinition
     14  * @see org.springframework.beans.factory.support.RootBeanDefinition
     15  * @see org.springframework.beans.factory.support.ChildBeanDefinition
     16  */
     17 public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
     18 
     19     /**
     20      * Scope identifier for the standard singleton scope: "singleton".
     21      * <p>Note that extended bean factories might support further scopes.
     22      * @see #setScope
     23      */
     24     String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
     25 
     26     /**
     27      * Scope identifier for the standard prototype scope: "prototype".
     28      * <p>Note that extended bean factories might support further scopes.
     29      * @see #setScope
     30      */
     31     String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
     32 
     33 
     34     /**
     35      * Role hint indicating that a {@code BeanDefinition} is a major part
     36      * of the application. Typically corresponds to a user-defined bean.
     37      */
     38     int ROLE_APPLICATION = 0;
     39 
     40     /**
     41      * Role hint indicating that a {@code BeanDefinition} is a supporting
     42      * part of some larger configuration, typically an outer
     43      * {@link org.springframework.beans.factory.parsing.ComponentDefinition}.
     44      * {@code SUPPORT} beans are considered important enough to be aware
     45      * of when looking more closely at a particular
     46      * {@link org.springframework.beans.factory.parsing.ComponentDefinition},
     47      * but not when looking at the overall configuration of an application.
     48      */
     49     int ROLE_SUPPORT = 1;
     50 
     51     /**
     52      * Role hint indicating that a {@code BeanDefinition} is providing an
     53      * entirely background role and has no relevance to the end-user. This hint is
     54      * used when registering beans that are completely part of the internal workings
     55      * of a {@link org.springframework.beans.factory.parsing.ComponentDefinition}.
     56      */
     57     int ROLE_INFRASTRUCTURE = 2;
     58 
     59 
     60     // Modifiable attributes
     61 
     62     /**
     63      * Set the name of the parent definition of this bean definition, if any.
     64      */
     65     void setParentName(@Nullable String parentName);
     66 
     67     /**
     68      * Return the name of the parent definition of this bean definition, if any.
     69      */
     70     @Nullable
     71     String getParentName();
     72 
     73     /**
     74      * Specify the bean class name of this bean definition.
     75      * <p>The class name can be modified during bean factory post-processing,
     76      * typically replacing the original class name with a parsed variant of it.
     77      * @see #setParentName
     78      * @see #setFactoryBeanName
     79      * @see #setFactoryMethodName
     80      */
     81     void setBeanClassName(@Nullable String beanClassName);
     82 
     83     /**
     84      * Return the current bean class name of this bean definition.
     85      * <p>Note that this does not have to be the actual class name used at runtime, in
     86      * case of a child definition overriding/inheriting the class name from its parent.
     87      * Also, this may just be the class that a factory method is called on, or it may
     88      * even be empty in case of a factory bean reference that a method is called on.
     89      * Hence, do <i>not</i> consider this to be the definitive bean type at runtime but
     90      * rather only use it for parsing purposes at the individual bean definition level.
     91      * @see #getParentName()
     92      * @see #getFactoryBeanName()
     93      * @see #getFactoryMethodName()
     94      */
     95     @Nullable
     96     String getBeanClassName();
     97 
     98     /**
     99      * Override the target scope of this bean, specifying a new scope name.
    100      * @see #SCOPE_SINGLETON
    101      * @see #SCOPE_PROTOTYPE
    102      */
    103     void setScope(@Nullable String scope);
    104 
    105     /**
    106      * Return the name of the current target scope for this bean,
    107      * or {@code null} if not known yet.
    108      */
    109     @Nullable
    110     String getScope();
    111 
    112     /**
    113      * Set whether this bean should be lazily initialized.
    114      * <p>If {@code false}, the bean will get instantiated on startup by bean
    115      * factories that perform eager initialization of singletons.
    116      */
    117     void setLazyInit(boolean lazyInit);
    118 
    119     /**
    120      * Return whether this bean should be lazily initialized, i.e. not
    121      * eagerly instantiated on startup. Only applicable to a singleton bean.
    122      */
    123     boolean isLazyInit();
    124 
    125     /**
    126      * Set the names of the beans that this bean depends on being initialized.
    127      * The bean factory will guarantee that these beans get initialized first.
    128      */
    129     void setDependsOn(@Nullable String... dependsOn);
    130 
    131     /**
    132      * Return the bean names that this bean depends on.
    133      */
    134     @Nullable
    135     String[] getDependsOn();
    136 
    137     /**
    138      * Set whether this bean is a candidate for getting autowired into some other bean.
    139      * <p>Note that this flag is designed to only affect type-based autowiring.
    140      * It does not affect explicit references by name, which will get resolved even
    141      * if the specified bean is not marked as an autowire candidate. As a consequence,
    142      * autowiring by name will nevertheless inject a bean if the name matches.
    143      */
    144     void setAutowireCandidate(boolean autowireCandidate);
    145 
    146     /**
    147      * Return whether this bean is a candidate for getting autowired into some other bean.
    148      */
    149     boolean isAutowireCandidate();
    150 
    151     /**
    152      * Set whether this bean is a primary autowire candidate.
    153      * <p>If this value is {@code true} for exactly one bean among multiple
    154      * matching candidates, it will serve as a tie-breaker.
    155      */
    156     void setPrimary(boolean primary);
    157 
    158     /**
    159      * Return whether this bean is a primary autowire candidate.
    160      */
    161     boolean isPrimary();
    162 
    163     /**
    164      * Specify the factory bean to use, if any.
    165      * This the name of the bean to call the specified factory method on.
    166      * @see #setFactoryMethodName
    167      */
    168     void setFactoryBeanName(@Nullable String factoryBeanName);
    169 
    170     /**
    171      * Return the factory bean name, if any.
    172      */
    173     @Nullable
    174     String getFactoryBeanName();
    175 
    176     /**
    177      * Specify a factory method, if any. This method will be invoked with
    178      * constructor arguments, or with no arguments if none are specified.
    179      * The method will be invoked on the specified factory bean, if any,
    180      * or otherwise as a static method on the local bean class.
    181      * @see #setFactoryBeanName
    182      * @see #setBeanClassName
    183      */
    184     void setFactoryMethodName(@Nullable String factoryMethodName);
    185 
    186     /**
    187      * Return a factory method, if any.
    188      */
    189     @Nullable
    190     String getFactoryMethodName();
    191 
    192     /**
    193      * Return the constructor argument values for this bean.
    194      * <p>The returned instance can be modified during bean factory post-processing.
    195      * @return the ConstructorArgumentValues object (never {@code null})
    196      */
    197     ConstructorArgumentValues getConstructorArgumentValues();
    198 
    199     /**
    200      * Return if there are constructor argument values defined for this bean.
    201      * @since 5.0.2
    202      */
    203     default boolean hasConstructorArgumentValues() {
    204         return !getConstructorArgumentValues().isEmpty();
    205     }
    206 
    207     /**
    208      * Return the property values to be applied to a new instance of the bean.
    209      * <p>The returned instance can be modified during bean factory post-processing.
    210      * @return the MutablePropertyValues object (never {@code null})
    211      */
    212     MutablePropertyValues getPropertyValues();
    213 
    214     /**
    215      * Return if there are property values values defined for this bean.
    216      * @since 5.0.2
    217      */
    218     default boolean hasPropertyValues() {
    219         return !getPropertyValues().isEmpty();
    220     }
    221 
    222     /**
    223      * Set the name of the initializer method.
    224      * @since 5.1
    225      */
    226     void setInitMethodName(@Nullable String initMethodName);
    227 
    228     /**
    229      * Return the name of the initializer method.
    230      * @since 5.1
    231      */
    232     @Nullable
    233     String getInitMethodName();
    234 
    235     /**
    236      * Set the name of the destroy method.
    237      * @since 5.1
    238      */
    239     void setDestroyMethodName(@Nullable String destroyMethodName);
    240 
    241     /**
    242      * Return the name of the destroy method.
    243      * @since 5.1
    244      */
    245     @Nullable
    246     String getDestroyMethodName();
    247 
    248     /**
    249      * Set the role hint for this {@code BeanDefinition}. The role hint
    250      * provides the frameworks as well as tools with an indication of
    251      * the role and importance of a particular {@code BeanDefinition}.
    252      * @since 5.1
    253      * @see #ROLE_APPLICATION
    254      * @see #ROLE_SUPPORT
    255      * @see #ROLE_INFRASTRUCTURE
    256      */
    257     void setRole(int role);
    258 
    259     /**
    260      * Get the role hint for this {@code BeanDefinition}. The role hint
    261      * provides the frameworks as well as tools with an indication of
    262      * the role and importance of a particular {@code BeanDefinition}.
    263      * @see #ROLE_APPLICATION
    264      * @see #ROLE_SUPPORT
    265      * @see #ROLE_INFRASTRUCTURE
    266      */
    267     int getRole();
    268 
    269     /**
    270      * Set a human-readable description of this bean definition.
    271      * @since 5.1
    272      */
    273     void setDescription(@Nullable String description);
    274 
    275     /**
    276      * Return a human-readable description of this bean definition.
    277      */
    278     @Nullable
    279     String getDescription();
    280 
    281 
    282     // Read-only attributes
    283 
    284     /**
    285      * Return a resolvable type for this bean definition,
    286      * based on the bean class or other specific metadata.
    287      * <p>This is typically fully resolved on a runtime-merged bean definition
    288      * but not necessarily on a configuration-time definition instance.
    289      * @return the resolvable type (potentially {@link ResolvableType#NONE})
    290      * @since 5.2
    291      * @see ConfigurableBeanFactory#getMergedBeanDefinition
    292      */
    293     ResolvableType getResolvableType();
    294 
    295     /**
    296      * Return whether this a <b>Singleton</b>, with a single, shared instance
    297      * returned on all calls.
    298      * @see #SCOPE_SINGLETON
    299      */
    300     boolean isSingleton();
    301 
    302     /**
    303      * Return whether this a <b>Prototype</b>, with an independent instance
    304      * returned for each call.
    305      * @since 3.0
    306      * @see #SCOPE_PROTOTYPE
    307      */
    308     boolean isPrototype();
    309 
    310     /**
    311      * Return whether this bean is "abstract", that is, not meant to be instantiated.
    312      */
    313     boolean isAbstract();
    314 
    315     /**
    316      * Return a description of the resource that this bean definition
    317      * came from (for the purpose of showing context in case of errors).
    318      */
    319     @Nullable
    320     String getResourceDescription();
    321 
    322     /**
    323      * Return the originating BeanDefinition, or {@code null} if none.
    324      * Allows for retrieving the decorated bean definition, if any.
    325      * <p>Note that this method returns the immediate originator. Iterate through the
    326      * originator chain to find the original BeanDefinition as defined by the user.
    327      */
    328     @Nullable
    329     BeanDefinition getOriginatingBeanDefinition();
    330 
    331 }
    View Code

    从BeanDefinition源码可以看出,BeanDefinition保存了Bean的所有定义信息,包括类名,scope,属性,构造函数列表,是否单例,是否懒加载等等。其实spring后续创建对象bean,就是通过拿到BeanDefinition,然后通过反射创建而成。

    实现类:ChildBeanDefinition、RootBeanDefinition、GenericBeanDefinition等。

    3、BeanDefinitionRegistry

     1 /**
     2  * Interface for registries that hold bean definitions, for example RootBeanDefinition
     3  * and ChildBeanDefinition instances. Typically implemented by BeanFactories that
     4  * internally work with the AbstractBeanDefinition hierarchy.
     5  *
     6  * <p>This is the only interface in Spring's bean factory packages that encapsulates
     7  * <i>registration</i> of bean definitions. The standard BeanFactory interfaces
     8  * only cover access to a <i>fully configured factory instance</i>.
     9  *
    10  * <p>Spring's bean definition readers expect to work on an implementation of this
    11  * interface. Known implementors within the Spring core are DefaultListableBeanFactory
    12  * and GenericApplicationContext.
    13  *
    14  * @author Juergen Hoeller
    15  * @since 26.11.2003
    16  * @see org.springframework.beans.factory.config.BeanDefinition
    17  * @see AbstractBeanDefinition
    18  * @see RootBeanDefinition
    19  * @see ChildBeanDefinition
    20  * @see DefaultListableBeanFactory
    21  * @see org.springframework.context.support.GenericApplicationContext
    22  * @see org.springframework.beans.factory.xml.XmlBeanDefinitionReader
    23  * @see PropertiesBeanDefinitionReader
    24  */
    25 public interface BeanDefinitionRegistry extends AliasRegistry {
    26 
    27     /**
    28      * Register a new bean definition with this registry.
    29      * Must support RootBeanDefinition and ChildBeanDefinition.
    30      * @param beanName the name of the bean instance to register
    31      * @param beanDefinition definition of the bean instance to register
    32      * @throws BeanDefinitionStoreException if the BeanDefinition is invalid
    33      * @throws BeanDefinitionOverrideException if there is already a BeanDefinition
    34      * for the specified bean name and we are not allowed to override it
    35      * @see GenericBeanDefinition
    36      * @see RootBeanDefinition
    37      * @see ChildBeanDefinition
    38      */
    39     void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
    40             throws BeanDefinitionStoreException;
    41 
    42     /**
    43      * Remove the BeanDefinition for the given name.
    44      * @param beanName the name of the bean instance to register
    45      * @throws NoSuchBeanDefinitionException if there is no such bean definition
    46      */
    47     void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
    48 
    49     /**
    50      * Return the BeanDefinition for the given bean name.
    51      * @param beanName name of the bean to find a definition for
    52      * @return the BeanDefinition for the given name (never {@code null})
    53      * @throws NoSuchBeanDefinitionException if there is no such bean definition
    54      */
    55     BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
    56 
    57     /**
    58      * Check if this registry contains a bean definition with the given name.
    59      * @param beanName the name of the bean to look for
    60      * @return if this registry contains a bean definition with the given name
    61      */
    62     boolean containsBeanDefinition(String beanName);
    63 
    64     /**
    65      * Return the names of all beans defined in this registry.
    66      * @return the names of all beans defined in this registry,
    67      * or an empty array if none defined
    68      */
    69     String[] getBeanDefinitionNames();
    70 
    71     /**
    72      * Return the number of beans defined in the registry.
    73      * @return the number of beans defined in the registry
    74      */
    75     int getBeanDefinitionCount();
    76 
    77     /**
    78      * Determine whether the given bean name is already in use within this registry,
    79      * i.e. whether there is a local bean or alias registered under this name.
    80      * @param beanName the name to check
    81      * @return whether the given bean name is already in use
    82      */
    83     boolean isBeanNameInUse(String beanName);
    84 
    85 }
    View Code

    接口类,BeanDefinition增删改查操作。可以看出容器中每一个BeanDefinition都有一个对应的beanName,事实上BeanFactory内部保存BeanDefinition的结构就是一个ConcurrentHashMap<String, BeanDefinition>

    4、XxxMetadata

    元数据:与之相关的所有信息的集合体,常用于接口之间的参数传递

    AnnotationMetadata:注解的元数据

      1 /**
      2  * Interface that defines abstract access to the annotations of a specific
      3  * class, in a form that does not require that class to be loaded yet.
      4  *
      5  * @author Juergen Hoeller
      6  * @author Mark Fisher
      7  * @author Phillip Webb
      8  * @author Sam Brannen
      9  * @since 2.5
     10  * @see StandardAnnotationMetadata
     11  * @see org.springframework.core.type.classreading.MetadataReader#getAnnotationMetadata()
     12  * @see AnnotatedTypeMetadata
     13  */
     14 public interface AnnotationMetadata extends ClassMetadata, AnnotatedTypeMetadata {
     15 
     16     /**
     17      * Get the fully qualified class names of all annotation types that
     18      * are <em>present</em> on the underlying class.
     19      * @return the annotation type names
     20      */
     21     default Set<String> getAnnotationTypes() {
     22         return getAnnotations().stream()
     23                 .filter(MergedAnnotation::isDirectlyPresent)
     24                 .map(annotation -> annotation.getType().getName())
     25                 .collect(Collectors.toCollection(LinkedHashSet::new));
     26     }
     27 
     28     /**
     29      * Get the fully qualified class names of all meta-annotation types that
     30      * are <em>present</em> on the given annotation type on the underlying class.
     31      * @param annotationName the fully qualified class name of the meta-annotation
     32      * type to look for
     33      * @return the meta-annotation type names, or an empty set if none found
     34      */
     35     default Set<String> getMetaAnnotationTypes(String annotationName) {
     36         MergedAnnotation<?> annotation = getAnnotations().get(annotationName, MergedAnnotation::isDirectlyPresent);
     37         if (!annotation.isPresent()) {
     38             return Collections.emptySet();
     39         }
     40         return MergedAnnotations.from(annotation.getType(), SearchStrategy.INHERITED_ANNOTATIONS).stream()
     41                 .map(mergedAnnotation -> mergedAnnotation.getType().getName())
     42                 .collect(Collectors.toCollection(LinkedHashSet::new));
     43     }
     44 
     45     /**
     46      * Determine whether an annotation of the given type is <em>present</em> on
     47      * the underlying class.
     48      * @param annotationName the fully qualified class name of the annotation
     49      * type to look for
     50      * @return {@code true} if a matching annotation is present
     51      */
     52     default boolean hasAnnotation(String annotationName) {
     53         return getAnnotations().isDirectlyPresent(annotationName);
     54     }
     55 
     56     /**
     57      * Determine whether the underlying class has an annotation that is itself
     58      * annotated with the meta-annotation of the given type.
     59      * @param metaAnnotationName the fully qualified class name of the
     60      * meta-annotation type to look for
     61      * @return {@code true} if a matching meta-annotation is present
     62      */
     63     default boolean hasMetaAnnotation(String metaAnnotationName) {
     64         return getAnnotations().get(metaAnnotationName,
     65                 MergedAnnotation::isMetaPresent).isPresent();
     66     }
     67 
     68     /**
     69      * Determine whether the underlying class has any methods that are
     70      * annotated (or meta-annotated) with the given annotation type.
     71      * @param annotationName the fully qualified class name of the annotation
     72      * type to look for
     73      */
     74     default boolean hasAnnotatedMethods(String annotationName) {
     75         return !getAnnotatedMethods(annotationName).isEmpty();
     76     }
     77 
     78     /**
     79      * Retrieve the method metadata for all methods that are annotated
     80      * (or meta-annotated) with the given annotation type.
     81      * <p>For any returned method, {@link MethodMetadata#isAnnotated} will
     82      * return {@code true} for the given annotation type.
     83      * @param annotationName the fully qualified class name of the annotation
     84      * type to look for
     85      * @return a set of {@link MethodMetadata} for methods that have a matching
     86      * annotation. The return value will be an empty set if no methods match
     87      * the annotation type.
     88      */
     89     Set<MethodMetadata> getAnnotatedMethods(String annotationName);
     90 
     91 
     92     /**
     93      * Factory method to create a new {@link AnnotationMetadata} instance
     94      * for the given class using standard reflection.
     95      * @param type the class to introspect
     96      * @return a new {@link AnnotationMetadata} instance
     97      * @since 5.2
     98      */
     99     static AnnotationMetadata introspect(Class<?> type) {
    100         return StandardAnnotationMetadata.from(type);
    101     }
    102 
    103 }
    View Code

    5、BeanPostProcessor

    bean初始化的后置处理器

     1 /**
     2  * Factory hook that allows for custom modification of new bean instances &mdash;
     3  * for example, checking for marker interfaces or wrapping beans with proxies.
     4  *
     5  * <p>Typically, post-processors that populate beans via marker interfaces
     6  * or the like will implement {@link #postProcessBeforeInitialization},
     7  * while post-processors that wrap beans with proxies will normally
     8  * implement {@link #postProcessAfterInitialization}.
     9  *
    10  * <h3>Registration</h3>
    11  * <p>An {@code ApplicationContext} can autodetect {@code BeanPostProcessor} beans
    12  * in its bean definitions and apply those post-processors to any beans subsequently
    13  * created. A plain {@code BeanFactory} allows for programmatic registration of
    14  * post-processors, applying them to all beans created through the bean factory.
    15  *
    16  * <h3>Ordering</h3>
    17  * <p>{@code BeanPostProcessor} beans that are autodetected in an
    18  * {@code ApplicationContext} will be ordered according to
    19  * {@link org.springframework.core.PriorityOrdered} and
    20  * {@link org.springframework.core.Ordered} semantics. In contrast,
    21  * {@code BeanPostProcessor} beans that are registered programmatically with a
    22  * {@code BeanFactory} will be applied in the order of registration; any ordering
    23  * semantics expressed through implementing the
    24  * {@code PriorityOrdered} or {@code Ordered} interface will be ignored for
    25  * programmatically registered post-processors. Furthermore, the
    26  * {@link org.springframework.core.annotation.Order @Order} annotation is not
    27  * taken into account for {@code BeanPostProcessor} beans.
    28  *
    29  * @author Juergen Hoeller
    30  * @author Sam Brannen
    31  * @since 10.10.2003
    32  * @see InstantiationAwareBeanPostProcessor
    33  * @see DestructionAwareBeanPostProcessor
    34  * @see ConfigurableBeanFactory#addBeanPostProcessor
    35  * @see BeanFactoryPostProcessor
    36  */
    37 public interface BeanPostProcessor {
    38 
    39     /**
    40      * Apply this {@code BeanPostProcessor} to the given new bean instance <i>before</i> any bean
    41      * initialization callbacks (like InitializingBean's {@code afterPropertiesSet}
    42      * or a custom init-method). The bean will already be populated with property values.
    43      * The returned bean instance may be a wrapper around the original.
    44      * <p>The default implementation returns the given {@code bean} as-is.
    45      * @param bean the new bean instance
    46      * @param beanName the name of the bean
    47      * @return the bean instance to use, either the original or a wrapped one;
    48      * if {@code null}, no subsequent BeanPostProcessors will be invoked
    49      * @throws org.springframework.beans.BeansException in case of errors
    50      * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet
    51      */
    52     @Nullable
    53     default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    54         return bean;
    55     }
    56 
    57     /**
    58      * Apply this {@code BeanPostProcessor} to the given new bean instance <i>after</i> any bean
    59      * initialization callbacks (like InitializingBean's {@code afterPropertiesSet}
    60      * or a custom init-method). The bean will already be populated with property values.
    61      * The returned bean instance may be a wrapper around the original.
    62      * <p>In case of a FactoryBean, this callback will be invoked for both the FactoryBean
    63      * instance and the objects created by the FactoryBean (as of Spring 2.0). The
    64      * post-processor can decide whether to apply to either the FactoryBean or created
    65      * objects or both through corresponding {@code bean instanceof FactoryBean} checks.
    66      * <p>This callback will also be invoked after a short-circuiting triggered by a
    67      * {@link InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation} method,
    68      * in contrast to all other {@code BeanPostProcessor} callbacks.
    69      * <p>The default implementation returns the given {@code bean} as-is.
    70      * @param bean the new bean instance
    71      * @param beanName the name of the bean
    72      * @return the bean instance to use, either the original or a wrapped one;
    73      * if {@code null}, no subsequent BeanPostProcessors will be invoked
    74      * @throws org.springframework.beans.BeansException in case of errors
    75      * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet
    76      * @see org.springframework.beans.factory.FactoryBean
    77      */
    78     @Nullable
    79     default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    80         return bean;
    81     }
    82 
    83 }
    View Code

    spring的钩子接口之一,在每一个bean初始化前后分别调用 所有BeanPostProcessor的postProcessBeforeInitialization,postProcessAfterInitialization两个函数。在bean已经被实例化,属性值也被赋值以后,在调用bean指定的初始化方法前后会被调用。

    6、 XxxAware

    Spring中提供了各种Aware接口,方便从上下文中获取当前的运行环境,比较常见的几个子接口有:
    BeanFactoryAware,BeanNameAware,ApplicationContextAware,EnvironmentAware,BeanClassLoaderAware等,这些Aware的作用都可以从命名得知,并且其使用也是十分简单。

     1 /**
     2  * Interface to be implemented by any object that wishes to be notified
     3  * of the {@link ApplicationContext} that it runs in.
     4  *
     5  * <p>Implementing this interface makes sense for example when an object
     6  * requires access to a set of collaborating beans. Note that configuration
     7  * via bean references is preferable to implementing this interface just
     8  * for bean lookup purposes.
     9  *
    10  * <p>This interface can also be implemented if an object needs access to file
    11  * resources, i.e. wants to call {@code getResource}, wants to publish
    12  * an application event, or requires access to the MessageSource. However,
    13  * it is preferable to implement the more specific {@link ResourceLoaderAware},
    14  * {@link ApplicationEventPublisherAware} or {@link MessageSourceAware} interface
    15  * in such a specific scenario.
    16  *
    17  * <p>Note that file resource dependencies can also be exposed as bean properties
    18  * of type {@link org.springframework.core.io.Resource}, populated via Strings
    19  * with automatic type conversion by the bean factory. This removes the need
    20  * for implementing any callback interface just for the purpose of accessing
    21  * a specific file resource.
    22  *
    23  * <p>{@link org.springframework.context.support.ApplicationObjectSupport} is a
    24  * convenience base class for application objects, implementing this interface.
    25  *
    26  * <p>For a list of all bean lifecycle methods, see the
    27  * {@link org.springframework.beans.factory.BeanFactory BeanFactory javadocs}.
    28  *
    29  * @author Rod Johnson
    30  * @author Juergen Hoeller
    31  * @author Chris Beams
    32  * @see ResourceLoaderAware
    33  * @see ApplicationEventPublisherAware
    34  * @see MessageSourceAware
    35  * @see org.springframework.context.support.ApplicationObjectSupport
    36  * @see org.springframework.beans.factory.BeanFactoryAware
    37  */
    38 public interface ApplicationContextAware extends Aware {
    39 
    40     /**
    41      * Set the ApplicationContext that this object runs in.
    42      * Normally this call will be used to initialize the object.
    43      * <p>Invoked after population of normal bean properties but before an init callback such
    44      * as {@link org.springframework.beans.factory.InitializingBean#afterPropertiesSet()}
    45      * or a custom init-method. Invoked after {@link ResourceLoaderAware#setResourceLoader},
    46      * {@link ApplicationEventPublisherAware#setApplicationEventPublisher} and
    47      * {@link MessageSourceAware}, if applicable.
    48      * @param applicationContext the ApplicationContext object to be used by this object
    49      * @throws ApplicationContextException in case of context initialization errors
    50      * @throws BeansException if thrown by application context methods
    51      * @see org.springframework.beans.factory.BeanInitializationException
    52      */
    53     void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
    54 
    55 }
    View Code
     1 /**
     2  * A marker superinterface indicating that a bean is eligible to be notified by the
     3  * Spring container of a particular framework object through a callback-style method.
     4  * The actual method signature is determined by individual subinterfaces but should
     5  * typically consist of just one void-returning method that accepts a single argument.
     6  *
     7  * <p>Note that merely implementing {@link Aware} provides no default functionality.
     8  * Rather, processing must be done explicitly, for example in a
     9  * {@link org.springframework.beans.factory.config.BeanPostProcessor}.
    10  * Refer to {@link org.springframework.context.support.ApplicationContextAwareProcessor}
    11  * for an example of processing specific {@code *Aware} interface callbacks.
    12  *
    13  * @author Chris Beams
    14  * @author Juergen Hoeller
    15  * @since 3.1
    16  */
    17 public interface Aware {
    18 
    19 }
    View Code
     1 /**
     2  * {@link BeanPostProcessor} implementation that supplies the {@code ApplicationContext},
     3  * {@link org.springframework.core.env.Environment Environment}, or
     4  * {@link StringValueResolver} for the {@code ApplicationContext} to beans that
     5  * implement the {@link EnvironmentAware}, {@link EmbeddedValueResolverAware},
     6  * {@link ResourceLoaderAware}, {@link ApplicationEventPublisherAware},
     7  * {@link MessageSourceAware}, and/or {@link ApplicationContextAware} interfaces.
     8  *
     9  * <p>Implemented interfaces are satisfied in the order in which they are
    10  * mentioned above.
    11  *
    12  * <p>Application contexts will automatically register this with their
    13  * underlying bean factory. Applications do not use this directly.
    14  *
    15  * @author Juergen Hoeller
    16  * @author Costin Leau
    17  * @author Chris Beams
    18  * @since 10.10.2003
    19  * @see org.springframework.context.EnvironmentAware
    20  * @see org.springframework.context.EmbeddedValueResolverAware
    21  * @see org.springframework.context.ResourceLoaderAware
    22  * @see org.springframework.context.ApplicationEventPublisherAware
    23  * @see org.springframework.context.MessageSourceAware
    24  * @see org.springframework.context.ApplicationContextAware
    25  * @see org.springframework.context.support.AbstractApplicationContext#refresh()
    26  */
    27 class ApplicationContextAwareProcessor implements BeanPostProcessor {
    28 
    29     private final ConfigurableApplicationContext applicationContext;
    30 
    31     private final StringValueResolver embeddedValueResolver;
    32 
    33 
    34     /**
    35      * Create a new ApplicationContextAwareProcessor for the given context.
    36      */
    37     public ApplicationContextAwareProcessor(ConfigurableApplicationContext applicationContext) {
    38         this.applicationContext = applicationContext;
    39         this.embeddedValueResolver = new EmbeddedValueResolver(applicationContext.getBeanFactory());
    40     }
    41 
    42 
    43     @Override
    44     @Nullable
    45     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    46         if (!(bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||
    47                 bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||
    48                 bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)){
    49             return bean;
    50         }
    51 
    52         AccessControlContext acc = null;
    53 
    54         if (System.getSecurityManager() != null) {
    55             acc = this.applicationContext.getBeanFactory().getAccessControlContext();
    56         }
    57 
    58         if (acc != null) {
    59             AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
    60                 invokeAwareInterfaces(bean);
    61                 return null;
    62             }, acc);
    63         }
    64         else {
    65             invokeAwareInterfaces(bean);
    66         }
    67 
    68         return bean;
    69     }
    70 
    71     private void invokeAwareInterfaces(Object bean) {
    72         if (bean instanceof EnvironmentAware) {
    73             ((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
    74         }
    75         if (bean instanceof EmbeddedValueResolverAware) {
    76             ((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);
    77         }
    78         if (bean instanceof ResourceLoaderAware) {
    79             ((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
    80         }
    81         if (bean instanceof ApplicationEventPublisherAware) {
    82             ((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);
    83         }
    84         if (bean instanceof MessageSourceAware) {
    85             ((MessageSourceAware) bean).setMessageSource(this.applicationContext);
    86         }
    87         if (bean instanceof ApplicationContextAware) {
    88             ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
    89         }
    90     }
    91 
    92 }
    View Code

    钩子接口,可以看到XxxAware本质上是利用了ApplicationContextAwareProcessor(BeanPostProcessor的实现类)实现 BeanFactory,BeanName,ApplicationContext,Environment,BeanClassLoader等spring框架相关对象向子对象的传递。

    7、BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor

    先看各自接口源码:

     1 /**
     2  * Allows for custom modification of an application context's bean definitions,
     3  * adapting the bean property values of the context's underlying bean factory.
     4  *
     5  * <p>Application contexts can auto-detect BeanFactoryPostProcessor beans in
     6  * their bean definitions and apply them before any other beans get created.
     7  *
     8  * <p>Useful for custom config files targeted at system administrators that
     9  * override bean properties configured in the application context.
    10  *
    11  * <p>See PropertyResourceConfigurer and its concrete implementations
    12  * for out-of-the-box solutions that address such configuration needs.
    13  *
    14  * <p>A BeanFactoryPostProcessor may interact with and modify bean
    15  * definitions, but never bean instances. Doing so may cause premature bean
    16  * instantiation, violating the container and causing unintended side-effects.
    17  * If bean instance interaction is required, consider implementing
    18  * {@link BeanPostProcessor} instead.
    19  *
    20  * @author Juergen Hoeller
    21  * @since 06.07.2003
    22  * @see BeanPostProcessor
    23  * @see PropertyResourceConfigurer
    24  */
    25 @FunctionalInterface
    26 public interface BeanFactoryPostProcessor {
    27 
    28     /**
    29      * Modify the application context's internal bean factory after its standard
    30      * initialization. All bean definitions will have been loaded, but no beans
    31      * will have been instantiated yet. This allows for overriding or adding
    32      * properties even to eager-initializing beans.
    33      * @param beanFactory the bean factory used by the application context
    34      * @throws org.springframework.beans.BeansException in case of errors
    35      */
    36     void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
    37 
    38 }
    View Code
     1 /**
     2  * Extension to the standard {@link BeanFactoryPostProcessor} SPI, allowing for
     3  * the registration of further bean definitions <i>before</i> regular
     4  * BeanFactoryPostProcessor detection kicks in. In particular,
     5  * BeanDefinitionRegistryPostProcessor may register further bean definitions
     6  * which in turn define BeanFactoryPostProcessor instances.
     7  *
     8  * @author Juergen Hoeller
     9  * @since 3.0.1
    10  * @see org.springframework.context.annotation.ConfigurationClassPostProcessor
    11  */
    12 public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
    13 
    14     /**
    15      * Modify the application context's internal bean definition registry after its
    16      * standard initialization. All regular bean definitions will have been loaded,
    17      * but no beans will have been instantiated yet. This allows for adding further
    18      * bean definitions before the next post-processing phase kicks in.
    19      * @param registry the bean definition registry used by the application context
    20      * @throws org.springframework.beans.BeansException in case of errors
    21      */
    22     void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
    23 
    24 }
    View Code

    钩子接口,可以看出BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的扩展接口,下文会介绍到,在Spring容器初始化过程中(beanFactory准备好,但是任何bean还未实例化的时候),会按顺序回调每一个BeanDefinitionRegistryPostProcessor的 postProcessBeanDefinitionRegistry 和 postProcessBeanFactory 方法,再回调每一个 BeanFactoryPostProcessor 的 postProcessBeanFactory 方法。

    需要注意的是,BeanDefinitionRegistryPostProcessor 一般用于往 BeanDefinitionRegister里面注入新的BeanDefinition,事实上这也是@Import内部实现的原理。

     8、InstantiationAwareBeanPostProcessor

     1 /**
     2  * Subinterface of {@link BeanPostProcessor} that adds a before-instantiation callback,
     3  * and a callback after instantiation but before explicit properties are set or
     4  * autowiring occurs.
     5  *
     6  * <p>Typically used to suppress default instantiation for specific target beans,
     7  * for example to create proxies with special TargetSources (pooling targets,
     8  * lazily initializing targets, etc), or to implement additional injection strategies
     9  * such as field injection.
    10  *
    11  * <p><b>NOTE:</b> This interface is a special purpose interface, mainly for
    12  * internal use within the framework. It is recommended to implement the plain
    13  * {@link BeanPostProcessor} interface as far as possible, or to derive from
    14  * {@link InstantiationAwareBeanPostProcessorAdapter} in order to be shielded
    15  * from extensions to this interface.
    16  *
    17  * @author Juergen Hoeller
    18  * @author Rod Johnson
    19  * @since 1.2
    20  * @see org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#setCustomTargetSourceCreators
    21  * @see org.springframework.aop.framework.autoproxy.target.LazyInitTargetSourceCreator
    22  */
    23 public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
    24 
    25     /**
    26      * Apply this BeanPostProcessor <i>before the target bean gets instantiated</i>.
    27      * The returned bean object may be a proxy to use instead of the target bean,
    28      * effectively suppressing default instantiation of the target bean.
    29      * <p>If a non-null object is returned by this method, the bean creation process
    30      * will be short-circuited. The only further processing applied is the
    31      * {@link #postProcessAfterInitialization} callback from the configured
    32      * {@link BeanPostProcessor BeanPostProcessors}.
    33      * <p>This callback will be applied to bean definitions with their bean class,
    34      * as well as to factory-method definitions in which case the returned bean type
    35      * will be passed in here.
    36      * <p>Post-processors may implement the extended
    37      * {@link SmartInstantiationAwareBeanPostProcessor} interface in order
    38      * to predict the type of the bean object that they are going to return here.
    39      * <p>The default implementation returns {@code null}.
    40      * @param beanClass the class of the bean to be instantiated
    41      * @param beanName the name of the bean
    42      * @return the bean object to expose instead of a default instance of the target bean,
    43      * or {@code null} to proceed with default instantiation
    44      * @throws org.springframework.beans.BeansException in case of errors
    45      * @see #postProcessAfterInstantiation
    46      * @see org.springframework.beans.factory.support.AbstractBeanDefinition#getBeanClass()
    47      * @see org.springframework.beans.factory.support.AbstractBeanDefinition#getFactoryMethodName()
    48      */
    49     @Nullable
    50     default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
    51         return null;
    52     }
    53 
    54     /**
    55      * Perform operations after the bean has been instantiated, via a constructor or factory method,
    56      * but before Spring property population (from explicit properties or autowiring) occurs.
    57      * <p>This is the ideal callback for performing custom field injection on the given bean
    58      * instance, right before Spring's autowiring kicks in.
    59      * <p>The default implementation returns {@code true}.
    60      * @param bean the bean instance created, with properties not having been set yet
    61      * @param beanName the name of the bean
    62      * @return {@code true} if properties should be set on the bean; {@code false}
    63      * if property population should be skipped. Normal implementations should return {@code true}.
    64      * Returning {@code false} will also prevent any subsequent InstantiationAwareBeanPostProcessor
    65      * instances being invoked on this bean instance.
    66      * @throws org.springframework.beans.BeansException in case of errors
    67      * @see #postProcessBeforeInstantiation
    68      */
    69     default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
    70         return true;
    71     }
    72 
    73     /**
    74      * Post-process the given property values before the factory applies them
    75      * to the given bean, without any need for property descriptors.
    76      * <p>Implementations should return {@code null} (the default) if they provide a custom
    77      * {@link #postProcessPropertyValues} implementation, and {@code pvs} otherwise.
    78      * In a future version of this interface (with {@link #postProcessPropertyValues} removed),
    79      * the default implementation will return the given {@code pvs} as-is directly.
    80      * @param pvs the property values that the factory is about to apply (never {@code null})
    81      * @param bean the bean instance created, but whose properties have not yet been set
    82      * @param beanName the name of the bean
    83      * @return the actual property values to apply to the given bean (can be the passed-in
    84      * PropertyValues instance), or {@code null} which proceeds with the existing properties
    85      * but specifically continues with a call to {@link #postProcessPropertyValues}
    86      * (requiring initialized {@code PropertyDescriptor}s for the current bean class)
    87      * @throws org.springframework.beans.BeansException in case of errors
    88      * @since 5.1
    89      * @see #postProcessPropertyValues
    90      */
    91     @Nullable
    92     default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
    93             throws BeansException {
    94 
    95         return null;
    96     }
    97 }
    View Code

    继承接口BeanPostProcessor。bean实例化的后置处理器,代表了bean的另一端生命周期;在bean实例化到初始化过程中,会优先调用  InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation();如果这个接口返回对象且不为Null,则直接调用 InstantiationAwareBeanPostProcessor.postProcessAfterInitialization(),完成这个对象的初始化-实例化过程(也就是跳过了后续初始化过程,BeanPostProcessor、初始化等等都不再起作用)。这个也常被用于生成代理对象,完成动态代理的过程。

    9、bean自定义初始化和销毁方法

    •  通过@Bean指定init-method和destroy-method;
    •  通过让Bean实现InitializingBean(定义初始化逻辑),DisposableBean(定义销毁逻辑);
    • 可以使用JSR250;
      • @PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法
      • @PreDestroy:在容器销毁bean之前通知我们进行清理工作

    Spring初始化背后原理介绍:

    1、简述

    解析@Configuration配置类、文件、xml、web.xml (具体解析哪个,依据ApplicationContext类型,比如AnnotationConfigApplicationContext肯定是来解析配置文件,ClassPathXmlApplicationContext是用来解析xml等等 来决定的),将上述解析得到的所有bean信息都保存成一个个BeanDefinition,并且与beanName组合成key-value对保存到 DefaultListableBeanFactory 中的 beanDefinitionMap中,同时将beanName存入beanDefinitionNames(List 类型) 中,然后按照顺序(InstantionAwareBeanPostProcessor ->  BeanPostProcessor -> ApplicationListenerDetector  ->  initApplicationEventMulticaster -> 其他的单实例bean)实例化bean,实例化完成后的bean放入单实例bean的缓存(private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);)中,调用getBean方法,返回缓存中的单实例。

    2、Spring容器初始化过程

    定位代码容器的主要初始化过程在refresh()  创建刷新方法上,所以接下来只介绍这个方法的过程。

     1 @Override
     2     public void refresh() throws BeansException, IllegalStateException {
     3         synchronized (this.startupShutdownMonitor) {
     4             //容器预先准备,记录容器启动时间和标记
     5             prepareRefresh();
     6 
     7             //创建bean工厂,里面实现了BeanDefinition的装载
     8             ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
     9 
    10             //配置bean工厂的上下文信息,如类装载器等
    11             prepareBeanFactory(beanFactory);
    12 
    13             try {
    14                 //在BeanDefinition被装载后,提供一个修改BeanFactory的入口
    15                 postProcessBeanFactory(beanFactory);
    16 
    17                 //在bean初始化之前,提供对BeanDefinition修改入口,PropertyPlaceholderConfigurer 在这里被调用
    18                 invokeBeanFactoryPostProcessors(beanFactory);
    19 
    20                 //注册各种 BeanPostProcessors,用于在bean被初始化时进行拦截,进行额外初始化操作
    21                 registerBeanPostProcessors(beanFactory);
    22 
    23                 //初始化MessageSource
    24                 initMessageSource();
    25 
    26                  //初始化上下文事件广播
    27                 initApplicationEventMulticaster();
    28 
    29                 //这是一个模板方法
    30                 onRefresh();
    31 
    32                 //注册监听器
    33                 registerListeners();
    34 
    35                //初始化所有未初始化的非懒加载的单例Bean
    36                 finishBeanFactoryInitialization(beanFactory);
    37 
    38                 //发布事件通知
    39                 finishRefresh();
    40             }
    41 
    42             catch (BeansException ex) {
    43                 if (logger.isWarnEnabled()) {
    44                     logger.warn("Exception encountered during context initialization - " +
    45                             "cancelling refresh attempt: " + ex);
    46                 }
    47 
    48                 // Destroy already created singletons to avoid dangling resources.
    49                 destroyBeans();
    50 
    51                 // Reset 'active' flag.
    52                 cancelRefresh(ex);
    53 
    54                 // Propagate exception to caller.
    55                 throw ex;
    56             }
    57 
    58             finally {
    59                 // Reset common introspection caches in Spring's core, since we
    60                 // might not ever need metadata for singleton beans anymore...
    61                 resetCommonCaches();
    62             }
    63         }
    64     }

    (1)prepareRefresh()刷新前的预处理;

     1 /**
     2      * Prepare this context for refreshing, setting its startup date and
     3      * active flag as well as performing any initialization of property sources.
     4      */
     5     protected void prepareRefresh() {
     6         // Switch to active.
     7         this.startupDate = System.currentTimeMillis();
     8         this.closed.set(false);
     9         this.active.set(true);
    10 
    11         if (logger.isDebugEnabled()) {
    12             if (logger.isTraceEnabled()) {
    13                 logger.trace("Refreshing " + this);
    14             }
    15             else {
    16                 logger.debug("Refreshing " + getDisplayName());
    17             }
    18         }
    19 
    20         // 初始化一些属性设置;子类自定义个性化的属性设置方法;
    21         initPropertySources();
    22 
    23         // Validate that all properties marked as required are resolvable:
    24         // see ConfigurablePropertyResolver#setRequiredProperties
    25                 // 检验属性的合法等
    26         getEnvironment().validateRequiredProperties();
    27 
    28         // 保存容器中的一些早期的事件;
    29         if (this.earlyApplicationListeners == null) {
    30             this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
    31         }
    32         else {
    33             // Reset local application listeners to pre-refresh state.
    34             this.applicationListeners.clear();
    35             this.applicationListeners.addAll(this.earlyApplicationListeners);
    36         }
    37 
    38         // Allow for the collection of early ApplicationEvents,
    39         // to be published once the multicaster is available...
    40         this.earlyApplicationEvents = new LinkedHashSet<>();
    41     }    
    View Code

    (2)obtainFreshBeanFactory(); 获取BeanFactory;

     1     /**
     2      * Tell the subclass to refresh the internal bean factory.
     3      * @return the fresh BeanFactory instance
     4      * @see #refreshBeanFactory()
     5      * @see #getBeanFactory()
     6      */
     7     protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
     8         refreshBeanFactory();
     9         return getBeanFactory();
    10     }
    View Code
     1     /**
     2      * This implementation performs an actual refresh of this context's underlying
     3      * bean factory, shutting down the previous bean factory (if any) and
     4      * initializing a fresh bean factory for the next phase of the context's lifecycle.
     5      */
     6     @Override
     7     protected final void refreshBeanFactory() throws BeansException {
     8         if (hasBeanFactory()) {
     9             destroyBeans();
    10             closeBeanFactory();
    11         }
    12         try {
    13             DefaultListableBeanFactory beanFactory = createBeanFactory();
    14             beanFactory.setSerializationId(getId());
    15             customizeBeanFactory(beanFactory);
    16             loadBeanDefinitions(beanFactory);
    17             synchronized (this.beanFactoryMonitor) {
    18                 this.beanFactory = beanFactory;
    19             }
    20         }
    21         catch (IOException ex) {
    22             throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
    23         }
    24     }
    25 
    26 
    27     protected DefaultListableBeanFactory createBeanFactory() {
    28         return new DefaultListableBeanFactory(getInternalParentBeanFactory());
    29     }
    View Code

    总结:创建BeanFactory[DefaultListableBeanFactory] 并返回

    (3)prepareBeanFactory(beanFactory);BeanFactory的预准备工作(BeanFactory进行一些设置)

     1     /**
     2      * Configure the factory's standard context characteristics,
     3      * such as the context's ClassLoader and post-processors.
     4      * @param beanFactory the BeanFactory to configure
     5      */
     6     protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
     7         // 设置BeanFactory的类加载器、支持表达式解析器...
     8         beanFactory.setBeanClassLoader(getClassLoader());
     9         beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
    10         beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
    11 
    12         // 添加部分BeanPostProcessor【ApplicationContextAwareProcessor】
    13         beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
    14         //ignoreDependencyInterface:表示自动注入时忽略以下接口类型
    15         beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
    16         beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
    17         beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
    18         beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
    19         beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
    20         beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
    21 
    22         // 注册可以解析的自动装配;我们能直接在任何组件中自动注入:
    23         // BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
    24         beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
    25         beanFactory.registerResolvableDependency(ResourceLoader.class, this);
    26         beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
    27         beanFactory.registerResolvableDependency(ApplicationContext.class, this);
    28 
    29         // 添加BeanPostProcessor【ApplicationListenerDetector】
    30         beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
    31 
    32         // Detect a LoadTimeWeaver and prepare for weaving, if found.
    33         // 添加编译时的AspectJ;
    34         if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
    35             beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
    36             // Set a temporary ClassLoader for type matching.
    37             beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
    38         }
    39 
    40         // 给BeanFactory中注册一些能用的组件;environment【ConfigurableEnvironment】、systemProperties【Map<String, Object>】、systemEnvironment【Map<String, Object>】
    41         if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
    42             beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
    43         }
    44         if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
    45             beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
    46         }
    47         if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
    48             beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
    49         }
    50     }
    View Code

    (4)postProcessBeanFactory(beanFactory);  BeanFactory准备工作完成后进行的后置处理工作;

    1     /**
    2      * Modify the application context's internal bean factory after its standard
    3      * initialization. All bean definitions will have been loaded, but no beans
    4      * will have been instantiated yet. This allows for registering special
    5      * BeanPostProcessors etc in certain ApplicationContext implementations.
    6      * @param beanFactory the bean factory used by the application context
    7      */
    8     protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    9     }
    View Code

    子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步的设置

    (5)invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor的方法;

    直接看代码:

      1     public static void invokeBeanFactoryPostProcessors(
      2             ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
      3 
      4         // Invoke BeanDefinitionRegistryPostProcessors first, if any.
      5         Set<String> processedBeans = new HashSet<>();
      6 
      7         if (beanFactory instanceof BeanDefinitionRegistry) {
      8             BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
      9             List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
     10             List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
     11 
     12             for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
     13                 if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
     14                     BeanDefinitionRegistryPostProcessor registryProcessor =
     15                             (BeanDefinitionRegistryPostProcessor) postProcessor;
     16                     registryProcessor.postProcessBeanDefinitionRegistry(registry);
     17                     registryProcessors.add(registryProcessor);
     18                 }
     19                 else {
     20                     regularPostProcessors.add(postProcessor);
     21                 }
     22             }
     23 
     24             // Do not initialize FactoryBeans here: We need to leave all regular beans
     25             // uninitialized to let the bean factory post-processors apply to them!
     26             // Separate between BeanDefinitionRegistryPostProcessors that implement
     27             // PriorityOrdered, Ordered, and the rest.
     28             List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
     29 
     30             // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
     31             String[] postProcessorNames =
     32                     beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
     33             for (String ppName : postProcessorNames) {
     34                 if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
     35                     currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
     36                     processedBeans.add(ppName);
     37                 }
     38             }
     39             sortPostProcessors(currentRegistryProcessors, beanFactory);
     40             registryProcessors.addAll(currentRegistryProcessors);
     41             invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
     42             currentRegistryProcessors.clear();
     43 
     44             // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
     45             postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
     46             for (String ppName : postProcessorNames) {
     47                 if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
     48                     currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
     49                     processedBeans.add(ppName);
     50                 }
     51             }
     52             sortPostProcessors(currentRegistryProcessors, beanFactory);
     53             registryProcessors.addAll(currentRegistryProcessors);
     54             invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
     55             currentRegistryProcessors.clear();
     56 
     57             // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
     58             boolean reiterate = true;
     59             while (reiterate) {
     60                 reiterate = false;
     61                 postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
     62                 for (String ppName : postProcessorNames) {
     63                     if (!processedBeans.contains(ppName)) {
     64                         currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
     65                         processedBeans.add(ppName);
     66                         reiterate = true;
     67                     }
     68                 }
     69                 sortPostProcessors(currentRegistryProcessors, beanFactory);
     70                 registryProcessors.addAll(currentRegistryProcessors);
     71                 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
     72                 currentRegistryProcessors.clear();
     73             }
     74 
     75             // Now, invoke the postProcessBeanFactory callback of all processors handled so far.
     76             invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
     77             invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
     78         }
     79 
     80         else {
     81             // Invoke factory processors registered with the context instance.
     82             invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
     83         }
     84 
     85         // Do not initialize FactoryBeans here: We need to leave all regular beans
     86         // uninitialized to let the bean factory post-processors apply to them!
     87         String[] postProcessorNames =
     88                 beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
     89 
     90         // Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
     91         // Ordered, and the rest.
     92         List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
     93         List<String> orderedPostProcessorNames = new ArrayList<>();
     94         List<String> nonOrderedPostProcessorNames = new ArrayList<>();
     95         for (String ppName : postProcessorNames) {
     96             if (processedBeans.contains(ppName)) {
     97                 // skip - already processed in first phase above
     98             }
     99             else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
    100                 priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
    101             }
    102             else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
    103                 orderedPostProcessorNames.add(ppName);
    104             }
    105             else {
    106                 nonOrderedPostProcessorNames.add(ppName);
    107             }
    108         }
    109 
    110         // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
    111         sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
    112         invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
    113 
    114         // Next, invoke the BeanFactoryPostProcessors that implement Ordered.
    115         List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
    116         for (String postProcessorName : orderedPostProcessorNames) {
    117             orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
    118         }
    119         sortPostProcessors(orderedPostProcessors, beanFactory);
    120         invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
    121 
    122         // Finally, invoke all other BeanFactoryPostProcessors.
    123         List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
    124         for (String postProcessorName : nonOrderedPostProcessorNames) {
    125             nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
    126         }
    127         invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
    128 
    129         // Clear cached merged bean definitions since the post-processors might have
    130         // modified the original metadata, e.g. replacing placeholders in values...
    131         beanFactory.clearMetadataCache();
    132     }
    View Code

    梳理一下BeanFactoryPostProcessor的方法流程:

    • 先执行BeanDefinitionRegistryPostProcessor
      • 获取所有的BeanDefinitionRegistryPostProcessor;
      • 先执行实现了PriorityOrdered优先级接口的BeanDefinitionRegistryPostProcessor;  postProcessor.postProcessBeanDefinitionRegistry(registry)
      • 再执行实现了Ordered顺序接口的BeanDefinitionRegistryPostProcessor; 
      • 最后执行没有实现任何优先级或者是顺序接口的BeanDefinitionRegistryPostProcessors;
    • 再执行BeanFactoryPostProcessor的方法
      • 获取所有的BeanFactoryPostProcessor
      • 看先执行实现了PriorityOrdered优先级接口的BeanFactoryPostProcessor;  postProcessor.postProcessBeanFactory()
      • 在执行实现了Ordered顺序接口的BeanFactoryPostProcessor;
      • 最后执行没有实现任何优先级或者是顺序接口的BeanFactoryPostProcessor;

    (6)registerBeanPostProcessors(beanFactory);注册BeanPostProcessor(Bean的后置处理器)

    将bean后置处理器实例化之后注册进beanFactory中,后续任何其他单实例bean实例化,初始化都会再次用到这些后置处理器的

     1     public static void registerBeanPostProcessors(
     2             ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
     3 
     4         String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
     5 
     6         // Register BeanPostProcessorChecker that logs an info message when
     7         // a bean is created during BeanPostProcessor instantiation, i.e. when
     8         // a bean is not eligible for getting processed by all BeanPostProcessors.
     9         int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
    10         beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
    11 
    12         // Separate between BeanPostProcessors that implement PriorityOrdered,
    13         // Ordered, and the rest.
    14         List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
    15         List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
    16         List<String> orderedPostProcessorNames = new ArrayList<>();
    17         List<String> nonOrderedPostProcessorNames = new ArrayList<>();
    18         for (String ppName : postProcessorNames) {
    19             if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
    20                 BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
    21                 priorityOrderedPostProcessors.add(pp);
    22                 if (pp instanceof MergedBeanDefinitionPostProcessor) {
    23                     internalPostProcessors.add(pp);
    24                 }
    25             }
    26             else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
    27                 orderedPostProcessorNames.add(ppName);
    28             }
    29             else {
    30                 nonOrderedPostProcessorNames.add(ppName);
    31             }
    32         }
    33 
    34         // First, register the BeanPostProcessors that implement PriorityOrdered.
    35         sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
    36         registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
    37 
    38         // Next, register the BeanPostProcessors that implement Ordered.
    39         List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
    40         for (String ppName : orderedPostProcessorNames) {
    41             BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
    42             orderedPostProcessors.add(pp);
    43             if (pp instanceof MergedBeanDefinitionPostProcessor) {
    44                 internalPostProcessors.add(pp);
    45             }
    46         }
    47         sortPostProcessors(orderedPostProcessors, beanFactory);
    48         registerBeanPostProcessors(beanFactory, orderedPostProcessors);
    49 
    50         // Now, register all regular BeanPostProcessors.
    51         List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
    52         for (String ppName : nonOrderedPostProcessorNames) {
    53             BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
    54             nonOrderedPostProcessors.add(pp);
    55             if (pp instanceof MergedBeanDefinitionPostProcessor) {
    56                 internalPostProcessors.add(pp);
    57             }
    58         }
    59         registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
    60 
    61         // Finally, re-register all internal BeanPostProcessors.
    62         sortPostProcessors(internalPostProcessors, beanFactory);
    63         registerBeanPostProcessors(beanFactory, internalPostProcessors);
    64 
    65         // Re-register post-processor for detecting inner beans as ApplicationListeners,
    66         // moving it to the end of the processor chain (for picking up proxies etc).
    67         beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
    68     }
    View Code

    流程梳理:获取所有BeanPostProcessor,按照PriorityOrdered、Ordered、无优先级的顺序注册到beanFactory中,最后再分别注册 MergedBeanDefinitionPostProcessor,ApplicationListenerDetector。

    几个特别的BeanPostProcessor:

    • DestructionAwareBeanPostProcessor
    • InstantiationAwareBeanPostProcessor
    • SmartInstantiationAwareBeanPostProcessor
    • MergedBeanDefinitionPostProcessor【internalPostProcessors】

    (7)initMessageSource();初始化MessageSource组件(做国际化功能;消息绑定,消息解析)

     1 /**
     2      * Initialize the MessageSource.
     3      * Use parent's if none defined in this context.
     4      */
     5     protected void initMessageSource() {
     6         ConfigurableListableBeanFactory beanFactory = getBeanFactory();
     7         if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
     8             this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
     9             // Make MessageSource aware of parent MessageSource.
    10             if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
    11                 HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
    12                 if (hms.getParentMessageSource() == null) {
    13                     // Only set parent context as parent MessageSource if no parent MessageSource
    14                     // registered already.
    15                     hms.setParentMessageSource(getInternalParentMessageSource());
    16                 }
    17             }
    18             if (logger.isTraceEnabled()) {
    19                 logger.trace("Using MessageSource [" + this.messageSource + "]");
    20             }
    21         }
    22         else {
    23             // Use empty MessageSource to be able to accept getMessage calls.
    24             DelegatingMessageSource dms = new DelegatingMessageSource();
    25             dms.setParentMessageSource(getInternalParentMessageSource());
    26             this.messageSource = dms;
    27             beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
    28             if (logger.isTraceEnabled()) {
    29                 logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");
    30             }
    31         }
    32     }
    View Code

    (8)initApplicationEventMulticaster();初始化事件派发器;

    事件派发器主要是用于ApplicationListener,spring容器的监听功能服务的。

    spring监听功能的使用步骤:

    • 写一个监听器(ApplicationListener实现类)来监听某个事件(ApplicationEvent及其子类):
      • 写一个ApplicationListener的实现类放入容器中
      • 使用@EventListener(原理:使用EventListenerMethodProcessor处理器来解析方法上的@EventListener)
    • 容器发布相关事件:applicationContext.publishEvent();
     1 /**
     2 *    第一种发布ApplicationListener方法
     3 */
     4 @Component
     5 public class MyApplicationListener implements ApplicationListener<ApplicationEvent> {
     6 
     7     //当容器中发布此事件以后,方法触发
     8     @Override
     9     public void onApplicationEvent(ApplicationEvent event) {
    10         // TODO Auto-generated method stub
    11         System.out.println("收到事件:"+event);
    12     }
    13 
    14 }
    15 
    16 /**
    17 *    第二种发布ApplicationListener方法
    18 */
    19 @Service
    20 public class UserService {
    21     
    22     @EventListener(classes={ApplicationEvent.class})
    23     public void listen(ApplicationEvent event){
    24         System.out.println("UserService。。监听到的事件:"+event);
    25     }
    26 
    27 }
    28 
    29 /**
    30 *    事件发布
    31 */
    32 public class IOCTest_Ext {
    33     
    34     @Test
    35     public void test01(){
    36         AnnotationConfigApplicationContext applicationContext  = new AnnotationConfigApplicationContext(ExtConfig.class);
    37         
    38         
    39         //发布事件;
    40         applicationContext.publishEvent(new ApplicationEvent(new String("我发布的时间")) {
    41         });
    42         
    43         applicationContext.close();
    44     }
    45 
    46 }
    View Code

     (9)onRefresh(); 留给子容器(子类)

     子类重写这个方法,在容器刷新的时候可以自定义逻辑;

     1 /**
     2      * Template method which can be overridden to add context-specific refresh work.
     3      * Called on initialization of special beans, before instantiation of singletons.
     4      * <p>This implementation is empty.
     5      * @throws BeansException in case of errors
     6      * @see #refresh()
     7      */
     8     protected void onRefresh() throws BeansException {
     9         // For subclasses: do nothing by default.
    10     }
    View Code

    (10)registerListeners();给容器中将所有项目里面的ApplicationListener注册进来;

     1     /**
     2      * Add beans that implement ApplicationListener as listeners.
     3      * Doesn't affect other listeners, which can be added without being beans.
     4      */
     5     protected void registerListeners() {
     6         // Register statically specified listeners first.
     7         for (ApplicationListener<?> listener : getApplicationListeners()) {
     8             getApplicationEventMulticaster().addApplicationListener(listener);
     9         }
    10 
    11         // Do not initialize FactoryBeans here: We need to leave all regular beans
    12         // uninitialized to let post-processors apply to them!
    13         String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
    14         for (String listenerBeanName : listenerBeanNames) {
    15             getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
    16         }
    17 
    18         // Publish early application events now that we finally have a multicaster...
    19         Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
    20         this.earlyApplicationEvents = null;
    21         if (earlyEventsToProcess != null) {
    22             for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
    23                 getApplicationEventMulticaster().multicastEvent(earlyEvent);
    24             }
    25         }
    26     }
    View Code

    (11)finishBeanFactoryInitialization(beanFactory);初始化所有剩下的单实例bean;

    介绍了单实例bean的实例化——初始化的整个过程

     populateBean、initializeBean源码:

      1     /**
      2      * Populate the bean instance in the given BeanWrapper with the property values
      3      * from the bean definition.
      4      * @param beanName the name of the bean
      5      * @param mbd the bean definition for the bean
      6      * @param bw the BeanWrapper with bean instance
      7      */
      8     @SuppressWarnings("deprecation")  // for postProcessPropertyValues
      9     protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
     10         if (bw == null) {
     11             if (mbd.hasPropertyValues()) {
     12                 throw new BeanCreationException(
     13                         mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
     14             }
     15             else {
     16                 // Skip property population phase for null instance.
     17                 return;
     18             }
     19         }
     20 
     21         // Give any InstantiationAwareBeanPostProcessors the opportunity to modify the
     22         // state of the bean before properties are set. This can be used, for example,
     23         // to support styles of field injection.
     24         boolean continueWithPropertyPopulation = true;
     25 
     26         if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
     27             for (BeanPostProcessor bp : getBeanPostProcessors()) {
     28                 if (bp instanceof InstantiationAwareBeanPostProcessor) {
     29                     InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
     30                     if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
     31                         continueWithPropertyPopulation = false;
     32                         break;
     33                     }
     34                 }
     35             }
     36         }
     37 
     38         if (!continueWithPropertyPopulation) {
     39             return;
     40         }
     41 
     42         PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);
     43 
     44         int resolvedAutowireMode = mbd.getResolvedAutowireMode();
     45         if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
     46             MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
     47             // Add property values based on autowire by name if applicable.
     48             if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
     49                 autowireByName(beanName, mbd, bw, newPvs);
     50             }
     51             // Add property values based on autowire by type if applicable.
     52             if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
     53                 autowireByType(beanName, mbd, bw, newPvs);
     54             }
     55             pvs = newPvs;
     56         }
     57 
     58         boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
     59         boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
     60 
     61         PropertyDescriptor[] filteredPds = null;
     62         if (hasInstAwareBpps) {
     63             if (pvs == null) {
     64                 pvs = mbd.getPropertyValues();
     65             }
     66             for (BeanPostProcessor bp : getBeanPostProcessors()) {
     67                 if (bp instanceof InstantiationAwareBeanPostProcessor) {
     68                     InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
     69                     PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
     70                     if (pvsToUse == null) {
     71                         if (filteredPds == null) {
     72                             filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
     73                         }
     74                         pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
     75                         if (pvsToUse == null) {
     76                             return;
     77                         }
     78                     }
     79                     pvs = pvsToUse;
     80                 }
     81             }
     82         }
     83         if (needsDepCheck) {
     84             if (filteredPds == null) {
     85                 filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
     86             }
     87             checkDependencies(beanName, mbd, filteredPds, pvs);
     88         }
     89 
     90         if (pvs != null) {
     91             applyPropertyValues(beanName, mbd, bw, pvs);
     92         }
     93     }
     94 
     95 
     96     /**
     97      * Initialize the given bean instance, applying factory callbacks
     98      * as well as init methods and bean post processors.
     99      * <p>Called from {@link #createBean} for traditionally defined beans,
    100      * and from {@link #initializeBean} for existing bean instances.
    101      * @param beanName the bean name in the factory (for debugging purposes)
    102      * @param bean the new bean instance we may need to initialize
    103      * @param mbd the bean definition that the bean was created with
    104      * (can also be {@code null}, if given an existing bean instance)
    105      * @return the initialized bean instance (potentially wrapped)
    106      * @see BeanNameAware
    107      * @see BeanClassLoaderAware
    108      * @see BeanFactoryAware
    109      * @see #applyBeanPostProcessorsBeforeInitialization
    110      * @see #invokeInitMethods
    111      * @see #applyBeanPostProcessorsAfterInitialization
    112      */
    113     protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
    114         if (System.getSecurityManager() != null) {
    115             AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
    116                 invokeAwareMethods(beanName, bean);
    117                 return null;
    118             }, getAccessControlContext());
    119         }
    120         else {
    121             invokeAwareMethods(beanName, bean);
    122         }
    123 
    124         Object wrappedBean = bean;
    125         if (mbd == null || !mbd.isSynthetic()) {
    126             wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
    127         }
    128 
    129         try {
    130             invokeInitMethods(beanName, wrappedBean, mbd);
    131         }
    132         catch (Throwable ex) {
    133             throw new BeanCreationException(
    134                     (mbd != null ? mbd.getResourceDescription() : null),
    135                     beanName, "Invocation of init method failed", ex);
    136         }
    137         if (mbd == null || !mbd.isSynthetic()) {
    138             wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    139         }
    140 
    141         return wrappedBean;
    142     }
    View Code

    总结下:在bean创建过程中会以此出现几个“拦路虎”接口:InstantiationAwareBeanPostProcessor、MergedBeanDefinitionPostProcessor、xxxAware接口的方法 BeanNameAwareBeanClassLoaderAwareBeanFactoryAware 、BeanPostProcessor、SmartInitializingSingleton ,这些“拦路虎”接口就是spring预留的bean创建过程中的钩子接口,正是这些钩子接口为那些依赖spring的框架或者组件化开发提供了便利。

    (12)finishRefresh();完成BeanFactory的初始化创建工作;IOC容器就创建完成;

     1     /**
     2      * Finish the refresh of this context, invoking the LifecycleProcessor's
     3      * onRefresh() method and publishing the
     4      * {@link org.springframework.context.event.ContextRefreshedEvent}.
     5      */
     6     protected void finishRefresh() {
     7         // Clear context-level resource caches (such as ASM metadata from scanning).
     8         clearResourceCaches();
     9 
    10         // 初始化和生命周期有关的后置处理器;LifecycleProcessor
    11         // 默认从容器中找是否有lifecycleProcessor的组件【LifecycleProcessor】;如果没有new DefaultLifecycleProcessor();加入到容器;
    12         initLifecycleProcessor();
    13 
    14         // Propagate refresh to lifecycle processor first.
    15         getLifecycleProcessor().onRefresh();
    16 
    17         // 发布容器刷新完成事件;
    18         publishEvent(new ContextRefreshedEvent(this));
    19 
    20         // Participate in LiveBeansView MBean, if active.
    21         LiveBeansView.registerApplicationContext(this);
    22     }
    View Code
  • 相关阅读:
    jQuery:提交表单前判断表单是否被修改过
    jQuery multiselect的使用
    input[file]标签的accept=”image/*”属性响应很慢的解决办法
    Linux-read命令
    shell编程学习
    优化网站加载速度
    select下拉框选中问题
    QTableWidget class
    QLabel class
    QMainWindow class
  • 原文地址:https://www.cnblogs.com/demo12138/p/12512947.html
Copyright © 2020-2023  润新知