一文讲明白@Resource和@Autowired区别

在Spring框架中,依赖注入(Dependency Injection,DI)是核心功能之一,通过它可以轻松管理对象的生命周期及其依赖关系。在实际开发中,@Resource@Autowired是常见的依赖注入注解,但它们的功能、使用场景以及推荐使用的方式存在一定的差异。本文将详细解释这两者的区别,并探讨为何近年来@Autowired不再被推荐使用。

1. @Resource@Autowired的基本概念
1.1 @Resource

@Resource是由JSR-250规范定义的注解,是Java EE标准的一部分。它可以用于字段、方法和类,并通过名称或类型进行依赖注入。@Resource注解通常使用在应用中需要与JNDI、EJB等Java EE服务集成的场景下。

  • 按名称注入:默认情况下,@Resource会根据字段或方法的名称进行注入。Spring会首先尝试在上下文中查找与字段名称匹配的Bean,如果找到则注入该Bean。
  • 按类型注入:如果按名称无法找到匹配的Bean,@Resource将尝试按类型查找与字段类型匹配的Bean。
 

java

代码解读

复制代码

@Resource private MyService myService;

1.2 @Autowired

@Autowired是Spring框架提供的注解,专门用于依赖注入。与@Resource不同,@Autowired默认是按类型进行注入的。如果在上下文中有多个同类型的Bean,Spring会使用@Qualifier注解来进一步指定注入的Bean。

  • 按类型注入@Autowired注解会根据字段或方法参数的类型在上下文中查找匹配的Bean,并进行注入。
  • 强制依赖:默认情况下,@Autowired是必需的,即如果找不到匹配的Bean,Spring将抛出异常。可以通过设置required=false来使其成为可选依赖。
 

java

代码解读

复制代码

@Autowired private MyService myService;

2. @Resource@Autowired的详细区别
2.1 注解来源与兼容性
  • @Resource:属于Java标准的一部分(JSR-250),与Spring无关,因此在Java EE和Spring应用中都可以使用。由于它是Java原生注解,因此与其他Java EE技术栈(如EJB、JPA)有良好的兼容性。
  • @Autowired:特定于Spring框架,无法在非Spring环境中使用。它是Spring框架提供的核心功能之一,主要用于Spring应用中的依赖注入。
2.2 注入方式
  • @Resource:默认按名称注入,若找不到则按类型注入。可以通过name属性显式指定要注入的Bean名称。
  • @Autowired:默认按类型注入,若有多个同类型的Bean时,需要结合@Qualifier@Primary注解来明确指定注入的Bean。
2.3 使用场景
  • @Resource:通常用于需要与Java EE其他技术集成的场景,或在不依赖Spring框架的环境中使用。
  • @Autowired:主要用于Spring应用中,特别是当应用高度依赖Spring的DI功能时。
2.4 可配置性
  • @Resource:通过name属性可以显式指定Bean的名称,从而提供更精确的控制。
  • @Autowired:无法通过注解直接指定Bean名称,而是依赖于类型匹配。需要结合@Qualifier来指定特定的Bean。

    整理了一份好像面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

    需要全套面试笔记【点击此处即可】免费获取

3. 为什么不再推荐使用@Autowired

随着Spring的不断演进,@Autowired的使用逐渐被更现代的方式所替代,原因主要有以下几点:

3.1 @Autowired的隐式依赖

@Autowired默认按类型注入,容易导致代码对Spring容器的隐式依赖性增强,从而降低了代码的可测试性和灵活性。在单元测试中,如果不启动Spring上下文,@Autowired注解无法正常工作,导致测试复杂性增加。

3.2 推荐使用构造函数注入

Spring团队和许多开发者现在更推荐使用构造函数注入,而非字段注入。构造函数注入更符合依赖注入的原则,可以确保Bean的完整性,避免循环依赖问题。同时,构造函数注入的代码更容易测试,因为可以直接在构造函数中传递Mock对象。

 

kotlin

代码解读

复制代码

public class MyService { private final MyRepository myRepository; @Autowired public MyService(MyRepository myRepository) { this.myRepository = myRepository; } }

3.3 @Autowired注解滥用

