4

我有一个名为DataSource的服务接口和超过 1 个实现,如XMLDataSourceDataBaseDataSource等。

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

@Autowired
private DataSource dataSource;

请建议实现这一目标的最佳方法。

4

4 回答 4

19

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

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

@Autowired
private List<DataSource> dataSources;

这取决于您,然后根据用户交互选择正确的界面。

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

@Autowired
private Map<String, DataSource> dataSourceIndex;

这可从 Spring 的 2.5 版本中获得,您可以在此处找到autowire 文档

于 2013-09-26T11:43:57.580 回答
5

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

@Autowired
@Qualifier("yourDataSource")
private DataSource dataSource;
于 2013-09-26T11:26:51.937 回答
3

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

于 2013-09-26T11:28:42.247 回答
0
@Autowired
@Qualifier("legacyDataSource")
private DataSource dataSource;

@Qualifier包含 bean 的名称

或使用实现注入

@Autowired
    private  XMLDataSource xMLDataSource ;

@Autowired
    private DataBaseDataSource dataBaseDataSource ;
于 2013-09-26T11:25:25.303 回答