我正在使用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
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;
}
我在那里没有看到真正的用途
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。