在春天开机使用@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);
}
}
注: - 在这里你使用泛型类型的参数,其决心在编译时只。这里
TCubeInfo
和MCubeInfo
都是不同类(它们不是关系层次结构)。所以,这是不可能投不其自带下层次结构的对象。这将提高ClassCastException
。
以上是关于在春天开机使用@Autowired注解的接口的主要内容,如果未能解决你的问题,请参考以下文章
解决非controller使用@Autowired注解注入为null问题
解决非controller使用@Autowired注解注入报错为java.lang.NullPointerException问题