1、什么是依赖注入

依赖注入(Dependency Injection,简称DI),是IOC的一种别称,用来减少对象间的依赖关系。

提起依赖注入,就少不了IOC。

IOC(Inversion of Control,控制反转)是一种设计思想,它将原本在程序中手动创建对象的控制权,交由Spring框架来管理。

IOC和DI,是同一个概念的不同角度描述。(IOC是一种思想,DI则是该思想的一种具体的技术实现方案。)

也可以这么理解:

IOC是目的(目的是创建对象),DI是手段(通过什么手段获取外部对象)。

2、依赖注入的常见实现方式

  • 构造函数注入
  • setter方法注入
  • 属性注入

2.1 构造函数注入

将各个必需的依赖全部放在带有注解构造方法的参数中,并在构造方法中完成对应变量的初始化,这种方式,就是基于构造方法的注入。

@RestController
public class UserController {
// 构造方法注入
private UserService userService; @Autowired
public UserController(UserService userService) {
this.userService = userService;
} @RequestMapping("/add")
public UserInfo add(String username, String password) {
return userService.add(username, password);
}
}

该方式的优点:

  • 可注入不可变对象
  • 注入对象不会被修改
  • 注入对象会被完全初始化
  • 通用性更好

该方式的缺点:

  • 当需要依赖的对象过多,构造方法会臃肿

2.2 setter方法注入

在JavaBean中,通常会通过setXXX()和getXXX()方法来访问对应属性。

这些setXXX()方法统称为setter方法,getXXX()方法统称为getter方法。

通过setter方法,可以更改相应的对象属性,通过getter方法,可以获得相应属性的状态。

所以,当前对象只要为其依赖对象所对应的属性添加setter方法,就可以通过setter方法将相应的依赖对象设置到被注入对象中。

@Service
public class UserService { private SmsService smsService; @Autowired //通过setter方法实现注入
public void setWolf3Bean(SmsService smsService) {
this.smsService = smsService;
}
}

该方式的优点:

  • 完全符合单一职责的设计原则,因为每一个 Setter 只针对一个对象

该方式的缺点:

  • 不能注入不可变对象(final 修饰的对象)
  • 注入的对象可被修改

2.3 属性注入

属性注入,就是在bean的变量上使用注解进行依赖注入。

属性注入是我们最熟悉的,也是日常开发中使用最多的一种注入方式,它的实现代码如下:

@RestController
public class UserController {
// 属性对象
@Autowired
private UserService userService; @RequestMapping("/add")
public UserInfo add(String username, String password) {
return userService.add(username, password);
}
}

该方式的优点:

  • 使用简单

该方式的缺点:

  • 不能注入不可变对象(final 修饰的对象)
  • 注入的对象可被修改
  • 只能适应于 IoC 容器

3、总结

在实际开发中,根据不同的场景,选择不同的注入方式。

简单来说,就是

  • 强制依赖就用构造器方式
  • 可选、可变的依赖就用setter注入

但,日常开发应该还是属性注入较多~

