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

    本节主要介绍beanDefintion体系结构、关键属性解读以及beanDefintion在整个框架中作用。众所周知, spring管理的实例对象都以bean的形式存在(bean一定是对象,但对象不一定是bean,由spring管理的对象才是bean),每个bean对象的实例化都是以beanDefinition为基础(通过beanDefinition里面的beanClassName获得构造或通过factoryBeanName等方式进行实例化)。为什么需要beanDefintion,而不是直接通过类class直接生成bean?本节给你答案。

备注:本次spring源码版本为5.1.x;

1、beanDefinition体系结构

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

RootBeanDefinition:可以单独存在描述bean定义,也可以作为父beanDefinition,但是不能作为子beanDefinition;

ChildBeanDefinition:通过parentName属性设置父beanDefinition,可以从父bean定义中继承属性;

GenericBeanDefinition:自从spring2.5后,建议采用GenericBeanDefinition,可以动态设置父beanDefinition,而不是硬编码;

AnnotatedGenericBeanDefinition:存储用@Component、@Service等注解标注的bean定义;

ScannedGenericBeanDefinition:存储扫描包名得到的bean定义;

ConfigurationClassBeanDefinition:存储通过@Configuration注解引入的bean定义(比如@Bean导入的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();
	
	//义创建该Bean对象的工厂类 
	void setFactoryBeanName(@Nullable String factoryBeanName);

	@Nullable
	String getFactoryBeanName();
	
    //定义创建该Bean对象的工厂方法
	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初探_第2张图片
    可以看到配置成希望被spring管理的class都解析成BeanDefinition存入beanDefinitionMap,供后续实例化bean使用,beanDefinition起着承上启下的作用。

你可能感兴趣的:(spring,spring)