在Spring中向单个服务注入多个实现

时间:2013-09-26 11:18:42

标签: java spring struts2

我有一个名为 DataSource 的服务接口和一个以上的实现,如 XMLDataSource DataBaseDataSource 等。

我想基于一些用户交互向我的Struts2 Action注入(Spring)适当的实现,比如用户点击XML然后我需要使用XML实现。 Spring已被用于DI框架。

@Autowired
private DataSource dataSource;

请说明实现这一目标的最佳方法。

4 个答案:

答案 0 :(得分:11)

如果您需要在运行时根据用户交互选择实现,则必须自动装配DataSource接口的所有可能实现。

当您自动装配所需接口的List时,Spring会自动使用每个实现的实例填充列表。

@Autowired
private List<DataSource> dataSources;

由您决定,然后根据用户交互选择正确的界面。

如果需要根据bean名称进行区分,还可以选择自动装配在bean名称上索引的DataSource对象的字典。

@Autowired
private Map<String, DataSource> dataSourceIndex;

这可以从Spring的2.5版本获得,你可以在这里找到autowire documentation

答案 1 :(得分:4)

当使用@Autowired注释按类型自动装配时,您应该按名称切换到自动装配,这可以使用@Qualifier注释

来完成
@Autowired
@Qualifier("yourDataSource")
private DataSource dataSource;

答案 2 :(得分:2)

最简单的方法是注入所有可能的实现,然后在用户点击我认为的选项时选择使用哪个实现。

答案 3 :(得分:0)

@Autowired
@Qualifier("legacyDataSource")
private DataSource dataSource;

@Qualifier包含bean的名称

或使用实施注入

@Autowired
    private  XMLDataSource xMLDataSource ;

@Autowired
    private DataBaseDataSource dataBaseDataSource ;