Skip to content

Latest commit

 

History

History
327 lines (262 loc) · 8.81 KB

File metadata and controls

327 lines (262 loc) · 8.81 KB

bean元数据元素

何为元数据?用于描述数据的数据。

package org.springframework.beans;

import org.springframework.lang.Nullable;

/**
 * 由携带源配置对象的bean元数据元素实现此接口。
 *
 * @author Juergen Hoeller
 * @since 2.0
 */
public interface BeanMetadataElement {

	/**
	 * 返回此元数据元素的配置源对象
	 * (may be {@code null}).
	 */
	@Nullable
	Object getSource();

}

属性访问器

用于访问bean的属性。

package org.springframework.core;

import org.springframework.lang.Nullable;

/**
 * 接口定义用于向任意对象增加和访问元数据的通用契约。
 *
 * @author Rob Harrop
 * @since 2.0
 */
public interface AttributeAccessor {

	/**
	 * 通过名称设置属性值。
	 * 通常,用户应该使用完全限定的名称(可能使用类或包名称作为前缀)来防止与其他元数据属性重叠。
	 * @param name 唯一属性键
	 * @param value 要附加的属性值
	 */
	void setAttribute(String name, @Nullable Object value);

	/**
	 * 获取由名称标识的属性的值
	 * 如果属性值不存在,则返回null
	 * @param name 唯一属性键
	 * @return 如果有的话,就返回属性的当前值
	 */
	@Nullable
	Object getAttribute(String name);

	/**
	 * 删除由名称标识的属性并返回其值。
	 * 如果未找到名称下的属性,则返回NULL。
	 * @param name 唯一属性键
	 * @return 如果有的话,返回最后一个属性值
	 */
	@Nullable
	Object removeAttribute(String name);

	/**
	 * 判断指定属性名称对应的数值是否存在
	 * @param name 唯一的属性键
	 */
	boolean hasAttribute(String name);

	/**
	 * 返回所有属性的名称。
	 */
	String[] attributeNames();
}

BeanDefinition接口

BeanDefinition 用于描述一个Bean的实例对象,它具有属性值、构造方法参数值和由它提供的进一步信息

具体的实现。这只是一个最小的接口:主要目的是允许 BeanFactoryPostProcessor 这样的PropertyPlaceholderConfigurer 来自行修改属性值和其他bean元数据。

package org.springframework.beans.factory.config;

import org.springframework.beans.BeanMetadataElement;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.core.AttributeAccessor;
import org.springframework.lang.Nullable;

