@Autowired和@Resource区别
在项目开发中,@Autowired
和@Resource
这两个注解都可以用来给一个实例注入Bean,都可以写在字段上,或写在setter方法上,但他们之间是有区别的。
@Autowired
@Autowired
是Spring框架中的注解,默认按类型注入,并且默认必须要求依赖对象必须存在(不存在会报错),可以通过required=false
属性设置为非必须。
@Qualifier
因为@Autowired
是按类型注入,如果容器中存在多个相同类型的Bean,那么这时候使用@Autowired
注入就会报错,因为他不知道到底要注入哪一个。解决办法是使用@Qualifier
注解,指定Bean的名称。比如如下的示例中有两个UserBean
对象,使用@Autowired
注解时,同时使用@Qualifier
注解指定注入的名称为 user1 的Bean。
1 |
|
1 |
|
输出:1
INFO 8556 --- [ main] c.l.s.annotation.test.IocBeanTest : {"id":1,"name":"张三"}
@Resource
@Resource
注解由J2EE提供的注解,默认按照名称进行装配,可以通过name属性指定名称,如果没有指定name属性,当注解写在字段上时,默认取字段名进行查找注入,如果写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
@Resource
装配顺序总结:
- 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
- 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
- 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
- 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配
所以上面@Autowired
的例子,如果用@Resource
来替换,则可以写成如下方式。
方式1:1
2
3
private UserBean user1;
方式2:1
2
3
"user1") (name =
private UserBean userBean;