java - Spring:如何仅在Web应用程序中调用方法?

标签 java spring spring-boot

我有一个名为“CacheService”的模块,它执行一些缓存工作,它有一个名为“preheatCache”的方法,该方法在启动时构建缓存内容。 Web 应用程序服务器和任务应用程序服务器都引用的“CacheService”。 Web服务器和任务服务独立启动,当任务服务器启动时,我不希望执行“preheatCache”。我怎样才能实现这个?

CacheService中启动服务器时自动调用preheatCache的代码:

@EventListener(ContextRefreshedEvent.class)
  public void afterStartup() {
    preheatCache();
  }

private preheatCache(){
    // build cache content
}

该事件在 Web 服务器和任务服务器中均触发。

我像这样尝试了@ConditionalOnWebApplication

@ConditionalOnWebApplication
private preheatCache(){
 // build cache content
}

但是好像不行

是否有一些注释或Spring的机制作用于一个方法,使该方法只在Web服务器中调用?

最佳答案

它必须是一个公共(public)方法才能允许 AOP 启动

@ConditionalOnWebApplication
public void preheatCache(){
 // build cache content
}

并且不能从 bean 本身调用 - 因此您必须自行注入(inject)该 bean 并使用注入(inject)进行调用

@Autowired
private BeanContainingThatMethod self;

    @EventListener(ContextRefreshedEvent.class)
      public void afterStartup() {
        self.preheatCache();
      }

如果我是你,我会为此创建专用的 bean(除非就是这个)并注释整个 bean。这样,仅当存在 Web 上下文时才会创建和管理整个 bean,否则将跳过创建。

关于java - Spring:如何仅在Web应用程序中调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59190411/

相关文章:

java - 创建随机数组以便对排序算法进行计时

spring - MongoDB GridFS 身份验证不起作用

spring - Docker gradlew构建因HibernateException而失败

java - Spring Security @PreAuthorize 或 @PreFilter

java - 如何在 java 中运行时更改 selenium webdriver 中的默认下载

java - 加载失败,请确认其已声明

java - 使用 spring StoredProcedure 将参数输出为 Integer

java.sql.SQLException : Access denied for user 'root' @'localhost' (using password: YES) in spring using mysql

spring-boot - 如何在应用程序运行之前在 SpringBootTest 中执行代码?

java - RecyclerViewAdapter 中的空指针异常