”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用独特的配置轻松设置多个 Spring Bean

使用独特的配置轻松设置多个 Spring Bean

发布于2024-11-08
浏览:871

Easily Set Up Multiple Spring Beans with Unique Configurations

厌倦了重复的 Spring Bean 注册?你并不孤单!

是否曾因 Spring Boot 中重复的 bean 定义而陷入困境?你并不孤单!管理具有不同配置的同一类的多个 bean 可能会变得乏味且混乱。假设您需要这样的东西:

@Bean
MyService beanA() {
    // Set Configuration for bean A
    Configuration a = new...
    a.setUrl(.....)
    return new MyService(a);
}

@Bean
MyService beanB() {
    // Set Configuration for bean A
    Configuration b = new...
    b.setUrl(.....)
    return new MyService(b);
}

这段代码并不复杂,但它很快就会变得重复,特别是在处理多个相同类型的 bean 时。理想情况下,您可以通过不同的设置注册多个实例,而无需冗余代码。

这与为接口的每个实现拥有唯一的 bean 不同。相反,我们正在讨论建立一个具有变化的类。例如,考虑一个连接到多个数据库(例如客户、报告和备份)的应用程序。每个连接都需要自己的配置,这使得管理变得混乱而具有挑战性。你最终可能会写出这样的东西:

@Bean
DatabaseService primaryDatabaseService() {
    return new DatabaseService("db-url-primary");
}

@Bean
DatabaseService reportDatabaseService() {
    return new DatabaseService("db-url-report");
}

拥有更简单的解决方案可以显着简化您的配置,让您更加关注应用程序逻辑。输入 MultiBeanConfig — 我构建的一个小型库,用于帮助管理同一个 Spring bean 的多个配置。

介绍 MultiBeanConfig

MultiBeanConfig 通过单独的配置简化了 Bean 的多个实例的设置。有了它,您可以:

  • 减少重复代码
  • 集中配置管理
  • 保持代码库整洁有序

核心特点

  • 多 Bean 设置:定义单个类的多个实例。
  • 自定义配置:通过应用程序属性控制每个实例的设置。
  • 默认值:如果缺少特定配置,自动应用默认值。
  • 自动注入:轻松使用@Autowired进行依赖注入。

分步指南

1. 将 MultiBeanConfig 添加到您的项目中

在 pom.xml 中包含依赖项:

io.github.olufemithompsonmultibeanconfig0.0.3

2. 设置Bean类

使用 @MultiBean 标记您的类,使其符合多个实例的条件:

@MultiBean
public class DatabaseService {
    // Your service logic
}

3. 在配置文件中定义 Bean

在属性或 YAML 文件中定义唯一版本:

multibean:
  primary-database-service:
    class: DatabaseService
  report-database-service:
    class: DatabaseService

这会使用默认配置注册primaryDatabaseService 和reportDatabaseService bean。 MultiBeanConfig 自动将名称从短横线命名法转换为驼峰命名法。

自定义每个 Bean 的配置

要分配单独的设置,请将属性直接添加到每个 bean 的配置中。这是每个实例连接到不同数据库的示例:

@MultiBean
public class DatabaseService {
   @Value("${database-config.connection-url}")
   private String connectionUrl;
}

配置application.yml中的每个实例:

database-config:
  connection-url: 'jdbc:h2:default-url'

multibean:
  primary-database-service:
    class: DatabaseService
    database-config:
      connection-url: 'jdbc:mysql:primary-db-url'
  report-database-service:
    class: DatabaseService
    database-config:
      connection-url: 'jdbc:postgresql:report-db-url'

此设置为每个 bean 提供了唯一的连接 URL。共享设置也可以在常规部分中定义,从而使配置高效并减少冗余。

注入配置的替代方法

您不必仅依赖 @Value 来注入配置。 Spring的@ConfigurationProperties允许将属性封装在配置类中:

@ConfigurationProperties("database-config")
@Configuration
public class DatabaseConfig {
    private String connectionUrl;
    private int connectionTimeout;
    // Getters and Setters
}

然后,直接注入DatabaseConfig:

@MultiBean
public class DatabaseService {
   private final DatabaseConfig databaseConfig;
   public DatabaseService(DatabaseConfig databaseConfig) {
       this.databaseConfig = databaseConfig;
   }
}