由于@Autowired的便捷性,容易导致开发者滥用它,随意地在任何类中注入依赖,结果导致代码结构混乱,职责不清。过度依赖@Autowired可能使得代码维护和重构变得更加困难。

3.4 Spring Boot和@ConfigurationProperties

在Spring Boot中,@ConfigurationProperties注解被广泛使用,它能够更加优雅地绑定外部配置到Bean中,并且推荐使用构造函数注入方式。这样不仅增强了配置的灵活性,还提升了代码的可读性和维护性。

 

arduino

代码解读

复制代码

@ConfigurationProperties(prefix = "app.config") public class AppConfig { private String url; private int timeout; public AppConfig(String url, int timeout) { this.url = url; this.timeout = timeout; } // getter and setter }

4. 结论

@Resource@Autowired在Spring框架中都是用于实现依赖注入的注解,但它们的使用场景、功能和推荐程度各有不同。@Resource适用于需要与Java EE技术集成的场景,而@Autowired主要在Spring应用中使用。随着Spring框架的发展,@Autowired逐渐不再被推荐,取而代之的是构造函数注入等更加现代和灵活的依赖注入方式。

在现代的Spring开发中,使用构造函数注入不仅能够提高代码的可测试性和灵活性,还能避免许多潜在的问题。因此,在新项目或现有项目中逐步减少@Autowired的使用,是一个值得考虑的方向。

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: @Resource注解是Java中的一种注解,它可以用来标记一个属性、方法或构造函数,告诉容器在进行自动装配时,使用名称或类型来查找需要注入的bean。 @Autowired注解是Spring框架中的一种注解,它可以用来标记一个属性、方法或构造函数,告诉容器在进行自动装配时,使用类型来查找需要注入的bean。 ### 回答2: @resource注解和@Autowired注解都是用于在Spring框架中进行依赖注入的方式。 @resource注解是JSR 250规范中的一部分,它可以用来标记一个类的属性或方法来指示Spring容器注入一个特定的资源。可以应用在字段上,在setter方法上,以及在构造函数中,用来注入具体类型的依赖。它可以使用一个name属性来指定要注入的资源的名称,如果没有指定name属性,它将根据变量的名称来查找匹配的资源。@resource注解可以用于注入任何类型的资源,包括其他对象、数据源、事务管理器等。 @Autowired注解是Spring框架提供的一种依赖注入方式。它可以通过类型来自动注入一个合适的bean或者其他的依赖项。可以应用在字段上,setter方法上,以及构造函数中。与@resource注解不同的是,@Autowired注解不需要明确指定需要注入的bean的名称,它会根据类型来自动寻找匹配的bean,并将其注入到对应的属性中。如果存在多个相同类型的bean,可以使用@Qualifier注解来指定要注入的bean的名称。在进行注入时,Spring会根据属性的类型,从容器中查找匹配的bean,并将其自动装配到指定的属性中。 总结来说,@resource注解主要用于注入各种类型的资源,可以指定资源的名称,而@Autowired注解主要用于自动注入其他对象或者依赖项,根据类型自动寻找匹配的bean进行注入。 ### 回答3: @Resource注解和@Autowired注解都是Spring框架中用于进行依赖注入的注解。 @Resource注解是JavaEE的注解,可以用于引用其他组件或者资源。在Spring中,它可以用于注入依赖的组件。@Resource注解有两个常用的属性:name和type。name属性可以指定要注入的组件的名称,type属性可以指定要注入的组件的类型。如果两个属性都没有指定,则根据属性的类型进行自动装配。 @Autowired注解是Spring框架提供的注解,用于进行自动装配。它可以根据属性的类型进行自动装配,也可以根据属性的名称进行自动装配。当需要装配的组件只有一个时,会根据类型进行匹配。当需要装配的组件有多个时,会根据属性名称进行匹配。如果找不到匹配的组件,会抛出异常。 在使用@Resource注解时,可以使用@Resource和@Autowired注解的效果是一样的,但是@Resource注解的功能更加强大,可以引用其他JavaEE容器的资源,而@Autowired注解只能引用Spring容器中的组件。 总结起来,@Resource注解是JavaEE的注解,用于引用其他组件或资源,而@Autowired是Spring框架的注解,用于进行自动装配。在Spring中,可以使用@Resource和@Autowired注解来实现依赖注入的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值