Spring中@Autowired和@Resource注解异同点

简介: Spring中@Autowired和@Resource注解异同点

概述

@Autowired@Resource 是在 Java 开发中用于实现依赖注入的注解。

@AutowiredSpring 框架提供的注解,用于自动装配(自动注入)依赖。通过在需要注入依赖的字段、构造方法或者方法上使用 @Autowired 注解,Spring 容器会自动寻找匹配类型的 Bean,并将其注入到被注解的位置。如果存在多个满足条件的 Bean,则可以使用 @Qualifier 注解指定具体的 Bean。

@Resource 是 JavaEE 规范提供的注解,也可用于依赖注入。它可以根据名称或者类型进行依赖注入。当使用名称进行依赖注入时,@Resource 注解会根据指定的名称去查找匹配的 Bean 进行注入;当使用类型进行依赖注入时,@Resource 注解会使用类型去查找匹配的 Bean 进行注入。

相同点

1.都可以实现依赖注入

通过注解将需要的Bean自动注入到目标类中。

2.都可以用于注入任意类型的Bean

包括类、接口、原始类型、数组等。

3.都支持通过名称、类型匹配进行注入

@Autowired 注解默认按照类型匹配,而 @Resource 注解默认按照名称匹配

@Autowired
private Bean beanA;
@Resource
private Bean beanB;

在Spring容器中这两个注解功能基本是等价的,都可以将bean注入到对应的字段中。

不同点

虽然功能上看起来基本相同还是存在区别的下面从几个不同方面分析

1.来源不同。

@Autowired 是 Spring 框架提供的注解。

@Resource 是 JavaEE(现在的 JakartaEE)规范中定义的注解。

2.包含的属性不同

@Autowired 只包含一个参数:required,表示是否开启自动注入,默认是true。

@Resource 包含七个参数,其中最重要的两个参数是:name 和 type。

3.匹配方式(装配顺序)不同。

@Autowired 默认先按照类型进行自动装配,再是根据名称的方式。意思就是先在Spring容器中找以Bean为类型的Bean实例,如果找不到或者找到多个bean,则会进一步通过字段名称来找。当有多个同类型的 Bean 存在时,也可以通过 @Qualifier 注解指定具体的 Bean。

@Component
public class UserService {
    @Autowired
    @Qualifier("userRepository")//如果有多个同类型的Bean,可以使用@Qualifier注解指定具体的Bean
    private UserRepository userRepository;
    // ...
}

@Resource@Autowired恰好相反,先是按照名称方式,然后再是按照类型方式;当然,我们也可以通过注解中的参数显示指定通过哪种方式。如果有多个同名的Bean,可以使用@Resource注解的name属性指定具体的Bean

默认使用

@Component
public class UserService {
    @Resource//不指定任何属性
    private UserRepository userRepository;
    // ...
}

指定name

@Component
public class UserService {
    @Resource(name = "userRepository")//使用name属性指定具体的Bean
    private UserRepository userRepository;
    // ...
}

指定type

@Component
public class UserService {
    @Resource(type = UserRepository.class)//使用type属性指定Bean类型
    private UserRepository userRepository;
    // ...
}

指定name和type

@Component
public class UserService {
    @Resource(type = "UserRepository.class",name = "userRepository")//使用type属性指定Bean类型,name指定Bean名称
    private UserRepository userRepository;
    // ...
}

4.支持的注入对象类型不同

@Autowired 可以注入任何类型的对象,只要 Spring 容器中存在该类型的 Bean。

@Resource 注解可以用于注入 JNDI 名称(JNDI名称可以是任何字符串,但通常使用具有描述性的名称来标识资源。在应用程序中,可以使用JNDI名称来查找和绑定对象)或者默认按照名称匹配的 Bean

5.应用地方不同

@Autowired能够用在:构造器、方法、参数、成员变量和注解上

@Resource能用在:类、成员变量和方法上。

目录
相关文章
|
5天前
|
Java 开发者 Spring
深入理解Spring Boot的@ComponentScan注解
【4月更文挑战第22天】在构建 Spring Boot 应用时,@ComponentScan 是一个不可或缺的工具,它使得组件发现变得自动化和高效。这篇博客将详细介绍 @ComponentScan 的基本概念、关键属性及其在实际开发中的应用。
23 4
|
7天前
|
Java 开发者 Spring
Spring Framework 中的 @Autowired 注解:概念与使用方法
【4月更文挑战第20天】在Spring Framework中,@Autowired 注解是实现依赖注入(Dependency Injection, DI)的一种非常强大的工具。通过使用 @Autowired,开发者可以减少代码中的引用绑定,提高模块间的解耦能力
29 6
|
1月前
|
XML Java 数据库连接
spring boot 参数的过滤注解与实战
在Spring Boot应用中,对于入参的过滤,通常会涉及到对Web层的数据验证和处理。Spring Boot借助Spring框架提供了强大的验证框架支持,主要基于JSR-303/JSR-380(Bean Validation API)规范,以及Spring自身的@Valid或@Validated注解来实现请求参数的验证。以下是一些常见的使用案例来展示如何对参数进行过滤和验证。
29 1
|
15天前
|
XML Java 数据格式
进阶注解探秘:深入Spring高级注解的精髓与实际运用
进阶注解探秘:深入Spring高级注解的精髓与实际运用
26 2
|
15天前
|
XML Java 数据格式
从入门到精通:Spring基础注解的全面解析
从入门到精通:Spring基础注解的全面解析
32 2
从入门到精通:Spring基础注解的全面解析
|
19天前
|
Java 容器
SpringBoot使用配置注解开启自动配置功能&整合spring-boot-configuration-processor
SpringBoot使用配置注解开启自动配置功能&整合spring-boot-configuration-processor
15 0
|
30天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
43 0
|
2月前
|
缓存 Java Maven
Spring Boot自动配置原理
Spring Boot自动配置原理
48 0
|
1月前
|
缓存 安全 Java
Spring Boot 面试题及答案整理,最新面试题
Spring Boot 面试题及答案整理,最新面试题
111 0
|
1月前
|
前端开发 搜索推荐 Java
【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革
【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革