spring的BeanDefinition

Bean模型定义

在这里插入图片描述
上的类中都是定义了解析bean的定义存储的的dto模型

BeanMetadataElement

  • BeanMetadataElement中只有一个方法,用来获取元数据元素的配置源对象:
     public interface BeanMetadataElement {
     	Object getSource(); // 可以从xml等
     } 
    

DefaultsDefinition

  • DefaultsDefinition 默认属性接口 他的实现是 DocumentDefaultsDefinition 就是一个DTO
    public class DocumentDefaultsDefinition implements DefaultsDefinition {
       private String lazyInit;
       private String merge;
       private String autowire;
       private String dependencyCheck;
       private String autowireCandidates;
       private String initMethod;
       private String destroyMethod;
       private Object source;
    }	
    

AliasDefinition

AliasDefinition 别名DTO

ImportDefinition

ImportDefinition 解析import

MethodOverride

MethodOverride 存储 method-override
ReplaceOverride 标签 replace-method
LookupOverride 标签lookup-method @Lookup

BeanDefinition

在这里插入图片描述

  • AttributeAccessor 属性访问者提供了访问属性的能力
    public interface AttributeAccessor {
     void setAttribute(String name, Object value);
     Object getAttribute(String name);
     Object removeAttribute(String name);
     boolean hasAttribute(String name);
     String[] attributeNames();
    }
    
  • AttributeAccessorSupport 抽象类 属性访问器加强 ,有private final Map<String, Object> attributes = new LinkedHashMap<String, Object>(0);可以存取属性

