栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

BeanDefinition

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

BeanDefinition

BeanDefinition是Spring中非常核心的概念,表示Bean定义,Spring根据BeanDefinition来创建Bean对象,
BeanDefinition有很多的属性用来描述Bean。

一、 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;


	// Modifiable attributes

	
	void setParentName(String parentName);

	
	String getParentName();

	
	void setBeanClassName(String beanClassName);

	
	String getBeanClassName();

	
	void setScope(String scope);

	
	String getScope();

	
	void setLazyInit(boolean lazyInit);

	
	boolean isLazyInit();

	
	void setDependsOn(String... dependsOn);

	
	String[] getDependsOn();

	
	void setAutowireCandidate(boolean autowireCandidate);

	
	boolean isAutowireCandidate();

	
	void setPrimary(boolean primary);

	
	boolean isPrimary();

	
	void setFactoryBeanName(String factoryBeanName);

	
	String getFactoryBeanName();

	
	void setFactoryMethodName(String factoryMethodName);

	
	String getFactoryMethodName();

	
	ConstructorArgumentValues getConstructorArgumentValues();

	
	MutablePropertyValues getPropertyValues();


	// Read-only attributes

	
	boolean isSingleton();

	
	boolean isPrototype();

	
	boolean isAbstract();

	
	int getRole();

	
	String getDescription();

	
	String getResourceDescription();

	
	BeanDefinition getOriginatingBeanDefinition();

}

定义了很多描述一个BeanDefinition的属性的setter和getter方法

  • parentName:父BeanDefinition名,一般没有,只有父子关系的BeanDefinition才有
  • beanClassName:表示一个bean的类型,比如UserService.class、OrderService.class,Spring在创建Bean的过程中会根据此属性来实例化得到对象。
  • scope:表示一个bean的作用域,比如:scope等于singleton,该bean就是一个单例Bean; scope等于prototype,该bean就是一个原型Bean。
  • lazyInit:表示一个bean是不是需要懒加载,prototype类型的bean的lazyInit属性不起作用。懒加载的单例bean,会在第一次getBean的时候生成该bean,非懒加载的单例bean,则会在Spring启动过程中直接生成好。
  • dependsOn:表示一个bean在创建之前所依赖的其他bean,在一个bean创建之前,它所依赖的这些bean得先全部创建好。
  • autowireCandidate:表示该bean是否支持自动注入候选
  • primary:表示一个bean是主bean,在Spring中一个类型可以有多个bean对象,在进行依赖注入时,如果根据类型找到了多个bean并且没有使用@Qulifier指定,此时会判断这些bean中是否存在一个主bean,如果存在,则直接将这个bean注入给属性。
  • factoryBeanName:工厂Bean名字,标注@Configuration的类
  • factoryMethodName:工厂Bean方法名字,以上两者来自@Bean注解的
  • constructorArgumentValues(ConstructorArgumentValues):构造方法参数值
  • propertyValues(MutablePropertyValues):所有的属性值
  • initMethodName:表示一个bean的初始化方法,一个bean的生命周期过程中有一个步骤叫初始化,Spring会在这个步骤中去调用bean的初始化方法,初始化逻辑由程序员自己控制,表示程序员可以自定义逻辑对bean进行加工。

其类继承层次如下:

二、AttributeAccessor

BeanDefinition继承自AttributeAccessor,定义了属性获取和设置的方法,其基本实现AttributeAccessorSupport采用map。进一步的BeanMetadataAttributeAccessor采用BeanMetadataAttribute来包装了value。

public interface AttributeAccessor {

	
	void setAttribute(String name, Object value);

	
	Object getAttribute(String name);

	
	Object removeAttribute(String name);

	
	boolean hasAttribute(String name);

	
	String[] attributeNames();

}

三、AbstractBeanDefinition

AbstractBeanDefinition是BeanDefinition的基础实现,定义了一系列的属性,并提供了getter/setter方法。具体的BeanDefinition实现(RootBeanDefinition、ChildBeanDefinition、GenericBeanDefinition)都继承自该类。

