首先说一下共同点,两者都是用来注入依赖的注解,且都可以声明在字段和setter方法上。
下面说一下区别

@Autowired

@Autowired 是由Spring框架提供的,默认通过byType注入。
若有一个UserService和两个实现类UserServiceImpl1和UserServiceImpl2

1
2
3
4
5
@Service
public class UserServiceImpl1 implements UserService;

@Service
public class UserServiceImpl2 implements UserService;

通过@Autowired注入
1
2
@Autowired
private UserService userService;

但显而易见,直接注入会报错。@Autowired默认通过byType注入,但是UserService有两个实现类,我们无法确定是哪一个,所以我们通过byNames注入。
但是byNames所需的变量名也无法匹配ioc容器中有的id,所以会报错。

解决方案

1
2
3
//1.改变变量名
@Autowired
private UserService userServiceImpl1;
1
2
3
4
//2.使用@Qualifier注解
@Autowired
@Qualifier("userServiceImpl1")
private UserService userService;

@Resource

@Resource 是由J2EE提供的,默认通过byName注入。
若有一个UserService和两个实现类UserServiceImpl1和UserServiceImpl2

1
2
3
4
5
@Service
public class UserServiceImpl1 implements UserService;

@Service
public class UserServiceImpl2 implements UserService;

通过@Resource注入
1
2
@Resource
private UserService userService;

@Resource默认通过byName注入,但是UserService这个变量名无法和IOC容器中的任何一个id进行匹配,我们无法确定是哪一个,所以我们通过byType注入。
但是使用byType后发现UserService中的实现类有两个,无法确定用哪个,所以报错。

解决方案

1
2
3
4
5
6
7
8
9
10
11
//1.指定name
@Autowired(name = "UserService")
private UserService userService;

//2.指定type
@Autowired(type = "UserService.class")
private UserService userService;

//3.同时指定name和type
@Autowired(name = "UserService" ,type = "UserService.class")
private UserService userService;