一、bean的定义BeanDefinition
-
BeanDefinition的含义 BeanDefinition就是用来描述一个Bean或者BeanDefinition就是Bean的定义。
**Spirng官网描述** SpringIoc容器管理一个Bean或多个Bean,这些Bean通过我们提供给容器的配置元数据被创建出来(例如,在xml中的定义) 在容器中,这些Bean的定义用BeanDefinition对象来表示, 包含以下元数据: 全限定类名, 通常是Bean的实际实现类; Bean行为配置元素,它们说明Bean在容器中的行为(作用域、生命周期回调等等); Bean执行工作所需要的的其他Bean的引用,这些Bean也称为协作者或依赖项; 其他配置信息,例如,管理连接池的bean中,限制池的大小或者使用的连接的数量。
在Spring容器中,定义bean的方式:
-
<bean/>标签 @Bean注解 @Component(@Service、@Controller)
从xml配置文件或者类路径中收集Spring需要的管理对象
在Spring的启动过程第一步就是找到需要被管理的类,比如标注的@Configuration类
找到之后将这些类封装到BeanDefinition对象,也就是bean,包含了这些类的全部信息BeanDefinition是一个接口,有三个实现RootBeanDefinition、ChildBeanDefinition、GenericBeanDefinition。所以也可以通过BeanDefinition这个对象定义一个bean。我们通过,@Bean,@Component等方式所定义的Bean,最终都会被解析为BeanDefinition对象,所有的。
-
使用BeanDefinition定义bean的流程:
导入依赖: <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.6.RELEASE</version> </dependency> 测试实体类: public class User { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void init(){ System.out.println("初始化"); } } 启动类: public static void main(String[] args) { // 定义了一个BeanDefinition AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition() .getBeanDefinition(); // 当前Bean对象的类型 beanDefinition.setBeanClass(User.class); // 将BeanDefinition注册到BeanFactory中 DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); beanFactory.registerBeanDefinition("user", beanDefinition); // 获取Bean System.out.println(beanFactory.getBean("user")); } 结果:com.gongj.entity.User@70177ecd **BeanDefinition可以设置其他属性** // 设置作用域 beanDefinition.setScope("prototype"); // 设置初始化方法 beanDefinition.setInitMethodName("init"); // 设置自动装配模型 beanDefinition.setAutowireMode(AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE); 结果: 初始化 com.gongj.entity.User@1e88b3c
BeanDefinition继承关系
-
AttributeAccessor:定义用于附加和访问元数据的通用协定的接口,可以是任意对象。
-
public interface AttributeAccessor { //设置属性的值(名称唯一) void setAttribute(String name, Object value); //获得指定属性名称的值,如果不存在返回null Object getAttribute(String name); //删除指定的name的属性,如果不存在则返回null Object removeAttribute(String name); //判断指定的属性名称是否存在 boolean hasAttribute(String name); //返回所有属性的名称 String[] attributeNames(); }
BeanDefinition的源码:
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
// 单例Bean还是原型Bean
String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
// Bean角色
int ROLE_APPLICATION = 0; //用户自己定义的 Bean
int ROLE_SUPPORT = 1; //来源于配置文件的 Bean
int ROLE_INFRASTRUCTURE = 2;//Spring 内部的 Bean
//配置 /获取父BeanDefinition的名称 XML中的 <bean parent="">
void setParentName(@Nullable String parentName);
@Nullable
String getParentName();
//配置/获取 Bean 的 Class 全路径 XML 中的 <bean class="">
void setBeanClassName(@Nullable String beanClassName);
@Nullable
String getBeanClassName();
//配置/获取 Bean 的作用域 XML中的 <bean scope=""> 配置。
void setScope(@Nullable String scope);
@Nullable
String getScope();
//配置 / 获取 Bean 是否懒加载(默认false,立马加载)
// XML 中的 <bean lazy-init="">
void setLazyInit(boolean lazyInit);
boolean isLazyInit();
//配置/获取 Bean 的依赖对象 XML中的 <bean depends-on="">
void setDependsOn(@Nullable String... dependsOn);
@Nullable
String[] getDependsOn();
//配置/获取 Bean 是否是自动装配的候选者 默认为 true XML中的 <bean autowire-candidate="">
void setAutowireCandidate(boolean autowireCandidate);
boolean isAutowireCandidate();
//如果找到了多个可注入bean,那么则选择被Primary标记的bean/获取当
//前 Bean 是否为首选的 Bean XML中的 <bean primary="">
void setPrimary(boolean primary);
boolean isPrimary();
// 配置/获取 FactoryBean 的名字 XML中的<bean factory-bean="">
void setFactoryBeanName(@Nullable String factoryBeanName);
@Nullable
String getFactoryBeanName();
//配置/获取 FactoryMethod 的名字,可以是某个实例的方法(和factoryBean配合使用)
//也可以是静态方法。 XML 中的<bean factory-method="">
void setFactoryMethodName(@Nullable String factoryMethodName);
@Nullable
String getFactoryMethodName();
//返回该 Bean 构造方法的参数值
ConstructorArgumentValues getConstructorArgumentValues();
//判断 getConstructorArgumentValues 是否是空对象。
default boolean hasConstructorArgumentValues() {
return !getConstructorArgumentValues().isEmpty();
}
//获取普通属性的集合
MutablePropertyValues getPropertyValues();
//判断 getPropertyValues 是否为空对象
default boolean hasPropertyValues() {
return !getPropertyValues().isEmpty();
}
// 配置/获取 Bean 的初始化方法 XML中的<bean init-method="">
void setInitMethodName(@Nullable String initMethodName);
@Nullable
String getInitMethodName();
// 配置/获取 Bean 的销毁方法 XML中的<bean destroy-method="">
void setDestroyMethodName(@Nullable String destroyMethodName);
@Nullable
String getDestroyMethodName();
//配置/获取 Bean的角色
void setRole(int role);
int getRole();
//配置/获取 Bean 的描述
void setDescription(@Nullable String description);
@Nullable
String getDescription();
//用来解析一个Bean对应的类型上的各种信息,比如泛型
ResolvableType getResolvableType();
//是否为单例
boolean isSingleton();
// 是否为原型
boolean isPrototype();
//是否抽象 XML 中的<bean abstract="true">
boolean isAbstract();
//返回定义 Bean 的资源描述
@Nullable
String getResourceDescription();
// 如果当前 BeanDefinition 是一个代理对象,那么该方法可以用来返回原始的 BeanDefinition
@Nullable
BeanDefinition getOriginatingBeanDefinition();
}
具体关系图:
一、先说AbstractBeanDefinition AbstractBeanDefinition是一个抽象类,在BeanDefinition接口中只定义了get和set方法, 没有提供属性,具体的属性在AbstractBeanDefinition中定义
-
1、源码:
```Java
public abstract class AbstractBeanDefinition extends
BeanMetadataAttributeAccessor
implements BeanDefinition, Cloneable {
//默认作用域名称的常量:等效于单例
public static final String SCOPE_DEFAULT = "";
//自动装配的一些常量
// autowireMode = 0,默认值,未激活Autowiring。
// bean 标签的 autowire 属性值为 no
// 1、在xml中需要手动指定依赖注入对象 配置 property标签或者 constructor-arg标签
// 2、使用 @Autowired 注解,autowireMode 的值也是 0
public static final int AUTOWIRE_NO = AutowireCapableBeanFactory.AUTOWIRE_NO;
//autowireMode = 1,根据set方法的的名称作为Bean名称进行依赖查找
//(去掉set,并尝试将首字母变为小写),并将对象设置到该set方法的参数上
// bean 标签的 autowire 属性值配置为 byName
public static final int AUTOWIRE_BY_NAME =
AutowireCapableBeanFactory.AUTOWIRE_BY_NAME;
//autowireMode = 2,根据set方法参数的类型作为Bean类型进行依赖查找
//并将对象设置到该set方法的参数上
// bean 标签的 autowire 属性值配置为 byType
public static final int AUTOWIRE_BY_TYPE =
AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE;
//autowireMode = 3,构造器注入
// bean 标签的 autowire 属性值配置为 constructor
public static final int AUTOWIRE_CONSTRUCTOR =
AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR;
//表明通过Bean的class的内部来自动装配 Spring3.0被弃用。
// bean 标签的 autowire 属性值配置为 autodetect
@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;
//若Bean未指定销毁方法,容器应该尝试推断Bean的销毁方法的名字,
//目前,推断的销毁方法的名字一般为close或是shutdown
public static final String INFER_METHOD = "(inferred)";
//Bean的class对象或是类的全限定名
@Nullable
private volatile Object beanClass;
//默认的scope是单例,对应bean属性scope
//@Scope
@Nullable
private String scope = SCOPE_DEFAULT;
//是否是抽象,对应bean属性abstract
private boolean abstractFlag = false;
//是否懒加载,对应bean属性lazy-init,默认不是懒加载
//@Lazy
@Nullable
private Boolean lazyInit;
//自动注入模式,对应bean属性autowire,默认不进行自动装配
private int autowireMode = AUTOWIRE_NO;
//是否进行依赖检查,默认不进行依赖检查
private int dependencyCheck = DEPENDENCY_CHECK_NONE;
//用来表示一个bean的实例化是否依靠另一个bean的实例化,先加载dependsOn的bean,
//对应bean属性depend-on
//@Dep