public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor
		implements BeanDefinition, Cloneable {
	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 qualifiers =
			new LinkedHashMap(0);

	private boolean nonPublicAccessAllowed = true;

	private boolean lenientConstructorResolution = true;

	private String factoryBeanName;

	private String factoryMethodName;

	private ConstructorArgumentValues constructorArgumentValues;

	private MutablePropertyValues propertyValues;

	private MethodOverrides methodOverrides = new MethodOverrides();

	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;
	。。。
四、RootBeanDefinition、ChildBeanDefinition、GenericBeanDefinition

RootBeanDefinition代表普通的BeanDefinition实现,通过其构造方法直接new BeanDefinition。ChildBeanDefinition 代表可以设置父BeanDefinition的。
GenericBeanDefinition代表一般的BeanDefinition,主要的两种实现AnnotatedGenericBeanDefinition和ScannedGenericBeanDefinition都继承自他。

五、AnnotatedBeanDefinition

AnnotatedBeanDefinition表示注解的BeanDefinition,有两种主要的实现AnnotatedGenericBeanDefinition和ScannedGenericBeanDefinition

public interface AnnotatedBeanDefinition extends BeanDefinition {

	
	AnnotationMetadata getMetadata();

	
	MethodMetadata getFactoryMethodMetadata();

}
六、AnnotatedGenericBeanDefinition

AnnotatedGenericBeanDefinition继承自GenericBeanDefinition,扩展了注解类的元信息和工厂方法元信息

public class AnnotatedGenericBeanDefinition extends GenericBeanDefinition implements AnnotatedBeanDefinition {

	private final AnnotationMetadata metadata;

	private MethodMetadata factoryMethodMetadata;


	
	public AnnotatedGenericBeanDefinition(Class beanClass) {
		setBeanClass(beanClass);
		this.metadata = new StandardAnnotationMetadata(beanClass, true);
	}

	
	public AnnotatedGenericBeanDefinition(AnnotationMetadata metadata) {
		Assert.notNull(metadata, "AnnotationMetadata must not be null");
		if (metadata instanceof StandardAnnotationMetadata) {
			setBeanClass(((StandardAnnotationMetadata) metadata).getIntrospectedClass());
		}
		else {
			setBeanClassName(metadata.getClassName());
		}
		this.metadata = metadata;
	}

	
	public AnnotatedGenericBeanDefinition(AnnotationMetadata metadata, MethodMetadata factoryMethodMetadata) {
		this(metadata);
		Assert.notNull(factoryMethodMetadata, "MethodMetadata must not be null");
		setFactoryMethodName(factoryMethodMetadata.getMethodName());
		this.factoryMethodMetadata = factoryMethodMetadata;
	}


	@Override
	public final AnnotationMetadata getMetadata() {
		 return this.metadata;
	}

	@Override
	public final MethodMetadata getFactoryMethodMetadata() {
		return this.factoryMethodMetadata;
	}

}
七、ScannedGenericBeanDefinition

该类代表扫描的BeanDefinition

public class ScannedGenericBeanDefinition extends GenericBeanDefinition implements AnnotatedBeanDefinition {

	private final AnnotationMetadata metadata;


	
	public ScannedGenericBeanDefinition(MetadataReader metadataReader) {
		Assert.notNull(metadataReader, "MetadataReader must not be null");
		this.metadata = metadataReader.getAnnotationMetadata();
		setBeanClassName(this.metadata.getClassName());
	}


	@Override
	public final AnnotationMetadata getMetadata() {
		return this.metadata;
	}

	@Override
	public MethodMetadata getFactoryMethodMetadata() {
		return null;
	}

}
八、BeanDefinitionBuilder

BeanDefinitionBuilder通过建造者模式提供了方便生成和设置属性的BeanDefinition的方法。我们常常用它来生成RootBeanDefinition、ChildBeanDefinition、GenericBeanDefinition。

public class BeanDefinitionBuilder {

	
	public static BeanDefinitionBuilder genericBeanDefinition() {
		BeanDefinitionBuilder builder = new BeanDefinitionBuilder();
		builder.beanDefinition = new GenericBeanDefinition();
		return builder;
	}

	
	public static BeanDefinitionBuilder genericBeanDefinition(Class beanClass) {
		BeanDefinitionBuilder builder = new BeanDefinitionBuilder();
		builder.beanDefinition = new GenericBeanDefinition();
		builder.beanDefinition.setBeanClass(beanClass);
		return builder;
	}

	
	public static BeanDefinitionBuilder genericBeanDefinition(String beanClassName) {
		BeanDefinitionBuilder builder = new BeanDefinitionBuilder();
		builder.beanDefinition = new GenericBeanDefinition();
		builder.beanDefinition.setBeanClassName(beanClassName);
		return builder;
	}

	
	public static BeanDefinitionBuilder rootBeanDefinition(Class beanClass) {
		return rootBeanDefinition(beanClass, null);
	}

	
	public static BeanDefinitionBuilder rootBeanDefinition(Class beanClass, String factoryMethodName) {
		BeanDefinitionBuilder builder = new BeanDefinitionBuilder();
		builder.beanDefinition = new RootBeanDefinition();
		builder.beanDefinition.setBeanClass(beanClass);
		builder.beanDefinition.setFactoryMethodName(factoryMethodName);
		return builder;
	}

	
	public static BeanDefinitionBuilder rootBeanDefinition(String beanClassName) {
		return rootBeanDefinition(beanClassName, null);
	}

	
	public static BeanDefinitionBuilder rootBeanDefinition(String beanClassName, String factoryMethodName) {
		BeanDefinitionBuilder builder = new BeanDefinitionBuilder();
		builder.beanDefinition = new RootBeanDefinition();
		builder.beanDefinition.setBeanClassName(beanClassName);
		builder.beanDefinition.setFactoryMethodName(factoryMethodName);
		return builder;
	}

	
	public static BeanDefinitionBuilder childBeanDefinition(String parentName) {
		BeanDefinitionBuilder builder = new BeanDefinitionBuilder();
		builder.beanDefinition = new ChildBeanDefinition(parentName);
		return builder;
	}


	
	private AbstractBeanDefinition beanDefinition;

	
	private int constructorArgIndex;


	
	private BeanDefinitionBuilder() {
	}

	
	public AbstractBeanDefinition getRawBeanDefinition() {
		return this.beanDefinition;
	}

	
	public AbstractBeanDefinition getBeanDefinition() {
		this.beanDefinition.validate();
		return this.beanDefinition;
	}


	
	public BeanDefinitionBuilder setParentName(String parentName) {
		this.beanDefinition.setParentName(parentName);
		return this;
	}

	
	public BeanDefinitionBuilder setFactoryMethod(String factoryMethod) {
		this.beanDefinition.setFactoryMethodName(factoryMethod);
		return this;
	}

	
	public BeanDefinitionBuilder setFactoryMethodOnBean(String factoryMethod, String factoryBean) {
		this.beanDefinition.setFactoryMethodName(factoryMethod);
		this.beanDefinition.setFactoryBeanName(factoryBean);
		return this;
	}

	
	@Deprecated
	public BeanDefinitionBuilder addConstructorArg(Object value) {
		return addConstructorArgValue(value);
	}

	
	public BeanDefinitionBuilder addConstructorArgValue(Object value) {
		this.beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(
				this.constructorArgIndex++, value);
		return this;
	}

	
	public BeanDefinitionBuilder addConstructorArgReference(String beanName) {
		this.beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(
				this.constructorArgIndex++, new RuntimeBeanReference(beanName));
		return this;
	}

	
	public BeanDefinitionBuilder addPropertyValue(String name, Object value) {
		this.beanDefinition.getPropertyValues().add(name, value);
		return this;
	}

	
	public BeanDefinitionBuilder addPropertyReference(String name, String beanName) {
		this.beanDefinition.getPropertyValues().add(name, new RuntimeBeanReference(beanName));
		return this;
	}

	
	public BeanDefinitionBuilder setInitMethodName(String methodName) {
		this.beanDefinition.setInitMethodName(methodName);
		return this;
	}

	
	public BeanDefinitionBuilder setDestroyMethodName(String methodName) {
		this.beanDefinition.setDestroyMethodName(methodName);
		return this;
	}


	
	public BeanDefinitionBuilder setScope(String scope) {
		this.beanDefinition.setScope(scope);
		return this;
	}

	
	public BeanDefinitionBuilder setAbstract(boolean flag) {
		this.beanDefinition.setAbstract(flag);
		return this;
	}

	
	public BeanDefinitionBuilder setLazyInit(boolean lazy) {
		this.beanDefinition.setLazyInit(lazy);
		return this;
	}

	
	public BeanDefinitionBuilder setAutowireMode(int autowireMode) {
		beanDefinition.setAutowireMode(autowireMode);
		return this;
	}

	
	public BeanDefinitionBuilder setDependencyCheck(int dependencyCheck) {
		beanDefinition.setDependencyCheck(dependencyCheck);
		return this;
	}

	
	public BeanDefinitionBuilder addDependsOn(String beanName) {
		if (this.beanDefinition.getDependsOn() == null) {
			this.beanDefinition.setDependsOn(beanName);
		}
		else {
			String[] added = ObjectUtils.addObjectToArray(this.beanDefinition.getDependsOn(), beanName);
			this.beanDefinition.setDependsOn(added);
		}
		return this;
	}

	
	public BeanDefinitionBuilder setRole(int role) {
		this.beanDefinition.setRole(role);
		return this;
	}

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/914936.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号