⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/weixin_43715214/article/details/127858049 「金鳞踏雨」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

@Autowired 和 @Resource 的有什么区别?

@Autowired@Resource 注解都是做bean注入时使用的!

其中@Autowired时Spring提供的注解;@Resource并不是Spring提供的,而是JDK提供的,但是Spring支持该注解的注入,使用的时候不需要导入而外的架包。

相同点

两者都可以写在 属性 或者 setter方法 上。

如果两者都写在字段上,那么就不需要再写setter方法了!

不同点

@Autowired

默认的情况下是按照byType的方式注入!

我们可以举一个例子

public class TestServiceImpl() {

@Autowired
private UserDao userDao;

...
}

上述代码,会先去容器中查找一下,有哪些对象的类型是UserDao,找到之后把具体的值赋值到userDao中去(但是如果找到多个的话,会报错!)

@Autowired注解是按照类型(byType)装配依赖对象的,默认情况下它要求依赖对象必须存在;如果允许null值,我们可以设置required属性为false。

如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用

问:假如我们的UserDao有多个实现类,比如UserDaoImpl1UserDaoImpl2,我们的代码要怎么写?

如果不用 @Qualifier 那默认是使用byType,会找到多个UserDao类型的,会报错!!!所以要像下面的代码这样写!!!

方案一(@Qualifier)

public class TestServiceImpl() {

@Autowired
@Qualifier("userDaoImpl1") // 指定哪一个实现类
private UserDao userDao;

...
}

方案二(@Primary)

@Autowired 中,如果有多个Bean,但是我们不想使用的@Qualifier时候,可以这样做:

使用@Primary注解指定一个进行注入!!!

@Primary
@Mapper
public class UserDaoImpl01 implements UserDao {
...
}
@Mapper
public class UserDaoImpl02 implements UserDao {
...
}

@Resource

默认按照是byName的方式注入,如果名称找不到,则按照类型注入。

@Resource 中有两个重要的属性 name 和 type

在Spring中,将@Resource注解的name属性解析为bean的名称,type为bean的类型。

  • 如果使用name属性,则使用byName的自动注入策略
  • 如果使用type属性,则使用byType的自动注入策略
  • 如果不指定,这是将会通过反射机制使用byName自动注入策略

@Resource的装配顺序

1)如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常

2)如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常

3)如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常

4)如果既没有指定name,又没有指定type,则自动按照byName方式进行装配。如果没有匹配,则回退为一个原始类型(UserDao)进行匹配,如果匹配则自动装配。(先Name后type)

为什么更推荐使用 @Resource ?

Resource注解在字段上,这个注解是属于J2EE的,减少了与spring的耦合。

但是其实啊,这个问题,我觉得很多人可能对它的理解有误!

更推荐使用 @Resource ,我觉得不是因为@Resource注解性能更好之类的。

而是因为其可以指定是通过 name 还是 type 的注入方式,而@Autowired注解本身自己是不能实现这个效果的,要和@Qualifier一起用才可以!

文章目录
  1. 1. @Autowired 和 @Resource 的有什么区别?
  2. 2. 相同点
  3. 3. 不同点
    1. 3.0.1. @Autowired
    2. 3.0.2. @Resource
    3. 3.0.3. @Resource的装配顺序
  • 4. 为什么更推荐使用 @Resource ?