请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

注入注解的选择

老师好 @Resource 和 @Autowired 注解的选择 是个人爱好吗? 还是@Resource优于@Autowired

正在回答 回答被采纳积分+3

1回答

大能老师 2022-05-16 20:58:13

同学你好,两者基本区别对比如下:

https://img1.sycdn.imooc.com//szimg/6282477f0929f5f812020247.jpg

@Resource注解和@Autowired注解都是用来实现依赖注入的。相同的地方是@Resource注解和@Autowired注解都可以作用在成员变量和方法上。区别是:@Autowired是spring的注解,@Resource是j2ee的注解。@Autowired默认按照byType自动注入;@Resource默认按照byName自动注入。

举个例子:

假如你有这么一个service层的实现:

@Service("CountService")
public Class CountServiceImpl implements CountService{}

现在你想在CountController 里面使用这个CountServiceImpl

public Class CountController{}

@AutoWire

当使用这个注入的时候上面的 CountServiceImpl 只需要这样写 @Service,这样就会自动找到Service这个类型以及他的子类型。CountServiceImpl 实现了CountService,所以能够找到它。

缺点:就是当CountService实现类有两个以上的时候(比如:CountServiceImpl1和CountServiceImpl2),这就造成了冲突,所以要用@AutoWire注入的时候要确保CountService只有一个实现类。

@Resource

默认情况下是按照名称进行匹配,如果没有找到相同名称的Bean,则会按照类型进行匹配.

缺点:

  根据这个注解的匹配效果可以看出,它进行了两次匹配,也就是说,如果你在CountService这个类上面这样写注解,@Service,它会首先是找相同名字的,如果没有找到,再找相同类型的,而这里的@Service没有写名字(默认的名字 是这个CountServiceImpl),这个时候就进行了两次搜索,显然,速度就下降了许多。

  @Resource根据名字搜索是这样写@Resource("countService"),如果你写了这个名字叫countService,那么countServiceImpl上面必须也是这个名字,不然还是会报错。

总结一下:

@Resource可以根据名字来搜索,@Resource(name="countService"),可以直接写@Resource("countService")。

当然@Autowired @Qualifie("countService")也可实现@Resource(name="countService")的效果。

为什么不用呢?大家不用的原因很简单,这个用了两个注解,有点长,增加工作量。



1 回复 有任何疑惑可以回复我~
  • luyuni #1
    @Resource 也可以直接使用吧, 
    @Resource  
    private CountServiceImpl  countServiceImpl
    回复 有任何疑惑可以回复我~ 2022-07-19 20:42:27
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信