BeanDefinition 是定义 Bean 的配置元信息接口,包含:
Bean 的类名
设置父 bean 名称、是否为 primary、
Bean 行为配置信息,作用域、自动绑定模式、生命周期回调、延迟加载、初始方法、销毁方法等
Bean 之间的依赖设置,dependencies
构造参数、属性设置
BeanDefinition 子类方法更为丰富些。
派生出 AnnotatedBeanDefinition 接口,以及常用子类 RootBeanDefinition、GenericBeanDefinition。
可以使用 BeanDefinitionBuilder 或 new BeanDefinition 实现类构建 BeanDefinition 对象。
假设没有 没有BeanDefinition 这一层的存在,Spring 实例化Bean的模型是这样的,
这个时候,由于版本更迭,xml配置的形式 被弃用,需要使用 注解的方式注解Bean,由于解析工作与实例化的代码 冗杂在一起, xml那一套完全 不被使用, 需要重新写一套 边解析注解,边实例化的 逻辑。由于设计的缺陷,导致了开发的工作量提升, 且代码复用性 也不高。
现在 存在BeanDefinition,Spring 解析xml文件,实例化Bean的模型是这样的,
此时需要增加 扫描注解 实例化Bean的逻辑,那么就只有 解析的工作不一样,后面的实例化部分的逻辑可以共用。 而解析 其实只是 ioc 很小的一部分而已。实现了 解析配置和 实例化的耦合,增加了代码的复用性,可维护性, 可拓展性。
如果 再需要加一种 注册Bean的方式, 比如文件,网络,那么只要 拓展 对应的解析阶段的逻辑 , 保持 实例化Bean的逻辑不变。
User.java
package constxiong;
public class User {
private Integer id;
private String name;
public User() {
}
public User(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
}
构建和注册 BeanDefinition 对象测试类
package constxiong;
import org.springframework.beans.factory.config.ConstructorArgumentValues;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.RootBeanDefinition;
/**
* 测试 BeanDefinition 构建
* @author ConstXiong
*/
public class Test {
public static void main(String[] args) {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
// BeanDefinitionBuilder 构建 BeanDefinition
BeanDefinitionBuilder builder = BeanDefinitionBuilder
.genericBeanDefinition(User.class)
.addPropertyValue("id", 1) //属性设置
.addPropertyValue("name", "constxiong");
beanFactory.registerBeanDefinition("user1", builder.getBeanDefinition());
User user = beanFactory.getBean("user1", User.class);
System.out.println(user);
//直接 new 的方式,创建 BeanDefinitionBuilder 对象
RootBeanDefinition beanDefinition = new RootBeanDefinition(User.class);
//构造参数
ConstructorArgumentValues constructorArgumentValues = new ConstructorArgumentValues();
constructorArgumentValues.addIndexedArgumentValue(0, 1);
constructorArgumentValues.addIndexedArgumentValue(1, "user2");
beanDefinition.setConstructorArgumentValues(constructorArgumentValues);
beanFactory.registerBeanDefinition("user2", beanDefinition);
User user2 = beanFactory.getBean("user2", User.class);
System.out.println(user2);
}
}