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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot实现ImportBeanDefinitionRegistrar动态注入

    SpringBoot实现ImportBeanDefinitionRegistrar动态注入

    在阅读Spring Boot源码时,看到Spring Boot中大量使用ImportBeanDefinitionRegistrar来实现Bean的动态注入,它是Spring中一个强大的扩展接口,本文就来详细的介绍一下如何使用,感兴趣的可以了解一下
    2024-02-02
  • 实例讲解Java 自旋锁

    实例讲解Java 自旋锁

    这篇文章主要介绍了Java 自旋锁的相关资料,帮助大家更好的理解和学习Java并发,感兴趣的朋友可以了解下
    2020-09-09
  • SpringBoot整合activemq的案例代码

    SpringBoot整合activemq的案例代码

    ActiveMQ是消息队列技术,为解决高并发问题而生,本文通过案例代码给大家介绍pringBoot整合activemq的详细过程,感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • Java解析XML的四种方法详解

    Java解析XML的四种方法详解

    XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML。本文将详细介绍用Java解析XML的四种方法
    2012-10-10
  • Spring Boot高效数据聚合之道深入讲解

    Spring Boot高效数据聚合之道深入讲解

    这篇文章主要给大家介绍了关于Spring Boot高效数据聚合之道的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • Java 中的 BufferedWriter 介绍_动力节点Java学院整理

    Java 中的 BufferedWriter 介绍_动力节点Java学院整理

    BufferedWriter 是缓冲字符输出流。它继承于Writer。接下来通过本文给大家分享Java 中的 BufferedWriter知识,需要的朋友参考下吧
    2017-05-05
  • Java实现调用第三方相关接口

    Java实现调用第三方相关接口

    最近在做一个项目,需要调用第三方接口,本文主要介绍了Java实现调用第三方相关接口,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • SpringBoot实现Server-Sent Events(SSE)的使用完整指南

    SpringBoot实现Server-Sent Events(SSE)的使用完整指南

    使用SpringBoot实现Server-Sent Events(SSE)可以有效处理实时数据推送需求,具有单向通信、轻量级和高实时性等优势,本文详细介绍了在SpringBoot中创建SSE端点的步骤,并通过代码示例展示了客户端如何接收数据,适用于实时通知、数据展示和在线聊天等场景
    2024-09-09
  • java+vue实现添加单选题、多选题到题库功能

    java+vue实现添加单选题、多选题到题库功能

    这篇文章主要为大家详细介绍了java+vue实现添加单选题、多选题到题库功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • IDEA中Maven依赖下载失败的完美解决方案

    IDEA中Maven依赖下载失败的完美解决方案

    使用IDEA进行Maven项目开发时,时不时会遇到pom.xml报错的情况,其中很大概率是因为Maven依赖的jar包下载失败,找来找去也没有找到是什么问题,困扰了很多程序猿,这里给出IDEA中Maven依赖下载失败解决方案,给大家参考,实测有用
    2020-04-04

最新评论