Spring的Bean注入解析结果BeanDefinition详解
作者:军伟@
Bean注入解析结果BeanDefinition
BeanDefinition描述了一个bean实例,拥有属性值、构造参数值和具体实现的其他信息,其是一个bean的元数据,xml中配置的bean元素会被解析成BeanDefinition对象。
BeanDefinition的接口的结构类图:
ChildBeanDefinition
可以让子Bean定义拥有从父母哪里继承配置的能力。相应的,子Bean定义有一个固定的依赖--他们的父bean定义。
一个子bean定义将继承父母的构造参数值、属性值和方法覆盖并且可以选择的增加新的值。 如果初始化方法、销毁方法或者静态工厂方法已经指定了,那么将覆盖父bean定义中的相关配置。 子bean定义保留的配置将是:依赖、自动装配模式、依赖检查、单例和延迟加载。
注意: 自从Spring 2.5之后, 编程的方式注册bean定义的优选方法是使用 GenericBeanDefinition类, 允许使用GenericBeanDefinition.setParentName方法动态的定义父依赖。 在大多数场景下可以 有效的取代ChildBeanDefinition类。
GenericBeanDefinition
GenericBeanDefinition是一个定义标准的bean定义的一站式服务。
像任何Bean定义,它允许指定一个类、可选的构造参数值和属性值。 除此之外可以通过配置"parentName"属性来灵活地指定从一个父Bean定义中派生。 通常来说,使用GenericBeanDefinition类为了注册一个用户可见的bean定义(后置处理器可能会操作它, 甚至可能重新配置父母的名字)。如果父/子关系是预设的建议使用RootBeanDefinition / ChildBeanDefinition。
RootBeanDefinition
RootBeanDefinition描述了Spring BeanFactory运行时合并后的特定Bean定义。
它可能来源于多个原始Bean定义(继承自其他的bean定义,通常被注册为GenericBeanDefinitions)。RootBeanDefinition从本质上将是运行时统一的Bean定义视图。 在配置阶段,RootBeanDefinition也可能用于注册独立的bean定义。然而,自从Spring2.5依赖,编程地注册bean定义建议使用 GenericBeanDefinition类。GenericBeanDefinition在允许动态定义父依赖而不是硬编码作为RootBeanDefinition方面有优势。
在抽象类AbstractBeanDefinition中添加了更多和bean属性设置相关的处理操作。
@SuppressWarnings("serial") public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor implements BeanDefinition, Cloneable { public static final String SCOPE_DEFAULT = ""; public static final int AUTOWIRE_NO = AutowireCapableBeanFactory.AUTOWIRE_NO; public static final int AUTOWIRE_BY_NAME = AutowireCapableBeanFactory.AUTOWIRE_BY_NAME; public static final int AUTOWIRE_BY_TYPE = AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE; public static final int AUTOWIRE_CONSTRUCTOR = AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR; @Deprecated public static final int AUTOWIRE_AUTODETECT = AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT; 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; public static final String INFER_METHOD = "(inferred)"; private volatile Object beanClass; private String scope = SCOPE_DEFAULT; private boolean abstractFlag = false; private boolean lazyInit = false; private int autowireMode = AUTOWIRE_NO; private int dependencyCheck = DEPENDENCY_CHECK_NONE; 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(); private String factoryBeanName; private String factoryMethodName; private String initMethodName; private String destroyMethodName; private boolean enforceInitMethod = true; private boolean enforceDestroyMethod = true; private boolean synthetic = false; private int role = BeanDefinition.ROLE_APPLICATION; private String description; private Resource resource; .........//属性处理代码 }
BeanDefinition源码
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement { String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON; String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE; int ROLE_APPLICATION = 0; int ROLE_SUPPORT = 1; int ROLE_INFRASTRUCTURE = 2; String getParentName(); void setParentName(String parentName); String getBeanClassName(); void setBeanClassName(String beanClassName); String getFactoryBeanName(); void setFactoryBeanName(String factoryBeanName); String getFactoryMethodName(); void setFactoryMethodName(String factoryMethodName); String getScope(); void setScope(String scope); boolean isLazyInit(); void setLazyInit(boolean lazyInit); String[] getDependsOn(); void setDependsOn(String... dependsOn); boolean isAutowireCandidate(); void setAutowireCandidate(boolean autowireCandidate); boolean isPrimary(); void setPrimary(boolean primary); ConstructorArgumentValues getConstructorArgumentValues(); MutablePropertyValues getPropertyValues(); boolean isSingleton(); boolean isPrototype(); boolean isAbstract(); int getRole(); String getDescription(); String getResourceDescription(); BeanDefinition getOriginatingBeanDefinition(); }
总结
简单来说BeanDefinition接口及其实现类就是bean的所有配置信息的一个数据集合,从类名也可以看出其就是一个bean的定义说明。
到此这篇关于Spring的Bean注入解析结果BeanDefinition详解的文章就介绍到这了,更多相关Bean注入解析结果BeanDefinition内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!