飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • UEditor使用文档
  • AngularJS教程
  • ThinkPHP5.0教程

同一项目中的多个 Spring Boot 应用程序

时间:2021-12-08  作者:匿名  

我经常在我的演示中使用 Spring Boot 框架。最新一期展示了如何使用包括 Spring Data JPA 和 jOOQ 在内的两种不同的代码路径来实现 CQRS

我的用例是一个银行应用程序,它提供了一个 REST 层,允许客户端调用任何部分。演示查询部分很容易,curl因为 URL 并不复杂:

curl localhost:8080/balance/123          // 1

1、查询账户余额 123

另一方面,创建一个新的操作,例如信用,需要将数据传递给curl。虽然这样做是可行的,但有效载荷的结构本身很复杂,因为它是 JSON 的一部分。因此,curl在现场观众面前演示命令部分是有风险的。我倾向于避免不必要的风险,所以我考虑了一些替代方案。

我的第一个想法是提前准备命令,在演示期间复制粘贴。我想进行几个不同的操作,所以我必须:

要么准备一个命令,在运行它之前粘贴它并更改它

或者准备所有不同的命令

对我来说,两者都太尴尬了。

另一种选择是@SpringBootApplication在同一个项目中创建另一个带注释的类:

@SpringBootApplication
public class GeneratorApplication {

    @Bean
    public CommandLineRunner run() {
        var template = new RestTemplate();
        return args -> {
            var operation = generateRandomOperation();            // 1
            域名e(0, 域名eLong(args[0]))          // 2
                .forEach(
                    operation -> 域名ForObject(          // 3
                        "http://localhost:8080/operation",
                        operation,
                        域名s));
        };
    }

    public static void main(String[] args) {
        new SpringApplicationBuilder(域名s)
                .run(args);
    }
}

Operation以某种方式生成随机

从参数中获取调用次数

调用主 Web 应用程序的 URL

当我在另一个 Web 应用程序之后启动此应用程序时,它失败了。有两个原因:

两个应用程序共享相同的 Maven POM。由于 位于spring-boot-starter-web类路径上,因此生成器应用程序会尝试启动 Tomcat。它失败是因为第一个应用程序确实绑定了默认端口。

Spring Boot 默认依赖组件扫描。因此,Web 应用程序扫描生成器应用程序及其声明的 bean 并创建它们。可以通过这种方式重新定义一些 bean。但是,Web 应用程序也会创建CommandLineRunner上面的bean。因此,当它的服务器还没有准备好时,它“向自己发布”。

最直接的解决方案是将每个应用程序的类移动到它们自己专用的 Maven 模块中。您需要在每个模块中创建一个 POM,其中只包含必要的依赖项。另外,我需要在 web 应用程序的运行程序中使用几个类。虽然我可以在另一个模块中复制它们,但这是额外的工作和复杂性。

为了防止类路径扫描,我们将每个应用程序类移动到它的包中。请注意,当包具有父子关系时它不起作用:它们必须是兄弟姐妹。

要创建特定类的 bean,我们需要根据它们的性质依赖特定的注释:

对于 JPA 实体,@EntityScan, 指向要扫描的包

对于 JPA 存储库,@EnableJpaRepositories, 指向要扫描的包

对于其他类,@Import指向要从中生成 bean 的类

最后一步是防止生成器应用程序启动网络服务器。您可以在启动应用程序时对其进行配置。

@SpringBootApplication
@EnableJpaRepositories("域名")                      // 1
@EntityScan("域名")                                 // 2
public class GeneratorApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(域名s)
                .web(域名)                     // 3
                .run(args);
    }

    // Command-line runner
}

扫描 JPA 存储库

扫描 JPA 实体

阻止网络服务器启动

它按预期工作,我们终于可以从设置中获益。

对于实际应用程序,您可能会创建一个自执行 JAR。您需要开发一种在构建期间配置主类的方法,每个应用程序一个。我认为最好不要这样做,并将其作为演示 hack。

湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。