Java 如何使用spring为同一接口动态注入不同的实现
对于这个接口,我有一个接口和两个实现 接口定义:Java 如何使用spring为同一接口动态注入不同的实现,java,spring,Java,Spring,对于这个接口,我有一个接口和两个实现 接口定义: public interface DoSomething {} 两种实现方式: public ImplementationOne implements DoSomething{} public ImplementationTwo implements DoSomething{} 然后在另一个类中,我想根据条件获得不同的实现(实现一或实现二),如何使用Spring实现 类似于 Public ServiceManager { Private Do
public interface DoSomething {}
两种实现方式:
public ImplementationOne implements DoSomething{}
public ImplementationTwo implements DoSomething{}
然后在另一个类中,我想根据条件获得不同的实现(实现一或实现二),如何使用Spring实现
类似于
Public ServiceManager {
Private DoSomething doSomething = null;
Public void do() {
If (condition1) {
doSomething = new ImplementationOne();
} else {
doSomething = new ImplementationTwo();
}
}
}
您肯定应该使用@Autowire注释自动连接ApplicationContext类型。如果你是这样做的:
@Autowire
ApplicationContext context
context.getBean(yourDesiredType.class)
然后,您应该得到如下所示的所需bean:
@Autowire
ApplicationContext context
context.getBean(yourDesiredType.class)
这样,根据您的示例,您可以获得任何要置于任何匹配类型下的bean。您肯定应该使用@Autowire annotation自动连接应用程序上下文类型。如果你是这样做的:
@Autowire
ApplicationContext context
context.getBean(yourDesiredType.class)
然后,您应该得到如下所示的所需bean:
@Autowire
ApplicationContext context
context.getBean(yourDesiredType.class)
你可以根据你的例子得到任何匹配类型的bean。
< P>另一个要考虑的选项是配置bean,例如:@Configuration
public class EntityRepositoryConfiguration {
private Map<Entity, EntityRepository> entityEntityRepositoryMap = new HashMap<>();
protected EntityRepositoryConfiguration() {
entityEntityRepositoryMap.put(Entity.Book, new BookRepository());
}
@Bean
public EntityRepository getByEntityType(Entity entity) {
return entityEntityRepositoryMap.get(entity);
}
}
@配置
公共类EntityRepositoryConfiguration{
私有映射entityEntityRepositoryMap=新HashMap();
受保护的EntityRepositoryConfiguration(){
entityEntityRepositoryMap.put(Entity.Book,newBookRepository());
}
@豆子
公共实体报告getByEntityType(实体){
返回entityEntityRepositoryMap.get(实体);
}
}
然后将配置bean注入到您的其他bean中,并使用GETEnTyType方法(例如)注入bean。
@Configuration
public class EntityRepositoryConfiguration {
private Map<Entity, EntityRepository> entityEntityRepositoryMap = new HashMap<>();
protected EntityRepositoryConfiguration() {
entityEntityRepositoryMap.put(Entity.Book, new BookRepository());
}
@Bean
public EntityRepository getByEntityType(Entity entity) {
return entityEntityRepositoryMap.get(entity);
}
}
@配置
公共类EntityRepositoryConfiguration{
私有映射entityEntityRepositoryMap=新HashMap();
受保护的EntityRepositoryConfiguration(){
entityEntityRepositoryMap.put(Entity.Book,newBookRepository());
}
@豆子
公共实体报告getByEntityType(实体){
返回entityEntityRepositoryMap.get(实体);
}
}
然后将配置bean注入到其他bean中,并使用getEntityType方法(例如)来注入bean。您能给我们提供一个使用此
DoSomething
的示例吗?您是否在@Autowired
构造函数/字段/设置器中使用它。。。?当使用类已经实例化时,它是否必须更改?您打算如何使用Spring?Xml还是注释配置?我认为最好的选择是获取Spring应用程序上下文的句柄,并通过名称或具体类获取托管bean。这通常取决于你想基于什么样的条件。您可以使用配置文件,您可以使用XML配置中的Spring表达式语言,或者当事情变得复杂时,您可以使用FactoryBean,我相信还有很多其他方法。您能为我们提供一个使用此DoSomething
的示例吗?您是否在@Autowired
构造函数/字段/设置器中使用它。。。?当使用类已经实例化时,它是否必须更改?您打算如何使用Spring?Xml还是注释配置?我认为最好的选择是获取Spring应用程序上下文的句柄,并通过名称或具体类获取托管bean。这通常取决于你想基于什么样的条件。您可以使用概要文件,您可以在XML配置中使用Spring表达式语言,或者在事情变得复杂时使用FactoryBean,我相信还有很多其他方法。