一、共同作用
在服务启动的时候,实现依赖注入相关bean
二、不同点
1、@Autowired
(1)为Spring提供的注解,需要导入org.springframework.beans.factory.annotation.Autowired;
(2)通过byType的方式,也就是按照类型匹配,而且必须要求这个对象存在;
(3)例子:
我们有个UserService接口类:
public interface UserService {
String getUser();
}
UserService下面有两个接口实现类UserService_1_Impl和UserService_2_Impl如下:
@Service
public class UserService_1_Impl implements UserService{
@Override
public String getUser() {
System.out.println("UserService_1_Impl");
return null;
}
}
@Service
public class UserService_2_Impl implements UserService{
@Override
public String getUser() {
System.out.println("UserService_2_Impl");
return null;
}
}
控制层注入UserService代码如下:
@Controller
public class TestController {
@Autowired
private UserService userService;
}
此时启动项目会报错:required a single bean, but 2 were found:
此时再加上一个@Qualifier注解指定要注入bean的名称name,代码如下:
@Controller
public class TestController {
@Autowired
@Qualifier(value = "userService_1_Impl")
private UserService userService;
}
这样就指定注入userService_1_Impl这个bean
2、@Resource
(1)注解由J2EE提供,需要导入包javax.annotation.Resource。
(2)默认通过byName的方式,也就是按照名称匹配,如果找不到名字,则通过byType实现。如果两个都找不到的情况下,就报错。
(3)例子:
以上面代码为基础,控制层注入UserService代码如下:
@Controller
public class TestController {
@Resource(name = "userService_1_Impl")
private UserService userService;
}
三、总结
Spring属于第三方的,J2EE是Java自己的东西。使用@Resource可以减少代码和Spring之间的耦合。