Spring Bean组件实现和源码分析

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中的属性。
这里写图片描述
通过图片中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 一个类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值