You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot:为多版本接口配置不同缓存的Bean解决方案

解决方案

你的核心需求是让两个API端点分别使用不同缓存实现的PersonService实例,原代码的问题在于只定义了一个PersonService Bean,无法同时关联两种缓存。

为什么@Conditional不适用?

@Conditional的作用是根据条件决定是否创建某个Bean(比如基于配置、环境变量等),它无法让同一个类型的多个Bean同时存在并分别被调用。你的场景需要两个PersonService实例同时生效,因此@Conditional不是合适的选择。

最佳实现方案:创建多个限定的Bean

我们可以通过给Bean添加限定符(@Qualifier),创建两个不同的PersonService实例,分别绑定MemoryCache和RedisCache,再在Controller中分别注入使用。

修改后的AppConfig.java

// AppConfig.java
@Configuration
public class AppConfig {
    // 绑定MemoryCache的PersonService
    @Bean("memoryCachePersonService")
    public PersonService memoryCachePersonService(@Qualifier("memory") ICache cache) {
        return new PersonServiceImpl(cache);
    }

    // 绑定RedisCache的PersonService
    @Bean("redisCachePersonService")
    public PersonService redisCachePersonService(@Qualifier("redis") ICache cache) {
        return new PersonServiceImpl(cache);
    }

    // 给MemoryCache Bean命名为"memory"
    @Bean("memory")
    public ICache memoryCache() {
        return new MemoryCache();
    }

    // 给RedisCache Bean命名为"redis"
    @Bean("redis")
    public ICache redisCache() {
        return new RedisCache();
    }
}

修改后的PersonController.java

// PersonController.java
@RestController
public class PersonController { 
    // 注入使用MemoryCache的PersonService
    @Autowired
    @Qualifier("memoryCachePersonService")
    private PersonService memoryCachePersonService; 

    // 注入使用RedisCache的PersonService
    @Autowired
    @Qualifier("redisCachePersonService")
    private PersonService redisCachePersonService; 
      
    @GetMapping("/api/v1/person") 
    public List<PersonV1> getAllV1(){ 
      return memoryCachePersonService.getAllV1(); 
    } 
    
    @GetMapping("/api/v2/person") 
    public List<PersonV2> getAllV2(){ 
      return redisCachePersonService.getAllV2(); 
    } 
}

方案说明

  1. 给两个ICache Bean指定明确的名称(memory和redis),方便后续注入时区分。
  2. 创建两个PersonService Bean,通过@Qualifier指定依赖的ICache实例,并给每个PersonService Bean命名。
  3. 在Controller中,通过@Qualifier指定要注入的PersonService实例,让两个端点分别调用对应的服务。

这种方式清晰直观,完全符合Spring的依赖注入规范,能稳定实现你的需求。


内容的提问来源于stack exchange,提问作者Jonathan Prates

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 17:56:00