本篇文章给大家带来的内容是关于spring源码之beandefinition类的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
spring版本为5.1.5
用过spring的人都知道,我们将对象注入到spring容器中,交给spring来帮我们管理。这种对象我们称之为bean对象。但是这些bean对象在spring容器中,到底是以什么形式存在,具有哪些属性、行为呢?今天我们进入到spring源码来一探究竟。
bean的创建工厂beanfactory有个默认实现类defaultlistablebeanfactory,内部有个存放所有注入bean对象信息的map
/** map of bean definition objects, keyed by bean name. */private final map<string, beandefinition> beandefinitionmap = new concurrenthashmap<>(256);
map的value对象beandefinition就是spring中对bean的定义和描述,具体概述如下:
属性行为解释
parentname string getparentname();
void setparentname(@nullable string parentname); bean定义对象的父类定义对象名称
beanclassname string getbeanclassname();
void setbeanclassname(@nullable string beanclassname); bean对象的实际class类
scope string getscope();
void setscope(@nullable string scope); bean对象是否为单例<singleton或者prototype>
lazyinit boolean islazyinit();
void setlazyinit(boolean lazyinit); 是否懒加载
dependson string[] getdependson();
void setdependson(@nullable string... dependson); 设置依赖的bean对象,被依赖的bean对象总是会比当前bean对象先创建
autowirecandidate boolean isautowirecandidate();
void setautowirecandidate(boolean autowirecandidate); 设置是否可以自动注入。只对@autowired注解有效,配置文件中可以通过property显示注入
primary boolean isprimary();
void setprimary(boolean primary); 配置bean为主要候选bean。当同一个接口的多个实现类或者一个类多次注入到spring容器时,通过该属性来配置某个bean为主候选bean,通过类型来注入时,默认为使用主候选bean注入
factorybeanname string getfactorybeanname();
void setfactorybeanname(@nullable string factorybeanname); 设置创建bean的工厂名称
factorymethodname string getfactorymethodname();
void setfactorymethodname(@nullable string factorymethodname); 设置创建bean的工厂中,创建bean的具体方法
initmethodname string getinitmethodname();
void setinitmethodname(@nullable string initmethodname); 设置创建bean时,默认初始化的方法
destroymethodname string getdestroymethodname();
void setdestroymethodname(@nullable string destroymethodname); 设置销毁bean时调用的方法名称。注意需要调用context的close()方法才会调用
role int getrole();
void setrole(int role); 设置bean的分类
description string getdescription();
void setdescription(@nullable string description); 对bean对象的描述
注意:beandefinition是一个接口,内部只定义了bean对象的一些基本行为。上表中的属性在beandefinition中并不是真实存在的,只是通过set、get方法来设置和获取。以下抽取出部分beandefinition源代码供大家感知下public interface beandefinition extends attributeaccessor, beanmetadataelement { /** * override the target scope of this bean, specifying a new scope name. * @see #scope_singleton * @see #scope_prototype */ void setscope(@nullable string scope); /** * return the name of the current target scope for this bean, * or {@code null} if not known yet. */ @nullable string getscope();}
实际使用假设有以下两个bean,java代码如下
mytestbeanpackage com.yuanweiquan.learn.bean;import org.springframework.beans.factory.annotation.autowired;import org.springframework.context.annotation.description;public class mytestbean { @autowired private autowirecandidatebean autowirecandidatebean; public void init() { system.out.println(inti mytestbean); } public autowirecandidatebean getautowirecandidatebean() { return autowirecandidatebean; } public void setautowirecandidatebean(autowirecandidatebean bean) { this.autowirecandidatebean = bean; }}
autowirecandidatebeanpackage com.yuanweiquan.learn.bean;public class autowirecandidatebean { public void initbean() { system.out.println(init autowirecandidatebean); } public void destroybean() { system.out.println(destroy autowirecandidatebean); }}
下面看如何在配置文件applicationcontext.xml来进行配置
<bean id="mytestbean" class="com.yuanweiquan.learn.bean.mytestbean" depends-on="autowirecandidatebean" init-method="init"/> <bean id="autowirecandidatebean" class="com.yuanweiquan.learn.bean.autowirecandidatebean" init-method="initbean" autowire-candidate="true" destroy-method="destroybean" scope="singleton" parent="mytestbean" lazy-init="default" primary="true"> <description>autowirecandidatebean description</description> </bean>
接下来就是测试代码
filesystemxmlapplicationcontext factory = new filesystemxmlapplicationcontext(classpath:applicationcontext.xml);beandefinition mytestbeandefinition = factory.getbeanfactory().getbeandefinition(autowirecandidatebean);//输出system.out.println(bean description: + mytestbeandefinition.getdescription());system.out.println(bean class name: + mytestbeandefinition.getbeanclassname());system.out.println(parent name: + mytestbeandefinition.getparentname());system.out.println(scope: + mytestbeandefinition.getscope());system.out.println(is lazyinit: + mytestbeandefinition.islazyinit());system.out.println(depends on: + mytestbeandefinition.getdependson());system.out.println(is autowirecandidate: + mytestbeandefinition.isautowirecandidate());system.out.println(is primary: + mytestbeandefinition.isprimary());system.out.println(factory bean name:+mytestbeandefinition.getfactorybeanname());system.out.println(factory bean method name: + mytestbeandefinition.getfactorymethodname());system.out.println(init method name: + mytestbeandefinition.getinitmethodname());system.out.println(destory method name: + mytestbeandefinition.getdestroymethodname());system.out.println(role: + mytestbeandefinition.getrole());//关闭context,否则不会调用bean的销毁方法factory.close();
控制台输出如下
init autowirecandidatebeaninti mytestbeanbean description:autowirecandidatebean descriptionbean class name:com.yuanweiquan.learn.bean.autowirecandidatebeanparent name:mytestbeanscope:singletonis lazyinit:falsedepends on:nullis autowirecandidate:trueis primary:truefactory bean name:nullfactory bean method name:nullinit method name:initbeandestory method name:destroybeanrole:0destroy autowirecandidatebean
到此为止,通过上面的信息,我们能清晰的看到各属性对应的值。上述测试代码的目的是让我们大家能看到bean在spring容器中,以什么样子的形式存在,具体有哪些属性,属性的值以及默认值是多少。也算初步的揭开了spring容器中bean的面纱,其实并没有我们想象中的那么神秘。
以上就是spring源码之beandefinition类的详细介绍的详细内容。