使用配置的 Bean

使用 MultiBeanConfig ,像使用任何 Spring 依赖项一样注入您独特配置的 bean:

@Service
public class ApplicationService {
   private final DatabaseService primaryDatabaseService;
   private final DatabaseService reportDatabaseService;

   public ApplicationService(DatabaseService primaryDatabaseService, DatabaseService reportDatabaseService) {
       this.primaryDatabaseService = primaryDatabaseService;
       this.reportDatabaseService = reportDatabaseService;
   }
}

最后的想法

MultiBeanConfig 简化了 Spring Boot 应用程序中的 bean 管理,特别是在处理功能标志、数据源或不同的 API 连接时。它减少了冗余,保持代码整洁,并增强了可维护性。尝试一下,让我知道它如何适用于您的项目!

版本声明 本文转载于:https://dev.to/thompsonolufemi/easily-set-up-multiple-spring-beans-with-unique-configurations-3df1?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 什么是封装以及如何使用它。
    什么是封装以及如何使用它。
    什么是封装? Java 中的封装就是隐藏某些东西如何工作的细节,同时仍然允许其他人使用它。您将数据(如变量)和方法(如函数)分组到一个单元中,称为类。您不是让每个人都直接访问您的数据,而是提供方法(getter 和 setter)来控制数据的访问或更改方式。这样,您可以保护您的数据并保持代码整洁和有...
    编程 发布于2024-11-08
  • Java 中的倒置二叉树
    Java 中的倒置二叉树
    最近,我开始练习一些 LeetCode 练习,以提高我的算法/数据结构技能。我可以说,该平台提供了一个良好的环境,可以与其他开发人员一起练习和学习多种编程语言的解决方案,与他人讨论、分享解决方案,并练习大公司要求的代码挑战。 什么是 LeetCode? LeetCode 是一个帮助候...
    编程 发布于2024-11-08
  • 如何在Python中高效查找一个数的因数?
    如何在Python中高效查找一个数的因数?
    在 Python 中高效查找数字的因数确定数字的因数是各个领域中的常见任务,Python 提供了多种有效的方法来实现它。一种优化方法涉及利用 Python 的 reduce 函数以及列表理解。这个简洁的解决方案有效地找到给定数字的所有因子。from functools import reduce d...
    编程 发布于2024-11-08
  • JavaScript 困境:嵌入脚本与内联执行?
    JavaScript 困境:嵌入脚本与内联执行?
    外部脚本标签中的 JavaScript:源困境当使用带有 的外部脚本标签时语法,了解它们的局限性很重要。尝试将 JavaScript 直接嵌入到这些标记中(如下例所示)会导致意外行为:<script src="myFile.js"> alert("...
    编程 发布于2024-11-08
  • 属性 Hooks 无 PHP
    属性 Hooks 无 PHP
    11 月,我们将推出我们心爱的 PHP 8.4 版本,随之而来的是社区期待已久的新功能:属性挂钩!受到 C#、Swift 和 Kotlin 等其他语言的启发,这个新功能消除了魔法方法 __set() 和 __get() 的麻烦。 我将展示一个示例,说明当前如何拥有 getter 和 setter,而...
    编程 发布于2024-11-08
  • 如何在不阻塞服务器和客户端的情况下实时读取和回显服务器当前正在写入的上传文件大小?
    如何在不阻塞服务器和客户端的情况下实时读取和回显服务器当前正在写入的上传文件大小?
    如何在不阻塞服务器和客户端的情况下,实时读取和打印正在服务器端写入的上传文件的大小?让我们展开来讨论这个问题:为了实时获取文件上传的进度,我们在 POST 请求中通过 fetch() 从 Blob、File、TypedArray 或 ArrayBuffer 对象设置了 body 对象。目前的实现将 ...
    编程 发布于2024-11-08
  • 如何在 Python 中确定闰年:综合指南
    如何在 Python 中确定闰年:综合指南
    使用 Python 计算闰年确定某一年是否为闰年涉及可以通过编程方式评估的特定标准。闰年可以被四整除,但能被一百但不能被四百整除的年份除外。解决此问题的一个潜在方法是实现一个自定义函数来检查闰年。但是,当尝试使用此类函数时,您可能会遇到模块返回 None 而不是所需输出的问题。更强大、更全面的解决方...
    编程 发布于2024-11-08
  • 如何在 PHP 中使用正则表达式提取以字符为界的子字符串?
    如何在 PHP 中使用正则表达式提取以字符为界的子字符串?
    在 PHP 中提取由字符限制的子字符串从字符串中提取由特定字符限制的短语是一项常见的编程任务。 PHP 通过正则表达式为此提供了方便的解决方案。考虑以下字符串:$String = "[modid=256]";提取之间的部分等号(=)和右方括号(]),可以使用以下代码:$input...
    编程 发布于2024-11-08
  • YAML 到 JSON 转换:综合指南
    YAML 到 JSON 转换:综合指南
    YAML 和 JSON 是两种流行的数据序列化格式,每种格式都有独特的优势。了解如何在它们之间进行转换对于跨不同平台和系统工作的开发人员很有用。在本指南中,我们将探讨 YAML 和 JSON 之间的主要区别、为什么您可能需要在它们之间进行转换,并提供执行转换的实用步骤和工具。 YAML 和 JSO...
    编程 发布于2024-11-08
  • 如何查找 PHP 数组中最高值的索引?
    如何查找 PHP 数组中最高值的索引?
    确定数组中最大值的索引使用数组时,确定具有最大值的元素的索引为一项共同的任务。让我们探讨一下这个问题的解决方案。问题描述:给定一个数组,检索数组中存在的最高值的索引。例如,如果数组为:[11 =&gt; 14, 10 =&gt; 9, 12 =&gt; 7, 13 =&...
    编程 发布于2024-11-08
  • 引入灵活且与框架无关的 Laravel Livewire Modal 包
    引入灵活且与框架无关的 Laravel Livewire Modal 包
    引入灵活的 Laravel Livewire 模态包 Laravel 和 Livewire 彻底改变了我们用最少的 JavaScript 构建动态应用程序的方式。但在处理模态时,大多数解决方案往往将我们锁定在特定的设计框架中,例如 Bootstrap 或 Tailwind CSS。...
    编程 发布于2024-11-08
  • Laravel 可邮寄教程
    Laravel 可邮寄教程
    在 Laravel 中发送电子邮件需要三个组件之间的协作:Laravel 邮件程序、Laravel 可邮件类和 Mail 外观。这三者中的每一个都涉及发送电子邮件生命周期的不同方面。 Mailers 是连接电子邮件发送服务(如 AWS SES、Sendgrid、Mailgun 等)的驱动程序,应用...
    编程 发布于2024-11-08
  • 如何在 Python 多处理应用程序中实现稳健的日志记录?
    如何在 Python 多处理应用程序中实现稳健的日志记录?
    Python 中的多处理日志记录:一个强大的解决方案当使用 Python 的多处理模块时,由于缺乏进程,日志记录变得更加复杂 -多处理感知记录器的共享锁,可能会导致 sys.stderr 输出混乱。为了解决这一挑战,另一种方法是创建一个自定义日志处理程序,通过管道将输出定向到父进程。此方法依赖队列来...
    编程 发布于2024-11-08
  • Go 的构建系统可以处理“go build”之外的自定义步骤吗?
    Go 的构建系统可以处理“go build”之外的自定义步骤吗?
    通过自定义步骤利用 Go 的构建系统在软件开发中,当基本命令出现时,可能会出现扩展构建系统功能的需求证明不足。这个问题探讨了Go的构建工具是否允许与go build一起执行额外的步骤。pkg-config和自定义标志虽然可以传递额外的标志要使用 pkg-config 构建工具,此方法仅限于与特定库关...
    编程 发布于2024-11-08
  • 如何验证MySQL DELETE操作是否成功?
    如何验证MySQL DELETE操作是否成功?
    如何验证 MySQL DELETE 操作是否成功使用 MySQL 执行 DELETE 查询时,确定操作是否成功至关重要成功的。这在根据条件删除特定记录时尤其重要。mysql_query() 方法:对于使用 mysql_query() 的传统 MySQL 交互,成功的 DELETE 操作将返回布尔值:...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3