热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于java:扯一把Spring的三种注入方式到底哪种注入方式最佳

@循环依赖这个问题,按理说咱们在日常的程序设计中应该防止,其实这个原本也是可能防止的。不过因为总总起因,咱们可能还是会遇到一些循环依赖的问题,特地是在面试的过程中,面试考查循环依赖
文章目录[隐藏]
  • 1. 实例的注入形式
  • 2. 实例注入形式大 PK
  • 3. 小结

@[toc]
循环依赖这个问题,按理说咱们在日常的程序设计中应该防止,其实这个原本也是可能防止的。不过因为总总起因,咱们可能还是会遇到一些循环依赖的问题,特地是在面试的过程中,面试考查循环依赖,次要是想考查候选人对 Spring 源码的相熟水平,因为要把循环依赖这个问题解释分明,波及到不少 Spring 源码。

明天松哥抽空和大家简略聊聊这个话题,问题比拟宏大,我可能花几篇文章来和大家分享下,明天先来聊聊实例的注入形式。

1. 实例的注入形式

首先来看看 Spring 中的实例该如何注入,总结起来,无非三种:

  • 属性注入
  • set 办法注入
  • 构造方法注入

咱们别离来看下。

1.1 属性注入

属性注入是大家最为常见也是应用最多的一种注入形式了,代码如下:

@Service
public class BService {
    @Autowired
    AService aService;
    //...
}

这里是应用 @Autowired 注解注入。另外也有 @Resource 以及 @Inject 等注解,都能够实现注入。

不过不晓得小伙伴们有没有注意过,在 IDEA 里边,应用属性注入,会有一个正告⚠️:

不举荐属性注入!

起因咱们前面探讨。

1.2 set 办法注入

set 办法注入太过于臃肿,实际上很少应用:

@Service
public class BService {
    AService aService;

    @Autowired
    public void setaService(AService aService) {
        this.aService = aService;
    }
}

这代码看一眼都感觉好受,坚定不必。

1.3 构造方法注入

构造方法注入形式如下:

@Service
public class AService {
    BService bService;
    @Autowired
    public AService(BService bService) {
        this.bService = bService;
    }
}

如果类只有一个构造方法,那么 @Autowired 注解能够省略;如果类中有多个构造方法,那么须要增加上 @Autowired 来明确指定到底应用哪个构造方法。

2. 实例注入形式大 PK

下面给大家列出来了三种注入形式,那么三种注入形式各自有何区别呢?

联合 Spring 官网文档,咱们来剖析下。

松哥翻出了 12 年前的 Spring3.0 的文档(https://docs.spring.io/spring…),里边有如下一段话:

我来简略翻译下(意译):

应用构造方法注入还是应用 set 办法注入?
因为构造方法注入和 set 办法注入能够混合应用,因而,如果须要强制注入,咱们能够应用构造方法注入的形式;如果是可选注入,则咱们能够应用 set 办法注入的形式。当然,咱们在 setter 上应用 @Required 注解能够让 set 办法注入也变为强制性注入。
Spring 团队通常提倡 setter 注入,因为当属性特地多的时候,构造方法看起来会特地臃肿,特地是当属性是可选的时(属性可选意味着没必要通过构造方法注入)。Setter 办法注入还有一个益处就是能够使该类的属性能够在当前重新配置或从新注入。
一些纯正主义者喜爱基于构造函数的注入,这样意味着所有的属性都被初始化了,毛病则是对象变得不太适宜重新配置和从新注入。
另外在一些非凡的场景下,如一个第三方类要注入到 Spring 容器,然而该类没有提供 set 办法,那么此时你就只能应用构造方法注入了。

英文程度无限,大略翻译了下。小伙伴们重点看加粗局部,也就是说在 Spring3.0 时代,官网还是提倡 set 办法注入的。

不过从 Spring4.x 开始,官网就不举荐这种注入形式了,转而举荐结构器注入。

咱们来看看 Spring4.x 的文档怎么说(https://docs.spring.io/spring…):

这段内容我就不一一翻译了,大家重点看第二段第一句:

The Spring team generally advocates constructor injection

这句话就是说 Spring 团队提倡通过构造方法实现注入。才一个大版本更新,Spring 咋就变了呢?别急,人家也给出用构造方法注入的理由,第二段翻译一下大略是这个意思:

通过构造方法注入的形式,可能保障注入的组件不可变,并且可能确保须要的依赖不为空。此外,构造方法注入的依赖总是可能在返回客户端(组件)代码的时候保障齐全初始化的状态。

下面这段话次要说了三件事:

  1. 依赖不可变:这个好了解,通过构造方法注入依赖,在对象创立的时候就要注入依赖,一旦对象创立胜利,当前就只能应用注入的依赖而无奈批改了,这就是依赖不可变(通过 set 办法注入未来还能通过 set 办法批改)。
  2. 依赖不为空:通过构造方法注入的时候,会主动查看注入的对象是否为空,如果为空,则注入失败;如果不为空,才会注入胜利。
  3. 齐全初始化:因为获取到了依赖对象(这个依赖对象是初始化之后的),并且调用了要初始化组件的构造方法,因而最终拿到的就是齐全初始化的对象了。

在 Spring3.0 文档中,官网说如果构造方法注入的话,属性太多可能会让代码变得十分臃肿,那么在 4.0 文档中,官网对这个说法也做了一些勘误:如果用构造方法注入的时候,参数过多以至于代码过于臃肿,那么此时你须要思考这个类的设计是否正当,这个类是否参杂了太多的其余无关性能,这个类是否做到了繁多职责。

好吧,你说的总是有理!

这是构造方法注入和 set 办法注入的问题,那么下面咱们还提到不举荐属性注入,这又是咋回事呢?

属性注入其实有一个不言而喻的毛病,那就是对于 IOC 容器以外的环境,除了应用反射来提供它须要的依赖之外,无奈复用该实现类。因为该类没有提供该属性的 set 办法或者相应的构造方法来实现该属性的初始化。换言之,要是应用属性注入,那么你这个类就只能在 IOC 容器中应用,要是想本人 new 一下这个类的对象,那么相干的依赖无奈实现注入。

以上剖析都是依据 Spring 官网文档得来,日常开发应该还是属性注入较多,这个咱们不用纠结,代码该咋写还咋写,Spring 官网的态度理解一下即可,当然,如果我的项目容许,也无妨试试 Spring 举荐的代码标准。

3. 小结

好啦,明天就和小伙伴们轻易扯扯 Spring 中的注入形式,因为我最近又要从新捡起 Spring 源码剖析了,所以先来个简略的预热一下哈哈~



推荐阅读
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 标题: ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • IB 物理真题解析:比潜热、理想气体的应用
    本文是对2017年IB物理试卷paper 2中一道涉及比潜热、理想气体和功率的大题进行解析。题目涉及液氧蒸发成氧气的过程,讲解了液氧和氧气分子的结构以及蒸发后分子之间的作用力变化。同时,文章也给出了解题技巧,建议根据得分点的数量来合理分配答题时间。最后,文章提供了答案解析,标注了每个得分点的位置。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
author-avatar
一个怪瓜的自白
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有