gpt4 book ai didi

java - Spring在配置中指定实现

转载 作者:行者123 更新时间:2023-11-30 05:23:41 25 4
gpt4 key购买 nike

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

我的想法是

  • 在每个存储实现上添加 @Qualifier 注解
  • 创建两个配置,例如databaseStorageConfiguration和InMemoryStorageConfiguration
  • 取决于配置文件,应用第一个或第二个配置

问题是我不知道如何绑定(bind)实现和配置。

我尝试过这样的事情:


@Configuration
public class InMemoryStorageConfig {

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

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

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

更新 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

最佳答案

您的 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;
}
}

并且需要使用@Qualifier注释来注释您的InMemoryWidgetCacheDatabaseWidgetCache。因为您使用的是默认约定。

请删除

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

我看不出那里有真正的用途

关于java - Spring在配置中指定实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59084645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com