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

Java 在Spring中向单个服务注入多个实现,java,spring,struts2,Java,Spring,Struts2,我有一个名为DataSource的服务接口和一个以上的实现,如XMLDataSource、DataBaseDataSource等 我想基于一些用户交互将(Spring)适当的实现注入到我的Struts2操作中,比如如果用户单击XML,那么我需要使用XML实现。Spring已经用于DI框架 @Autowired private DataSource dataSource; 请建议实现这一目标的最佳方式 @Autowired @Qualifier("legacyDataSource") priva

我有一个名为DataSource的服务接口和一个以上的实现,如XMLDataSourceDataBaseDataSource

我想基于一些用户交互将(Spring)适当的实现注入到我的Struts2操作中,比如如果用户单击XML,那么我需要使用XML实现。Spring已经用于DI框架

@Autowired
private DataSource dataSource;
请建议实现这一目标的最佳方式

@Autowired
@Qualifier("legacyDataSource")
private DataSource dataSource;
@限定符
包含bean的名称

或者使用实现进行注入

@Autowired
    private  XMLDataSource xMLDataSource ;

@Autowired
    private DataBaseDataSource dataBaseDataSource ;

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

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

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

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

当您自动关联所需接口的
列表时,Spring将自动使用每个实现的实例填充该列表

@Autowired
private List<DataSource> dataSources;
@Autowired
私有列表数据源;
这取决于您,然后根据用户交互选择正确的界面

如果需要根据bean名称进行区分,还可以选择自动关联根据bean名称索引的数据源对象的字典

@Autowired
private Map<String, DataSource> dataSourceIndex;
@Autowired
私有地图数据源索引;

这可以从Spring的2.5版本中获得,您可以在这里找到

注意,您可以将
DateSource
的所有实现作为
@Autowired List数据源注入您所说的“用户选择使用哪一个”是什么意思?请详细说明。作为私有数据源xMLDataSource和私有数据源dataBaseDataSource,这会更好吗?(通过公共接口访问服务)当然,为了获得更大的灵活性,我们必须使用接口而不是实现。在这种情况下,唯一的方法是使用@Qualifier注释。您可以使用类似这样的
@Autowired Map
@Autowired List
在spring上下文中输入所有数据源。但由于某些原因,您不需要注入所有数据源(在您的项目中可能只有10个数据源中的4个)。它是基于SpringBeans xml的,但展示了如何定义多个具体对象并按键字符串名称选择一个。