在春天开机使用@Autowired注解的接口

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在春天开机使用@Autowired注解的接口相关的知识,希望对你有一定的参考价值。

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

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";
        }
}

我期待,当我打电话测试方法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);

     }


}

当我搜索这个问题,我与@Qualifier注解遇到,但我无法使它适应我的问题。

答案

我想你应该让你定义这两个服务/组件类的两种不同的豆类。

public class MBuilder   //two different beans in configuration Class.
public class Tuilder 

春季启动配置类。

@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尝试注入两个bean不同@Qualifier声明。如下所示。

RestController类。

@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);
     }
}

注: - 在这里你使用泛型类型的参数,其决心在编译时只。这里TCubeInfoMCubeInfo都是不同类(它们不是关系层次结构)。所以,这是不可能投不其自带下层次结构的对象。这将提高ClassCastException

以上是关于在春天开机使用@Autowired注解的接口的主要内容,如果未能解决你的问题,请参考以下文章

解决非controller使用@Autowired注解注入为null问题

@Autowired和@Resource注解用法详细讲解

@Autowired和@Resource注解用法详细讲解

@Autowired和@Resource注解用法详细讲解

解决非controller使用@Autowired注解注入报错为java.lang.NullPointerException问题

Spring 注解之@Autowired、@Qualifer以及@Resource的区别