Spring BeanDefinition及读取、注册

来源:互联网 发布:centos开启3306端口 编辑:程序博客网 时间:2024/06/07 17:40

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中。



阅读全文
0 0
原创粉丝点击