Java Spring 4-Autowire通用接口

Java Spring 4-Autowire通用接口,java,spring,generics,autowired,Java,Spring,Generics,Autowired,从Spring(v4.3.8)开始,我在Spring尝试加载依赖注入时遇到了一个问题 我想根据T(Debit1或Debit2)的类型调用ManagerImpl1.java或ManagerImpl2.java实现的“manage”方法。详情如下: 原因: org.springframework.beans.factory.NoniqueBeandDefinitionException:否 类型的限定bean 'com.xxx.xxx.datacollection.infoprod.Manager'

从Spring(v4.3.8)开始,我在Spring尝试加载依赖注入时遇到了一个问题

我想根据T(Debit1或Debit2)的类型调用ManagerImpl1.java或ManagerImpl2.java实现的“manage”方法。详情如下:

原因: org.springframework.beans.factory.NoniqueBeandDefinitionException:否 类型的限定bean 'com.xxx.xxx.datacollection.infoprod.Manager' 可用:需要单个匹配bean,但找到2个: ManagerImpl1,ManagerImpl2

Business.java:

@Component
public class Business<T extends Debit> {

    @Autowired
    private Manager<T> manager;

    public void treatment(Context<T> context, FindServiceReturnMessage response) {

        manager.manage(response, context);
    }
@组件
公营业务{
@自动连线
私人经理;
公共无效处理(上下文、FindServiceReturnMessage响应){
管理(响应、上下文);
}
Manager.java:

public interface Manager<T extends Debit> {

    void manage(final FindServiceReturnMessage response, Context<T> context);
}
公共接口管理器{
void manage(最终FindServiceReturnMessage响应、上下文);
}
ManagerImpl1.java:

@Component
public class ManagerImpl1 implements Manager<Debit1> {

    @Override
    public void manage(final FindServiceReturnMessage response, Context<Debit1> context) {

    }
}
@组件
公共类ManagerImpl1实现管理器{
@凌驾
公共void管理(最终FindServiceReturnMessage响应、上下文){
}
}
ManagerImpl2.java:

@Component
public class ManagerImpl2 implements Manager<Debit2> {

    @Override
    public void manage(final FindServiceReturnMessage response, Context<Debit2> context) {

    }
}
@组件
公共类管理器RIMPL2实现管理器{
@凌驾
公共void管理(最终FindServiceReturnMessage响应、上下文){
}
}
此外,“Debit1”和“Debit2”实现接口“Debit”


我尝试了几种方法,但没有成功…

您需要在Bean上添加一个限定符,如下所示:

@Component
@Qualifier("managerImpl2")
public class ManagerImpl2 implements Manager<Debit2> {

    @Override
    public void manage(final FindServiceReturnMessage response, Context<Debit2> context) 
    {

    }
}
然而,正如@dvorog在评论中所说的,由于compile中不存在泛型,您可能需要制作如下的业务接口:

public interface Business<T extends Debit> {

    public void treatment(Context<T> context, FindServiceReturnMessage response);
}

这将重复一步,并可能以一些不可维护的代码或一些
if(Debit1的T instanceof)结束
使泛型工作的地方。

泛型在运行时不存在,因此它们在
自动连接的
对象上使用时毫无意义。如果您希望有多个bean需要通过同一接口注入,请签出
@限定符
注释。@Dvorog:谢谢您的回复。我理解正如您所说,我已经尝试添加
@Qualifier
注释,如:@Autowired@Qualifier(“ManagerImpl2”)private Manager Manager;但是,此代码将始终实现ManagerImpl2,而不是managerimpl1。这就是重点。依赖项只注入一次(在bean创建期间)在spring上下文初始化之后,您不应该更改它们的实现。您想如何决定注入哪个bean?如果您想基于某些业务逻辑获取bean,也许您应该签出
ApplicationContext.getBean()
方法。这种方法的问题是您不再使用IOC。
public interface Business<T extends Debit> {

    public void treatment(Context<T> context, FindServiceReturnMessage response);
}
@Component
public class ManagerImpl2Business<Debit2> {

    @Autowired
    @Qualifier("managerImpl2")
    private Manager<Debit2> manager;

    public void treatment(Context<Debit2> context, FindServiceReturnMessage response) {

        manager.manage(response, context);
    }
}