java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java BeanDefination

Java BeanDefination接口详细讲解

作者:氵奄不死的鱼

BeanDefinition是spring里面bean的一个建模对象,就相当于class对象是普通java对象的建模对象一样。可能在spring作用的各种业务场景中,class对象并不能完成spring对bean的抽象,所以弄了一个BeanDefinition作为bean的抽象建模对象

功能作用

BeanDefinition 是定义 Bean 的配置元信息接口,包含:

Bean 的类名

设置父 bean 名称、是否为 primary、

Bean 行为配置信息,作用域、自动绑定模式、生命周期回调、延迟加载、初始方法、销毁方法等

Bean 之间的依赖设置,dependencies

构造参数、属性设置

BeanDefinition 子类方法更为丰富些。

派生出 AnnotatedBeanDefinition 接口,以及常用子类 RootBeanDefinition、GenericBeanDefinition。

可以使用 BeanDefinitionBuilder 或 new BeanDefinition 实现类构建 BeanDefinition 对象。

为什么这样设计

假设没有BeanDefinition

假设没有 没有BeanDefinition 这一层的存在,Spring 实例化Bean的模型是这样的,

这个时候,由于版本更迭,xml配置的形式 被弃用,需要使用 注解的方式注解Bean,由于解析工作与实例化的代码 冗杂在一起, xml那一套完全 不被使用, 需要重新写一套 边解析注解,边实例化的 逻辑。由于设计的缺陷,导致了开发的工作量提升, 且代码复用性 也不高。

有BeanDefinition

现在 存在BeanDefinition,Spring 解析xml文件,实例化Bean的模型是这样的,

此时需要增加 扫描注解 实例化Bean的逻辑,那么就只有 解析的工作不一样,后面的实例化部分的逻辑可以共用。 而解析 其实只是 ioc 很小的一部分而已。实现了 解析配置和 实例化的耦合,增加了代码的复用性,可维护性, 可拓展性。

如果 再需要加一种 注册Bean的方式, 比如文件,网络,那么只要 拓展 对应的解析阶段的逻辑 , 保持 实例化Bean的逻辑不变。

BeanDefinition 属性介绍

示例

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);
	}
}

到此这篇关于Java BeanDefination接口详细讲解的文章就介绍到这了,更多相关Java BeanDefination内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文