zoukankan      html  css  js  c++  java
  • 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);
        }
    }
    
  • 相关阅读:
    HTTP长连接、短连接使用及测试
    递归分治算法之二维数组二分查找(Java版本)
    Java二维数组的概念和使用方法
    java二维数组遍历
    HashMap多线程并发问题分析
    Linux 移动或重命名文件/目录-mv 的10个实用例子
    CSS fixed 定位元素失效的问题
    关于 JavaScript 中的继承
    React 虚拟 DOM 的差异检测机制
    下拉框中选项的快速定位
  • 原文地址:https://www.cnblogs.com/zhuxudong/p/10351576.html
Copyright © 2011-2022 走看看