首页 > 解决方案 > Spring:如何仅在 Web 应用程序中调用方法?

问题描述

我有一个名为“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 服务器中调用?

标签: javaspringspring-boot

解决方案


它必须是允许 AOP 启动的公共方法

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

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

@Autowired
private BeanContainingThatMethod self;

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

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


推荐阅读