写点什么

Spring 的三种依赖注入的方式

  • 2024-07-04
    福建
  • 本文字数:1297 字

    阅读完需:约 4 分钟

1、什么是依赖注入


依赖注入(Dependency Injection,简称 DI),是 IOC 的一种别称,用来减少对象间的依赖关系。提起依赖注入,就少不了 IOC。IOC(Inversion of Control,控制反转)是一种设计思想,它将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。


IOC 和 DI,是同一个概念的不同角度描述。(IOC 是一种思想,DI 则是该思想的一种具体的技术实现方案。)也可以这么理解:IOC 是目的(目的是创建对象),DI 是手段(通过什么手段获取外部对象)。


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


  • 构造函数注入

  • setter 方法注入

  • 属性注入


2.1 构造函数注入


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

@RestControllerpublic 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 方法将相应的依赖对象设置到被注入对象中。

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


该方式的优点:

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


该方式的缺点:

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

  • 注入的对象可被修改


2.3 属性注入


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


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

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


该方式的优点:

  • 使用简单


该方式的缺点:

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

  • 注入的对象可被修改

  • 只能适应于 IoC 容器


3、总结


在实际开发中,根据不同的场景,选择不同的注入方式。简单来说,就是

  • 强制依赖就用构造器方式

  • 可选、可变的依赖就用 setter 注入


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


文章转载自:树叶的一生啊

原文链接:https://www.cnblogs.com/anboy/p/18281768

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
Spring的三种依赖注入的方式_Java_不在线第一只蜗牛_InfoQ写作社区