Spring揭秘:BeanDefinitionBuilder接口应用场景及实现原理!

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: BeanDefinitionBuilder类为Spring框架中的Bean定义提供了灵活且强大构建方式,通过API,开发者能够轻松创建和配置Bean,无需依赖繁琐的XML配置或注解。

Spring揭秘:BeanDefinitionBuilder接口应用场景及实现原理! - 程序员古德

内容概要

BeanDefinitionBuilder类为Spring框架中的Bean定义提供了灵活且强大构建方式,通过API,开发者能够轻松创建和配置Bean,无需依赖繁琐的XML配置或注解。

核心应用场景

BeanDefinitionBuilder类在Spring框架中用于构建和配置Bean。

在Spring的IoC容器中,Bean定义描述了如何创建一个Bean实例,包括其类名、作用域、初始化方法、属性设置等信息,它主要解决了以下问题:

  1. 简化Bean定义的创建:使用BeanDefinitionBuilder,开发者可以以编程的方式轻松地创建和配置Bean定义,而不需要手动编写冗长的XML配置文件或注解。
  2. 提供流畅的APIBeanDefinitionBuilder提供了一组流畅的API,允许开发者以链式调用的方式设置Bean的各种属性。
  3. 支持多种Bean类型BeanDefinitionBuilder支持创建多种类型的Bean定义,包括普通的JavaBean、工厂Bean(FactoryBean)等。这使得开发者可以灵活地选择最适合当前需求的Bean类型。
  4. 与Spring容器集成BeanDefinitionBuilder创建的Bean定义可以直接与Spring IoC容器集成,使得这些动态创建的Bean能够享受到Spring提供的各种服务,如依赖注入、AOP代理、事件处理等。

代码案例

下面是一个简单的示例,演示了如何使用 BeanDefinitionBuilder 类来动态地创建一个 Spring Bean 定义,并将其注册到 Spring 容器中,如下代码:

首先,需要创建一个简单的 Java 类,该类将作为要动态创建的 Bean:

// SimpleBean.java  
public class SimpleBean {
   
     
    private String message;  

    public void setMessage(String message) {
   
     
        this.message = message;  
    }  

    public String getMessage() {
   
     
        return message;  
    }  

    @Override  
    public String toString() {
   
     
        return "SimpleBean{message='" + message + "'}";  
    }  
}

接下来,使用 BeanDefinitionBuilder 来创建一个 SimpleBean 类型的 Bean 定义,并将其注册到 Spring 容器中:

// AppConfig.java  
import org.springframework.beans.factory.support.BeanDefinitionBuilder;  
import org.springframework.beans.factory.support.BeanDefinitionRegistry;  
import org.springframework.beans.factory.support.GenericBeanDefinition;  
import org.springframework.context.ConfigurableApplicationContext;  
import org.springframework.context.annotation.AnnotationConfigApplicationContext;  

public class AppConfig {
   
     

    public static void main(String[] args) {
   
     
        // 创建 AnnotationConfigApplicationContext,这是一个可配置的应用上下文  
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();  

        // 获取 BeanDefinitionRegistry,用于注册新的 Bean 定义  
        BeanDefinitionRegistry registry = (BeanDefinitionRegistry) context.getBeanFactory();  

        // 使用 BeanDefinitionBuilder 创建一个新的 Bean 定义  
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(SimpleBean.class);  
        // 为新的 Bean 定义设置属性  
        builder.addPropertyValue("message", "Hello, Spring!");  

        // 构建并获取 GenericBeanDefinition 对象  
        GenericBeanDefinition beanDefinition = (GenericBeanDefinition) builder.getBeanDefinition();  

        // 注册新的 Bean 定义到容器中,使用 "simpleBean" 作为 Bean 的名称  
        registry.registerBeanDefinition("simpleBean", beanDefinition);  

        // 刷新上下文,以便应用新的 Bean 定义  
        context.refresh();  

        // 从容器中获取并打印刚刚创建的 SimpleBean 实例  
        SimpleBean simpleBean = context.getBean(SimpleBean.class);  
        System.out.println(simpleBean);  

        // 关闭上下文  
        context.close();  
    }  
}

