还在使用@Autowired 吗?并不推荐使用!

简介: 还在使用@Autowired 吗?并不推荐使用!
既然标题说了不推荐使用 @Autowired 那肯定有好的代替它的啦,那就是@Resource 。 那 @Resource 是什么呢?下面我们去对比下 @Resource 和 @Autowired 的区别吧!
区别一

@Autowired 是 Spring 自带的注解
@Resource 是 J2EE提供,Spring 支持

区别二

@Autowired 默认按类型装配
@Resource 默认按照名称进行装配

我们一起看看 @Resource 的源码。

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Resource {
    String name() default "";

    Class<?> type() default Object.class;

    Resource.AuthenticationType authenticationType() default Resource.AuthenticationType.CONTAINER;

    boolean shareable() default true;

    String description() default "";

    String mappedName() default "";

    String lookup() default "";

    public static enum AuthenticationType {
        CONTAINER,
        APPLICATION;

        private AuthenticationType() {
        }
    }
}

从上面看到 @Resource 有两个重要的属性:name 和 type 。

上面虽然说了 "默认按照名称进行装配" 但是可以按照类型处理。

Spring 将 @Resource 注解的 name 属性解析为 bean 的名字,type 属性则解析为 bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用 byName 自动注入策略。

上面的话就是介绍了 @Resource 装配顺序:

  • 1 如果同时指定了 name 和 type ,则从 Spring 上下文中找到唯一匹配的 bean 进行装配,找不到则抛出异常
  • 2 如果指定了 name ,则从 Spring 上下文中查找名称(id)匹配的 bean 进行装配,找不到则抛出异常
  • 3 如果指定了 type ,则从 Spring 上下文中找到类型匹配的唯一 bean 进行装配,找不到或找到多个,都抛出异常
  • 4 如果既没指定 name ,也没指定 type ,则自动按照 byName 方式进行装配。如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

@Resource 大致讲完了,是不是感觉 @Autowired 和 @Resource 都差不多,只不过一个是根绝类型,一个是根据名称注入,什么建议使用 @Resource 呢?

这么说吧,因为 @Resource 是 java 自带的!以及在 idea 中不会有黄色提示线。而如果用 @Autowired 则 idea 会提示 "不建议使用字段注入 "。这可是喜欢干净的人的福利呀,为什么你还不用上呢?

相关文章
|
Linux 数据处理 开发者
Linux命令ld.bfd:二进制文件的强大链接器
`ld.bfd`是GNU链接器的变体,利用BFD库处理多种目标文件格式(如ELF, COFF)。它收集文件,解析符号,执行重定位,生成可执行文件。特点包括多格式支持,高效符号管理和诊断信息。常用命令如`ld.bfd -o output file1.o file2.o -lc`。注意文件路径、链接顺序,利用诊断信息和文档,保持工具更新以优化使用。
|
8月前
|
测试技术 Python
Python 的 for-else 循环结构是如何工作的?
本文介绍了Python中不太为人熟知但实用的`for-else`循环结构。通过示例讲解了其工作原理:当`for`循环正常结束而未遇到`break`时,执行`else`块。文章提供了两个应用场景——检查素数和列表搜索,帮助理解如何高效使用该结构。最后提醒,若无需条件跳出循环,普通`for`循环已足够。
377 33
|
Java Spring
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
`@RequiredArgsConstructor(onConstructor = @__(@Autowired))` 是一个注解,通常用于在类中生成一个包含所有`final`和`@NonNull`注解的字段的构造函数,并且对这些字段进行自动注入(使用Spring框架的`@Autowired`注解)。让我们详细解释一下: 1. **`@RequiredArgsConstructor` 注解:** - **作用:** Lombok 提供的注解,用于自动生成类的构造函数。 - **生成的构造函数:** 生成一个包含所有`final`字段的构造函数,同时也包括被`@NonNull`注解
1476 1
|
5月前
|
机器学习/深度学习 人工智能 负载均衡
大语言模型计算成本高,MoE如何有效降低成本?
本文由AI产品专家三桥君深入探讨混合专家(MoE)技术在大语言模型中的应用。MoE通过稀疏激活机制,仅激活与当前任务相关的专家子网络,显著降低计算成本(如LLaMA 4仅激活2-3个专家)。三桥君解析了MoE的核心原理,包括路由机制(动态选择专家)和共享专家(提升泛化能力)等关键技术,并对比传统Transformer模型。MoE的工作流程类比专业团队协作,支持高效推理和千亿级参数扩展。该技术重新定义AI模型标准,为突破性能瓶颈提供新思路。
325 0
|
传感器 IDE 物联网
ESP8266接入阿里云物联网平台上传温湿度数据
本文章使用NodeMCU(ESP8266)开发板和SHTC3温湿度传感器接入阿里云物联网(IoT)平台,并上传读取到的温湿度数据。
23008 6
ESP8266接入阿里云物联网平台上传温湿度数据
|
12月前
|
监控 NoSQL Java
若依RuoYi项目环境搭建教程(RuoYi-Vue + RuoYi-Vue3版本)
若依(RuoYi)是一款基于Spring Boot和Vue.js的开源Java快速开发脚手架,支持OAuth2、JWT鉴权,集成多种安全框架和持久化框架。它提供了系统管理、监控管理、任务调度、代码生成等常用功能模块,适合中小型公司快速搭建Web应用。本文主要介绍若依框架的特点、版本发展、优缺点及项目部署步骤,帮助开发者快速上手并部署若依项目。
13562 3
若依RuoYi项目环境搭建教程(RuoYi-Vue + RuoYi-Vue3版本)
|
存储 运维 监控
带你从概念、指标、标准这3方面了解所谓的数据中心。
带你从概念、指标、标准这3方面了解所谓的数据中心。
1063 0
|
消息中间件 存储 Kafka
实时计算 Flink版产品使用问题之有5个并行度,但只有其中1个并行度有数据,是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
消息中间件 分布式计算 大数据
大数据处理工具及其与 Kafka 的搭配使用
大数据处理工具及其与 Kafka 的搭配使用
270 2
|
分布式计算 并行计算 数据处理
NumPy的并行与分布式计算实践
【4月更文挑战第17天】本文探讨了如何使用NumPy进行并行和分布式计算以提升效率。介绍了利用`numexpr`加速多核CPU计算,设置`NUMPY_NUM_THREADS`环境变量实现多线程,并通过Dask和PySpark进行分布式计算。Dask允许无缝集成NumPy,而PySpark则将NumPy数组转换为RDD进行并行处理。这些方法对处理大规模数据至关重要。

热门文章

最新文章