开发者社区> 问答> 正文

Spring在配置中指定实现

我正在使用spring mvc / boot编写应用程序,并且我有两个存储实现:数据库存储和内存存储。我的全局想法是在配置文件中选择应该使用什么存储应用程序。

我的主意是

在每个存储实现上放置@Qualifier批注 创建两个配置,例如databaseStorageConfiguration和InMemoryStorageConfiguration 取决于配置文件,应用第一或第二配置 问题是我不知道如何绑定实现和配置。

我尝试过这样的事情:

@Configuration
public class InMemoryStorageConfig {

    @Autowired
    @Qualifier("inMemoryStorage")
    private Storage storage;

    @Bean
    public Storage getStorage() {
        return storage;
    }
}

但我得到一个错误,发现了3个bean:2个具有不同实现的bean和第3个-在配置中

更新1 我已添加@Profile("InMemory")到“配置”并在属性中激活了该配置文件。这没有任何变化,但现在看起来更加合乎逻辑

更新2 完整配置:

@SpringBootApplication
@ImportResource("classpath:spring-config.xml")
public class Application {
    public static void main(String... args) {
        SpringApplication.run(Application.class, args);
    }
}

@Service
public class WidgetService {

    private WidgetCache widgetCache;

    @Autowired
    public WidgetService(WidgetCache widgetCache) {
        this.widgetCache = widgetCache;
    }
....

@Qualifier("databaseWidgetCache")
@Transactional
@Repository
public class DatabaseWidgetCache implements WidgetCache {

    private WidgetRepository widgetRepository;

    @Autowired
    public DatabaseWidgetCache(WidgetRepository widgetRepository) {
        this.widgetRepository = widgetRepository;
    }

@Qualifier("inMemoryWidgetCache")
@Repository
public class InMemoryWidgetCache implements WidgetCache {

    private WidgetLayersStorage widgetLayersStorage;

    @Autowired
    public InMemoryWidgetCache(WidgetLayersStorage widgetLayersStorage) {
        this.widgetLayersStorage = widgetLayersStorage;
    }

@Profile("InMemory")
@Configuration
public class InMemoryStorageConfig {

    @Autowired
    @Qualifier("inMemoryWidgetCache")
    private WidgetCache widgetCache;

    @Bean
    public WidgetCache getWidgetCache() {
        return widgetCache;
    }
}

堆栈跟踪:

Parameter 0 of constructor in
 com.widgets.service.widget.WidgetService required a single
 bean, but 3 were found:
    - inMemoryWidgetCache: defined in file [..../MemoryWidgetCache.class]
    - databaseWidgetCache: defined in file [..../DatabaseWidgetCache.class]
    - getWidgetCache: defined by method 'getWidgetCache' in class path resource
 [......../InMemoryStorageConfig.class]


 Action:

 Consider marking one of the beans as @Primary, updating the consumer
 to accept multiple beans, or using @Qualifier to identify the bean
 that should be consumed

展开
收起
垚tutu 2019-11-28 22:40:26 985 0
1 条回答
写回答
取消 提交回答
  • #include

    1个

    您的WidgetService应该更改为

    @Service
        public class WidgetService {
    
            private WidgetCache widgetCache;
    
            /** or 
            private List<WidgetCache> widgetCaches;
            public WidgetService(List<WidgetCache> widgetCaches) {
                this.widgetCaches = widgetCaches;
            }
            */
            public WidgetService(@Qualifier(<desired impl>) WidgetCache widgetCache) {
                this.widgetCache = widgetCache;
            }
        }
    而需要您
    的```  
    注释InMemoryWidgetCache和DatabaseWidgetCache与@Qualifier注释。因为您使用的是默认约定。
    
    并请删除
    
    ```js
    @Bean
        public WidgetCache getWidgetCache() {
            return widgetCache;
        }
    
    

    我在那里没有看到真正的用途

    2019-11-28 22:49:16
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载