Spring IOC ( 三) : AbstractBeanDefiniton类源码分析


Spring IOC ( 三) : AbstractBeanDefiniton类源码分析

 

 

 

public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor
		implements BeanDefinition, Cloneable {

	/**
	 * 常数为默认作用域的名称:“”,相当于单身状态,但是从父bean定义(如适用)所覆盖。
	 */
	public static final String SCOPE_DEFAULT = "";


	/**
	 * 常数,指示没有自动装配。
	 */
	public static final int AUTOWIRE_NO = AutowireCapableBeanFactory.AUTOWIRE_NO;

	/**
	 * 常数,表示按name自动装配bean的属性。
	 */
	public static final int AUTOWIRE_BY_NAME = AutowireCapableBeanFactory.AUTOWIRE_BY_NAME;

	/**
	 * 常数,指示按类型自动装配bean的属性。
	 */
	public static final int AUTOWIRE_BY_TYPE = AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE;

	/**
	 * 常数,表示自动装配一个构造。
	 */
	public static final int AUTOWIRE_CONSTRUCTOR = AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR;

	/**
	 * 常数指示不依赖检查。
	 */
	public static final int DEPENDENCY_CHECK_NONE = 0;

	/**
	 * 常数,表示为对象引用的依赖检查。
	 */
	public static final int DEPENDENCY_CHECK_OBJECTS = 1;

	/**
	 * 常数,指出“简单”的属性的依赖检查。
	 */
	public static final int DEPENDENCY_CHECK_SIMPLE = 2;

	/**
	 * 常数,指示所有属性的依赖检查
	 */
	public static final int DEPENDENCY_CHECK_ALL = 3;

//应该是这个bean的Class类型吧
	private volatile Object beanClass;
//默认scope为“”,相当于单例
	private String scope = SCOPE_DEFAULT;
//bean默认为单例的
	private boolean singleton = true;
//bean默认不是原型的
	private boolean prototype = false;
//bean默认不是抽象的
	private boolean abstractFlag = false;
//bean默认不开启延迟初始化
	private boolean lazyInit = false;
//bean默认自动装配功能是关闭的
	private int autowireMode = AUTOWIRE_NO;
//bean的默认依赖检查方式
	private int dependencyCheck = DEPENDENCY_CHECK_NONE;
//这个bean要初始化依赖的bean名称数组
	private String[] dependsOn;
//自动装配候选者
	private boolean autowireCandidate = true;
//默认不是主要候选者
	private boolean primary = false;
//不太清楚
	private final Map<String, AutowireCandidateQualifier> qualifiers =
			new LinkedHashMap<String, AutowireCandidateQualifier>(0);
//允许访问非公开的构造器和方法
	private boolean nonPublicAccessAllowed = true;
//不太清楚
	private boolean lenientConstructorResolution = true;
//	构造参数持有者
	private ConstructorArgumentValues constructorArgumentValues;
//	一个或多个属性的持有者
	private MutablePropertyValues propertyValues;
// 	方法重写的持有者
	private MethodOverrides methodOverrides = new MethodOverrides();
//     这个bean的工厂bean名称
	private String factoryBeanName;
// 这个bean的工厂方法名
	private String factoryMethodName;
//这个bean的初始化方法名
	private String initMethodName;
//这个bean的销毁方法名
	private String destroyMethodName;
//默认执行初始化方法
	private boolean enforceInitMethod = true;
//默认执行销毁方法
	private boolean enforceDestroyMethod = true;
//  不太清楚
	private boolean synthetic = false;
//暗示角色是应用程序的重要组成部分
	private int role = BeanDefinition.ROLE_APPLICATION;
//这个bean的描述
	private String description;
//这个bean定义的资源
	private Resource resource;


	/**
	 * 创建新的AbstractBeanDefinition实例并给定ConstructorArgumentValues实例和MutabePropertyValues实例
	 */
	protected AbstractBeanDefinition(ConstructorArgumentValues cargs, MutablePropertyValues pvs) {
		setConstructorArgumentValues(cargs);
		setPropertyValues(pvs);
	}


	/**
	 * 创建一个新的AbstractBeanDefinition并深入拷贝给定的BeanDefinition实例
	 */
	protected AbstractBeanDefinition(BeanDefinition original) {
//		抽象方法,由子类实现,设置父类名
		setParentName(original.getParentName());
//		设置这个bean的类名称
		setBeanClassName(original.getBeanClassName());
//		设置这个bean的工厂bean名称
		setFactoryBeanName(original.getFactoryBeanName());
//		设置这个bean的工厂方法名称
		setFactoryMethodName(original.getFactoryMethodName());
//		设置这个bean的作用范围,如单例的还是原型的,也有可能是其它的
		setScope(original.getScope());
//		设置这个bean是否是抽象的
		setAbstract(original.isAbstract());
//		设置这个bean是否开启延载初始化
		setLazyInit(original.isLazyInit());
//		设置这个bean的角色
		setRole(original.getRole());
//		设置这个bean的构造参数持有者
		setConstructorArgumentValues(new ConstructorArgumentValues(original.getConstructorArgumentValues()));
//		设置这个bean的Property持有者
		setPropertyValues(new MutablePropertyValues(original.getPropertyValues()));
//		设置这个bean的配置源
		setSource(original.getSource());
//		这个bean复制属性组名称
		copyAttributesFrom(original);
//判断origina是否是AbstractBeanDefinition子类
		if (original instanceof AbstractBeanDefinition) {
			AbstractBeanDefinition originalAbd = (AbstractBeanDefinition) original;
			if (originalAbd.hasBeanClass()) {
//				设置这个bean的Class类型
				setBeanClass(originalAbd.getBeanClass());
			}
//			设置这个bean的自动装配模式
			setAutowireMode(originalAbd.getAutowireMode());
//			设置这个bean的依赖检查
			setDependencyCheck(originalAbd.getDependencyCheck());
//			设置这个bean初始化要依赖的bean名称数组
			setDependsOn(originalAbd.getDependsOn());
//			设置这个bean是否自动装配候选
			setAutowireCandidate(originalAbd.isAutowireCandidate());
//			
			copyQualifiersFrom(originalAbd);
//			设置这个bean是否是主要候选者
			setPrimary(originalAbd.isPrimary());
//			设置是否允许访问非public的构造器和方法
			setNonPublicAccessAllowed(originalAbd.isNonPublicAccessAllowed());
			//不清楚
			setLenientConstructorResolution(originalAbd.isLenientConstructorResolution());
//			设置这个bean的初始化方法名
			setInitMethodName(originalAbd.getInitMethodName());
//			设置是否执行初始化方法
			setEnforceInitMethod(originalAbd.isEnforceInitMethod());
//			设置这个bean的销毁方法名
			setDestroyMethodName(originalAbd.getDestroyMethodName());
//			设置是否执行销毁方法
			setEnforceDestroyMethod(originalAbd.isEnforceDestroyMethod());
//			设置这个bean的方法重写持有者
			setMethodOverrides(new MethodOverrides(originalAbd.getMethodOverrides()));
//			设置这个bean是人造的或者是应用程序本身
			setSynthetic(originalAbd.isSynthetic());
//			
			setResource(originalAbd.getResource());
		}
		else {
			setResourceDescription(original.getResourceDescription());
		}
	}


	/**
	 * Override settings in this bean definition (assumably a copied parent
	 * from a parent-child inheritance relationship) from the given bean
	 * definition (assumably the child).
	 * <ul>
	 * <li>Will override beanClass if specified in the given bean definition.
	 * <li>Will always take <code>abstract</code>, <code>scope</code>,
	 * <code>lazyInit</code>, <code>autowireMode</code>, <code>dependencyCheck</code>,
	 * and <code>dependsOn</code> from the given bean definition.
	 * <li>Will add <code>constructorArgumentValues</code>, <code>propertyValues</code>,
	 * <code>methodOverrides</code> from the given bean definition to existing ones.
	 * <li>Will override <code>factoryBeanName</code>, <code>factoryMethodName</code>,
	 * <code>initMethodName</code>, and <code>destroyMethodName</code> if specified
	 * in the given bean definition.
	 * </ul>
	 */
	public void overrideFrom(BeanDefinition other) {
		if (StringUtils.hasLength(other.getBeanClassName())) {
			setBeanClassName(other.getBeanClassName());
		}
		if (StringUtils.hasLength(other.getFactoryBeanName())) {
			setFactoryBeanName(other.getFactoryBeanName());
		}
		if (StringUtils.hasLength(other.getFactoryMethodName())) {
			setFactoryMethodName(other.getFactoryMethodName());
		}
		if (StringUtils.hasLength(other.getScope())) {
			setScope(other.getScope());
		}
		setAbstract(other.isAbstract());
		setLazyInit(other.isLazyInit());
		setRole(other.getRole());
		getConstructorArgumentValues().addArgumentValues(other.getConstructorArgumentValues());
		getPropertyValues().addPropertyValues(other.getPropertyValues());
		setSource(other.getSource());
		copyAttributesFrom(other);

		if (other instanceof AbstractBeanDefinition) {
			AbstractBeanDefinition otherAbd = (AbstractBeanDefinition) other;
			if (otherAbd.hasBeanClass()) {
				setBeanClass(otherAbd.getBeanClass());
			}
			setAutowireCandidate(otherAbd.isAutowireCandidate());
			setAutowireMode(otherAbd.getAutowireMode());
			copyQualifiersFrom(otherAbd);
			setPrimary(otherAbd.isPrimary());
			setDependencyCheck(otherAbd.getDependencyCheck());
			setDependsOn(otherAbd.getDependsOn());
			setNonPublicAccessAllowed(otherAbd.isNonPublicAccessAllowed());
			setLenientConstructorResolution(otherAbd.isLenientConstructorResolution());
			if (StringUtils.hasLength(otherAbd.getInitMethodName())) {
				setInitMethodName(otherAbd.getInitMethodName());
				setEnforceInitMethod(otherAbd.isEnforceInitMethod());
			}
			if (StringUtils.hasLength(otherAbd.getDestroyMethodName())) {
				setDestroyMethodName(otherAbd.getDestroyMethodName());
				setEnforceDestroyMethod(otherAbd.isEnforceDestroyMethod());
			}
			getMethodOverrides().addOverrides(otherAbd.getMethodOverrides());
			setSynthetic(otherAbd.isSynthetic());
			setResource(otherAbd.getResource());
		}
		else {
			setResourceDescription(other.getResourceDescription());
		}
	}

	/**
	 * 套用这个bean提供的默认值。
	 */
	public void applyDefaults(BeanDefinitionDefaults defaults) {
		setLazyInit(defaults.isLazyInit());
		setAutowireMode(defaults.getAutowireMode());
		setDependencyCheck(defaults.getDependencyCheck());
		setInitMethodName(defaults.getInitMethodName());
		setEnforceInitMethod(false);
		setDestroyMethodName(defaults.getDestroyMethodName());
		setEnforceDestroyMethod(false);
	}
         //************************各个属性信息的get/set方法这里忽略***********************//  
	/**
	 * Set the originating (e.g. decorated) BeanDefinition, if any.
	 */
	public void setOriginatingBeanDefinition(BeanDefinition originatingBd) {
		this.resource = new BeanDefinitionResource(originatingBd);
	}

	public BeanDefinition getOriginatingBeanDefinition() {
		return (this.resource instanceof BeanDefinitionResource ?
				((BeanDefinitionResource) this.resource).getBeanDefinition() : null);
	}

	/**
	 * Validate this bean definition.
	 * @throws BeanDefinitionValidationException in case of validation failure
	 */
	public void validate() throws BeanDefinitionValidationException {
		if (!getMethodOverrides().isEmpty() && getFactoryMethodName() != null) {
			throw new BeanDefinitionValidationException(
					"Cannot combine static factory method with method overrides: " +
					"the static factory method must create the instance");
		}

		if (hasBeanClass()) {
			prepareMethodOverrides();
		}
	}

	/**
	 * Validate and prepare the method overrides defined for this bean.
	 * Checks for existence of a method with the specified name.
	 * @throws BeanDefinitionValidationException in case of validation failure
	 */
	public void prepareMethodOverrides() throws BeanDefinitionValidationException {
		// Check that lookup methods exists.
		MethodOverrides methodOverrides = getMethodOverrides();
		if (!methodOverrides.isEmpty()) {
			for (MethodOverride mo : methodOverrides.getOverrides()) {
				prepareMethodOverride(mo);
			}
		}
	}

	/**
	 * Validate and prepare the given method override.
	 * Checks for existence of a method with the specified name,
	 * marking it as not overloaded if none found.
	 * @param mo the MethodOverride object to validate
	 * @throws BeanDefinitionValidationException in case of validation failure
	 */
	protected void prepareMethodOverride(MethodOverride mo) throws BeanDefinitionValidationException {
		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);
		}
	}


	/**
	 * Clone this bean definition.
	 * To be implemented by concrete subclasses.
	 * @return the cloned bean definition object
	 */
	public abstract AbstractBeanDefinition cloneBeanDefinition();

}