Java 在Spring boot中为接口使用@Autowired Anotion

Java 在Spring boot中为接口使用@Autowired Anotion,java,spring-boot,interface,autowired,Java,Spring Boot,Interface,Autowired,我有一个接口(QBuilder),有两个类(MBuilder、TBuilder)实现这个接口。该接口包含一个测试方法。此方法在MBuilder中接收参数类型MCubeInfo,在TBuilder中接收参数类型TCubeInfo public interface QBuilder<T> { public String test(T cubeInfo); } public class MBuilder implements QBuilder<MCubeInfo>

我有一个接口(QBuilder),有两个类(MBuilder、TBuilder)实现这个接口。该接口包含一个测试方法。此方法在MBuilder中接收参数类型MCubeInfo,在TBuilder中接收参数类型TCubeInfo

public interface QBuilder<T> {

    public String test(T cubeInfo);
}

public class MBuilder implements QBuilder<MCubeInfo> {

    @Override
    public String test(MCubeInfo cubeInfo) {
        System.out.println("MCube Info");
        return "MCube";
    }
}


public class TBuilder implements QBuilder<TCubeInfo> {
        @Override
        public String test(TCubeInfo cubeInfo) {
            System.out.println("TCube Info");
            return "TCube";
        }
}
公共接口QBuilder{
公共字符串测试(T cubeInfo);
}
公共类MBuilder实现QBuilder{
@凌驾
公共字符串测试(MCubeInfo cubeInfo){
System.out.println(“MCube信息”);
返回“MCube”;
}
}
公共类TBuilder实现QBuilder{
@凌驾
公共字符串测试(TCubeInfo cubeInfo){
System.out.println(“TCube信息”);
返回“TCube”;
}
}
我希望在QuerySvc中调用测试方法时,qBuilder会根据参数类型重定向到我。但是,在autowired QBuilder中,会使用MBuilder自动设置。因此,当我向测试函数发送TCubeInfo对象时,发生了一个错误,即它无法转换MCubeInfo

@RestController
public class QuerySvc {

     private QBuilder qBuilder;

     @Autowired
     public void setQBuilder(QBuilder q){
          qBuilder = q)
     }

     @RequestMapping(value = "/boot", method = RequestMethod.GET)
     public ResponseEntity<String> getTest(){

           .
           .
           .
           TCubeInfo cube = .....
           qBuilder.test(cube);

     }


}
@RestController
公共类查询VC{
私人QBuilder QBuilder;
@自动连线
公共无效设置QBuilder(QBuilder q){
qBuilder=q)
}
@RequestMapping(value=“/boot”,method=RequestMethod.GET)
公共响应getTest(){
.
.
.
TCubeInfo多维数据集=。。。。。
qBuilder.test(立方体);
}
}

当我搜索问题时,我遇到了@Qualifier注释,但我无法使其适应我的问题。

我认为您应该为您定义的这两个服务/组件类创建两个不同的bean

public class MBuilder   //two different beans in configuration Class.
public class Tuilder 
Spring引导配置类

现在,在您的
RestController
中,尝试使用不同的
@Qualifier
语句注入两个bean。如下图所示

RestController类

@RestController
公共类查询VC{
@限定符(“tBuilder”)//现在根据需要使用tBuilder对象。
@自动连线
私人QBuilder-tBuilder;
@限定符(“mBuilder”)//您可以根据需要使用mBuilder对象。
@自动连线
私人住宅;
@自动连线
公共无效设置QBuilder(QBuilder q){
qBuilder=q)
}
@RequestMapping(value=“/boot”,method=RequestMethod.GET)
公共响应getTest(){
.
.
.
TCubeInfo多维数据集=。。。。。
qBuilder.test(立方体);
}
}
注意:-这里使用的泛型类型参数仅在编译时解析。这里的
TCubeInfo
MCubeInfo
都是不同的类(它们没有继承关系)。因此,不可能铸造不属于继承权的对象。它将引发
ClassCastException


由于Java中的类型擦除,参数化bean是一个不好的选择。您的和将变成对象。请参阅:命名bean-并使用带有限定符的适当bean名称。您的示例并没有说明如何定义bean(作为组件,或者作为配置中的bean)。实际上,我不能使用@Qualifier,因为它是在运行时决定的。我是否可以在运行时设置限定符我遇到以下错误:
tr中方法setqBuilder的参数0…..query.api.controller.QuerySvc需要一个bean,但是发现了2个:MyApple Buield:由Tr.QueReScCMANK-MUNDRANBUILDER定义的方法'MuBueld':由Tr.QueRysCcMead动作中的方法“TBueBudE”定义:考虑将bean中的一个标记为@主,更新消费者接受多个bean,或者使用@Qualifier来标识应该使用的bean
@ugur Now答案已更新。。请说明如何定义qBuilder,是否需要设置@Qualifier?@ugur
qBuilder
定义为
tBuilder
mBuilder
。它将根据定义的
@Qualifier
注释注入bean。@ugur如果您通过此答案找到正确的解决方案,请标记勾号,以便将来任何其他人都可以轻松找到它。。谢谢
@Bean(name="mBuilder") //define bean name
public MBuilder mBuilder(){    //mBuilder bean for MBuilder Class.
    return new MBuilder();
}

@Bean(name="tBuilder")   //Define bean name
public TBuilder tBuilder(){   //tBuilder bean for TBuilder Class.
    return new TBuilder();
}
@RestController
public class QuerySvc {

     @Qualifier("tBuilder")  //Now use tBuilder Object as per Your Need.
     @Autowired
     private QBuilder tBuilder;
     @Qualifier("mBuilder") // You can use mBuilder Object as per need.
     @Autowired 
     private QBuilder mBuilder;

     @Autowired
     public void setQBuilder(QBuilder q){
          qBuilder = q)
     }

     @RequestMapping(value = "/boot", method = RequestMethod.GET)
     public ResponseEntity<String> getTest(){

           .
           .
           .
           TCubeInfo cube = .....
           qBuilder.test(cube);
     }
}