当前位置: 首页 > 知识库问答 >
问题:

如何在到达 /actuator/refreshendpoint后在运行时重新加载Spring bean?

文英达
2023-03-14

我试图在SpringBoot2.2.7版本的bean级别上,借助@RefreshScope注释,使用执行器刷新endpoint来重新加载SpringBean。

但是我的HelloWorld bean并没有通过点击刷新endpoint来刷新。谁能帮帮我吗?

我的主课:

@SpringBootApplication
public class SampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(SampleApplication.class, args);
    }

}

HelloWorld:

public class HelloWorld {
    private String message;

       public void setMessage(String message){
          this.message  = message;
       }
       public void getMessage(){
          System.out.println("Your Message : " + message);
       }
    
}

应用配置

@Configuration
public class ApplicationConfiguration {
    @Bean
    @RefreshScope
    public HelloWorld helloWorld() {
        System.out.println("From HelloWorld");
        return new HelloWorld();
    }
}

application.properties:

management.endpoints.web.exposure.include=*

共有1个答案

万俟高峻
2023-03-14

使用RefreshScope注释的bean不会立即重新创建。只有在调用其中一个方法时,才会重新创建它们。即使在第一次创建应用程序时也是如此。这些bean在第一次使用时“缓慢”初始化。

如果您希望在调用“执行器/刷新”时打印“来自Hello World”,那么这不会立即发生。至少在您的HelloWorld bean上调用其中一个方法之前,这是不会发生的。

我之所以说“至少”是因为Spring通过注释将新属性重新注入到bean中。我不知道为什么会这样想,但我有一种感觉,即使在对HelloWorld bean进行方法调用时,它也不会被重建,因为它没有值注释。Spring可能会认为,因为它没有这些,所以bean中实际上不会发生任何变化,因此它不会被重建。不过我不确定。

为了验证这一点,设置一些可以在应用程序正常执行期间使用HelloWorld的东西。然后,在刷新之后,您应该看到它重建并在访问时打印“来自Hello World”。如果没有发生这种情况,请尝试向其中注入一个带有值的属性值,然后重试。

 类似资料:
  • 问题内容: 我试图在运行时将jar文件添加到classpath。我用这个代码 系统输出打印此URL: 我正在仔细检查此路径,此jar存在。即使这个测试也显示com.mysql.jdbc。驱动程序类存在。 但是,当我使用此Class.forName(driver)时,仍然会收到java.lang.ClassNotFoundException。此代码有什么问题? 问题答案: URL可以,但是您仍然尝试

  • 问题内容: 这肯定是一个普遍的问题…而且我觉得在使用Google搜索和SOing之后,我肯定只是没有彻底地环顾四周以获得足够的答案,或者没有人问过这个问题…所以请原谅我。 我正在使用Spring Security和Hibernate等 因此,用户/主要用户已登录并对其个人资料进行了一些更改。 我使用DAO更新配置文件(UserDetails),并且希望我的Principal自动反映此更新。 但是,

  • 我有一个spring-boot项目,我设法配置外部配置,它将在外部servlet容器和嵌入式servlet容器下工作(您可以在这里看到详细信息:spring-boot应用程序的外部配置),现在我想让这个配置在运行时可以重新加载。知道吗?

  • 我在我的应用程序中使用导航栏,每次我选择一个项目时,它都会加载一个片段。 我能够使用相同的文本字段和按钮保存片段的状态,但有一个片段可以加载地图、添加标记、集群并执行。 每次我转到另一个菜单项并返回时,它都会重新加载所有内容,例如AsyncTask、Cluster、Markers。我如何停止此片段以不再重新创建地图并在返回时保存状态: Udate 1:我更新了代码,但问题仍然存在 主要活动: 主片

  • 问题内容: 我被要求构建一个Java系统,该系统在运行时能够加载新代码(扩展)。我的代码运行时如何重新加载jar文件?或如何加载新的jar? 显然,由于持续的正常运行时间很重要,因此,我想增加在此过程中重新加载现有类的功能(如果这样做不会使事情复杂化)。 我应该注意什么?(将其视为两个不同的问题-一个关于在运行时重新加载类,另一个关于添加新类)。 问题答案: 用现有数据重新加载现有类可能会破坏事情

  • 我用的是ChromeDriver。这是我用来设置超时的代码。 这是连接到URL的代码。 这段代码位于一个for循环中,该循环迭代URL字符串列表。一旦“skip”设置为真,它对该网页不做任何操作,并在循环的下一次迭代中连接到下一个URL。 我想做的是,当一个网页挂起(卡在无限负载中)时,我想捕获TimeoutException,跳过该网页并连接到循环中的下一个URL。 但一旦捕获到TimeoutE