• Spring手动构建BeanDefinition的几种方法


    Spring手动构建BeanDefinition的几种方法

    • GenericBeanDefinition
    • RootBeanDefinition
    • ChildBeanDefinition
    • BeanDefinitionBuilder

    GenericBeanDefinition

    @Data
    public class Student {
        String name;
        int age;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    public void test() {
    	AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
    	GenericBeanDefinition gBean = new GenericBeanDefinition();
    	//设置bean
    	gBean .setBeanClass(Student.class);
    	//设置属性
    	MutablePropertyValues propertys=new MutablePropertyValues();
    	propertys.add("name","luxifa").add("age",25);
    	gBean .setPropertyValues(mp); 
    	// 注册bean
        context.registerBeanDefinition("bean1", gBean );
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    GenericBeanDefinition也可以继承

    public void test() {
    	AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
    	GenericBeanDefinition definition1 = new GenericBeanDefinition();
    	//设置bean
    	definition1.setBeanClass(Student.class);
    	//设置属性
    	MutablePropertyValues propertys=new MutablePropertyValues();
    	propertys.add("name","luxifa").add("age",25);
    	definition1.setPropertyValues(mp); 
    	// 注册bean
        context.registerBeanDefinition("gBean1", definition1);
    
    
        GenericBeanDefinition definition2 = new GenericBeanDefinition();
        definition2.setParentName("gBean1");
        // definition2 的属性继承了 definition1
        context.registerBeanDefinition("gBean2", definition2);
        
    	context.refresh();
    
        Student student1 = (Student) context.getBean("gBean1");
        Student bean2 = (Student) context.getBean("gBean2");
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    RootBeanDefinition

    RootBeanDefinition不能有父节点

    public void test() {
        // RootBeanDefinition
        RootBeanDefinition definition = new RootBeanDefinition();
        definition.setBeanClass(Student.class);
        definition.getPropertyValues().add("name", "luxifa");
        definition.getPropertyValues().add("age", 25);
        context.registerBeanDefinition("bean1", definition);
    
        // child
        ChildBeanDefinition definition2 = new ChildBeanDefinition("bean1");
        context.registerBeanDefinition("bean2", definition2);
    
        // 刷新
        context.refresh();
    
        Bean bean1 = (Bean) context.getBean("bean1");
        Bean bean2 = (Bean) context.getBean("bean2");
        System.out.println(bean1==bean2);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    ChildBeanDefinition

    ChildBeanDefinition必须有父节点

    public void test() {
    	AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        // RootBeanDefinition
        RootBeanDefinition definition = new RootBeanDefinition();
        definition.setBeanClass(Student.class);
        definition.getPropertyValues().add("name", "luxifa");
        definition.getPropertyValues().add("age", 25);
        context.registerBeanDefinition("rBean1", definition);
    
        // ChildBeanDefinition
        ChildBeanDefinition definition2 = new ChildBeanDefinition("rBean1");
        context.registerBeanDefinition("rBean2", definition2);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    BeanDefinitionBuilder

    BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(Student.class);
    //懒加载,调用get("beanname")方法时才实例化
    builder.setLazyInit(true);
    // builder.getBeanDefinition() 其实是一个 GenericBeanDefinition
    context.registerBeanDefinition("hBean", builder.getBeanDefinition());
    
    • 1
    • 2
    • 3
    • 4
    • 5

    GenericBeanDefinition跟AbstractBeanDefinition区别

    Spring中的GenericBeanDefinition和AbstractBeanDefinition都是BeanDefinition的子类,用于定义bean的元数据信息,但它们的区别如下:

    1. GenericBeanDefinition是一个简单的BeanDefinition实现,它没有AbstractBeanDefinition的复杂性和灵活性。它只提供了基本的bean属性定义,如bean的类名、作用域、构造函数参数、属性等。
    
    2. AbstractBeanDefinition是一个抽象类,它提供了更加灵活和丰富的bean属性定义。它可以定义bean的生命周期、依赖关系、初始化方法、销毁方法等。同时,AbstractBeanDefinition还提供了一些扩展点,如BeanPostProcessorFactoryBean等。
    
    • 1
    • 2
    • 3

    因此,如果需要定义一个简单的bean,可以使用GenericBeanDefinition;如果需要定义一个复杂的bean,可以使用AbstractBeanDefinition。

    Spring的GenericBeanDefinition和AbstractBeanDefinition都是BeanDefinition接口的实现类,用于定义Spring容器中的Bean。

    GenericBeanDefinition是一个简单的BeanDefinition实现,它可以用于定义一个普通的Bean,并且可以设置Bean的Class类型、Scope、构造函数参数、属性等信息。

    示例代码:

    // 创建一个GenericBeanDefinition
    GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
    // 设置Bean的Class类型
    beanDefinition.setBeanClass(UserService.class);
    // 设置Bean的Scope为Singleton
    beanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON);
    // 设置构造函数参数
    ConstructorArgumentValues constructorArgs = new ConstructorArgumentValues();
    constructorArgs.addIndexedArgumentValue(0, "张三");
    constructorArgs.addIndexedArgumentValue(1, 18);
    beanDefinition.setConstructorArgumentValues(constructorArgs);
    // 设置属性
    MutablePropertyValues propertyValues = new MutablePropertyValues();
    propertyValues.add("email", "zhangsan@example.com");
    beanDefinition.setPropertyValues(propertyValues);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    AbstractBeanDefinition是一个抽象类,它提供了更加丰富的Bean定义方式,可以用于定义一个完整的BeanDefinition,并且还提供了一些扩展点,比如Bean的初始化方法、销毁方法、Bean的自动注入等。

    示例代码:

    // 创建一个AbstractBeanDefinition
    AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(UserService.class)
            // 设置Bean的Scope为Singleton
            .setScope(BeanDefinition.SCOPE_SINGLETON)
            // 设置构造函数参数
            .addConstructorArgValue("张三")
            .addConstructorArgValue(18)
            // 设置属性
            .addPropertyValue("email", "zhangsan@example.com")
            // 设置Bean的初始化方法
            .setInitMethodName("init")
            // 设置Bean的销毁方法
            .setDestroyMethodName("destroy")
            // 设置Bean的自动注入方式
            .setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_NAME)
            .getBeanDefinition();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    参考博客:https://juejin.cn/post/6844904118595616782

  • 相关阅读:
    循环购商业模式:实现用户裂变的关键
    [附源码]java毕业设计药品销售管理系统
    3DCAT+东风日产:共建线上个性化订车实时云渲染方案
    利用Git+GitHub进行团队协作开发
    RFID 完整指南:优点、应用和挑战
    【面试八股总结】C++内存管理:内存分区、内存泄漏、new和delete、malloc和free
    RHCSA-Day2 --- 命令、目录结构、vi编辑器
    机器视觉Halcon-焊点提取排序设计思路一
    使用Python PyQt5完成残缺棋盘覆盖仿真作业
    家用摄像头怎么选:实用性,功能性以及性价比是关键
  • 原文地址:https://blog.csdn.net/weixin_42594143/article/details/132710570