Spring的BeanDefinition解析

BeanDefinition 就是在bean被实例化之前与文件加载之后的一个中间产物,在这个中间过程用户可以对BeanDefinition做一些变更操作.后面实例化通过反射实现,实例化时需要的属性均来之BeanDefinition

BeanDefinition 继承了AttributeAccessor, BeanMetadataElement这两个类,可以处理一些属性配置比如Xml配置中的一些信息。

/**
 * BeanDefinition 描述了一个bean的实例, 包括属性、构造参数、以及一些具体的实现信息,
 * BeanDefinition是一个小接口,它的主要目的是为了允许BeanFactoryPostProcessor之类的前置
 * 后置的接口堆bean的属性和元信息做一些修改。
 *
 * @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 {

	/**
	 * 属性:单例
	 */
	String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;

	/**
	 * 属性:多例
	 */
	String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;


    /**
     * bean权限的三个角色信息 应用级别、support级别、基础级别(表示完全由内部完成)
     */
	int ROLE_APPLICATION = 0;

	int ROLE_SUPPORT = 1;

	int ROLE_INFRASTRUCTURE = 2;


	// 可修改的属性

	/**
	 * 设置父类的Beandifinition
	 */
	void setParentName(@Nullable String parentName);

	/**
	 * 返回父类的BeanDifinition
	 */
	@Nullable
	String getParentName();

	/**
	 * 设置Bean的className
	 * @see #setParentName
	 * @see #setFactoryBeanName
	 * @see #setFactoryMethodName
	 */
	void setBeanClassName(@Nullable String beanClassName);

	/**
	 * 返回BeanDefinition的className.
	 * <p>注意:返回的值在runtime环境下不一定是实际类名
	 * @see #getParentName()
	 * @see #getFactoryBeanName()
	 * @see #getFactoryMethodName()
	 */
	@Nullable
	String getBeanClassName();

	/**
	 * 设置单例还是多例
	 * @see #SCOPE_SINGLETON
	 * @see #SCOPE_PROTOTYPE
	 */
	void setScope(@Nullable String scope);

	/**
	 * 返回bean的scope
	 * or {@code null} if not known yet.
	 */
	@Nullable
	String getScope();

	/**
	 * 设置是否懒加载
	 */
	void setLazyInit(boolean lazyInit);

	/**
	 * 是否懒加载
	 */
	boolean isLazyInit();

	/**
	 * 设置加载所需要依赖的bean,bean工厂在加载这个bean之前会先加载所需的依赖
	 */
	void setDependsOn(@Nullable String... dependsOn);

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

	/**
	 * 设置这个bean是否被认定为被其它bean自动注入             
     * 也就是说,在其它类中使用了@Autowire 注解注入这个bean
	 */
	void setAutowireCandidate(boolean autowireCandidate);

	/**
	 * 返回这个bean有没有被其它类注入
	 */
	boolean isAutowireCandidate();

	/**
	 * 设置这个bean在存在多个同类型bean的情况下是否首选注入
	 */
	void setPrimary(boolean primary);

	/**
	 * 返回是否首选注入
	boolean isPrimary();

	/**
	 * 设置factoryBean 的name 注意这个与beanfactory的区别
	 */
	void setFactoryBeanName(@Nullable String factoryBeanName);

	/**
	 * 返回factoryBean的name
	 */
	@Nullable
	String getFactoryBeanName();

	/**
	 * 设置factoryBean的方法名
	 * @see #setFactoryBeanName
	 * @see #setBeanClassName
	 */
	void setFactoryMethodName(@Nullable String factoryMethodName);

	/**
	 * 如果存在则返回不存在返回null
	 */
	@Nullable
	String getFactoryMethodName();

	/**
	 * 返回带参构造函数的值,这是个结构体内部是个map和一个list
	 */
	ConstructorArgumentValues getConstructorArgumentValues();

	/**
	 * 返回是否存在带参构造函数
	 * @since 5.0.2
	 */
	default boolean hasConstructorArgumentValues() {
		return !getConstructorArgumentValues().isEmpty();
	}

	/**
	 * 返回可变的属性
	 */
	MutablePropertyValues getPropertyValues();

	/**
	 * 判断这个bean是否由属性值
	 * @since 5.0.2
	 */
	default boolean hasPropertyValues() {
		return !getPropertyValues().isEmpty();
	}

	/**
	 * 设置初始化的方法名
	 * @since 5.1
	 */
	void setInitMethodName(@Nullable String initMethodName);

	/**
	 * 返回初始化的方法名
	 * @since 5.1
	 */
	@Nullable
	String getInitMethodName();

	/**
	 * 设置销毁时的方法名
	 * @since 5.1
	 */
	void setDestroyMethodName(@Nullable String destroyMethodName);

	/**
	 * 放回销毁时的方法名
	 * @since 5.1
	 */
	@Nullable
	String getDestroyMethodName();

	/**
	 * 设置角色级别
	 * @see #ROLE_APPLICATION
	 * @see #ROLE_SUPPORT
	 * @see #ROLE_INFRASTRUCTURE
	 */
	void setRole(int role);

	/**
	 * 获取角色级别
	 * @see #ROLE_APPLICATION
	 * @see #ROLE_SUPPORT
	 * @see #ROLE_INFRASTRUCTURE
	 */
	int getRole();

	/**
	 * 设置Beandifinition的描述
	 * @since 5.1
	 */
	void setDescription(@Nullable String description);

	/**
	 * 返回BeanDefinition的描述信息
     */
	@Nullable
	String getDescription();


	// Read-only attributes

	/**
	 * 返回是否单例,如果是单例,调用时返回同一个对象
	 * returned on all calls.
	 * @see #SCOPE_SINGLETON
	 */
	boolean isSingleton();

	/**
	 * 是否多例,如果是多例,调用时返回各自的对象
	 * returned for each call.
	 * @since 3.0
	 * @see #SCOPE_PROTOTYPE
	 */
	boolean isPrototype();

	/**
	 * 返回是否是抽象类,如果是意味着不要实例化
	 */
	boolean isAbstract();

	/**
	 * 返回资源描述信息
	 */
	@Nullable
	String getResourceDescription();

	/**
	 * 返回最原始的BeanDefinition
	 */
	@Nullable
	BeanDefinition getOriginatingBeanDefinition();

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值