组合ComponentDefinition
AbstractComponentDefinition
CompositeComponentDefinitionBeanComponentDefinition`

BeanDefinition

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
	/**singleton和prototype 常量定义 spring默认提供这两种模式*/
	String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
	String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
	/** Bean 的角色   可通过 @Role 定义*/
	// 表示一个应用主要的组成部分 用户定义的bean 
	int ROLE_APPLICATION = 0;
	// 表示一个支持一些较大的配置的bean定义,如一个外部的组件定义
	int ROLE_SUPPORT = 1;
	// 表示一个内部使用的注册的bean组件定义,与终端用户无关
	int ROLE_INFRASTRUCTURE = 2;
	// Modifiable attributes 属性元素
	// 设置(获取)bean定义的父name,如果有的话
	void setParentName(String parentName);
	String getParentName();
	// 设置bean定义的bean class name。在bean工厂后处理的过程中,类名可以被修改,典型的情况下
 	// 将原始class的name,替换成一个可解析的变量。
	void setBeanClassName(String beanClassName);
	/**
* 获取bean的class name 对应class的:class="spring.service.impl.MessageServiceImpl"
 */
	String getBeanClassName();
 	
 	// bean 的作用于 可用scope标签 @Scope指定 
	void setScope(String scope);
	String getScope();
	/**
	 * 设置懒加载 对应xml中的 : lazy-init="true" @Lazy
	 */
	void setLazyInit(boolean lazyInit);
	boolean isLazyInit();
	/**
	 * 设置此bean依赖于初始化的bean的名称。
	 * bean factory将确保这些bean首先被初始化。@DependsOn
	 */
	void setDependsOn(String... dependsOn);
	String[] getDependsOn();
	// 设置该Bean是否可以注入其他Bean中,只对根据类型注入有效
	// 如果根据名称注入,即使这边设置false,也是可以的
	void setAutowireCandidate(boolean autowireCandidate);
	// 判断bean是否可以做为其他bean的自动注入对象
	// Return whether this bean is a candidate for getting autowired into some other bean.
	boolean isAutowireCandidate();
	// @Primary 设置bean是否为主要的自动入候选者。
	// 如果多个类型匹配返回true,则以primary bean 注入
	void setPrimary(boolean primary);
	// 返回该bean是否是primary
	boolean isPrimary();
	// 设置工厂bean的name,bean的name可以被工厂方法使用
	void setFactoryBeanName(String factoryBeanName);
	// 返回factoryBean的name
	String getFactoryBeanName();
	/**
	 * Specify a factory method, if any. This method will be invoked with
	 * constructor arguments, or with no arguments if none are specified.
	 * The method will be invoked on the specified factory bean, if any,
	 * or otherwise as a static method on the local bean class.
	 * @see #setFactoryBeanName
	 * @see #setBeanClassName
	 */
	// 设置工厂bean方法。此方法调用将会使用构造参数,如果没有方法,则没有参数.
	// 此方法将会被特定的工厂bean调用,或者本地bean类型的静态方法调用
	void setFactoryMethodName(String factoryMethodName);
	// 返回工厂bean方法的name
	String getFactoryMethodName();
	// 获取构造器中的参数
	ConstructorArgumentValues getConstructorArgumentValues();
	/**
	 * Return if there are constructor argument values defined for this bean.
	 * @since 5.0.2
	 */
	// 如果这个bean定义的构造器有参数值,则返回true
	default boolean hasConstructorArgumentValues() {
		return !getConstructorArgumentValues().isEmpty();
	}
	// 返回属性值
	MutablePropertyValues getPropertyValues();
	/**
	 * Return if there are property values values defined for this bean.
	 * @since 5.0.2
	 */
	 // 如果定义的bean有属性值,则返回true
	default boolean hasPropertyValues() {
		return !getPropertyValues().isEmpty();
	}
	/**
	 * Set the name of the initializer method.
	 * @since 5.1
	 */
	void setInitMethodName(@Nullable String initMethodName);
		/**
	 * Return the name of the initializer method.
	 * @since 5.1
	 */
	@Nullable
	String getInitMethodName();
	/**
	 * Set the name of the destroy method.
	 * @since 5.1
	 */
	void setDestroyMethodName(@Nullable String destroyMethodName);
	/**
	 * Return the name of the destroy method.
	 * @since 5.1
	 */
	@Nullable
	String getDestroyMethodName();
	void setRole(int role)
	// @Role
	int getRole();
	/**
	 * Set a human-readable description of this bean definition.
	 * @since 5.1
	 */
	void setDescription(@Nullable String description);
	String getDescription();
	// Read-only attributes
	ResolvableType getResolvableType();
	// 是单例类型
	boolean isSingleton();
	// 是原型类型,返回true
	boolean isPrototype();
	// 是否是抽象类型
	boolean isAbstract();
	// 返回bean定义资源的描述
	String getResourceDescription();
	// 返回原始的bean定义,如果没有,返回null
	// 此方法将返回即时的originator,通过迭代originator链,可以获取用户定义的原始bean定义
	BeanDefinition getOriginatingBeanDefinition();
}

BeanDefinition常见实现类

AnnotatedBeanDefinition:包含有注解的Bean定义。一般情况下,通过注解的方式得到Bean定义,类型都是该接口的实现类。

AnnotatedGenericBeanDefinition:有@Configuration注解的类,会生成AnnotatedGenericBeanDefinition类型的Bean定义。
ScannedGenericBeanDefinition:有@Component注解的类,会生成ScannedGenericBeanDefinition类型的Bean定义。注意其它继承了@Component的注解,同@Component。

ConfigurationClassBeanDefinitionConfigurationClassBeanDefinitionReader中定义的类

RootBeanDefinition,ChildBeanDefinition,GenericBeanDefinition:这个类均继承了AbstractBeanDefinition。从官方文档里,我们得到了以下一些信息:

RootBeanDefinition是最常用的实现类,它对应一般性的元素标签,GenericBeanDefinition是自2.5以后新加入的bean文件配置属性定义类,是一站式服务类。在配置文件中可以定义父和子,父用RootBeanDefinition表示,而子用ChildBeanDefiniton表示,而没有父的就使用RootBeanDefinition表示。AbstractBeanDefinition对两者共同的类信息进行抽象

BeanDefinitionBuilder

BeanDefinitionBuilder是Builder模式的应用。通过这个类我们可以方便的构建BeanDefinition的实例对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值