当前位置:首页 > 科技  > 软件

private final、@Autowired、@Resource你更喜欢哪个?

来源: 责编: 时间:2023-10-23 17:05:42 187观看
导读一、引言现在有一些流言,想必大多都是非Java程序员对Java程序员的称谓或者嘲讽:“spring boy”。相信现在大家基本上都是使用的基于spring或者SpringBoot框架构建公司的各种业务应用,这个称谓对我们来说也没有啥了。不过

一、引言

现在有一些流言,想必大多都是非Java程序员对Java程序员的称谓或者嘲讽:“spring boy”。CYi28资讯网——每日最新资讯28at.com

相信现在大家基本上都是使用的基于spring或者SpringBoot框架构建公司的各种业务应用,这个称谓对我们来说也没有啥了。CYi28资讯网——每日最新资讯28at.com

不过就有一种嘲讽的意思是脱离了Spring我们就不能开发了。CYi28资讯网——每日最新资讯28at.com

不知道大家是什么感受,不过了不起不以为然,没了spring就自己定义一套处理流程...CYi28资讯网——每日最新资讯28at.com

不过目前了不起也还是使用spring生态,今天有个项目中出现了三种注入bean的方式,@Resource、@Autowired、private final,我们一起来看一看吧。CYi28资讯网——每日最新资讯28at.com

二、Bean的注入

这里是一个简单的示例代码,演示了 @Resource、@Autowired和 private final三种注入方式的使用:CYi28资讯网——每日最新资讯28at.com

