Spring的三种依赖注入的方式

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注入

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

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

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

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值