Java 在Spring中向单个服务注入多个实现
我有一个名为DataSource的服务接口和一个以上的实现,如XMLDataSource、DataBaseDataSource等 我想基于一些用户交互将(Spring)适当的实现注入到我的Struts2操作中,比如如果用户单击XML,那么我需要使用XML实现。Spring已经用于DI框架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
@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的,但展示了如何定义多个具体对象并按键字符串名称选择一个。