@Autowired 和 @Resource注解, 一个接口有多个实现类的时候Spring注入遇到的问题
先说下我遇到的问题,有一个接口 CompensationService, 有两个实现类 MusicCompensationStrategyImpl 和 TakeDeliveryCompensationStrategyImpl
在另一个类中需要用到其中的两个实现类,我直接CompensationService com = new MusicCompensationStrategyImpl () , 然后调用此实现类实现的方法,但是这个实现类注入了一个接口(此接口是一个@FeginClients接口,调用另一个服务),所以就出现了空指针异常,此接口注入不进来。
问题的原因是,我new个对象只是在JVM堆中产生了个对象,而Fegin是交给了Spring容器来管理,虽然此spring容器也是在JVM中,但是毕竟是两个不同的容器,如同两堵墙不能想通,果断弃之。
如下图 和 代码:

@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;
@Autowired 和 @Resource注解, 一个接口有多个实现类的时候Spring注入遇到的问题的更多相关文章
- @Autowired和@Resource注解的一个意外重要区别
今天上午,因为公司要跟客户展示最近开发的项目,然后安排了我重新构建一个template项目,用来向客户展示参考.基于已开发好的代码,我在进行一些简化抽取的时候出现了一个有趣的问题 因为我们有一个spr ...
- 解决非controller使用,@Autowired或者@Resource注解注入Mapper接口为null的问题
知识点:在service层中注入其它的service接口或者mapper接口都是可以的 但是在封装的Utils工具类中或者非controller普通类中使用@Autowired@Resource注解注 ...
- Spring下的@Inject、@Autowired、@Resource注解区别(转)
1.@Inject javax.inject JSR330 (Dependency Injection for Java) 这是JSR330中的规范,通过AutowiredAnnotationBean ...
- Java框架spring 学习笔记(九):Spring的bean管理(@Required、@Component、@Autowired、@Resource注解)
注解:代码里面特殊的标记,使用注解可以完成相关功能 注解写法:@注解名称(属性名.属性值) @Required 用在set方法上,一旦用了这个注解,那么容器在初始化bean的时候必须要进行set,也就 ...
- @Autowired和@Resource注解的区别
@Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false.如果我们想使用按名称装配,可以结合@Qualifier注 ...
- 关于@Autowired和@Resource注解区别
区分一下@Autowired和@Resource两个注解的区别: 1.@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配 2.@A ...
- spring容器注入一个接口的两个实现类
spring容器中能拥有两个同种类型的bean吗?我有两个dao类同时实现一个接口,这两个接口注入时报了异常如下. org.springframework.beans.factory.NoSuchBe ...
- spring下应用@Resource, @Autowired 和 @Inject注解进行依赖注入的差异
为了探寻 '@Resource', '@Autowired', 和'@Inject'如何解决依赖注入中的问题,我创建了一个"Party"接口,和它的两个实现类"Perso ...
- (转)用@Resource注解完成属性装配
http://blog.csdn.net/yerenyuan_pku/article/details/52858878 前面我们讲过spring的依赖注入有两种方式: 使用构造器注入. 使用属性set ...
随机推荐
- 将 iTunes 降级到支持安装 .ipa 文件的版本
将 iTunes 降级到支持安装 .ipa 文件的版本 新版的 iTunes 再也不支持安装 .ipa 文件了,但是 Apple 官网依旧保留了旧版 iTunes 的下载渠道.(点击进入) 安装完上面 ...
- MATLAB关闭科学计数法显示
- #C++初学记录(typedef和define)
typedef的用法 typedef关键字可以用于给数据类型定义一个别名,即可以给long long 定义成ll,也可以给结构体定义,当你定义了一个结构体时,每次创建一个结构体都要使用struct+结 ...
- MyBatis中的配置错误creating bean with name 'sqlSessionFactory'
错误信息如下: 警告: Exception encountered during context initialization - cancelling refresh attempt: org.sp ...
- Dependency Parsing
句子的依赖结构表现在哪些单词依赖哪些单词.单词之间的这种关系及可以表示为优先级之间的关系等. Dependency Parsing 通常情况下,对于一个输入句子:\(S=w_{0} w_{1} \do ...
- 第10组Alpha冲刺(1/4)
队名:凹凸曼 组长博客 作业博客 组员实践情况 童景霖 过去两天完成了哪些任务 文字/口头描述 学习Android studio和Java,基本了解APP前端的制作 完善项目APP原型 展示GitHu ...
- Redis的常用JavaAPI(Jedis)实现
一. pom依赖: <!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency> & ...
- pgsql 聚合函数array_to_string,ARRAY_AGG
array_to_string--将sql中的数组转为字符串 ARRAY_AGG--将sql中的数据转为数组处理 以下给大家一个简单的例子即可体会: 1.需求 2.数据库中原数据 1.pn ...
- 《精通CSS第3版》(6)内容布局(定位+水平布局)
- Python 初级 6 循环 (三)
一.复习 1 计算循环(for循环) for looper in [1, 2, 3, 4, 5]: print("hello") 1) looper的值从第0个数1开始 2) 对应 ...