在上面的代码中,首先创建了一个 AnnotationConfigApplicationContext 实例,然后通过它获取了 BeanDefinitionRegistry,接着,使用 BeanDefinitionBuilder 创建了一个新的 SimpleBean 类型的 Bean 定义,并为其设置了一个属性 message

然后,这个新的 Bean 定义注册到了 Spring 容器中,并刷新了上下文以便应用新的 Bean 定义。

最后,从容器中获取了刚刚创建的 SimpleBean 实例,并打印了它。

运行上面的代码后,会在控制台看到类似下面的输出:

SimpleBean{message='Hello, Spring!'}

核心方法

BeanDefinitionBuilder 类在 Spring 框架中用于以编程方式构建和配置 BeanDefinition 对象,这些对象描述了如何创建 Spring 容器中的 bean 实例。

以下是 BeanDefinitionBuilder 类中一些常用方法的含义:

  1. BeanDefinitionBuilder.genericBeanDefinition(Class<?> beanClass)BeanDefinitionBuilder.genericBeanDefinition(String beanClassName)
    这两个静态方法用于创建一个新的 BeanDefinitionBuilder 实例,指定要创建的 bean 的类类型或类名。
  2. setScope(String scope)
    设置 bean 的作用域,如 BeanDefinition.SCOPE_SINGLETON(单例)、BeanDefinition.SCOPE_PROTOTYPE(原型)等。
  3. setLazyInit(boolean lazyInit)
    设置是否延迟初始化 bean,如果设置为 true,则 bean 将在首次请求时创建,而不是在容器启动时。
  4. setInitMethodName(String initMethodName)setDestroyMethodName(String destroyMethodName)
    设置 bean 的自定义初始化方法和销毁方法。
  5. addPropertyValue(String name, Object value)addPropertyValue(PropertyValue pv)
    为 bean 添加属性设置,包括bean名称和值。
  6. setFactoryMethod(String factoryMethod)
    设置用于创建 bean 实例的工厂方法,通常与 FactoryBean 一起使用。
  7. setConstructorArgumentValues(ConstructorArgumentValues cargs)addConstructorArgValue(Object value) 等:
    设置用于构造 bean 实例的构造函数参数,包括造函数参数的值和类型。
  8. setAutowireMode(int autowireMode)
    设置自动装配模式,如 BeanDefinition.AUTOWIRE_BY_NAME(按名称自动装配)或 BeanDefinition.AUTOWIRE_BY_TYPE(按类型自动装配)等。
  9. setDependencyCheck(int dependencyCheck)
    设置依赖检查模式,用于检查 bean 的依赖是否已正确解析。
  10. setRole(int role)
    设置 bean 的角色,通常用于区分框架内部使用的 bean 和应用程序级别的 bean。
  11. setResource(Resource resource)
    设置与 bean 定义相关联的资源,通常用于提供元数据或配置信息的来源。
  12. getBeanDefinition()
    完成配置后,此方法用于获取构建的 BeanDefinition 对象。

这些方法提供了构建和配置 BeanDefinition 所需的所有功能,从而允许开发者以编程方式完全控制 bean 的创建和配置过程,这在动态创建 bean 或在运行时修改 bean 配置时非常有用。

技术原理

BeanDefinitionBuilder 类是 Spring 框架中用于帮助构建 BeanDefinition 对象的工具类。

它提供了一组流畅的 API 来配置和构建这些定义,更易于以编程方式使用。

实现原理

BeanDefinitionBuilder 本质上是对 AbstractBeanDefinition 及其子类的封装,通过 BeanDefinitionBuilder 设置各种属性(如作用域、延迟初始化、构造函数参数等)时,这些设置最终都会被映射到对应的 BeanDefinition 对象上。