Spring的三种依赖注入的方式的更多相关文章

  1. Spring学习(十八)Bean 的三种依赖注入方式介绍

    依赖注入:让调用类对某一接口实现类的依赖关系由第三方注入,以移除调用类对某一接口实现类的依赖.接下来将详细的向大家介绍Spring容器支持的三种依赖注入的方式以及具体配置方法:•    属性注入方法• ...

  2. 深入浅出spring IOC中三种依赖注入方式

    深入浅出spring IOC中三种依赖注入方式 spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和 ...

  3. Spring中三种配置Bean的方式

    Spring中三种配置Bean的方式分别是: 基于XML的配置方式 基于注解的配置方式 基于Java类的配置方式 一.基于XML的配置 这个很简单,所以如何使用就略掉. 二.基于注解的配置 Sprin ...

  4. (转)Spring的三种实例化Bean的方式

    http://blog.csdn.net/yerenyuan_pku/article/details/52832793 Spring提供了三种实例化Bean的方式. 使用类构造器实例化. <be ...

  5. 【SSH系列】深入浅出spring IOC中三种依赖注入方式

    spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入什么?控 ...

  6. spring IOC中三种依赖注入方式

    Spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则,用来消减计算机程序之间的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入 ...

  7. Android Studio项目中三种依赖的添加方式

    通常一个AS项目中的依赖关系有三种,一是本地依赖(主要是对本地的jar包),二是模块依赖,三是远程依赖:添加这些依赖的目的在于上我们想要在项目的某一个模块中使用其中的功能,比如okttp这个网络框架库 ...

  8. [心得笔记]spring常用的三种依赖注入方式

    一.目前使用最广泛的 @Autowired:自动装配 基于@Autowired的自动装配,默认是根据类型注入,可以用于构造器.接口.方法注入,使用方式如下: @Autowired 构造方法.方法.接口 ...

  9. Spring第四弹—–Spring的三种实例化bean的方式

    1.使用类构造器实例化   1 <bean id=“orderService" class="cn.itcast.OrderServiceBean"/> 2. ...

  10. Spring4学习回顾之路03—XML配置Bean ,依赖注入的方式

    配置Bean的形式可以基于XML文件的方式,也可以基于注解的方式,而Bean的配置方式可以通过全类名(反射),通过工厂方式和FactoryBean. XML形式 <?xml version=&q ...

随机推荐

  1. 校园圈子系统前后端安装开发app小程序h5

    四川掌上时代开发公司,作为一家专注于提供高质量软件解决方案的企业,在信息技术领域已经积累了丰富的经验和良好的声誉.位于中国四川省成都市,该公司不仅服务于本地市场,还将业务拓展到了全国乃至国际市场,与多 ...

  2. Mysql8.0在windows系统安装一直卡在Starting the server的解决方案

    报错:Beginning configuration step: Starting Server Attempting to start service MySQL80 一直卡在这里,手动启动服务也起 ...

  3. uni.request二次封装

    点击查看代码 const baseUrl = 'https://your-api-base-url.com'; function getAuthToken() { // 获取token的逻辑,可能会从 ...

  4. C语言(较深入原理):%s通过字符串首元素地址输出,用指针数组来作示例

    首先,我们输出一个字符串都知道是用%s来输出,但是我们并没有多想是通过什么方式来输出的. 今天我在看指针数组的时候发现了一个问题,按就是定义一个字符类型的指针数组, /*字符串的输出本身就需要他的地址 ...

  5. c 语言不输出空数据 (全面覆盖)

    目录 去除空值的专栏 解决方案 一.通过数组的自身性质,让其值大于零 1. short 数组测试 2. int 数组测试 3. long 数组测试 4. float 数组测试 5. float 数组测 ...

  6. 用 C 语言开发一门编程语言 — 字符串与文件加载

    目录 文章目录 目录 前文列表 字符串 读取字符串 注释 文件加载函数 命令行参数 打印函数 报错函数 源代码 前文列表 <用 C 语言开发一门编程语言 - 交互式解析器> <用 C ...

  7. Pageoffice6 实现后台批量生成Word文档

    在实际项目开发中经常会遇到后台动态生成文档的需求,目前网上有一些针对此需求的方案,如果您想要了解这些方案的对比,请查看后台生成单个Word文档中的"方案对比". 如果一次只生成一份 ...

  8. pageOffice插件 springboot实现服务器上Word文档在线打开编辑保存

    需求: 在oa系统上,想实现在线,服务器上doc,docx文档,在web打开,编辑.编辑后,可以再同步保存到服务器端. 开发环境: java springboot,thymeleaf 服务器环境: 无 ...

  9. 腾讯云服务器Ubuntu-配置mysql,nginx,nodejs

    ​趁着618腾讯云服务器的促销活动,笔者买了最低配置的云服务器,用作学习. 接上一篇文章的内容,系统方面选择了Ubuntu,版本是20.04 LTS. 选择Ubuntu的原因,主要是因为Ubuntu一 ...

  10. windows下载安装ipopt求解器 可用于pyomo调用

    方案一:采用官方编译的应用程序 官方对windows下有已经编译好的应用程序,只需要下载下来,并将ipopt的应用程序所在文件夹路径添加到系统全局环境变量就可以了.这样在利用pyomo或者其他建模工具 ...