欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

@Autowired 和 @Resource注解, 一个接口有多个实现类的时候Spring注入遇到的问题

程序员文章站 2022-05-13 21:05:15
先说下我遇到的问题,有一个接口 CompensationService, 有两个实现类 MusicCompensationStrategyImpl 和 TakeDeliveryCompensationStrategyImpl 在另一个类中需要用到其中的两个实现类,我直接CompensationSer ......

先说下我遇到的问题,有一个接口 compensationservice, 有两个实现类 musiccompensationstrategyimpl  和  takedeliverycompensationstrategyimpl

在另一个类中需要用到其中的两个实现类,我直接compensationservice  com = new  musiccompensationstrategyimpl () , 然后调用此实现类实现的方法,但是这个实现类注入了一个接口(此接口是一个@feginclients接口,调用另一个服务),所以就出现了空指针异常,此接口注入不进来。

问题的原因是,我new个对象只是在jvm堆中产生了个对象,而fegin是交给了spring容器来管理,虽然此spring容器也是在jvm中,但是毕竟是两个不同的容器,如同两堵墙不能想通,果断弃之。

如下图 和 代码:

@Autowired 和 @Resource注解,  一个接口有多个实现类的时候Spring注入遇到的问题

 

@slf4j
@service(value = "takedeliverycompensationstrategyimpl")
public class takedeliverycompensationstrategyimpl implements compensationservice {

    @autowired
    private takedeliveryserviceorderservice takedeliveryserviceorderservice;

    @override
    public result<string> compensationmethod(orderform orderform, long accountid) {
        result<string> takedeliveryserviceorder = takedeliveryserviceorderservice.createtakedeliveryserviceorder(orderform);
        return takedeliveryserviceorder;
    }
}

 

如下:

@slf4j
@service("musiccompensationstrategyimpl")
@allargsconstructor
public class musiccompensationstrategyimpl implements compensationservice {

    compensationorderservice compensationorderservice;
    accountremoteservice accountremoteservice;

    @override
    public result<string> compensationmethod(orderform orderform, long accountid) {

 

又用@autowired注解,启动报错,信息显示无法不知该注入那个实现类,因为这个注解是按照类型来的,出现了两个实现类,也不知道按照那个, 果断弃之。

 

最后用@resource注解,这个是按照name来的,在每个实现类上加上,如 @service("musiccompensationstrategyimpl"),类名全程(首字母小写, 看我上面的代码),然后在要调用的类注入  @resource(name = "musiccompensationstrategyimpl")

@resource(name = "musiccompensationstrategyimpl")
private compensationservice compensationservicemusic;
@resource(name = "takedeliverycompensationstrategyimpl")
private compensationservice compensationservicetake;