一尘不染

Spring IoC和通用接口类型

spring

我正在尝试将Spring IoC与这样的接口一起使用:

public interface ISimpleService<T> {
    void someOp(T t);
    T otherOp();
}

Spring可以基于通用类型参数T提供IoC吗?我的意思是这样的:

public class SpringIocTest {
    @Autowired
    ISimpleService<Long> longSvc;

    @Autowired
    ISimpleService<String> strSvc;
    //...
}

当然,上面的例子不起作用:

expected single matching bean but found 2: [serviceLong, serviceString]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation(AutowiredAnnotationBeanPostProcessor.java:243)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:957)

我的问题:是否可以提供对接口或实现类进行最少修改的类似功能?例如,我知道我可以使用@Qualifiers,但我想使事情尽可能简单。


阅读 255

收藏
2020-04-18

共1个答案

一尘不染

由于擦除,我认为这是不可能的。在进行全自动布线时,我们通常切换到强类型子接口:

public interface LongService extends ISimpleService<Long> {}
public interface StringService extends ISimpleService<String> {}

进行此切换后,我们发现我们实际上非常喜欢此功能,因为它使我们能够更好地进行“查找使用情况”跟踪,而使用泛型接口则有些松懈。

2020-04-18