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