springboot @Resource、@AutoWaire的用法实战

简介: 【4月更文挑战第3天】在Spring Boot中,@Autowired和@Resource注解都用于自动注入依赖,但它们在底层工作方式和使用的场合上存在一些差异。理解这些差异有助于更有效地使用Spring框架。

在Spring Boot中,@Autowired@Resource注解都用于自动注入依赖,但它们在底层工作方式和使用的场合上存在一些差异。理解这些差异有助于更有效地使用Spring框架。

@Autowired注解

  • 来源@Autowired是Spring框架的注解。
  • 注入方式:默认按照类型进行依赖注入。如果找到多个相同类型的bean,则会根据属性名称作为bean的id进行匹配。如果设置required属性为false,当Spring找不到对应的bean时,它将不会抛出异常,而是留下一个未设置的属性。
  • 使用场景:通常用于注入应用程序上下文中的bean,支持构造器注入、属性注入和方法注入。

@Resource注解

  • 来源@Resource注解来自Javax注解,是JSR-250规范的一部分。
  • 注入方式:默认按名称进行依赖注入。如果没有指定一个名字,它会默认采用被注解的元素的名称。如果按名称注入失败,则会回退到按类型注入。@Resource没有required属性。
  • 使用场景:适用于需要按名称进行依赖注入的场景,比如当有多个类型相同的bean需要注入时,通过指定名称来选择具体的bean。

底层注入原理

  1. 启动时扫描:在Spring容器启动时,会扫描应用中所有的类,查找带有@Autowired@Resource等注解的字段或方法。
  2. 依赖解析
  • 对于@Autowired:Spring首先按类型进行匹配,如果有多个同类型的bean,则根据属性名(或指定的@Qualifier)来选择。
  • 对于@Resource:首先按指定的名称(如果有)进行匹配,失败后再按类型进行匹配。
  1. 代理和注入:找到匹配的bean后,Spring通过反射等机制将依赖对象注入到目标对象的字段或方法中。

对比优劣

  • 类型安全@Autowired提供了更好的类型安全性,因为它默认按类型注入,而且可以结合@Qualifier注解使用来进一步消除歧义。
  • 灵活性@Resource提供了按名称注入的能力,这在某些情况下更为灵活,特别是当存在多个类型相同的bean,而你需要注入其中一个特定的bean时。
  • 标准@Resource是基于标准的注解,而@Autowired是Spring特有的。在某些情况下,如果你想让你的应用尽可能标准化或减少对Spring的依赖,使用@Resource可能更合适。

总的来说,@Autowired@Resource都是强大的依赖注入功能,适用于不同的场景。选择哪一个主要取决于你的具体需求,比如是否需要按类型安全地注入,或是偏好按名称来选择具体的bean等。



使用@Autowired

@Autowired注解主要是按类型(type)自动装配依赖。它可以用在构造器、属性、设置器方法上。

示例1: 构造器注入

java复制代码

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    private final UserRepository userRepository;

    @Autowired // 在Spring 4.3及之后的版本中,如果该类只有一个构造器,可以省略@Autowired注解
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // UserService的其他方法
}

示例2: 属性注入

java复制代码

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ProductService {

    @Autowired
    private ProductRepository productRepository;

    // ProductService的其他方法
}

使用@Resource

@Resource注解主要是按名称(name)来自动装配依赖。如果没有指定名称,Spring会退回到按类型自动装配。它通常用在属性上,但也可以用在设置器方法上。

示例1: 按名称注入

java复制代码

import javax.annotation.Resource;
import org.springframework.stereotype.Service;

@Service
public class OrderService {

    @Resource(name = "orderRepository")
    private OrderRepository orderRepository;

    // OrderService的其他方法
}

示例2: 设置器方法注入

java复制代码

import javax.annotation.Resource;
import org.springframework.stereotype.Service;

@Service
public class CustomerService {

    private CustomerRepository customerRepository;

    @Resource
    public void setCustomerRepository(CustomerRepository customerRepository) {
        this.customerRepository = customerRepository;
    }

    // CustomerService的其他方法
}

