BeanDefinition 实例
BeanDefinition
- BeanDefinition
/**
* BeanDefinition 用于描述一个 bean 实例,包括属性值、构造参数和补充信息。
*/
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
/**
* 标准单例 bean 的范围标识符
*/
String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
/**
* 标准多例 bean 的范围标识符
*/
String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
/**
* 此 bean 是应用程序的主要组成部分,通常对应于用户定义的 bean
*/
int ROLE_APPLICATION = 0;
/**
* 此 bean 是一些大型配置的支持部分
* {@link org.springframework.beans.factory.parsing.ComponentDefinition}.
*/
int ROLE_SUPPORT = 1;
/**
* 此 bean 与最终用户无关,是框架基础设施的一部分
*/
int ROLE_INFRASTRUCTURE = 2;
// Modifiable attributes
/**
* 设置此 BeanDefinition 的 parent
*/
void setParentName(@Nullable String parentName);
/**
* 读取此 BeanDefinition 的 parent
*/
@Nullable
String getParentName();
/**
* 设置此 BeanDefinition 关联的类名
*/
void setBeanClassName(@Nullable String beanClassName);
/**
* 读取此 BeanDefinition 关联的类名
*/
@Nullable
String getBeanClassName();
/**
* 设置此 BeanDefinition 的作用域
*/
void setScope(@Nullable String scope);
/**
* 读取此 BeanDefinition 的作用域
*/
@Nullable
String getScope();
/**
* 设置此 bean 的延迟初始化标识,单例、非抽象、非延迟初始化的 bean 将在启动时实例化
*/
void setLazyInit(boolean lazyInit);
/**
* 读取此 bean 的延迟初始化标识
*/
boolean isLazyInit();
/**
* 设置此 bean 依赖的其他 bean 名称【内部属性依赖】,
* BeanFactory 会保证其他依赖 bean 优先初始化
*/
void setDependsOn(@Nullable String... dependsOn);
/**
* 读取此 bean 依赖的其他 bean 名称
*/
@Nullable
String[] getDependsOn();
/**
* 设置此 bean 是否是依赖注入到其他 bean 的候选者
*/
void setAutowireCandidate(boolean autowireCandidate);
/**
* 读取此 bean 是否是依赖注入到其他 bean 的候选者
*/
boolean isAutowireCandidate();
/**
* 设置此 bean 是否是其他 bean 主要的依赖注入候选者【存在满足注入条件的多个 bean 时】
*/
void setPrimary(boolean primary);
/**
* 读取此 bean 是否是其他 bean 主要的依赖注入候选者
*/
boolean isPrimary();
/**
* 设置创建此 bean 的工厂 bean 名称【此 bean 是通过工厂 bean 创建的】
*/
void setFactoryBeanName(@Nullable String factoryBeanName);
/**
* 读取创建此 bean 的工厂 bean 名称
*/
@Nullable
String getFactoryBeanName();
/**
* 写入创建此 bean 的工厂方法,可传递构造函数
*/
void setFactoryMethodName(@Nullable String factoryMethodName);
/**
* 读取创建此 bean 的工厂方法
*/
@Nullable
String getFactoryMethodName();
/**
* 读取此 bean 的构造函数参数
*/
ConstructorArgumentValues getConstructorArgumentValues();
/**
* 此 bean 是否有构造函数参数
* @since 5.0.2
*/
default boolean hasConstructorArgumentValues() {
return !getConstructorArgumentValues().isEmpty();
}
/**
* 读取需要注入到此 bean 的属性列表【Dependency Injection】
*/
MutablePropertyValues getPropertyValues();
/**
* 此 bean 是否存在需要注入的属性列表
* @since 5.0.2
*/
default boolean hasPropertyValues() {
return !getPropertyValues().isEmpty();
}
/**
* 设置此 bean 的初始化方法名称
* @since 5.1
*/
void setInitMethodName(@Nullable String initMethodName);
/**
* 读取此 bean 的初始化方法名称
* @since 5.1
*/
@Nullable
String getInitMethodName();
/**
* 写入此 bean 的销毁方法名称
* @since 5.1
*/
void setDestroyMethodName(@Nullable String destroyMethodName);
/**
* 读取此 bean 的销毁方法名称
* Return the name of the destroy method.
* @since 5.1
*/
@Nullable
String getDestroyMethodName();
/**
* 写入此 bean 的角色
* @since 5.1
* @see #ROLE_APPLICATION
* @see #ROLE_SUPPORT
* @see #ROLE_INFRASTRUCTURE
*/
void setRole(int role);
/**
* 读取此 bean 的角色
*/
int getRole();
/**
* 写入此 bean 的描述信息
* @since 5.1
*/
void setDescription(@Nullable String description);
/**
* 读取此 bean 的描述信息
*/
@Nullable
String getDescription();
// Read-only attributes
/**
* 此 bean 是否是可共享的单例
*/
boolean isSingleton();
/**
* 此 bean 是否是多例
*/
boolean isPrototype();
/**
* 此 bean 是否是抽象的,不能实例化
*/
boolean isAbstract();
/**
* 此 BeanDefinition 的来源
*/
@Nullable
String getResourceDescription();
/**
* 读取原始的 BeanDefinition,未加装饰
*/
@Nullable
BeanDefinition getOriginatingBeanDefinition();
}
- AbstractBeanDefinition:BeanDefinition 接口的核心实现
/**
* 羽翼丰满的 BeanDefinition 基础类
*/
@SuppressWarnings("serial")
public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor
implements BeanDefinition, Cloneable {
/**
* 默认的作用域名称,等同于 singleton
*/
public static final String SCOPE_DEFAULT = "";
/**
* 不执行自动注入
*/
public static final int AUTOWIRE_NO = AutowireCapableBeanFactory.AUTOWIRE_NO;
/**
* 根据属性名称自动注入
*/
public static final int AUTOWIRE_BY_NAME = AutowireCapableBeanFactory.AUTOWIRE_BY_NAME;
/**
* 根据属性类型自动注入
*/
public static final int AUTOWIRE_BY_TYPE = AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE;
/**
* 根据构造函数自动注入
*/
public static final int AUTOWIRE_CONSTRUCTOR = AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR;
@Deprecated
public static final int AUTOWIRE_AUTODETECT = AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT;
/**
* 此 bean 不需要执行依赖检查
*/
public static final int DEPENDENCY_CHECK_NONE = 0;
/**
* 此 bean 需要执行对象引用的依赖检查
*/
public static final int DEPENDENCY_CHECK_OBJECTS = 1;
/**
* 此 bean 需要执行简单属性的依赖检查
*/
public static final int DEPENDENCY_CHECK_SIMPLE = 2;
/**
* 此 bean 需要对所有属性执行依赖检查
*/
public static final int DEPENDENCY_CHECK_ALL = 3;
/**
* 此 bean 需要自动推断销毁方法的名称
*/
public static final String INFER_METHOD = "(inferred)";
@Nullable
private volatile Object beanClass;
@Nullable
private String scope = SCOPE_DEFAULT;
private boolean abstractFlag = false;
private boolean lazyInit = false;
private int autowireMode = AUTOWIRE_NO;
private int dependencyCheck = DEPENDENCY_CHECK_NONE;
@Nullable
private String[] dependsOn;
private boolean autowireCandidate = true;
private boolean primary = false;
private final Map<String, AutowireCandidateQualifier> qualifiers = new LinkedHashMap<>();
/**
* 实例生成器
*/
@Nullable
private Supplier<?> instanceSupplier;
private boolean nonPublicAccessAllowed = true;
private boolean lenientConstructorResolution = true;
@Nullable
private String factoryBeanName;
@Nullable
private String factoryMethodName;
@Nullable
private ConstructorArgumentValues constructorArgumentValues;
@Nullable
private MutablePropertyValues propertyValues;
@Nullable
private MethodOverrides methodOverrides;
@Nullable
private String initMethodName;
@Nullable
private String destroyMethodName;
/**
* 强制执行初始化方法
*/
private boolean enforceInitMethod = true;
/**
* 强制执行销毁方法
*/
private boolean enforceDestroyMethod = true;
/**
* 此 bean 是否是合成的
*/
private boolean synthetic = false;
private int role = BeanDefinition.ROLE_APPLICATION;
@Nullable
private String description;
@Nullable
private Resource resource;
protected AbstractBeanDefinition() {
this(null, null);
}
protected AbstractBeanDefinition(@Nullable ConstructorArgumentValues cargs, @Nullable MutablePropertyValues pvs) {
constructorArgumentValues = cargs;
propertyValues = pvs;
}
protected AbstractBeanDefinition(BeanDefinition original) {
setParentName(original.getParentName());
setBeanClassName(original.getBeanClassName());
setScope(original.getScope());
setAbstract(original.isAbstract());
setLazyInit(original.isLazyInit());
setFactoryBeanName(original.getFactoryBeanName());
setFactoryMethodName(original.getFactoryMethodName());
setRole(original.getRole());
setSource(original.getSource());
copyAttributesFrom(original);
if (original instanceof AbstractBeanDefinition) {
final AbstractBeanDefinition originalAbd = (AbstractBeanDefinition) original;
if (originalAbd.hasBeanClass()) {
setBeanClass(originalAbd.getBeanClass());
}
if (originalAbd.hasConstructorArgumentValues()) {
setConstructorArgumentValues(new ConstructorArgumentValues(original.getConstructorArgumentValues()));
}
if (originalAbd.hasPropertyValues()) {
setPropertyValues(new MutablePropertyValues(original.getPropertyValues()));
}
if (originalAbd.hasMethodOverrides()) {
setMethodOverrides(new MethodOverrides(originalAbd.getMethodOverrides()));
}
setAutowireMode(originalAbd.getAutowireMode());
setDependencyCheck(originalAbd.getDependencyCheck());
setDependsOn(originalAbd.getDependsOn());
setAutowireCandidate(originalAbd.isAutowireCandidate());
setPrimary(originalAbd.isPrimary());
copyQualifiersFrom(originalAbd);
setInstanceSupplier(originalAbd.getInstanceSupplier());
setNonPublicAccessAllowed(originalAbd.isNonPublicAccessAllowed());
setLenientConstructorResolution(originalAbd.isLenientConstructorResolution());
setInitMethodName(originalAbd.getInitMethodName());
setEnforceInitMethod(originalAbd.isEnforceInitMethod());
setDestroyMethodName(originalAbd.getDestroyMethodName());
setEnforceDestroyMethod(originalAbd.isEnforceDestroyMethod());
setSynthetic(originalAbd.isSynthetic());
setResource(originalAbd.getResource());
}
else {
setConstructorArgumentValues(new ConstructorArgumentValues(original.getConstructorArgumentValues()));
setPropertyValues(new MutablePropertyValues(original.getPropertyValues()));
setResourceDescription(original.getResourceDescription());
}
}
public void overrideFrom(BeanDefinition other) {
if (StringUtils.hasLength(other.getBeanClassName())) {
setBeanClassName(other.getBeanClassName());
}
if (StringUtils.hasLength(other.getScope())) {
setScope(other.getScope());
}
setAbstract(other.isAbstract());
setLazyInit(other.isLazyInit());
if (StringUtils.hasLength(other.getFactoryBeanName())) {
setFactoryBeanName(other.getFactoryBeanName());
}
if (StringUtils.hasLength(other.getFactoryMethodName())) {
setFactoryMethodName(other.getFactoryMethodName());
}
setRole(other.getRole());
setSource(other.getSource());
copyAttributesFrom(other);
if (other instanceof AbstractBeanDefinition) {
final AbstractBeanDefinition otherAbd = (AbstractBeanDefinition) other;
if (otherAbd.hasBeanClass()) {
setBeanClass(otherAbd.getBeanClass());
}
if (otherAbd.hasConstructorArgumentValues()) {
getConstructorArgumentValues().addArgumentValues(other.getConstructorArgumentValues());
}
if (otherAbd.hasPropertyValues()) {
getPropertyValues().addPropertyValues(other.getPropertyValues());
}
if (otherAbd.hasMethodOverrides()) {
getMethodOverrides().addOverrides(otherAbd.getMethodOverrides());
}
setAutowireMode(otherAbd.getAutowireMode());
setDependencyCheck(otherAbd.getDependencyCheck());
setDependsOn(otherAbd.getDependsOn());
setAutowireCandidate(otherAbd.isAutowireCandidate());
setPrimary(otherAbd.isPrimary());
copyQualifiersFrom(otherAbd);
setInstanceSupplier(otherAbd.getInstanceSupplier());
setNonPublicAccessAllowed(otherAbd.isNonPublicAccessAllowed());
setLenientConstructorResolution(otherAbd.isLenientConstructorResolution());
if (otherAbd.getInitMethodName() != null) {
setInitMethodName(otherAbd.getInitMethodName());
setEnforceInitMethod(otherAbd.isEnforceInitMethod());
}
if (otherAbd.getDestroyMethodName() != null) {
setDestroyMethodName(otherAbd.getDestroyMethodName());
setEnforceDestroyMethod(otherAbd.isEnforceDestroyMethod());
}
setSynthetic(otherAbd.isSynthetic());
setResource(otherAbd.getResource());
}
else {
getConstructorArgumentValues().addArgumentValues(other.getConstructorArgumentValues());
getPropertyValues().addPropertyValues(other.getPropertyValues());
setResourceDescription(other.getResourceDescription());
}
}
/**
* 将默认值应用到此 BeanDefinition
*/
public void applyDefaults(BeanDefinitionDefaults defaults) {
setLazyInit(defaults.isLazyInit());
setAutowireMode(defaults.getAutowireMode());
setDependencyCheck(defaults.getDependencyCheck());
setInitMethodName(defaults.getInitMethodName());
setEnforceInitMethod(false);
setDestroyMethodName(defaults.getDestroyMethodName());
setEnforceDestroyMethod(false);
}
@Override
public void setBeanClassName(@Nullable String beanClassName) {
beanClass = beanClassName;
}
@Override
@Nullable
public String getBeanClassName() {
final Object beanClassObject = beanClass;
if (beanClassObject instanceof Class) {
return ((Class<?>) beanClassObject).getName();
}
else {
return (String) beanClassObject;
}
}
public void setBeanClass(@Nullable Class<?> beanClass) {
this.beanClass = beanClass;
}
public Class<?> getBeanClass() throws IllegalStateException {
final Object beanClassObject = beanClass;
if (beanClassObject == null) {
throw new IllegalStateException("No bean class specified on bean definition");
}
if (!(beanClassObject instanceof Class)) {
throw new IllegalStateException(
"Bean class name [" + beanClassObject + "] has not been resolved into an actual Class");
}
return (Class<?>) beanClassObject;
}
public boolean hasBeanClass() {
return beanClass instanceof Class;
}
@Nullable
public Class<?> resolveBeanClass(@Nullable ClassLoader classLoader) throws ClassNotFoundException {
final String className = getBeanClassName();
if (className == null) {
return null;
}
final Class<?> resolvedClass = ClassUtils.forName(className, classLoader);
beanClass = resolvedClass;
return resolvedClass;
}
@Override
public void setScope(@Nullable String scope) {
this.scope = scope;
}
@Override
@Nullable
public String getScope() {
return scope;
}
@Override
public boolean isSingleton() {
return SCOPE_SINGLETON.equals(scope) || SCOPE_DEFAULT.equals(scope);
}
@Override
public boolean isPrototype() {
return SCOPE_PROTOTYPE.equals(scope);
}
public void setAbstract(boolean abstractFlag) {
this.abstractFlag = abstractFlag;
}
@Override
public boolean isAbstract() {
return abstractFlag;
}
@Override
public void setLazyInit(boolean lazyInit) {
this.lazyInit = lazyInit;
}
@Override
public boolean isLazyInit() {
return lazyInit;
}
/**
* @see #AUTOWIRE_NO
* @see #AUTOWIRE_BY_NAME
* @see #AUTOWIRE_BY_TYPE
* @see #AUTOWIRE_CONSTRUCTOR
* @see #AUTOWIRE_AUTODETECT
*/
public void setAutowireMode(int autowireMode) {
this.autowireMode = autowireMode;
}
public int getAutowireMode() {
return autowireMode;
}
public int getResolvedAutowireMode() {
if (autowireMode == AUTOWIRE_AUTODETECT) {
// Work out whether to apply setter autowiring or constructor autowiring.
// If it has a no-arg constructor it's deemed to be setter autowiring,
// otherwise we'll try constructor autowiring.
final Constructor<?>[] constructors = getBeanClass().getConstructors();
for (final Constructor<?> constructor : constructors) {
if (constructor.getParameterCount() == 0) {
// 如果有无参数的构造函数,则按照类型注入
return AUTOWIRE_BY_TYPE;
}
}
return AUTOWIRE_CONSTRUCTOR;
}
else {
return autowireMode;
}
}
public void setDependencyCheck(int dependencyCheck) {
this.dependencyCheck = dependencyCheck;
}
public int getDependencyCheck() {
return dependencyCheck;
}
@Override
public void setDependsOn(@Nullable String... dependsOn) {
this.dependsOn = dependsOn;
}
@Override
@Nullable
public String[] getDependsOn() {
return dependsOn;
}
@Override
public void setAutowireCandidate(boolean autowireCandidate) {
this.autowireCandidate = autowireCandidate;
}
@Override
public boolean isAutowireCandidate() {
return autowireCandidate;
}
@Override
public void setPrimary(boolean primary) {
this.primary = primary;
}
@Override
public boolean isPrimary() {
return primary;
}
public void addQualifier(AutowireCandidateQualifier qualifier) {
qualifiers.put(qualifier.getTypeName(), qualifier);
}
public boolean hasQualifier(String typeName) {
return qualifiers.keySet().contains(typeName);
}
@Nullable
public AutowireCandidateQualifier getQualifier(String typeName) {
return qualifiers.get(typeName);
}
public Set<AutowireCandidateQualifier> getQualifiers() {
return new LinkedHashSet<>(qualifiers.values());
}
public void copyQualifiersFrom(AbstractBeanDefinition source) {
Assert.notNull(source, "Source must not be null");
qualifiers.putAll(source.qualifiers);
}
public void setInstanceSupplier(@Nullable Supplier<?> instanceSupplier) {
this.instanceSupplier = instanceSupplier;
}
@Nullable
public Supplier<?> getInstanceSupplier() {
return instanceSupplier;
}
/**
* 是否允许指向此 bean 的外部化元素,访问非公共构造函数和方法。
* 注解的 private 属性不需要 setter 方法即可注入
*/
public void setNonPublicAccessAllowed(boolean nonPublicAccessAllowed) {
this.nonPublicAccessAllowed = nonPublicAccessAllowed;
}
public boolean isNonPublicAccessAllowed() {
return nonPublicAccessAllowed;
}
/**
* 是否在宽大模式下解析构造函数
*/
public void setLenientConstructorResolution(boolean lenientConstructorResolution) {
this.lenientConstructorResolution = lenientConstructorResolution;
}
public boolean isLenientConstructorResolution() {
return lenientConstructorResolution;
}
@Override
public void setFactoryBeanName(@Nullable String factoryBeanName) {
this.factoryBeanName = factoryBeanName;
}
@Override
@Nullable
public String getFactoryBeanName() {
return factoryBeanName;
}
@Override
public void setFactoryMethodName(@Nullable String factoryMethodName) {
this.factoryMethodName = factoryMethodName;
}
@Override
@Nullable
public String getFactoryMethodName() {
return factoryMethodName;
}
public void setConstructorArgumentValues(ConstructorArgumentValues constructorArgumentValues) {
this.constructorArgumentValues = constructorArgumentValues;
}
@Override
public ConstructorArgumentValues getConstructorArgumentValues() {
if (constructorArgumentValues == null) {
constructorArgumentValues = new ConstructorArgumentValues();
}
return constructorArgumentValues;
}
@Override
public boolean hasConstructorArgumentValues() {
return constructorArgumentValues != null && !constructorArgumentValues.isEmpty();
}
public void setPropertyValues(MutablePropertyValues propertyValues) {
this.propertyValues = propertyValues;
}
@Override
public MutablePropertyValues getPropertyValues() {
if (propertyValues == null) {
propertyValues = new MutablePropertyValues();
}
return propertyValues;
}
@Override
public boolean hasPropertyValues() {
return propertyValues != null && !propertyValues.isEmpty();
}
public void setMethodOverrides(MethodOverrides methodOverrides) {
this.methodOverrides = methodOverrides;
}
public MethodOverrides getMethodOverrides() {
if (methodOverrides == null) {
methodOverrides = new MethodOverrides();
}
return methodOverrides;
}
public boolean hasMethodOverrides() {
return methodOverrides != null && !methodOverrides.isEmpty();
}
@Override
public void setInitMethodName(@Nullable String initMethodName) {
this.initMethodName = initMethodName;
}
@Override
@Nullable
public String getInitMethodName() {
return initMethodName;
}
public void setEnforceInitMethod(boolean enforceInitMethod) {
this.enforceInitMethod = enforceInitMethod;
}
public boolean isEnforceInitMethod() {
return enforceInitMethod;
}
@Override
public void setDestroyMethodName(@Nullable String destroyMethodName) {
this.destroyMethodName = destroyMethodName;
}
@Override
@Nullable
public String getDestroyMethodName() {
return destroyMethodName;
}
public void setEnforceDestroyMethod(boolean enforceDestroyMethod) {
this.enforceDestroyMethod = enforceDestroyMethod;
}
public boolean isEnforceDestroyMethod() {
return enforceDestroyMethod;
}
public void setSynthetic(boolean synthetic) {
this.synthetic = synthetic;
}
public boolean isSynthetic() {
return synthetic;
}
@Override
public void setRole(int role) {
this.role = role;
}
@Override
public int getRole() {
return role;
}
@Override
public void setDescription(@Nullable String description) {
this.description = description;
}
@Override
@Nullable
public String getDescription() {
return description;
}
public void setResource(@Nullable Resource resource) {
this.resource = resource;
}
@Nullable
public Resource getResource() {
return resource;
}
public void setResourceDescription(@Nullable String resourceDescription) {
resource = resourceDescription != null ? new DescriptiveResource(resourceDescription) : null;
}
@Override
@Nullable
public String getResourceDescription() {
return resource != null ? resource.getDescription() : null;
}
public void setOriginatingBeanDefinition(BeanDefinition originatingBd) {
resource = new BeanDefinitionResource(originatingBd);
}
@Override
@Nullable
public BeanDefinition getOriginatingBeanDefinition() {
return resource instanceof BeanDefinitionResource ?
((BeanDefinitionResource) resource).getBeanDefinition() : null;
}
/**
* 验证此 BeanDefinition
*/
public void validate() throws BeanDefinitionValidationException {
if (hasMethodOverrides() && getFactoryMethodName() != null) {
throw new BeanDefinitionValidationException(
"Cannot combine static factory method with method overrides: " +
"the static factory method must create the instance");
}
if (hasBeanClass()) {
prepareMethodOverrides();
}
}
public void prepareMethodOverrides() throws BeanDefinitionValidationException {
// Check that lookup methods exists.
if (hasMethodOverrides()) {
final Set<MethodOverride> overrides = getMethodOverrides().getOverrides();
synchronized (overrides) {
for (final MethodOverride mo : overrides) {
prepareMethodOverride(mo);
}
}
}
}
protected void prepareMethodOverride(MethodOverride mo) throws BeanDefinitionValidationException {
final int count = ClassUtils.getMethodCountForName(getBeanClass(), mo.getMethodName());
if (count == 0) {
throw new BeanDefinitionValidationException(
"Invalid method override: no method with name '" + mo.getMethodName() +
"' on class [" + getBeanClassName() + "]");
}
else if (count == 1) {
// Mark override as not overloaded, to avoid the overhead of arg type checking.
mo.setOverloaded(false);
}
}
@Override
public Object clone() {
return cloneBeanDefinition();
}
/**
* 克隆此 BeanDefinition
*/
public abstract AbstractBeanDefinition cloneBeanDefinition();
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (!(other instanceof AbstractBeanDefinition)) {
return false;
}
final AbstractBeanDefinition that = (AbstractBeanDefinition) other;
boolean rtn = ObjectUtils.nullSafeEquals(getBeanClassName(), that.getBeanClassName());
rtn = rtn &= ObjectUtils.nullSafeEquals(scope, that.scope);
rtn = rtn &= abstractFlag == that.abstractFlag;
rtn = rtn &= lazyInit == that.lazyInit;
rtn = rtn &= autowireMode == that.autowireMode;
rtn = rtn &= dependencyCheck == that.dependencyCheck;
rtn = rtn &= Arrays.equals(dependsOn, that.dependsOn);
rtn = rtn &= autowireCandidate == that.autowireCandidate;
rtn = rtn &= ObjectUtils.nullSafeEquals(qualifiers, that.qualifiers);
rtn = rtn &= primary == that.primary;
rtn = rtn &= nonPublicAccessAllowed == that.nonPublicAccessAllowed;
rtn = rtn &= lenientConstructorResolution == that.lenientConstructorResolution;
rtn = rtn &= ObjectUtils.nullSafeEquals(constructorArgumentValues, that.constructorArgumentValues);
rtn = rtn &= ObjectUtils.nullSafeEquals(propertyValues, that.propertyValues);
rtn = rtn &= ObjectUtils.nullSafeEquals(methodOverrides, that.methodOverrides);
rtn = rtn &= ObjectUtils.nullSafeEquals(factoryBeanName, that.factoryBeanName);
rtn = rtn &= ObjectUtils.nullSafeEquals(factoryMethodName, that.factoryMethodName);
rtn = rtn &= ObjectUtils.nullSafeEquals(initMethodName, that.initMethodName);
rtn = rtn &= enforceInitMethod == that.enforceInitMethod;
rtn = rtn &= ObjectUtils.nullSafeEquals(destroyMethodName, that.destroyMethodName);
rtn = rtn &= enforceDestroyMethod == that.enforceDestroyMethod;
rtn = rtn &= synthetic == that.synthetic;
rtn = rtn &= role == that.role;
return rtn && super.equals(other);
}
@Override
public int hashCode() {
int hashCode = ObjectUtils.nullSafeHashCode(getBeanClassName());
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(scope);
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(constructorArgumentValues);
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(propertyValues);
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(factoryBeanName);
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(factoryMethodName);
hashCode = 29 * hashCode + super.hashCode();
return hashCode;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("class [");
sb.append(getBeanClassName()).append("]");
sb.append("; scope=").append(scope);
sb.append("; abstract=").append(abstractFlag);
sb.append("; lazyInit=").append(lazyInit);
sb.append("; autowireMode=").append(autowireMode);
sb.append("; dependencyCheck=").append(dependencyCheck);
sb.append("; autowireCandidate=").append(autowireCandidate);
sb.append("; primary=").append(primary);
sb.append("; factoryBeanName=").append(factoryBeanName);
sb.append("; factoryMethodName=").append(factoryMethodName);
sb.append("; initMethodName=").append(initMethodName);
sb.append("; destroyMethodName=").append(destroyMethodName);
if (resource != null) {
sb.append("; defined in ").append(resource.getDescription());
}
return sb.toString();
}
}
- RootBeanDefinition
/**
* 合并的 BeanDefinition
*/
@SuppressWarnings("serial")
public class RootBeanDefinition extends AbstractBeanDefinition {
/**
* 持有 bean 名称、bean 别名和 BeanDefinition 的包装器
*/
@Nullable
private BeanDefinitionHolder decoratedDefinition;
/**
* 注解元素
*/
@Nullable
private AnnotatedElement qualifiedElement;
/**
* 允许缓存
*/
boolean allowCaching = true;
boolean isFactoryMethodUnique = false;
@Nullable
volatile ResolvableType targetType;
/** 此 BeanDefinition 关联的 Class 类型 */
@Nullable
volatile Class<?> resolvedTargetType;
/** 泛型工厂方法的返回类型 */
@Nullable
volatile ResolvableType factoryMethodReturnType;
/** 缓存用于内省的惟一工厂方法 */
@Nullable
volatile Method factoryMethodToIntrospect;
/** 以下 4 个构造函数的锁 */
final Object constructorArgumentLock = new Object();
/** 已解析的构造函数或工厂方法 */
@Nullable
Executable resolvedConstructorOrFactoryMethod;
/** 构造函数参数是否已解析 */
boolean constructorArgumentsResolved = false;
/** 已解析的构造函数参数 */
@Nullable
Object[] resolvedConstructorArguments;
/** 部分准备的构造函数参数 */
@Nullable
Object[] preparedConstructorArguments;
/** Common lock for the two post-processing fields below. */
final Object postProcessingLock = new Object();
/** 是否已应用了 MergedBeanDefinitionPostProcessor */
boolean postProcessed = false;
/** before-instantiation post-processor 已启动 */
@Nullable
volatile Boolean beforeInstantiationResolved;
/**
* 外部管理的配置成员
*/
@Nullable
private Set<Member> externallyManagedConfigMembers;
/**
* 外部管理的初始化方法
*/
@Nullable
private Set<String> externallyManagedInitMethods;
/**
* 外部管理的销毁方法
*/
@Nullable
private Set<String> externallyManagedDestroyMethods;
public RootBeanDefinition() {
super();
}
public RootBeanDefinition(@Nullable Class<?> beanClass) {
super();
setBeanClass(beanClass);
}
public <T> RootBeanDefinition(@Nullable Class<T> beanClass, @Nullable Supplier<T> instanceSupplier) {
super();
setBeanClass(beanClass);
setInstanceSupplier(instanceSupplier);
}
public <T> RootBeanDefinition(@Nullable Class<T> beanClass, String scope, @Nullable Supplier<T> instanceSupplier) {
super();
setBeanClass(beanClass);
setScope(scope);
setInstanceSupplier(instanceSupplier);
}
*/
public RootBeanDefinition(@Nullable Class<?> beanClass, int autowireMode, boolean dependencyCheck) {
super();
setBeanClass(beanClass);
setAutowireMode(autowireMode);
if (dependencyCheck && getResolvedAutowireMode() != AUTOWIRE_CONSTRUCTOR) {
setDependencyCheck(DEPENDENCY_CHECK_OBJECTS);
}
}
public RootBeanDefinition(@Nullable Class<?> beanClass, @Nullable ConstructorArgumentValues cargs,
@Nullable MutablePropertyValues pvs) {
super(cargs, pvs);
setBeanClass(beanClass);
}
public RootBeanDefinition(String beanClassName) {
setBeanClassName(beanClassName);
}
public RootBeanDefinition(String beanClassName, ConstructorArgumentValues cargs, MutablePropertyValues pvs) {
super(cargs, pvs);
setBeanClassName(beanClassName);
}
public RootBeanDefinition(RootBeanDefinition original) {
super(original);
decoratedDefinition = original.decoratedDefinition;
qualifiedElement = original.qualifiedElement;
allowCaching = original.allowCaching;
isFactoryMethodUnique = original.isFactoryMethodUnique;
targetType = original.targetType;
}
RootBeanDefinition(BeanDefinition original) {
super(original);
}
@Override
public String getParentName() {
return null;
}
@Override
public void setParentName(@Nullable String parentName) {
if (parentName != null) {
throw new IllegalArgumentException("Root bean cannot be changed into a child bean with parent reference");
}
}
public void setDecoratedDefinition(@Nullable BeanDefinitionHolder decoratedDefinition) {
this.decoratedDefinition = decoratedDefinition;
}
@Nullable
public BeanDefinitionHolder getDecoratedDefinition() {
return decoratedDefinition;
}
public void setQualifiedElement(@Nullable AnnotatedElement qualifiedElement) {
this.qualifiedElement = qualifiedElement;
}
@Nullable
public AnnotatedElement getQualifiedElement() {
return qualifiedElement;
}
public void setTargetType(ResolvableType targetType) {
this.targetType = targetType;
}
public void setTargetType(@Nullable Class<?> targetType) {
this.targetType = targetType != null ? ResolvableType.forClass(targetType) : null;
}
@Nullable
public Class<?> getTargetType() {
if (resolvedTargetType != null) {
return resolvedTargetType;
}
final ResolvableType targetType = this.targetType;
return targetType != null ? targetType.resolve() : null;
}
public ResolvableType getResolvableType() {
final ResolvableType targetType = this.targetType;
return targetType != null ? targetType : ResolvableType.forClass(getBeanClass());
}
@Nullable
public Constructor<?>[] getPreferredConstructors() {
return null;
}
public void setUniqueFactoryMethodName(String name) {
Assert.hasText(name, "Factory method name must not be empty");
setFactoryMethodName(name);
isFactoryMethodUnique = true;
}
public boolean isFactoryMethod(Method candidate) {
return candidate.getName().equals(getFactoryMethodName());
}
@Nullable
public Method getResolvedFactoryMethod() {
return factoryMethodToIntrospect;
}
public void registerExternallyManagedConfigMember(Member configMember) {
synchronized (postProcessingLock) {
if (externallyManagedConfigMembers == null) {
externallyManagedConfigMembers = new HashSet<>(1);
}
externallyManagedConfigMembers.add(configMember);
}
}
public boolean isExternallyManagedConfigMember(Member configMember) {
synchronized (postProcessingLock) {
return externallyManagedConfigMembers != null &&
externallyManagedConfigMembers.contains(configMember);
}
}
/**
* @PostConstruct
*/
public void registerExternallyManagedInitMethod(String initMethod) {
synchronized (postProcessingLock) {
if (externallyManagedInitMethods == null) {
externallyManagedInitMethods = new HashSet<>(1);
}
externallyManagedInitMethods.add(initMethod);
}
}
public boolean isExternallyManagedInitMethod(String initMethod) {
synchronized (postProcessingLock) {
return externallyManagedInitMethods != null &&
externallyManagedInitMethods.contains(initMethod);
}
}
/**
* @PreDestroy
*/
public void registerExternallyManagedDestroyMethod(String destroyMethod) {
synchronized (postProcessingLock) {
if (externallyManagedDestroyMethods == null) {
externallyManagedDestroyMethods = new HashSet<>(1);
}
externallyManagedDestroyMethods.add(destroyMethod);
}
}
public boolean isExternallyManagedDestroyMethod(String destroyMethod) {
synchronized (postProcessingLock) {
return externallyManagedDestroyMethods != null &&
externallyManagedDestroyMethods.contains(destroyMethod);
}
}
@Override
public RootBeanDefinition cloneBeanDefinition() {
return new RootBeanDefinition(this);
}
@Override
public boolean equals(Object other) {
return this == other || other instanceof RootBeanDefinition && super.equals(other);
}
@Override
public String toString() {
return "Root bean: " + super.toString();
}
}
- GenericBeanDefinition
/**
* 标准 bean 定义的 GenericBeanDefinition,主要用于 XML 配置中的 bean
*/
@SuppressWarnings("serial")
public class GenericBeanDefinition extends AbstractBeanDefinition {
@Nullable
private String parentName;
public GenericBeanDefinition() {
super();
}
public GenericBeanDefinition(BeanDefinition original) {
super(original);
}
@Override
public void setParentName(@Nullable String parentName) {
this.parentName = parentName;
}
@Override
@Nullable
public String getParentName() {
return this.parentName;
}
@Override
public AbstractBeanDefinition cloneBeanDefinition() {
return new GenericBeanDefinition(this);
}
@Override
public boolean equals(Object other) {
return (this == other || (other instanceof GenericBeanDefinition && super.equals(other)));
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("Generic bean");
if (this.parentName != null) {
sb.append(" with parent '").append(this.parentName).append("'");
}
sb.append(": ").append(super.toString());
return sb.toString();
}
}
- ScannedGenericBeanDefinition
/**
* 基于包扫描发现,通过注解加入到容器中的 BeanDefinition
*/
@SuppressWarnings("serial")
public class ScannedGenericBeanDefinition extends GenericBeanDefinition implements AnnotatedBeanDefinition {
/**
* 注解元数据
*/
private final AnnotationMetadata metadata;
public ScannedGenericBeanDefinition(MetadataReader metadataReader) {
Assert.notNull(metadataReader, "MetadataReader must not be null");
this.metadata = metadataReader.getAnnotationMetadata();
setBeanClassName(this.metadata.getClassName());
}
@Override
public final AnnotationMetadata getMetadata() {
return this.metadata;
}
@Override
@Nullable
public MethodMetadata getFactoryMethodMetadata() {
return null;
}
}
- AnnotatedGenericBeanDefinition
@SuppressWarnings("serial")
public class AnnotatedGenericBeanDefinition extends GenericBeanDefinition implements AnnotatedBeanDefinition {
/**
* 类注解元数据
*/
private final AnnotationMetadata metadata;
/**
* 方法元数据
*/
@Nullable
private MethodMetadata factoryMethodMetadata;
public AnnotatedGenericBeanDefinition(Class<?> beanClass) {
setBeanClass(beanClass);
metadata = new StandardAnnotationMetadata(beanClass, true);
}
public AnnotatedGenericBeanDefinition(AnnotationMetadata metadata) {
Assert.notNull(metadata, "AnnotationMetadata must not be null");
if (metadata instanceof StandardAnnotationMetadata) {
setBeanClass(((StandardAnnotationMetadata) metadata).getIntrospectedClass());
}
else {
setBeanClassName(metadata.getClassName());
}
this.metadata = metadata;
}
public AnnotatedGenericBeanDefinition(AnnotationMetadata metadata, MethodMetadata factoryMethodMetadata) {
this(metadata);
Assert.notNull(factoryMethodMetadata, "MethodMetadata must not be null");
setFactoryMethodName(factoryMethodMetadata.getMethodName());
this.factoryMethodMetadata = factoryMethodMetadata;
}
@Override
public final AnnotationMetadata getMetadata() {
return metadata;
}
@Override
@Nullable
public final MethodMetadata getFactoryMethodMetadata() {
return factoryMethodMetadata;
}
}
- ConfigurationClassBeanDefinition
ConfigurationClassBeanDefinitionReader#
/**
* 配置类 BeanDefinition、包括通过 @Bean 注解创建的 BeanDefinition
*/
private static class ConfigurationClassBeanDefinition extends RootBeanDefinition implements AnnotatedBeanDefinition {
/**
* 类注解元数据
*/
private final AnnotationMetadata annotationMetadata;
/**
* 方法元数据
*/
private final MethodMetadata factoryMethodMetadata;
public ConfigurationClassBeanDefinition(ConfigurationClass configClass, MethodMetadata beanMethodMetadata) {
this.annotationMetadata = configClass.getMetadata();
this.factoryMethodMetadata = beanMethodMetadata;
setLenientConstructorResolution(false);
}
public ConfigurationClassBeanDefinition(
RootBeanDefinition original, ConfigurationClass configClass, MethodMetadata beanMethodMetadata) {
super(original);
this.annotationMetadata = configClass.getMetadata();
this.factoryMethodMetadata = beanMethodMetadata;
}
private ConfigurationClassBeanDefinition(ConfigurationClassBeanDefinition original) {
super(original);
this.annotationMetadata = original.annotationMetadata;
this.factoryMethodMetadata = original.factoryMethodMetadata;
}
@Override
public AnnotationMetadata getMetadata() {
return this.annotationMetadata;
}
@Override
public MethodMetadata getFactoryMethodMetadata() {
return this.factoryMethodMetadata;
}
@Override
public boolean isFactoryMethod(Method candidate) {
return (super.isFactoryMethod(candidate) && BeanAnnotationHelper.isBeanAnnotated(candidate));
}
@Override
public ConfigurationClassBeanDefinition cloneBeanDefinition() {
return new ConfigurationClassBeanDefinition(this);
}
}
BeanDefinition 实例的更多相关文章
- Spring源码分析——BeanFactory体系之接口详细分析
Spring的BeanFactory的继承体系堪称经典.这是众所周知的!作为Java程序员,不能错过! 前面的博文分析了Spring的Resource资源类Resouce.今天开始分析Spring的I ...
- Spring IoC容器初始化过程学习
IoC容器是什么?IoC文英全称Inversion of Control,即控制反转,我么可以这么理解IoC容器: 把某些业务对象的的控制权交给一个平台或者框架来同一管理,这个同一管理的平台可以称为I ...
- python的装饰器
什么是python的装饰器? 网络上的定义: 装饰器就是一函数,用来包装函数的函数,用来修饰原函数,将其重新赋值给原来的标识符,并永久的丧失原函数的引用. 在google上搜索下python 装饰器 ...
- 3.8 spring - AbstractBeanDefinition 介绍
之前,我们已尽完成了xml 文档到 GenericBeanDefinition的转换, 也就是说,到这里,所有的配置都可以在GenericBeanDefinition 的实例中找到对应的配置. Gen ...
- Spring源码入门——DefaultBeanNameGenerator解析
我们知道在spring中每个bean都要有一个id或者name标示每个唯一的bean,在xml中定义一个bean可以指定其id和name值,但那些没有指定的,或者注解的spring的beanname怎 ...
- Spring MVC 解读——@Autowired(转)
转自:http://my.oschina.net/HeliosFly/blog/203902 Spring MVC 解读——@Autowired 一.@Autowired 作为一个Spring开发者对 ...
- BeanFactory调用getbean()对象
Spring通过资源加载器加载相应的XML文件,使用读取器读取资源加载器中的文件到读取器中,在读取过程中,解析相应的xml文件元素,转化为spring定义的数据结BeanDefinition,把相应的 ...
- Spring IOC之依赖
一个标准的企业级应用不只有一个对象组成.即使是最简单的引用也会有个相互作用的对象以使最终呈现 在用户面前的是个连贯一致的引用. 1依赖注入 依赖注入(DI)是一个对象定义他们依赖的过程,也就是说他们一 ...
- Spring读书笔记——bean解析
前情回顾 上篇<Spring读书笔记--bean加载>我们从代码角度介绍了有哪些类负责解析XML文件,又是如何一步步从XML格式脱变成我们熟悉的bean的,直到DefaultBeanDef ...
随机推荐
- 日志:slf4j+logback 的配置与使用
1. 常用日志组件和选择 java开发日志处理是发现和调试bug所 必不可少的,那么现在企业中常用的日志组件有哪些呢,JCL . JUL. SLF4j.Log4j. Log4j2 . Logbac ...
- IT技术网站博客推荐
CSDN 全球最大中文IT社区,为IT专业技术人员提供最全面的信息传播和服务平台. 51CTO 技术成就梦想 - 中国领先的IT技术网站 itEye Java编程 Spring框架 Ajax技术 ag ...
- Delphi FileListBox组件
- 学习Linux的准备
学习方式: 主动学习: 动手实践:40% 讲给别人:70% 被动学习: 听课:10% 笔记:20% 写博客的要求: 写博客是对某一方面知识的总结,输出:是知识的书面化的表达方式.写博客不同于写笔记,笔 ...
- 第二章 Vue快速入门-- 25 过滤器-定义格式化时间的全局过滤器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- 2019全国卷(III)理科23题的另类解法
已知 $x,y,z\in\textbf{R}$且$x+y+z=1$ (1)求$(x-1)^2+(y+1)^2+(z+1)^2$的最小值: (2)若$(x-2)^2+(y-1)^2+(z-a)^2\ge ...
- C#使用BinaryReader类读取二进制文件
Close():关闭BinaryReader对象: Read():从指定流读取数据,并将指针迁移,指向下一个字符. ReadDecimal():从指定流读取一个十进制数值,并将在流中的位置向前 ...
- 微信小程序没找到构建npm或者没找到node_modules目录以及如何在小程序中引入vant weapp组件
微信小程序没找到构建npm或者没找到node_modules目录解决方法如下: 按照微信小程序提供的文档npm install是不行的,直接提示没找到可构建的npm包. 1.直接安装:npm init ...
- 【leetcode】1012. Numbers With Repeated Digits
题目如下: Given a positive integer N, return the number of positive integers less than or equal to N tha ...
- Python 正则表达式Ⅲ
re.match与re.search的区别 re.match只匹配字符串的开始,如果字符串开始https://www.xuanhe.net/不符合正则表达式,则匹配失败,函数返回None:而re.se ...