首页 > 其他分享 >Spring手动构建BeanDefinition的几种方法

Spring手动构建BeanDefinition的几种方法

时间:2023-12-17 20:14:06浏览次数:34  
标签:definition GenericBeanDefinition Spring 手动 Bean bean context new BeanDefinition

  • GenericBeanDefinition
  • RootBeanDefinition
  • ChildBeanDefinition
  • BeanDefinitionBuilder

GenericBeanDefinition

@Data
public class Student {
    String name;
    int age;
}
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 );
}

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");
}

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);
}

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);
}

BeanDefinitionBuilder

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

GenericBeanDefinition跟AbstractBeanDefinition区别

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

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

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

// 创建一个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", "[email protected]");
beanDefinition.setPropertyValues(propertyValues);
// 创建一个AbstractBeanDefinition
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(UserService.class)
    // 设置Bean的Scope为Singleton
    .setScope(BeanDefinition.SCOPE_SINGLETON)
    // 设置构造函数参数
    .addConstructorArgValue("张三")
    .addConstructorArgValue(18)
    // 设置属性
    .addPropertyValue("email", "[email protected]")
    // 设置Bean的初始化方法
    .setInitMethodName("init")
    // 设置Bean的销毁方法
    .setDestroyMethodName("destroy")
    // 设置Bean的自动注入方式
    .setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_NAME)
    .getBeanDefinition();

 

标签:definition,GenericBeanDefinition,Spring,手动,Bean,bean,context,new,BeanDefinition
From: https://www.cnblogs.com/xfeiyun/p/17909270.html

相关文章

  • SpringBoot开启注册发现并使用feign进行远程调用
    1、安装nacos服务端nacos下载地址https://github.com/alibaba/nacos/releases下载nacos之后解压并启动Nacos默认端口是88482、配置maven坐标信息2.1配置坐标管理<dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</......
  • Spring如何j将xml配置映射为BeanDefinition
    Spring的常用配置文件是applicationContext.xml文件,最简单的,一般我们都会添加这样的配置:<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-ins......
  • springboot连接mysql出现的SSL问题
    1、连接配置spring:datasource:username:rootpassword:rooturl:jdbc:mysql://192.168.0.1:3307/admin?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaidriver-class-name:com.mysql.cj.jdbc.Driver出现SSL连接问题2、解......
  • 最新Spring 6手写实现Sping IOC保姆级教程
    Java全能学习+面试指南:https://javaxiaobear.cn我们都知道,Spring框架的IOC是基于Java反射机制实现的,下面我们先回顾一下java反射。1、回顾Java反射Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种......
  • Java医院3D人体智能导诊系统源码 Uniapp+springboot
    “智能导诊”以人工智能手段为依托,为人们提供智能分诊、问病信息等服务,在一定程度上满足了人们自我健康管理、精准挂号等需求。智能导诊可根据描述的部位和病症,给出适合病症的科室参考。智慧导诊页面会显示男性或女性的身体结构图,可切换正面/背面。通过点击部位选项,选择自己身体不......
  • Spring的BeanDefinition是什么
    BeanDefinition是什么?在Spring框架中,BeanDefinition是描述和定义Spring容器中的Bean的元数据对象。它包含了定义Bean的相关信息,例如Bean的类名、作用域、生命周期等。BeanDefinition对象通常由Spring容器在启动过程中根据配置信息或注解生成。是SpingIoc容器管理的核心数据结构......
  • Spring Boot Actuator 使用和常用配置
    转载请注明出处:SpringBootActuator是SpringBoot提供的一个非常强大的工具,它可以帮助我们监控和管理我们的SpringBoot应用。Actuator提供了一系列的端点,我们可以通过这些端点来查看我们的应用的运行状态,例如健康状态、指标、信息、数据库连接、Redis连接等等1.配置Spring......
  • SpringBoot集成Swagger的使用
    一、前言Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。目标是使客户端和文件系统作为服务器以同样的速度来更新文件的方法,参数和模型紧密集成到服务器。Swagger能够在线自动生成RESTFul接口的文档,同时具备测试接口的功能。简单点来讲就是说......
  • SpringBoot集成多个RabbitMq(多个MQ链接)
    ##2023年12月16日20:25:36 项目中使用RabbitMQ作为应用间信息互通,本次梳理下关于MQ的使用。1、引入依赖<!--引入依赖,使用v2.5.6版本--><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-b......
  • 第八章:SpringBoot-Java工程及关系和修改启动logo(了解)
    一、springbootJava工程(了解)二、关闭&修改启动logo(了解)......