我有一个复杂的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个:
-
使用
@Lazy
bean,以便Spring不会加载Bean,除非您真的需要它来运行代码。从您的解释中,听起来可以有所帮助,因为您无论如何都不需要这个豆 -
提供一些模拟/内存实现,并使用配置文件(如果您在春季4.x上) - 根据环境,应实际加载bean的想法。因此,对于在"开发"环境中运行,可以加载bean的"轻重量"实现,并且可以将真正的bean加载到生产环境中。