publicclassMyService{@Resourceprivate MyDependency resourceDependency;@Autowiredprivate MyDependency autowiredDependency;privatefinal MyDependency finalDependency;publicMyService(MyDependency finalDependency){this.finalDependency = finalDependency;    }  // ...}publicclassMyDependency{// ...}

在上面的示例中,MyService类使用了三种不同的方式来注入 MyDependency依赖。CYi28资讯网——每日最新资讯28at.com

@Resource和 @Autowired注解用于注入可变的依赖,而 private final方式用于注入不可变的依赖。CYi28资讯网——每日最新资讯28at.com

这三种方式都是目前注入bean的方式,也常被面试官提及发问,不管你使用哪种方式,都是可以的。CYi28资讯网——每日最新资讯28at.com

三、@Resource

@Resource的原理:@Resource注解是Java标准库提供的一种依赖注入方式。CYi28资讯网——每日最新资讯28at.com

在Spring中,@Resource注解的处理由 CommonAnnotationBeanPostProcessor类负责。CYi28资讯网——每日最新资讯28at.com

该类是一个Bean后置处理器,用于处理使用了 @Resource注解的字段或方法参数。CYi28资讯网——每日最新资讯28at.com

CommonAnnotationBeanPostProcessor在Spring的容器初始化过程中起作用,它会扫描所有的Bean定义,并检查是否存在使用了 @Resource注解的字段或方法参数。CYi28资讯网——每日最新资讯28at.com

当检测到这样的注解时,它会解析注解中指定的名称(name),并尝试查找匹配的依赖。CYi28资讯网——每日最新资讯28at.com

具体地说,CommonAnnotationBeanPostProcessor使用了Java的反射机制来解析注解,并通过 javax.annotation.Resource规范中定义的算法来查找匹配的依赖。根据规范,@Resource注解默认按照字段或方法参数的名称进行依赖的匹配,也可以通过 name属性指定特定的依赖名称。CYi28资讯网——每日最新资讯28at.com

@Resource的使用方式:@Resource注解可以用于字段、方法和构造函数上,用于指定要注入的依赖。下面是几种常见的使用方式:CYi28资讯网——每日最新资讯28at.com

  • 字段注入:
publicclassMyService{@Resourceprivate MyDependency dependency;// ...}
  • 方法注入:
publicclassMyService{private MyDependency dependency;@ResourcepublicvoidsetDependency(MyDependency dependency){this.dependency = dependency;    }// ...}
  • 构造函数注入:
publicclassMyService{private MyDependency dependency;@ResourcepublicMyService(MyDependency dependency){this.dependency = dependency;    }// ...}

在上述示例中,@Resource注解用于标记要注入的依赖,并根据默认的名称匹配规则或显式指定的名称来查找依赖。CYi28资讯网——每日最新资讯28at.com

需要注意的是,@Resource注解是Java标准库中的注解,因此它可以与Java SE和Java EE应用程序一起使用,不仅限于Spring框架。CYi28资讯网——每日最新资讯28at.com

总结起来,@Resource注解是Java标准库提供的一种依赖注入方式,在Spring中借助 CommonAnnotationBeanPostProcessor来实现。它可以用于标记要注入的依赖,并根据名称匹配规则或显式指定的名称来查找依赖。CYi28资讯网——每日最新资讯28at.com

四、@Autowired

当涉及到 @Autowired注解的原理、使用方式以及与 @Resource注解的区别时,我们需要了解它在Spring中的实现方式。下面我将详细解释 @Autowired的原理、使用方式以及与 @Resource注解的区别。CYi28资讯网——每日最新资讯28at.com

@Autowired的原理:

@Autowired注解是Spring Framework提供的一种依赖注入方式。它通过 AutowiredAnnotationBeanPostProcessor类来实现。AutowiredAnnotationBeanPostProcessor是一个Bean后置处理器,用于处理使用了 @Autowired注解的字段、方法或构造函数参数。CYi28资讯网——每日最新资讯28at.com

在Spring的容器初始化过程中,AutowiredAnnotationBeanPostProcessor会扫描所有的Bean定义,检查是否存在使用了 @Autowired注解的字段、方法或构造函数参数。当检测到这样的注解时,它会解析注解,并根据依赖的类型来寻找匹配的Bean,并将其注入到目标对象中。CYi28资讯网——每日最新资讯28at.com

具体来说,AutowiredAnnotationBeanPostProcessor使用了Java的反射机制来解析 @Autowired注解,并利用Spring容器中的Bean定义信息来查找匹配的依赖。它支持按照类型、名称和限定符等方式进行依赖的解析和注入。CYi28资讯网——每日最新资讯28at.com

@Autowired的使用方式:

@Autowired注解可以用于字段、方法和构造函数上,用于指定要注入的依赖。下面是几种常见的使用方式:CYi28资讯网——每日最新资讯28at.com

  • 字段注入:
public class MyService {    @Autowired    private MyDependency dependency;    // ...}```
  • 方法注入:
public class MyService {    private MyDependency dependency;    @Autowired    public void setDependency(MyDependency dependency) {        this.dependency = dependency;    }    // ...}```
  • 构造函数注入:
public class MyService {    private MyDependency dependency;    @Autowired    public MyService(MyDependency dependency) {        this.dependency = dependency;    }    // ...}```

在上述示例中,@Autowired注解用于标记要注入的依赖。Spring会根据依赖的类型(或名称和限定符)自动查找匹配的Bean,并将其注入到目标对象中。CYi28资讯网——每日最新资讯28at.com

@Autowired与@Resource的区别:

尽管 @Autowired和 @Resource都是用于依赖注入的注解,但它们在一些方面有一些区别。CYi28资讯网——每日最新资讯28at.com

  1. 来源和依赖关系:@Autowired是Spring特有的注解,用于实现Spring的依赖注入机制。它通过类型匹配来解析依赖关系。而 @Resource是Java标准库中的注解,它可以与Java SE和Java EE应用程序一起使用,不仅限于Spring框架。@Resource通过名称匹配来解析依赖关系。
  2. 配置方式:@Autowired注解通常与 @Component、@Service等Spring注解一起使用,通过组件扫描和自动装配来实现依赖注入。而 @Resource注解不需要特定的配置,它可以直接用于字段、方法和构造函数上。
  3. 名称匹配规则:@Autowired注解默认按照类型进行依赖的匹配。如果存在多个匹配的Bean,可以使用 @Qualifier注解指定特定的Bean名称或限定符。而 @Resource注解默认按照名称进行依赖的匹配,也可以通过 name属性指定特定的依赖名称。
  4. 兼容性:由于 @Resource是Java标准库中的注解,因此它可以与Java SE和Java EE应用程序一起使用,并且在不同的容器中具有较好的兼容性。相比之下,@Autowired注解是Spring特有的注解,主要用于Spring框架中,因此在非Spring环境中可能无法正常使用。
  5. Null处理:当无法找到匹配的依赖时,@Autowired注解的字段或方法参数可以为 null,而 @Resource注解要求必须找到匹配的依赖,否则会抛出异常。

需要注意的是,尽管 @Autowired和 @Resource有一些区别,但在大多数情况下,它们可以互换使用。CYi28资讯网——每日最新资讯28at.com

如果您只是简单地进行依赖注入,并且不需要关注兼容性问题,那么两者的选择取决于个人偏好。CYi28资讯网——每日最新资讯28at.com

五、priavet final

private final字段的自动注入原理:

在Spring Boot中,对于 private final字段的自动注入,Spring使用构造函数注入(Constructor Injection)来实现。当一个Bean有一个或多个 private final字段需要注入时,Spring会尝试在容器中查找与这些字段类型匹配的Bean,并使用构造函数注入来实例化Bean对象。CYi28资讯网——每日最新资讯28at.com

构造函数注入的原理是,Spring会查找与构造函数参数类型匹配的Bean,并将它们作为参数传递给构造函数,从而实现对 private final字段的赋值。CYi28资讯网——每日最新资讯28at.com

private final字段的使用方式:

在使用 private final字段进行自动注入时,需要遵循以下几个步骤:CYi28资讯网——每日最新资讯28at.com

  1. 定义一个带有private final字段的类,并确保该类是一个Spring Bean。
@Componentpublic class MyService {    private final MyDependency dependency;    public MyService(MyDependency dependency) {        this.dependency = dependency;    }    // ...}```
  1. 在类的构造函数中接收依赖参数,并将其赋值给 private final字段。
  2. Spring Boot会自动扫描并创建Bean实例,同时检测到带有 private final字段的构造函数,会自动解析依赖并进行注入。

需要注意的是,由于 private final字段是不可变的,一旦注入后就无法修改。这种不可变性有助于确保字段的安全性和线程安全性。CYi28资讯网——每日最新资讯28at.com

六、总结

了不起和大家聊的springBean三种注入方式大家都烂熟于心了,具体使用还是看个人喜好,并无优劣之分。CYi28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-14609-0.htmlprivate final、@Autowired、@Resource你更喜欢哪个?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 揭示Lombok的代码设计缺陷:探索封装问题

下一篇: Go并发可视化解释:sync.WaitGroup

标签:
  • 热门焦点
  • 鸿蒙OS 4.0公测机型公布:甚至连nova6都支持

    鸿蒙OS 4.0公测机型公布:甚至连nova6都支持

    华为全新的HarmonyOS 4.0操作系统将于今天下午正式登场,官方在发布会之前也已经正式给出了可升级的机型产品,这意味着这些机型会率先支持升级享用。这次的HarmonyOS 4.0支持
  • 一加Ace2 Pro官宣:普及16G内存 引领24G

    一加Ace2 Pro官宣:普及16G内存 引领24G

    一加官方今天继续为本月发布的新机一加Ace2 Pro带来预热,公布了内存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引领,还有呢?#一加Ace2Pro#,2023 年 8 月,敬请期待。”同时
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 三万字盘点 Spring 九大核心基础功能

    三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 三分钟白话RocketMQ系列—— 如何发送消息

    三分钟白话RocketMQ系列—— 如何发送消息

    我们知道RocketMQ主要分为消息 生产、存储(消息堆积)、消费 三大块领域。那接下来,我们白话一下,RocketMQ是如何发送消息的,揭秘消息生产全过程。注意,如果白话中不小心提到相关代
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为“纯欲天花板”的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 认真聊聊东方甄选:如何告别低垂的果实

    认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的“网红”。7月5日至9日,为期5天的东方甄选“甘肃行”首次在自有App内直播,
  • 半导体需求下滑 三星电子DS业务部门今年营业亏损预计超10万亿韩元

    半导体需求下滑 三星电子DS业务部门今年营业亏损预计超10万亿韩元

    7月17日消息,据外媒报道,去年下半年开始的半导体需求下滑,影响到了三星电子、SK海力士、英特尔等诸多厂商,营收明显下滑,部分厂商甚至出现了亏损。作为
  • 到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
Top
Baidu
map