我有一个名为 DataSource 的服务接口和一个以上的实现,如 XMLDataSource , DataBaseDataSource 等。
我想基于一些用户交互向我的Struts2 Action注入(Spring)适当的实现,比如用户点击XML然后我需要使用XML实现。 Spring已被用于DI框架。
@Autowired
private DataSource dataSource;
请说明实现这一目标的最佳方法。
答案 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 ;