Spring Bean组件实现和源码分析

Bean定义类继承关系

《Spring Bean组件实现和源码分析》
AtttributeAccessor 接口:位于org.springframework.core包下。

package org.springframework.core;

/** * Interface defining a generic contract for attaching and accessing * metadata to/from arbitrary objects.(定义了一个通用的协议设置获取元数据从任意一个对象或者设置元数据给任意一个对象) * @since 2.0 */
public interface AttributeAccessor {


    void setAttribute(String name, Object value);

    Object getAttribute(String name);

    Object removeAttribute(String name);

    boolean hasAttribute(String name);

    String[] attributeNames();

}

AttributeAccessor接口一共5个方法。
分别包括:设置元数据、获取元数据、删除元数据、判断元数据是否存在、列出元数据属性名称。

BeanDefinition(Interface)继承了AttributeAccessor 接口:

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {

    String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;


    String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;


    int ROLE_APPLICATION = 0;

    int ROLE_SUPPORT = 1;

    int ROLE_INFRASTRUCTURE = 2;

    String getParentName();

    void setParentName(String parentName);

    String getBeanClassName();

    void setBeanClassName(String beanClassName);

    String getFactoryBeanName();

    void setFactoryBeanName(String factoryBeanName);

    String getFactoryMethodName();

    void setFactoryMethodName(String factoryMethodName);

    String getScope();

    void setScope(String scope);

    boolean isLazyInit();

    void setLazyInit(boolean lazyInit);

    String[] getDependsOn();

    void setDependsOn(String... dependsOn);

    boolean isAutowireCandidate();

    void setAutowireCandidate(boolean autowireCandidate);

    boolean isPrimary();

    void setPrimary(boolean primary);

    ConstructorArgumentValues getConstructorArgumentValues();

    MutablePropertyValues getPropertyValues();

    boolean isSingleton();

    boolean isPrototype();

    boolean isAbstract();

    int getRole();

    String getDescription();

    String getResourceDescription();

    BeanDefinition getOriginatingBeanDefinition();

}

SCOPE_SINGLETONSCOPE_PROTOTYPE这个的值查看ConfigurableBeanFactory的源码发现为:

String SCOPE_SINGLETON = "singleton";
String SCOPE_PROTOTYPE = "prototype";

这两个就相当于Spring的配置文件中的Bean属性的scope值中的两个。Spring通过定义对应的接口来对应Bean XML 配置中的Bean中的各种复杂的关系。
AbstractBeanDefinition抽象类实现了BeanDefinition和继承了BeanMetadataAttributeAccessor,同时还实现了Cloneable接口。
源码实现分析:

/** * Constant for the default scope name "", equivalent to * singleton status unless overridden from a parent bean * definition (if applicable). */
    public static final String SCOPE_DEFAULT = "";
    private String scope = SCOPE_DEFAULT;

从上面的代码可以看出来 当使用者不设置默认的情况下是以单例模式创建Bean,除非在适用的情况下父Bean进行了覆盖。下面是在Myeclipse中创建Bean 配置XML中的属性。
《Spring Bean组件实现和源码分析》
通过图片中Bean的属性看看AbstractBeanDefinition中的是怎么样的。
例如abstract:

private boolean abstractFlag = false;

public void setAbstract(boolean abstractFlag) {
        this.abstractFlag = abstractFlag;
    }
public boolean isAbstract() {
        return this.abstractFlag;
    }

在默认的情况下为false。在XML中为什么为true和false因为在代码中的定义就boolean值。那么这个字段的作用是什么?代码中的作用注释: Set if this bean is “abstract”, i.e. not meant to be instantiated itself but rather just serving as parent for concrete child bean definitions.Default is “false”. Specify true to tell the bean factory to not try to instantiate that particular bean in any case.(设置为false,意味这个类不能实例化自己而是作为非抽象类的父类,默认值是false,如果为true就告诉BeanFactory在任何情况下都不要实例化这个特殊的Bean).
其他属性在个类中都有实现。
RootBeanDefinition 是实现了AbstractBeanDefinition 一个类。

    原文作者:Spring Boot
    原文地址: https://blog.csdn.net/ljbmxsm/article/details/50087037
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