如何有选择地使一个类成为应该在 Spring (Spring Boot 2.x) 中运行的代码

Posted

技术标签:

【中文标题】如何有选择地使一个类成为应该在 Spring (Spring Boot 2.x) 中运行的代码【英文标题】:How to selectively make one class to be the code that should be run in Spring (Spring Boot 2.x) 【发布时间】:2019-04-27 12:27:28 【问题描述】:

在我们的 Spring Boot 2.x 项目中,我们有几个使用 @Component 符号注释的类 - 但我们希望在运行时仅选择其中一个类。

为了进一步详细说明,我们创建了一个 Uber Jar - 它将在多台机器上运行 - 但每个 jar 应该运行不同的逻辑,并且该逻辑由此类中的一个决定。

在 Spring boot 2.x 中实现这一目标的最简洁方法是什么?我阅读了一些关于配置文件等的内容。非常感谢任何更清洁的解决方案。

【问题讨论】:

How do I tell Spring Boot which main class to use for the executable jar?的可能重复 也许您正在寻找:docs.spring.io/spring-boot/docs/current/maven-plugin/usage.html,然后是 docs.spring.io/spring-boot/docs/current/reference/html/…,后者查看启动器清单以及它在 PropertiesLauncher 中的使用方式一旦您选择了该启动器,您就可以直接通过 loader.main 属性指定要运行的 Main 类。 【参考方案1】:

使用 Spring Boot Maven 插件,并将其配置为使用 PropertiesLauncher,然后通过命令行设置 loader.main。或者,您可以通过命令行指定整个内容。假设您使用 Maven(或 Gradle)Spring Boot 插件来构建 jar/war 文件:

java -cp bootApp.jar -Dloader.main=org.your.package.DemoApplication org.springframework.boot.loader.PropertiesLauncher

【讨论】:

【参考方案2】:

您可以将这些 @Component 类分组和移动到多个 @Configuration 类中。在这种情况下,您必须手动将它们声明为@Beans(方法)。您将定义与机器数量一样多的 @Configuration 类。

此外,您可以通过Spring Profiles 启用或禁用配置类。使用 spring.profiles.active 系统属性 (-Dspring.profiles.active=profile1,profile2) 启用配置文件。

如果你想让它干净,那么你必须以“依赖倒置原则”的方式来做:你应该为你的@Components 定义接口,每个@Configuration 都会声明一个具体类型的@Beans。这样你就可以在不知道具体实现的情况下使用@Autowired依赖注入。

【讨论】:

以上是关于如何有选择地使一个类成为应该在 Spring (Spring Boot 2.x) 中运行的代码的主要内容,如果未能解决你的问题,请参考以下文章

如何使 UITableView 成为透明的?

使用 spring data neo4j 3 使 Cypher 查询成为动态的一部分

如何使大量现有函数在一个类的范围内可用?

如何使我的 C++ 类事件系统成为仅限于类型数组的模板类?

使用 Squeryl(使用 Lift),如何使两个模型类成为同一类的子类?

如何使 Grails Spring Security 2.0 中的登录/页面成为初始屏幕?