同学你好,两者基本区别对比如下:
@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")的效果。
为什么不用呢?大家不用的原因很简单,这个用了两个注解,有点长,增加工作量。