Intellij Idea和Spring Boot:如何仅重新启动我的Java代码的一部分



我有一个复杂的Java Spring启动项目,其中一个类MyClass具有一个静态属性,需要从数据库加载30秒。MyClass注释为@SpringBootApplication,方法

@Bean
public CommandLineRunner demo() {...
启动应用程序时执行

在开发过程中,当我要调试/纠正需要MyClass静态属性的项目的其他部分时,我想避免这30秒。

我想在Intellij Idea中获利compiler.automake.allow.when.app.running注册表设置,以便通过热交换再次加载更改的类。

我如何避免每次更改其他类别的地方时一次又一次地执行MyClass(分别重新启动整个项目)?

您可以使用@RefreshScope

的豆子以春季的方式进行相同的操作

创建一个单独的类,其中静态变量加载值并不保持静态。

@Componen
@RefreshScope
public class MyClass {
    private String myRefreshableObject;
    @PostConstruct
    public void init() {
        // set the values of myRefreshableObject
    }
    public void getMyRefreshableObject() {
     return this.myRefreshableObject;
    }
}

现在,每当您想重新加载bean时,您都会扔一个POST请求执行器端点refresh如下所示。

curl -d{} http://localhost:8080/refresh

此处需要春季启动依赖项之后

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

Spring引导包含" DevTools"的内容。 - 您可以放在classPath中的罐子。

它在开发过程中做了几件事并在生产中被禁用。其漂亮的功能之一是自动重新启动。您可以在此处阅读有关它的信息(请参阅第20.2节涵盖这些重新启动功能)。

至少值得知道此选项存在:)

我不知道此注册表设置,我必须承认。

但是,看起来您重新启动了应用程序,并且不希望重型类会一次又一次加载。

好吧,如果您已经使用了热量 - 您实际上不需要重新启动应用程序 - 只要更改代码,并且只要不更改方法签名或类定义(换句话说,只有更改允许使用这些方法) - 您会没事的 - 并且应用程序将不会重新启动。

它的JVM功能,Spring或Intellij与此无关。

现在,如果您仍然想在更改后重新加载(读取,重新启动过程),并且不想加载重型弹簧豆,则有特定于春季的解决方案。我将提到其中2个:

  1. 使用@Lazy bean,以便Spring不会加载Bean,除非您真的需要它来运行代码。从您的解释中,听起来可以有所帮助,因为您无论如何都不需要这个豆

  2. 提供一些模拟/内存实现,并使用配置文件(如果您在春季4.x上) - 根据环境,应实际加载bean的想法。因此,对于在"开发"环境中运行,可以加载bean的"轻重量"实现,并且可以将真正的bean加载到生产环境中。

最新更新