SpringBoot依赖注入标注@Primary后如何获取同接口其他实现类实例
问题解答
Spring 框架本身没有内置 @Secondary 这类注解,你可以通过以下两种常用方案实现「优先查缓存、未命中再查 MongoDB」的逻辑:
方案1:在CacheRepo中直接注入MongoDBRepo(更推荐)
这种方式把缓存降级的逻辑封装在仓库层内部,业务侧无需感知底层调用逻辑,符合单一职责原则。
修正后的CacheRepo代码示例:@Primary @Component public class CacheRepo implements Repository { // 直接注入MongoDBRepo实例,或者也可以通过@Qualifier指定bean名称注入Repository类型实例 private final MongoDBRepo mongoDBRepo; // Spring会自动装配MongoDBRepo实例 public CacheRepo(MongoDBRepo mongoDBRepo) { this.mongoDBRepo = mongoDBRepo; } // 示例查询方法 public Data queryById(String dataId) { // 第一步:查询缓存 Data cacheResult = getFromCache(dataId); if (cacheResult != null) { return cacheResult; } // 第二步:缓存未命中,查询MongoDB Data dbResult = mongoDBRepo.queryById(dataId); // 可选逻辑:将DB查询结果回写缓存 writeToCache(dataId, dbResult); return dbResult; } // 缓存读写方法省略实现 private Data getFromCache(String dataId) {} private void writeToCache(String dataId, Data data) {} }方案2:在业务服务中同时注入两个Repository实例
如果你希望把路由逻辑放在业务层控制,可以通过@Qualifier注解指定注入的bean名称,来获取MongoDBRepo的实例:
业务服务代码示例:@Service public class BusinessService { // CacheRepo加了@Primary,默认注入的是CacheRepo实例 private final Repository cacheRepo; // 通过@Qualifier指定bean名称注入MongoDBRepo,Spring默认bean命名规则是类名首字母小写,即mongoDBRepo private final Repository mongoRepo; public BusinessService(Repository cacheRepo, @Qualifier("mongoDBRepo") Repository mongoRepo) { this.cacheRepo = cacheRepo; this.mongoRepo = mongoRepo; } public Data doBusinessQuery(String dataId) { Data result = cacheRepo.queryById(dataId); if (result == null) { result = mongoRepo.queryById(dataId); } return result; } }
内容的提问来源于stack exchange,提问作者Drex
相关产品推荐
相关产品推荐

