开发者

Java BeanDefination接口详细讲解

开发者 https://www.devze.com 2022-11-28 14:04 出处:网络 作者: 氵奄不死的鱼
目录功能作用为什么这样设计假设没有BeanDefinition有BeanDefinitionBeanDefinition属性介绍示例功能作用BeanDefinition是定义Bean的配置元信...
目录
  • 功能作用
  • 为什么这样设计
    • 假设没有BeanDefinition
    • 有BeanDefinition
    • BeanDefinition 属性介绍
  • 示例

    功能作用

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

    Bean 的类名

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

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

    Bean 之间的依赖设置,dependencies

    构造参数、属性设置

    Java BeanDefination接口详细讲解

    BeanDefinition 子类方法更为丰富些。

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

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

    为什么这样设计

    假设没有BeanDefinition

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

    Java BeanDefination接口详细讲解

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

    Java BeanDefination接口详细讲解

    有BeanDefinition

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

    Java BeanDefination接口详细讲解

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

    Java BeanDefination接口详细讲解

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

    Java BeanDefination接口详细讲解

    BeanDefinition 属性介绍

    Java BeanDefination接口详细讲解

    示例

    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.cojavascriptnfig.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.ge开发者_开发培训tBean("user1", User.class);
    		System.out.println(user);
    		//直接 new 的方式,创建 BeanDefinitionBuilder 对象
    		RootBeanDefinition beanDefinition = new RootBeanDefinition(User.class);
    		//构造参www.devze.com数
    		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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消