Springboot 的三种注入方式对比

el/2024/5/21 21:11:04

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

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

我们分别来看下。

1、属性注入

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

@Service
public class BService {@AutowiredAService aService;//...
}

不光 @Autowired 可以实现注入,@Resouce 和 @inject 也是可以实现注入的
但不知道大家有没有发现在 idea 中 使用这种注入方式会有 一个警告,即 Field injection is not recommended (不推荐注入!)

属性注入其实有一个显而易见的缺点,那就是对于 IOC 容器以外的环境,除了使用反射来提供它需要的依赖之外,无法复用该实现类。因为该类没有提供该属性的 set方法或者相应的构造方法来完成该属性的初始化。换言之,要是使用属性注入,那么你这个类就只能在 IOC 容器中使用,要是想自己 new 一下这个类的对象,那么相关的依赖无法完成注入。

2、set 方法注入 (spring3.0时 推荐)

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

@Service
public class BService {AService aService;@Autowiredpublic void setaService(AService aService) {this.aService = aService;}
}

Spring 团队通常提倡 setter注入,因为当属性特别多的时候,构造方法看起来会特别臃肿,特别是当属性是可选的时(属性可选意味着没必要通过构造方法注入)。Setter方法注入还有一个好处就是可以使该类的属性可以在以后重新配置或重新注入。

3、构造方法注入 (spring4.0时 推荐)

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

如果类只有一个构造方法,那么 @Autowired 注解可以省略;如果类中有多个构造方法,那么需要添加上 @Autowired 来明确指定到底使用哪个构造方法。

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

上面这段话主要说了三件事:

  1. 依赖不可变:这个好理解,通过构造方法注入依赖,在对象创建的时候就要注入依赖,一旦对象创建成功,以后就只能使用注入的依赖而无法修改了,这就是依赖不可变(通过 set 方法注入将来还能通过 set 方法修改)。
  2. 依赖不为空:通过构造方法注入的时候,会自动检查注入的对象是否为空,如果为空,则注入失败;如果不为空,才会注入成功。
  3. 完全初始化:由于获取到了依赖对象(这个依赖对象是初始化之后的),并且调用了要初始化组件的构造方法,因此最终拿到的就是完全初始化的对象了。

http://www.ngui.cc/el/5277790.html

相关文章

SELECT 语句的执行过程

SELECT 语句的执行过程为:连接、查询缓存、词法分析,语法分析,语义分析,构造执行树,生成执行计划、执行器执行计划,下面开始梳理一次完整的查询流程: 连接器 连接器负责与客户端建立连接,获取…

Unity3D 旧版Animation. Time.timeScale = 0暂停,播放动画.

需要用到Time.timeScale 0暂停,但个别地方需要播放动画,在Time.timeScale 0前,开启下面的"播放动画"协程即可. IEnumerator PlayAnimation(Animation animation, string clipName, bool useTimeScale, System.Action onComplete…

C# 计算文件、字符串的MD5值

/// <summary> /// 计算字符串的MD5值 /// </summary> public static string md5(string source) {MD5CryptoServiceProvider md5 new MD5CryptoServiceProvider();byte[] data System.Text.Encoding.UTF8.GetBytes(source);byte[] md5Data md5.ComputeHash(dat…

Unity ParticleSystem 控制粒子移动到一个点,沿路径移动.

一、粒子移动到一个点. 方案1&#xff1a;粒子系统模拟空间为Local. private Transform m_Transform;private ParticleSystem m_ParticleSystem;private ParticleSystem.Particle[] m_particles;public Transform target_Trans; //目标位置.(手动拖拽)private Vector3 pos; …

Unity 贝塞尔曲线(Beizer curve)的原理与运用

前言&#xff1a;现在使用各种搜索引擎 搜索贝塞尔曲线&#xff0c;都会有很多介绍。这里自己写一篇博客&#xff0c;只是记录一下自己的学习过程与运用方法&#xff0c;方便后续回忆。 贝塞尔曲线原理 1、一阶贝塞尔曲线&#xff1a; 一阶贝塞尔曲线&#xff0c;其实就是找一…

IEnumerator、IEnumerable的理解

请直接看以下代码&#xff0c;用foreach来了解Ienumerator和IEnumerable的原理。 class Program{static void Main(string[] args){//1.int[] array_Int;array_Int new int[] { 1, 3, 2 };foreach (int item in array_Int){Console.WriteLine(item);}//2.int[] array_Int2;arr…

Unity 限制物体旋转角度的坑

按我的理解&#xff0c;在Unity中&#xff0c;角度在内部应该是用四元数表示的&#xff0c;所以&#xff0c;在Inspector面板展示的和实际打印出来的localEulerAngles值是不一样的。 直接上代码. /// <summary>/// 旋转值 数值规范.(-180——0——180)/// </summary&…

Unity 使用代码生成饼状图 PieChart

前言&#xff1a; 之前工作需要实现饼状图&#xff0c;这里记录一下用代码生成饼状图的方法. 最终效果如图 原理&#xff1a; 1.原理很简单&#xff0c;通过创建网格绘制各个饼状图基块&#xff0c;然后按角度合成即可. 2.如何创建网格&#xff0c;请直接看官方文档. 3.图像分…

Unity UGUI ScrollView无限滚动效果

一、发现需求 1、在UGUI中&#xff0c;使用 ScrollView 表格布局和字段自适应组件 就可以很好的实现列表功能。 2、如果列表中同时存在很多个Item时&#xff0c;显示区域却只显示一部分&#xff0c;就会造成性能不必要的浪费。 3、这时就想到&#xff0c;利用对象池相关知识…

Unity 模型描边的几种方法. (Shader、GL、代码生成描绘边)

前言 1、前段时间工作&#xff0c;需要给模型描边&#xff0c;由于对Shader不熟悉&#xff0c;就直接网上找了描边Shader文件&#xff0c;无奈项目发布环境是WebGL&#xff0c;WebGL对Shader的需求比较特殊&#xff0c;故无法使用。 2、因为项目需要描边的物体并不多&#xf…