Bean模型定义
上的类中都是定义了解析bean的定义存储的的dto模型
BeanMetadataElement
BeanMetadataElement中
只有一个方法,用来获取元数据元素的配置源对象:public interface BeanMetadataElement { Object getSource(); // 可以从xml等 }
DefaultsDefinition
DefaultsDefinition
默认属性接口 他的实现是DocumentDefaultsDefinition
就是一个DTOpublic class DocumentDefaultsDefinition implements DefaultsDefinition { private String lazyInit; private String merge; private String autowire; private String dependencyCheck; private String autowireCandidates; private String initMethod; private String destroyMethod; private Object source; }
AliasDefinition
AliasDefinition
别名DTO
ImportDefinition
ImportDefinition
解析import
MethodOverride
MethodOverride
存储 method-override
ReplaceOverride
标签 replace-method
LookupOverride
标签lookup-method
@Lookup
BeanDefinition
AttributeAccessor
属性访问者提供了访问属性的能力public interface AttributeAccessor { void setAttribute(String name, Object value); Object getAttribute(String name); Object removeAttribute(String name); boolean hasAttribute(String name); String[] attributeNames(); }
AttributeAccessorSupport
抽象类 属性访问器加强 ,有private final Map<String, Object> attributes = new LinkedHashMap<String, Object>(0);
可以存取属性
组合ComponentDefinition
AbstractComponentDefinition
CompositeComponentDefinition
BeanComponentDefinition`
BeanDefinition
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
/**singleton和prototype 常量定义 spring默认提供这两种模式*/
String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
/** Bean 的角色 可通过 @Role 定义*/
// 表示一个应用主要的组成部分 用户定义的bean
int ROLE_APPLICATION = 0;
// 表示一个支持一些较大的配置的bean定义,如一个外部的组件定义
int ROLE_SUPPORT = 1;
// 表示一个内部使用的注册的bean组件定义,与终端用户无关
int ROLE_INFRASTRUCTURE = 2;
// Modifiable attributes 属性元素
// 设置(获取)bean定义的父name,如果有的话
void setParentName(String parentName);
String getParentName();
// 设置bean定义的bean class name。在bean工厂后处理的过程中,类名可以被修改,典型的情况下
// 将原始class的name,替换成一个可解析的变量。
void setBeanClassName(String beanClassName);
/**
* 获取bean的class name 对应class的:class="spring.service.impl.MessageServiceImpl"
*/
String getBeanClassName();
// bean 的作用于 可用scope标签 @Scope指定
void setScope(String scope);
String getScope();
/**
* 设置懒加载 对应xml中的 : lazy-init="true" @Lazy
*/
void setLazyInit(boolean lazyInit);
boolean isLazyInit();
/**
* 设置此bean依赖于初始化的bean的名称。
* bean factory将确保这些bean首先被初始化。@DependsOn
*/
void setDependsOn(String... dependsOn);
String[] getDependsOn();
// 设置该Bean是否可以注入其他Bean中,只对根据类型注入有效
// 如果根据名称注入,即使这边设置false,也是可以的
void setAutowireCandidate(boolean autowireCandidate);
// 判断bean是否可以做为其他bean的自动注入对象
// Return whether this bean is a candidate for getting autowired into some other bean.
boolean isAutowireCandidate();
// @Primary 设置bean是否为主要的自动入候选者。
// 如果多个类型匹配返回true,则以primary bean 注入
void setPrimary(boolean primary);
// 返回该bean是否是primary
boolean isPrimary();
// 设置工厂bean的name,bean的name可以被工厂方法使用
void setFactoryBeanName(String factoryBeanName);
// 返回factoryBean的name
String getFactoryBeanName();
/**
* Specify a factory method, if any. This method will be invoked with
* constructor arguments, or with no arguments if none are specified.
* The method will be invoked on the specified factory bean, if any,
* or otherwise as a static method on the local bean class.
* @see #setFactoryBeanName
* @see #setBeanClassName
*/
// 设置工厂bean方法。此方法调用将会使用构造参数,如果没有方法,则没有参数.
// 此方法将会被特定的工厂bean调用,或者本地bean类型的静态方法调用
void setFactoryMethodName(String factoryMethodName);
// 返回工厂bean方法的name
String getFactoryMethodName();
// 获取构造器中的参数
ConstructorArgumentValues getConstructorArgumentValues();
/**
* Return if there are constructor argument values defined for this bean.
* @since 5.0.2
*/
// 如果这个bean定义的构造器有参数值,则返回true
default boolean hasConstructorArgumentValues() {
return !getConstructorArgumentValues().isEmpty();
}
// 返回属性值
MutablePropertyValues getPropertyValues();
/**
* Return if there are property values values defined for this bean.
* @since 5.0.2
*/
// 如果定义的bean有属性值,则返回true
default boolean hasPropertyValues() {
return !getPropertyValues().isEmpty();
}
/**
* Set the name of the initializer method.
* @since 5.1
*/
void setInitMethodName(@Nullable String initMethodName);
/**
* Return the name of the initializer method.
* @since 5.1
*/
@Nullable
String getInitMethodName();
/**
* Set the name of the destroy method.
* @since 5.1
*/
void setDestroyMethodName(@Nullable String destroyMethodName);
/**
* Return the name of the destroy method.
* @since 5.1
*/
@Nullable
String getDestroyMethodName();
void setRole(int role)
// @Role
int getRole();
/**
* Set a human-readable description of this bean definition.
* @since 5.1
*/
void setDescription(@Nullable String description);
String getDescription();
// Read-only attributes
ResolvableType getResolvableType();
// 是单例类型
boolean isSingleton();
// 是原型类型,返回true
boolean isPrototype();
// 是否是抽象类型
boolean isAbstract();
// 返回bean定义资源的描述
String getResourceDescription();
// 返回原始的bean定义,如果没有,返回null
// 此方法将返回即时的originator,通过迭代originator链,可以获取用户定义的原始bean定义
BeanDefinition getOriginatingBeanDefinition();
}
BeanDefinition常见实现类
AnnotatedBeanDefinition
:包含有注解的Bean定义。一般情况下,通过注解的方式得到Bean定义,类型都是该接口的实现类。
AnnotatedGenericBeanDefinition
:有@Configuration注解的类,会生成AnnotatedGenericBeanDefinition类型的Bean定义。
ScannedGenericBeanDefinition
:有@Component注解的类,会生成ScannedGenericBeanDefinition类型的Bean定义。注意其它继承了@Component的注解,同@Component。
ConfigurationClassBeanDefinition
是 ConfigurationClassBeanDefinitionReader
中定义的类
RootBeanDefinition,ChildBeanDefinition,GenericBeanDefinition:这个类均继承了AbstractBeanDefinition。从官方文档里,我们得到了以下一些信息:
RootBeanDefinition是最常用的实现类,它对应一般性的元素标签,GenericBeanDefinition是自2.5以后新加入的bean文件配置属性定义类,是一站式服务类。在配置文件中可以定义父和子,父用RootBeanDefinition表示,而子用ChildBeanDefiniton表示,而没有父的就使用RootBeanDefinition表示。AbstractBeanDefinition对两者共同的类信息进行抽象
BeanDefinitionBuilder
BeanDefinitionBuilder是Builder模式的应用。通过这个类我们可以方便的构建BeanDefinition的实例对象