Spring BeanDefinition及读取、注册

BeanDefinition及其实现类

这个接口描述bean的结构,它集成了BeanMetadataElement和AttributeAccessor。

1.AttributeAccessor接口

类似于map,具有保存和访问name/value属性的能力。

public interface AttributeAccessor { 
    void setAttribute(String name, Object value); 
    Object getAttribute(String name); 
    Object removeAttribute(String name); 
    boolean hasAttribute(String name); 
    String[] attributeNames(); 
}


2.BeanmetadataElement接口

访问source(配置源)的能力。

public interface BeanMetadataElement { 
    Object getSource(); 
}


3.BeanDeinition接口

定义设置、获取一个BeanDefinition属性方法。

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {

    //单例或原型
    String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON; 
    String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;

     //Bean角色
    int ROLE_APPLICATION = 0; 
    int ROLE_SUPPORT = 1; 
    int ROLE_INFRASTRUCTURE = 2;

    // 返回/设置父BeanDefinition 
    String getParentName(); 
    void setParentName(String parentName);

    //返回/设置 当前的BeanClassName(不等于最终Bean的名称)
    String getBeanClassName(); 
    void setBeanClassName(String beanClassName);

    //返回设置 factory bean name  
    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();
}

子接口和实现类

1.AnnotatedBeanDefinition接口

这个接口可以获取BeanDefintion注解相关数据。

2.AbstractBeanDefintion

这个抽象类的构造方法设置了BeanDefinition的默认属性,重写equals, hashCode, toString方法。

3.ChildBeanDefinition

可以从父BeanDefinition中集成构造方法、属性等。

4.RootBeanDefinition

代表一个从配置源(XML Java Config等)中生成的BeanDefinition

5.GenericBeanDefinitioin

是ChildBeanDefinition和RootBeanDefinition更好的替代者

6.AnnotatedGenericBeanDefinition

对应注解@Bean。

 

BeanDefinitionHolder

持有一个BeanDefinition,名称 和别名数组。在Spring内部,它用来临时保存BeanDefinition来传递BeanDefinition。

 

public class BeanDefinitionHolder implements BeanMetadataElement {

    private final BeanDefinition beanDefinition;
    private final String beanName;
    private final String[] aliases; 

    public BeanDefinitionHolder(BeanDefinition beanDefinition, String beanName, String[] aliases) {
        Assert.notNull(beanDefinition, "BeanDefinition must not be null");
        Assert.notNull(beanName, "Bean name must not be null");
        this.beanDefinition = beanDefinition;
        this.beanName = beanName;
        this.aliases = aliases;
    }  
    public BeanDefinition getBeanDefinition() {
        return this.beanDefinition;
    } 
    public String getBeanName() {
        return this.beanName;
    } 
    public String[] getAliases() {
        return this.aliases;
    }
    //其他方法...省略

 

BeanDefinitionRegistry接口

这个接口定义了注册、获取BeanDefinition的方法。

public interface BeanDefinitionRegistry extends AliasRegistry {
    //注册一个BeanDefinition  
    void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
            throws BeanDefinitionStoreException; 
    //根据name,从自己持有的多个BeanDefinition 中 移除一个 
    void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
    // 获取某个BeanDefinition
    BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; 
    boolean containsBeanDefinition(String beanName);//是否包含 
    String[] getBeanDefinitionNames();//获取所有名称 
    int getBeanDefinitionCount();//获取持有的BeanDefinition数量 
    boolean isBeanNameInUse(String beanName); //判断某个BeanDefinition是否在使用
}


实现类有SimpleBeanDefinitionRegistry, DefaultListableBeanFactory, GenericApplicationContext等。

 

BeanDefinitionReader接口

BeanDefintionRegistry接口一次只能注册一个BeanDefinition,而且只能自己构造BeanDefinition类来注册。BeanDefintionReader解决了这些问题,它一般可以使用BeanDefinitionRegistry构造,然后通过#loadBeanDefinitions等方法,把“配置源”转化为多个BeanDefinition并注册到BeanDefinitionRegistry中。

 

 

最后欢迎大家访问我的个人网站:1024s

​​​​​​​

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值