Java BeanDefination接口详细讲解

 更新时间:2022年11月18日 09:07:08   作者:氵奄不死的鱼  
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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现从方法返回多个值功能示例

    java实现从方法返回多个值功能示例

    这篇文章主要介绍了java实现从方法返回多个值功能,结合实例形式分析了集合类、封装对象、引用传递三种实现方法,需要的朋友可以参考下
    2017-10-10
  • 使用jpa之动态插入与修改(重写save)

    使用jpa之动态插入与修改(重写save)

    这篇文章主要介绍了使用jpa之动态插入与修改(重写save),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java类和对象原理与用法分析

    java类和对象原理与用法分析

    这篇文章主要介绍了java类和对象原理与用法,结合实例形式分析了java类和对象的相关概念、功能、原理、使用技巧与操作注意事项,需要的朋友可以参考下
    2020-02-02
  • Java反射的使用和原理详解

    Java反射的使用和原理详解

    这篇文章主要介绍了Java反射的使用和原理详解,反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作,需要的朋友可以参考下
    2024-01-01
  • Eclipse中创建Web项目最新方法(2023年)

    Eclipse中创建Web项目最新方法(2023年)

    在Java开发人员中,最常用的开发工具应该就是Eclipse,下面这篇文章主要给大家介绍了关于Eclipse中创建Web项目2023年最新的方法,需要的朋友可以参考下
    2023-09-09
  • Java并发工具类Future使用示例

    Java并发工具类Future使用示例

    这篇文章主要介绍了Java并发工具类Future使用示例,本文需要注意future.get()方法是阻塞式的,如果调用该方法的时候任务尚未执行完成,则会一直等待下去,直到任务执行结束,本文通过示例代码给大家介绍的非常详细,需要的朋友参考下吧
    2022-06-06
  • Java模拟服务器解析web数据

    Java模拟服务器解析web数据

    本篇文章主要给大家详细分享了搭建JavaWeb服务器的详细步骤以及用到的代码,对此有需要的朋友可以跟着学习下,希望能给你带来帮助
    2021-07-07
  • Spring Batch批处理框架操作指南

    Spring Batch批处理框架操作指南

    Spring Batch 是 Spring 提供的一个数据处理框架。企业域中的许多应用程序需要批量处理才能在关键任务环境中执行业务操作,这篇文章主要介绍了Spring Batch批处理框架操作指南,需要的朋友可以参考下
    2022-07-07
  • JAVA文件读写操作详解

    JAVA文件读写操作详解

    这篇文章主要为大家详细介绍了JAVA文件读写操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • Java详解聊天窗口的创建流程

    Java详解聊天窗口的创建流程

    这篇文章主要介绍了怎么用Java来创建一个聊天窗口,聊天软件我们经常要用,但是你有想过自己怎么去实现它吗,感兴趣的朋友跟随文章往下看看吧
    2022-04-04

最新评论