/**
 * @author Juergen Hoeller
 * @author Rob Harrop
 * @since 19.03.2004
 * @see ConfigurableListableBeanFactory#getBeanDefinition
 * @see org.springframework.beans.factory.support.RootBeanDefinition
 * @see org.springframework.beans.factory.support.ChildBeanDefinition
 */
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {

	/**
	 * 标准单例范围的范围标识符: "singleton".
	 * 请注意,扩展的bean工厂可能支持更多的范围。
	 * @see #setScope
	 */
	String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;

	/**
	 * 标准原型范围的范围标识符: "prototype".
	 * 请注意,扩展的bean工厂可能支持更多的范围。
	 * @see #setScope
	 */
	String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;


	/**
	 * bean对象的角色表示,0表示是bean定义是应用程序的主要部分。通常对应于用户定义的bean。
	 */
	int ROLE_APPLICATION = 0;

	/** 表示角色是 较大的配置(通常是外部配置) */
	int ROLE_SUPPORT = 1;

	/** 内部使用的角色 */
	int ROLE_INFRASTRUCTURE = 2;


	// 可更改的属性

	/** 如果当前bean描述器存在父描述器名称的话,就设置父描述器的名称 */
	void setParentName(@Nullable String parentName);

	/** 如果当前bean描述器存在父描述器名称的话,就设获取父描述器的名称 */
	@Nullable
	String getParentName();

	/**
	 * 指定此bean定义的bean类名。
	 * 类名可以在bean工厂的后置处理过程中修改,通常用经过解析的类名变体替换原来的类名。
	 * @see #setParentName
	 * @see #setFactoryBeanName
	 * @see #setFactoryMethodName
	 */
	void setBeanClassName(@Nullable String beanClassName);

	/**
	 * 返回此bean描述器类名。
	 * 注意,如果子类定义覆盖/继承了父类的类名,那么它不必是运行时使用的实际类名。
	 * 而且,这可能只是调用工厂方法的类,或者在调用方法的工厂bean引用的情况下,它甚至可能是空的。
	 * 因此,而不是认为它是运行时的最终bean类型,而只是将其用于在单个bean定义级别进行解析。
	 * @see #getParentName()
	 * @see #getFactoryBeanName()
	 * @see #getFactoryMethodName()
	 */
	@Nullable
	String getBeanClassName();

	/**
	 * 指定一个新的作用域,用以覆盖当前bean的作用域
	 * @see #SCOPE_SINGLETON
	 * @see #SCOPE_PROTOTYPE
	 */
	void setScope(@Nullable String scope);

	/**
	 * 获取当前bean的作用域名称
	 * 如果不存在的话,则返回null
	 */
	@Nullable
	String getScope();

	/**
	 * 设置是否应该延迟初始化此bean。
	 * 如果设置为false,bean将在启动时由执行单例初始化的bean工厂进行实例化。
	 */
	void setLazyInit(boolean lazyInit);

	/** 返回是否延迟初始化此bean */
	boolean isLazyInit();

	/**
	 * 设置此bean依赖于初始化的bean的名称。
	 * bean工厂将保证首先初始化这些bean。
	 */
	void setDependsOn(@Nullable String... dependsOn);

	/** 返回此bean所依赖的bean名称 */
	@Nullable
	String[] getDependsOn();

	/**
	 * 设置此bean是否是自动连接到其他bean的候选bean。
	 * 注意,此标志仅用于影响基于类型的自动连接。
	 * 它不影响按名称显式引用,即使指定的bean没有标记为自动连接候选,也会解析该引用。
	 * 因此,如果名称匹配,按名称自动连接将注入bean。
	 */
	void setAutowireCandidate(boolean autowireCandidate);

	/**
	 * 返回此bean是否是自动连接到其他bean的候选bean。
	 */
	boolean isAutowireCandidate();

	/**
	 * 设置此bean是否为主要自动连接候选bean。
	 * 如果这个值是true,那么对于多个匹配候选bean中会选择其中一个bean,它将起到关键作用。
	 */
	void setPrimary(boolean primary);

	/** 返回此bean是否为主要自动连接候选对象 */
	boolean isPrimary();

	/**
	 * 也可以通过此方式来设置指定的bean工厂。
	 * 只需要传入被指的的bean工厂字符串名称即可
	 * @see #setFactoryMethodName
	 */
	void setFactoryBeanName(@Nullable String factoryBeanName);

	/**
	 * 如果该bean有bean工厂的话,可以通过此方法获取
	 */
	@Nullable
	String getFactoryBeanName();

	/**
	 * (如果有工厂的方法)可以指定工厂方法。
	 * 将使用构造方法参数调用此方法,如果没有指定参数,则不使用参数。
	 * (如果有的话)方法将在指定的工厂bean上调用,或者作为本地bean类上的静态方法调用。
	 * @see #setFactoryBeanName
	 * @see #setBeanClassName
	 */
	void setFactoryMethodName(@Nullable String factoryMethodName);

	/** 如果此bean有工厂方法的化话,此方法可以返回这个工厂方法 */
	@Nullable
	String getFactoryMethodName();

	/**
	 * 返回此bean的构造方法参数值
	 * 返回的实例可以在bean工厂后处理期间修改。
	 * @return the ConstructorArgumentValues 对象(非null)
	 */
	ConstructorArgumentValues getConstructorArgumentValues();

	/**
	 * 如果此bean定义了构造函数参数值,则返回true。
	 * @since 5.0.2
	 */
	default boolean hasConstructorArgumentValues() {
		return !getConstructorArgumentValues().isEmpty();
	}

	/**
	 * 返回要应用于bean的新实例的属性值。
	 * 返回的实例可以在bean工厂后置处理期间修改。
	 * @return the MutablePropertyValues 对象(非null)
	 */
	MutablePropertyValues getPropertyValues();

	/**
	 * 如果为该bean定义了属性值,则返回true。
	 * @since 5.0.2
	 */
	default boolean hasPropertyValues() {
		return !getPropertyValues().isEmpty();
	}


	// 只读的属性

	/**
	 * 判断此bean的作用域是否是单例作用域
	 * @see #SCOPE_SINGLETON
	 */
	boolean isSingleton();

	/**
	 * 判断此bean的作用域是否是原型作用域
	 * @since 3.0
	 * @see #SCOPE_PROTOTYPE
	 */
	boolean isPrototype();

	/** 返回此bean是否“抽象”,即不打算实例化。 */
	boolean isAbstract();

	/**
	 * 获取这个bean的角色
	 * @see #ROLE_APPLICATION
	 * @see #ROLE_SUPPORT
	 * @see #ROLE_INFRASTRUCTURE
	 */
	int getRole();

	/**
	 * 返回此bean定义的可读描述。
	 */
	@Nullable
	String getDescription();

	/**
	 * 获取此bean定义的资源描述(以便在出现错误时显示在上下文)。
	 */
	@Nullable
	String getResourceDescription();

	/**
	 * 返回原始的BeanDefinition,如果没有,则返回null
	 * 允许检索修饰后的bean定义
	 */
	@Nullable
	BeanDefinition getOriginatingBeanDefinition();

}