• 什么是BeanDefination


    功能作用

    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 + "]";
    	}
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    构建和注册 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);
    	}
     
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
  • 相关阅读:
    [汇编实操]DOSBox工具: unable to open input file: 文件名.asm问题解决
    css关于relative和absolute的区别
    玩转ChatGPT:批量下载Alphafold的蛋白pdb文件
    【测试代码 & 基于Pytorch】的卷积神经网络(CNN) || 【基于Pytorch】的深度卷积神经网络(DCNN)
    Android APP 存储权限(适用高于Android R版本)
    使用Java操作Redis
    千兆以太网——MDIO接口协议
    【多任务案例:猫狗脸部定位与分类】
    MySQL数据库的备份和恢复
    C++ Reference: Standard C++ Library reference: C Library: cwctype: towlower
  • 原文地址:https://blog.csdn.net/qq_37436172/article/details/127755842