实战建议

  1. 首选构造器注入:构造器注入强制依赖不可为空,提高了类的不变性和测试性。对于必须的依赖,建议使用构造器注入。
  2. @Autowired和@Qualifier联用:当存在多个同类型的bean需要注入时,@Autowired注解可以与@Qualifier注解联用来精确指定bean的名称。
  3. 用途区分:如果特定场合需要按名称装配,可以使用@Resource;否则,推荐使用@Autowired以利用其类型安全的特性。
  4. 减少依赖:尽可能减少对Spring特定注解的依赖,尤其是在编写库代码时。这有助于保持代码的清洁和可移植性。

通过这些示例和建议,你可以根据实际情况和需求,在Spring Boot应用中灵活地使用@Autowired@Resource注解。

相关文章
|
9月前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
578 12
|
Java 数据库连接 Maven
springBoot:项目建立&配置修改&yaml的使用&resource 文件夹(二)
本文档介绍了如何创建一个基于Maven的项目,并配置阿里云仓库、数据库连接、端口号、自定义启动横幅及多环境配置等。同时,详细说明了如何使用YAML格式进行配置,以及如何处理静态资源和模板文件。文档还涵盖了Spring Boot项目的`application.properties`和`application.yaml`文件的配置方法,包括设置数据库驱动、URL、用户名、密码等关键信息,以及如何通过配置文件管理不同环境下的应用设置。
1166 1
|
NoSQL Java MongoDB
SpringBoot中MongoDB的那些高级用法
本文探讨了在Spring Boot项目中使用MongoDB的多种方式及其高级用法。MongoDB作为一种NoSQL数据库,在某些场景下相较于SQL数据库有着独特的优势。文中详细介绍了在Spring Boot中使用MongoDB的三种主要方式:直接使用官方SDK、使用Spring JPA以及使用MongoTemplate,并对比分析了它们之间的差异。此外,文章深入讲解了Spring Data MongoDB提供的各种注解(如@Id, @Document, @Field等)以简化操作流程,并探讨了MongoTemplate监听器的应用,如设置主键值、记录日志等。
1165 2
|
Java
springboot打包错误:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resource
springboot打包错误:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resource
316 0
|
Java Maven Spring
SpringBoot 系列之 Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resource
这篇文章描述了在使用Maven构建Spring Boot项目时遇到的`maven-resources-plugin`插件版本问题导致的编译失败,并提供了通过修改插件版本至3.1.0来解决这个问题的方法。
SpringBoot 系列之 Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resource
|
NoSQL Java MongoDB
SpringBoot中MongoDB的那些骚操作用法
MongoDB作为一种NoSQL数据库,在不需要传统SQL数据库的表格结构的情况下,提供了灵活的数据存储方案。在Spring Boot中可以通过官方SDK、Spring JPA或MongoTemplate等方式集成MongoDB。文章重点介绍了Spring Data MongoDB提供的注解功能,例如`@Id`、`@Document`和`@Field`等,这些注解简化了Java对象到MongoDB文档的映射。此外,文中还讨论了MongoTemplate监听器的使用,包括设置主键值和日志记录等高级特性。
755 0
SpringBoot中MongoDB的那些骚操作用法
|
JSON Java 数据格式
Spring Boot 中的 @DateTimeFormat 和 @JsonFormat 的用法及作用
【6月更文挑战第11天】在开发 Spring Boot 应用时,处理日期和时间数据是一个常见的需求。Spring Boot 提供了两个注解 @DateTimeFormat 和 @JsonFormat 来帮助我们处理这些问题。
1751 4
|
前端开发 Java 开发者
深入理解 Spring Boot 注解:核心功能与高级用法详解
深入理解 Spring Boot 注解:核心功能与高级用法详解
2026 1
|
安全 Java 编译器
springboot @resource与private final声明式的有何区别??
【6月更文挑战第3天】在Spring Boot中,@Resource 和 private final 常用于依赖注入,但它们的用途和行为有一些重要的区别。
658 1
|
Java 开发者 Spring
Springboot中的@Bean用法以及常见问题
【5月更文挑战第27天】@Bean 注解是Spring框架中用于声明Spring应用上下文中的bean的一种方式。在Spring Boot中,@Bean注解通常与@Configuration注解一起使用,在配置类(Configuration class)中定义bean。
1332 2