spring源码系列2——spring bean初探

    本节主要介绍beanDefintion体系结构、关键参数解析以及beanDefintion在整个框架中作用。总所周知, spring里面的实例对象都以bean的形式存在,每个bean对象的实例化都是以beanDefinition为基础,通过反射获得构造函数,通过调用构造函数得到对应实例。为什么需要beanDefintion,而不是直接通过类class直接生成bean?下面即将揭晓答案。

#1、beanDefinition体系结构
spring源码系列2——spring bean初探其中绿虚线代表接口实现,绿实线代表接口继承,蓝实线代表类继承;可以看到不管是注解类型(AnnotatedBeanDefinition)和非注解类型(AbstractBeanDefinition)都实现或者继承BeanDefinition。BeanDefinition分别继承两个接口AttributeAccessor(bean属性的访问控制)和BeanMetadataElement(获取该bean的源配置的接口);

#2、beanDefinition

public interface BeanDefinition extends AttributeAccessor,    BeanMetadataElement {
    //当前beanDefinition的父beanDefinition名字
    void setParentName(@Nullable String parentName);

	@Nullable
	String getParentName();
	
	//当前bean的类名
	void setBeanClassName(@Nullable String beanClassName);
	
	@Nullable
	String getBeanClassName();
	
    //bean的作用域,常见的有singleton和prototype;
	void setScope(@Nullable String scope);

	@Nullable
	String getScope();
	
	//当前bean是否懒加载;如果为懒加载,在获取此bean时才进行实例化;
	void setLazyInit(boolean lazyInit);

	boolean isLazyInit();
	
    //当前bean所依赖的bean。如果有依赖bean,锁依赖bean必须早于当前bean生成;
	void setDependsOn(@Nullable String... dependsOn);

	@Nullable
	String[] getDependsOn();

	//当前bean是否作为候选bean作为其他bean的依赖
	void setAutowireCandidate(boolean autowireCandidate);
	
	boolean isAutowireCandidate();

	//多个bean都可以作为依赖注入到其他bean时,标注为primary的bean被注入
	void setPrimary(boolean primary);
	
	boolean isPrimary();
	
	void setFactoryBeanName(@Nullable String factoryBeanName);

	@Nullable
	String getFactoryBeanName();

	void setFactoryMethodName(@Nullable String factoryMethodName);

	@Nullable
	String getFactoryMethodName();

	ConstructorArgumentValues getConstructorArgumentValues();
	
	default boolean hasConstructorArgumentValues() {
		return !getConstructorArgumentValues().isEmpty();
	}

	MutablePropertyValues getPropertyValues();

	default boolean hasPropertyValues() {
		return !getPropertyValues().isEmpty();
	}
    
    //当前bean初始化方法名字
	void setInitMethodName(@Nullable String initMethodName);
	
	@Nullable
	String getInitMethodName();
	
    //当前bean销毁之前执行方法的名字
	void setDestroyMethodName(@Nullable String destroyMethodName);

	@Nullable
	String getDestroyMethodName();
	
    /*当前bean在容器中的角色,主要有:
    int ROLE_APPLICATION = 0;
    int ROLE_SUPPORT = 1;
    int ROLE_INFRASTRUCTURE = 2;*/
	void setRole(int role);

	int getRole();

	void setDescription(@Nullable String description);

	@Nullable
	String getDescription();
	
	boolean isSingleton();

	boolean isPrototype();

	boolean isAbstract();

	@Nullable
	String getResourceDescription();

	@Nullable
	BeanDefinition getOriginatingBeanDefinition();
	}

#3、beanDefinition的作用
为什么不直接通过该类的信息直接进行实例化,而是通过class先生成beanDefinition,再通过beanDefinition生成具体bean?
A、 统一模型:无论是spring框架的基础类还是应用程序类都转化成BeanDefinition(用beanDefinition描述class信息),无论是xml配置的bean还是注解配置的bean,都统一转化成用beanDefinition表示,达到统一模型的作用;
B、针对原型bean,可以加快bean的生成速度;
spring源码系列2——spring bean初探
可以看到配置成希望被spring管理的class都解析成BeanDefinition存入beanDefinitionMap,供后续实例化bean使用,beanDefinition起着承上启下的作用。

上一篇:MySQL案例:binlog_row_image如何取舍


下一篇:springboot源码解析-管中窥豹系列之BeanDefinition(八)