• AbstractBeanDefinition解读


    AbstractBeanDefinition解读

    AbstractBeanDefinition介绍

    AbstractBeanDefinition是实现了BeanDefinition接口的一个抽象类,是一个BeanDefinition的一个基础抽象类。

    许多BeanDefinition实现类都继承了AbstractBeanDefinition,如:

    • RootBeanDefinition
    • ChildBeanDefinition
    • GenericBeanDefinition
    public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor
          implements BeanDefinition, Cloneable
    
    • 1
    • 2

    AbstractBeanDefinition源码

    成员属性

    AbstractBeanDefinition中添加了一系列成员属性,跟BeanDefinition接口接口方法相关。

        //bean的Class
    	@Nullable
    	private volatile Object beanClass;
    	//作用域
    	@Nullable
    	private String scope = SCOPE_DEFAULT;
    
    	private boolean abstractFlag = false;
    	
    	//懒加载,自动装配,依赖检测
    	@Nullable
    	private Boolean lazyInit;
    	private int autowireMode = AUTOWIRE_NO;
    	private int dependencyCheck = DEPENDENCY_CHECK_NONE;
        
        //依赖的beanName
    	@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;
        
    	//factoryBean信息
    	@Nullable
    	private String factoryBeanName;
    	@Nullable
    	private String factoryMethodName;
    
    
    	@Nullable
    	private ConstructorArgumentValues constructorArgumentValues;
    
    	@Nullable
    	private MutablePropertyValues propertyValues;
    
    	private MethodOverrides methodOverrides = new MethodOverrides();
    	
    	//两个生命周期的钩子方法
    	@Nullable
    	private String initMethodName;
    	@Nullable
    	private String destroyMethodName;
    
    
    	private boolean enforceInitMethod = true;
    
    	private boolean enforceDestroyMethod = true;
    
    	private boolean synthetic = false;
    
    	private int role = BeanDefinition.ROLE_APPLICATION;
    
    	@Nullable
    	private String description;
    
    	@Nullable
    	private Resource resource;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    部分构造函数

    AbstractBeanDefinition有一些深复制的构造函数

    //深复制的构造函数    
        /**
    	 * Create a new AbstractBeanDefinition as a deep copy of the given
    	 * bean definition.
    	 * @param original the original bean definition to copy from
    	 */
    	protected AbstractBeanDefinition(BeanDefinition original) {
    		setParentName(original.getParentName());
    		setBeanClassName(original.getBeanClassName());
    		setScope(original.getScope());
    		setAbstract(original.isAbstract());
    		setFactoryBeanName(original.getFactoryBeanName());
    		setFactoryMethodName(original.getFactoryMethodName());
    		setRole(original.getRole());
    		setSource(original.getSource());
    		copyAttributesFrom(original);
    
    		if (original instanceof AbstractBeanDefinition) {
    			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()));
    			}
    			Boolean lazyInit = originalAbd.getLazyInit();
    			if (lazyInit != null) {
    				setLazyInit(lazyInit);
    			}
    			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()));
    			setLazyInit(original.isLazyInit());
    			setResourceDescription(original.getResourceDescription());
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    overrideFrom(BeanDefinition other)

    覆盖当前BeanDefinition信息

    public void overrideFrom(BeanDefinition other) {
    		if (StringUtils.hasLength(other.getBeanClassName())) {
    			setBeanClassName(other.getBeanClassName());
    		}
    		if (StringUtils.hasLength(other.getScope())) {
    			setScope(other.getScope());
    		}
    		setAbstract(other.isAbstract());
    		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) {
    			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());
    			}
    			Boolean lazyInit = otherAbd.getLazyInit();
    			if (lazyInit != null) {
    				setLazyInit(lazyInit);
    			}
    			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());
    			setLazyInit(other.isLazyInit());
    			setResourceDescription(other.getResourceDescription());
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
  • 相关阅读:
    Nacos分级存储
    直流有刷电机驱动基于STM32F302R8+X-NUCLEO-IHM07M1(一)
    微软表示Visual Studio的IDE即日起开启“退休”倒计时
    【Django学习笔记 - 13】:关联查询(日期查询、一对一查询、一对多查询、多对多查询)
    轻量级神经网络算法-MobileNet v1
    node模块化的流程说明
    LabVIEW中将前面板置于所有桌面窗口的前面
    吸烟(抽烟)检测和识别2:Pytorch实现吸烟(抽烟)检测和识别(含吸烟(抽烟)数据集和训练代码)
    项目测试排期的正确方法是什么?
    CiteSpace for Mac 最新保姆级教程
  • 原文地址:https://blog.csdn.net/qq_43203949/article/details/125454751