BeanDefinition 就是在bean被实例化之前与文件加载之后的一个中间产物,在这个中间过程用户可以对BeanDefinition做一些变更操作.后面实例化通过反射实现,实例化时需要的属性均来之BeanDefinition
BeanDefinition 继承了AttributeAccessor, BeanMetadataElement这两个类,可以处理一些属性配置比如Xml配置中的一些信息。
/**
* BeanDefinition 描述了一个bean的实例, 包括属性、构造参数、以及一些具体的实现信息,
* BeanDefinition是一个小接口,它的主要目的是为了允许BeanFactoryPostProcessor之类的前置
* 后置的接口堆bean的属性和元信息做一些修改。
*
* @author Juergen Hoeller
* @author Rob Harrop
* @since 19.03.2004
* @see ConfigurableListableBeanFactory#getBeanDefinition
* @see org.springframework.beans.factory.support.RootBeanDefinition
* @see org.springframework.beans.factory.support.ChildBeanDefinition
*/
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
/**
* 属性:单例
*/
String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
/**
* 属性:多例
*/
String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
/**
* bean权限的三个角色信息 应用级别、support级别、基础级别(表示完全由内部完成)
*/
int ROLE_APPLICATION = 0;
int ROLE_SUPPORT = 1;
int ROLE_INFRASTRUCTURE = 2;
// 可修改的属性
/**
* 设置父类的Beandifinition
*/
void setParentName(@Nullable String parentName);
/**
* 返回父类的BeanDifinition
*/
@Nullable
String getParentName();
/**
* 设置Bean的className
* @see #setParentName
* @see #setFactoryBeanName
* @see #setFactoryMethodName
*/
void setBeanClassName(@Nullable String beanClassName);
/**
* 返回BeanDefinition的className.
* <p>注意:返回的值在runtime环境下不一定是实际类名
* @see #getParentName()
* @see #getFactoryBeanName()
* @see #getFactoryMethodName()
*/
@Nullable
String getBeanClassName();
/**
* 设置单例还是多例
* @see #SCOPE_SINGLETON
* @see #SCOPE_PROTOTYPE
*/
void setScope(@Nullable String scope);
/**
* 返回bean的scope
* or {@code null} if not known yet.
*/
@Nullable
String getScope();
/**
* 设置是否懒加载
*/
void setLazyInit(boolean lazyInit);
/**
* 是否懒加载
*/
boolean isLazyInit();
/**
* 设置加载所需要依赖的bean,bean工厂在加载这个bean之前会先加载所需的依赖
*/
void setDependsOn(@Nullable String... dependsOn);
/**
* 返回所依赖的bean名称
*/
@Nullable
String[] getDependsOn();
/**
* 设置这个bean是否被认定为被其它bean自动注入
* 也就是说,在其它类中使用了@Autowire 注解注入这个bean
*/
void setAutowireCandidate(boolean autowireCandidate);
/**
* 返回这个bean有没有被其它类注入
*/
boolean isAutowireCandidate();
/**
* 设置这个bean在存在多个同类型bean的情况下是否首选注入
*/
void setPrimary(boolean primary);
/**
* 返回是否首选注入
boolean isPrimary();
/**
* 设置factoryBean 的name 注意这个与beanfactory的区别
*/
void setFactoryBeanName(@Nullable String factoryBeanName);
/**
* 返回factoryBean的name
*/
@Nullable
String getFactoryBeanName();
/**
* 设置factoryBean的方法名
* @see #setFactoryBeanName
* @see #setBeanClassName
*/
void setFactoryMethodName(@Nullable String factoryMethodName);
/**
* 如果存在则返回不存在返回null
*/
@Nullable
String getFactoryMethodName();
/**
* 返回带参构造函数的值,这是个结构体内部是个map和一个list
*/
ConstructorArgumentValues getConstructorArgumentValues();
/**
* 返回是否存在带参构造函数
* @since 5.0.2
*/
default boolean hasConstructorArgumentValues() {
return !getConstructorArgumentValues().isEmpty();
}
/**
* 返回可变的属性
*/
MutablePropertyValues getPropertyValues();
/**
* 判断这个bean是否由属性值
* @since 5.0.2
*/
default boolean hasPropertyValues() {
return !getPropertyValues().isEmpty();
}
/**
* 设置初始化的方法名
* @since 5.1
*/
void setInitMethodName(@Nullable String initMethodName);
/**
* 返回初始化的方法名
* @since 5.1
*/
@Nullable
String getInitMethodName();
/**
* 设置销毁时的方法名
* @since 5.1
*/
void setDestroyMethodName(@Nullable String destroyMethodName);
/**
* 放回销毁时的方法名
* @since 5.1
*/
@Nullable
String getDestroyMethodName();
/**
* 设置角色级别
* @see #ROLE_APPLICATION
* @see #ROLE_SUPPORT
* @see #ROLE_INFRASTRUCTURE
*/
void setRole(int role);
/**
* 获取角色级别
* @see #ROLE_APPLICATION
* @see #ROLE_SUPPORT
* @see #ROLE_INFRASTRUCTURE
*/
int getRole();
/**
* 设置Beandifinition的描述
* @since 5.1
*/
void setDescription(@Nullable String description);
/**
* 返回BeanDefinition的描述信息
*/
@Nullable
String getDescription();
// Read-only attributes
/**
* 返回是否单例,如果是单例,调用时返回同一个对象
* returned on all calls.
* @see #SCOPE_SINGLETON
*/
boolean isSingleton();
/**
* 是否多例,如果是多例,调用时返回各自的对象
* returned for each call.
* @since 3.0
* @see #SCOPE_PROTOTYPE
*/
boolean isPrototype();
/**
* 返回是否是抽象类,如果是意味着不要实例化
*/
boolean isAbstract();
/**
* 返回资源描述信息
*/
@Nullable
String getResourceDescription();
/**
* 返回最原始的BeanDefinition
*/
@Nullable
BeanDefinition getOriginatingBeanDefinition();
}