我有一个名为DataSource的服务接口和超过 1 个实现,如XMLDataSource、DataBaseDataSource等。
我想基于一些用户交互向我的 Struts2 Action 注入(Spring)适当的实现,比如如果用户点击 XML,那么我需要使用 XML 实现。Spring 已用于 DI 框架。
@Autowired
private DataSource dataSource;
请建议实现这一目标的最佳方法。
如果需要在运行时根据用户交互选择实现,则必须自动装配DataSource
接口的所有可能实现。
当您自动装配List
所需接口的 a 时,Spring 将使用每个实现的实例自动填充列表。
@Autowired
private List<DataSource> dataSources;
这取决于您,然后根据用户交互选择正确的界面。
如果您需要根据 bean 名称进行区分,您还可以选择自动装配以 bean 名称为索引的 DataSource 对象的字典。
@Autowired
private Map<String, DataSource> dataSourceIndex;
这可从 Spring 的 2.5 版本中获得,您可以在此处找到autowire 文档
使用@Autowired
按类型自动装配的注释时,您应该切换到按名称自动装配,这可以使用@Qualifier
注释来完成
@Autowired
@Qualifier("yourDataSource")
private DataSource dataSource;
最简单的方法是注入所有可能的实现,然后在用户单击我认为的选项时选择要使用的实现。
@Autowired
@Qualifier("legacyDataSource")
private DataSource dataSource;
@Qualifier
包含 bean 的名称
或使用实现注入
@Autowired
private XMLDataSource xMLDataSource ;
@Autowired
private DataBaseDataSource dataBaseDataSource ;