主要的接口和类

  • BeanDefinition: 这是所有 bean 定义的根接口,提供了配置 bean 的基本属性(如作用域、依赖项检查等)的方法。
  • AbstractBeanDefinition: 这是 BeanDefinition 的抽象实现,提供了一些公共的实现逻辑和属性,大多数实际的 BeanDefinition 实现都继承自这个类。
  • GenericBeanDefinition: 这是一个通用的、完整的 BeanDefinition 实现,可以用于任何 bean 类型,BeanDefinitionBuilder 默认情况下就是使用这个类来构建 bean 定义。
  • BeanDefinitionRegistry: 这个接口允许注册、获取和移除 BeanDefinitionAnnotationConfigApplicationContext 和其他应用上下文实现类通常都会实现这个接口。

运行机制

  1. 创建 Builder: 首先,会使用 BeanDefinitionBuilder 的静态工厂方法(如 genericBeanDefinition)来创建一个 builder 实例,指定要构建的 bean 的类型或类名。
  2. 配置属性: 然后,会调用 builder 的各种方法(如 setScope, setLazyInit, addPropertyValue 等)来配置 bean 的属性,这些方法会修改内部的 BeanDefinition 对象。
  3. 构建 BeanDefinition: 一旦配置完成,可以通过调用 getBeanDefinition 方法来获取构建的 BeanDefinition 对象。
  4. 注册 BeanDefinition: 最后,可以将构建的 BeanDefinition 注册到一个 BeanDefinitionRegistry 中,在 Spring 应用程序启动时,容器会使用这些定义来创建和管理 bean 实例。

核心总结

Spring揭秘:AnnotationMetadata接口应用场景及实现原理! - 程序员古德

BeanDefinitionBuilder的主要作用是构建BeanDefinition对象,优点在于,可以灵活地以编程方式创建和配置Bean定义,无需依赖XML或注解配置,这在动态扩展Spring容器时特别有用,它提供了丰富的设置选项,能够满足复杂的配置需求。

但是,过渡使用BeanDefinitionBuilder可能会让代码变得更加复杂,特别是当Bean的配置逻辑本身就很复杂时,过度依赖编程式配置可能会降低配置的可读性和可维护性。

关注我,每天学习互联网编程技术 - 程序员古德

END!
END!
END!

往期回顾

精品文章

Spring揭秘:@import注解应用场景及实现原理!

Java并发基础:原子类之AtomicMarkableReference全面解析!

Java并发基础:concurrent Flow API全面解析

Java并发基础:CopyOnWriteArraySet全面解析

Java并发基础:ConcurrentSkipListMap全面解析

相关文章
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
162 1
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
104 62
|
28天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
28天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
53 2
|
2月前
|
人工智能 开发框架 Java
总计 30 万奖金,Spring AI Alibaba 应用框架挑战赛开赛
Spring AI Alibaba 应用框架挑战赛邀请广大开发者参与开源项目的共建,助力项目快速发展,掌握 AI 应用开发模式。大赛分为《支持 Spring AI Alibaba 应用可视化调试与追踪本地工具》和《基于 Flow 的 AI 编排机制设计与实现》两个赛道,总计 30 万奖金。
|
2月前
|
存储 安全 Java
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用
【10月更文挑战第8天】本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,通过 Spring Initializr 创建并配置 Spring Boot 项目,实现后端 API 和安全配置。接着,使用 Ant Design Pro Vue 脚手架创建前端项目,配置动态路由和菜单,并创建相应的页面组件。最后,通过具体实践心得,分享了版本兼容性、安全性、性能调优等注意事项,帮助读者快速搭建高效且易维护的应用框架。
45 3
|
2月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
29 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
2月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
28 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
2月前
|
存储 Java 数据管理
强大!用 @Audited 注解增强 Spring Boot 应用,打造健壮的数据审计功能
本文深入介绍了如何在Spring Boot应用中使用`@Audited`注解和`spring-data-envers`实现数据审计功能,涵盖从添加依赖、配置实体类到查询审计数据的具体步骤,助力开发人员构建更加透明、合规的应用系统。