@Autowired和@Resource的区别详解

news/2024/12/4 18:31:56/

1. @Autowired 配置
首先介绍 @Autowired 注解的配置,通过该注解可以实现自动装配 Bean 的依赖。例如以下的 OrderService 类,通过 @Autowired 注解将其依赖的 OrderRepository 对象实例化并注入:
@Service
public class OrderService {
    
    @Autowired
    private OrderRepository orderRepository;
    
    // ...
}
需要注意的是,在默认情况下,@Autowired 会按照类型进行依赖注入。如果容器中有多个同类型的 Bean,则会抛出异常。这时如果需要指定具体的 Bean,可以使用 @Qualifier 注解来实现。


@Service
public class OrderService {
    
    @Autowired
    @Qualifier("orderRepositoryImpl")
    private OrderRepository orderRepository;
    
    // ...
}
另外,还可以在构造器、Setter 方法以及其他自定义方法上使用 @Autowired 注解进行依赖注入。
@Service
public class OrderService {
    
    private OrderRepository orderRepository;
    
    @Autowired
    public OrderService(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }
    
    /**
     * Setter injection.
     */
    @Autowired
    public void setOrderRepository(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }
    
    /**
     * Custom method injection.
     */
    @Autowired
    public void injectOrderRepository(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }
    
    // ...
}
2. @Resource 配置
接下来介绍 @Resource 注解的配置,同样可以实现自动装配 Bean 的依赖。相比于 @Autowired,它使用的是名称来进行依赖注入。

例如以下的 OrderService 类,通过 @Resource 注解将其依赖的 OrderRepository 对象实例化并注入:


@Service
public class OrderService {
    
    @Resource(name = "orderRepositoryImpl")
    private OrderRepository orderRepository;
    
    // ...
}
需要注意的是,默认情况下会根据属性名与 Bean 名称进行匹配。如果需要指定名称,则可以使用 name 属性来设置。

同时, @Resource 还支持 type 属性,可以按照类型来进行依赖注入。例如以下代码:


@Service
public class OrderService {
    
    @Resource(type = OrderRepository.class)
    private OrderRepository orderRepository;
    
    // ...
}
3. 区别比较
综上所述,两者的区别主要在于依赖注入的方式不同。

对于 @Autowired,它按照类型进行依赖注入,如果有多个同类型的 Bean 则需要使用 @Qualifier 来区分。而 @Resource 则按照名称或类型进行依赖注入,通过 name 或 type 属性进行配置。

在使用上,两者都可以实现自动装配 Bean 的依赖关系,但使用场景略有不同。一般情况下,如果我们只需要按照类型注入,那么优先使用 @Autowired。如果需要按照名称或类型注入,则优先使用 @Resource。

需要注意的是,在 Spring 5.1 及以上版本,@Autowired 和 @Qualifier 存在一个新的特性——默认注解值(Default Annotation Values)。即当按照类型进行注入时,可以通过 @Qualifier 注解的默认值来指定具体的 Bean 名称。这样 @Resource 在一定程度上的优势就被削弱了。
@Service
public class OrderService {
    
    @Autowired
    @Qualifier("orderRepositoryImpl")
    private OrderRepository orderRepository;
    
    // ...
}
因此,在使用时应该根据具体情况选择合适的注解来实现依赖注入。


http://www.ppmy.cn/news/66576.html

相关文章

【Linux】安装node-v16.17.0-linux

【Linux】安装node-v16.17.0-linux 1 下载node-v16.17.0-linux-x64.tar.xz 下载地址:https://nodejs.org/zh-cn 2 解压文件 cd 到node-v16.17.0-linux-x64.tar.xz所在的路径 xz -d node-v16.17.0-linux-x64.tar.xz tar -xvf node-v16.17.0-linux-x64.tar 3 软…

vim操作命令

基础操作: Vim(Vi Improved)是一个高效的文本编辑器,它提供了许多快捷键和命令来帮助您更快地编辑文本。以下是一些常用的Vim操作命令: 模式切换: 普通模式(Normal mode)&#xf…

linux运维知识点

Linux作为一种开源操作系统,被广泛地应用于企业、政府和私人用户的计算机系统中,其优越的稳定性、安全性和灵活性使得 Linux 成为了云计算、大数据和人工智能等最热门领域的重要组成部分。对于从事 Linux 运维的人员来说,了解其知识点和技能是…

vscode编辑器,vue、小程序等语言适配eslint格式校验 + prettier 保存时自动修改格式

目的:自留备份,用者自取 基础配置 1 基于vscode编辑器,prettier插件需要下载 2 eslint配置项规则: https://eslint.bootcss.com/docs/rules/ 3 prettier配置项规则: https://prettier.io/docs/en/options.html 安装…

Maven 依赖管理 学习

目录 Maven 依赖管理 可传递性依赖发现 依赖范围 依赖管理 Maven 自动化部署 问题描述 解决方案 修改项目的 pom.xml Maven Release 插件 Maven Web 应用 创建 Web 应用 构建 Web 应用 部署 Web 应用 Maven 依赖管理 Maven 一个核心的特性就是依赖管理。当我们处…

瑞云渲染农场怎么用,瑞云渲染多少钱一分钟?

Renderbus瑞云渲染农场作为亚洲前沿的 云渲染平台,一直以“做最好的云渲染工具”为愿景,紧跟CG行业的技术创新与发展,致力于提供专业可靠、安全稳定、可持续创新的云渲染解决方案,助力推动行业快速发展,被誉为中国云渲…

C++模板详解(函数模板、类模板)

hello,这里是bangbang,今天来讲下模板 目录 1. 泛型编程 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的实例化 2.4 模板参数的匹配原则 3. 类模板 3.1 类模板定义格式 3.2 类模板实例化 4. 非类型模板参数 5. 模板特化 5.1 模板特化概念 5.2…

C#套接字通信之UDP组播

文章目录 组播的概念简单示例组播的优势 组播的概念 UDP信息传递的方式分三类,分别是 单播 Unicast:客户端与服务器之间的点到点连接多播MultiCast:又称组播,是“一对一组”的通讯模式,加入同一个组的主机可以接受到…