@Autowired与 @Resource注解引起的问题

文章讨论了如何在Spring中通过@Resource和@Autowired处理微服务自调用时的依赖选择,强调了@Primary注解的作用,以及两者之间的区别,提醒开发者对这种看似无害但可能隐藏问题的细节保持警惕。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

        这个问题是在另一个问题基础上发生的,(微服务自调用),不过目前微服务自调用没有写博客,所以这里只是简单的说明下情况,后续如果写了有空我再更新下地址

代码结构

 

//用户接口
public interface UserInterface {

    String getUserName();
}

  

@Service
public class UserInterfaceFeignImpl implements UserInterface{
    @Override
    public String getUserName() {

        //使用feign接口从远程获取数据,这里只是表示一下,就不做具体的实现了
        String name = "从feign接口远程获取的";

        return name;
    }
}
//覆盖远程feign调用,使用本地调用
@Service
@Primary
public class UserInterfaceFeignWriteImpl extends UserInterfaceFeignImpl{

    @Override
    public String getUserName() {

        //覆盖父类的方法,从本地获取,也只是写下模拟表示
        String name = "从本地获取的数据";
        return name;
    }
}
//切面使用者
@Service
public class UserLogAspect {


    @Resource
    private UserInterfaceFeignImpl userInterfaceFeignImpl;
//    @Autowired
//    private UserInterfaceFeignImpl userInterfaceFeignImpl;

    public String getName() {

        String userName = userInterfaceFeignImpl.getUserName();
        System.out.println("userName=" + userName);
        return userName;
    }
}

问题描述如下:  UserLogAspect 最终需要依赖接口去获取数据

UserInterfaceFeignImpl:  需要通过feign远程发起调用的实现类

UserInterfaceFeignWriteImpl:  覆盖UserInterfaceFeignImpl的方法,这里就是为了解决微服务自调用的问题(目前没有写这篇博客)

最终需要的流程

UserLogAspect  里面引用的是UserInterfaceFeignWriteImpl这个实现类,而不是UserInterfaceFeignImpl这个(至于为什么不直接用UserInterfaceFeignWriteImpl,那是因为UserInterfaceFeignImpl是共用的,只能引用到这个,无法引用另外一个)

测试情况

使用 @Resource时

可以看到使用了feign,如果这样上线那么就会发生微服务自调用的问题了

使用@Autowired时

可以看到,这里使用了本地的,这样就不会有问题

扩展 使用@Resource时

这里使用了 @Resource但是仍然是正常的?为什么,细心的人可能发现了此时bean属性名变为了

userInterfaceFeign, 为什么会这样? 其实就是两种的区别,如下描述

@Resource和@Autowired的区别

 @Primary

首先需要说明@Primary的作用,其实就是现在容器里有两个UserInterfaceFeignImpl实现,如果直接依赖spring不知道要注入哪个,所以这个注解就是用来告诉spring当有相同的bean实现时要优先帮我们注入哪一个用的

区别

下面就可以说下两者的区别了

@Autowired: 优先根据类型匹配,当容器里有2个UserInterfaceFeignImpl类型时,会优先找到那个配置了 @Primary的实现并装配

@Resource 有两种情况, 分开讨论

1.当属性名为 userInterfaceFeignImpl 时,也就是容器在spring中的名称时会优先匹配到这个

2.当属性名为 userInterfaceFeign 时,也就是容器中没有匹配的bean名称,那么就会根据类型匹配了

也就是@Resource会优先匹配beanName跟属性名称一样的bean,如果没有就会根据类型去匹配

总结

        这个问题目前看起来并不复杂,甚至有人觉得没什么影响,那是因为微服务自调用的博客我还没写,看不出问题的严重性.

        这个知识点可能很多人知道,但是还是建议大家谨慎对待

       最后再说下为什么要用 @Resource, 那是因为spring官方已经不建议使用@Autowired,所以我一直用的是@Resource, 有兴趣的可以自行百度,文章较长.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值