Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用spring为同一接口动态注入不同的实现_Java_Spring - Fatal编程技术网

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,我相信还有很多其他方法。