首页 > 解决方案 > 如何在spring中通过泛型变量注入bean

问题描述

我在使用泛型类型注入 bean 时遇到问题。看例子。我将向服务注入一个类型来自 App 类的存储库。现在我有例外:

没有可用的“asd.IRepository”类型的合格 bean:预期的单个匹配 bean,但找到了 2:a,b

asd 这里是包,仅用于测试。

在这种情况下我能做什么?有什么办法可以做到吗?

public interface IRepository<T, V> {
    void print();
}


@Component
public class A implements IRepository<String,String> {

    @Override
    public void print() {
        System.out.println("A");
    }
}

@Component
public class B implements IRepository<Double,String> {

    @Override
    public void print() {
        System.out.println("A");
    }
}

@Service
public class ServiceABC<V, T> {

    @Autowired
    private IRepository<V,T> repo;

    public void print(){
        repo.print();
    }
}

@Controller
public class App {

    @Autowired
    private ServiceABC<String, String> serviceABC;

    public static void main(String[] args) {
        ApplicationContext ctx =
                new AnnotationConfigApplicationContext("asd");

        App app = ctx.getBean(App.class);
        app.serviceABC.print();
    }

标签: javaspringdependency-injectionautowired

解决方案


您必须命名您的组件并按名称自动装配:

@Component("A")
public class A implements IRepository<String,String> {...}

@Component("B")
public class B implements IRepository<Double,String> {...}

[...]

@Autowired
@Qualifier("B")
private IRepository repo;

推荐阅读