注入注解的选择

来源:3-11 使用官方推荐的RedisTemplate工具让缓存操作更优雅

qq_冰封夕阳_5

2022-05-16

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

写回答

1回答

大能老师

2022-05-16

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

//img.mukewang.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
1
luyuni
@Resource 也可以直接使用吧, @Resource private CountServiceImpl countServiceImpl
2022-07-19
共1条回复

Java分布式架构设计与开发实战

项目贯穿式讲解,真正将理论与实战相结合

325 学习 · 74 问题

查看课程