前言
这个问题是在另一个问题基础上发生的,(微服务自调用),不过目前微服务自调用没有写博客,所以这里只是简单的说明下情况,后续如果写了有空我再更新下地址
代码结构
//用户接口
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, 有兴趣的可以自行百度,文章较长.