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

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

  • 相关阅读:
    sql引用
    DNS劫持案列
    Android 滑动事件消费监控,Debug 环境下通用思路
    作业帮运维负责人聂安:云原生时代运维转型之道
    innovus:stripe下不放std cell的命令
    22.3 分布式
    elementplus el-table(行列互换)转置
    css初入门:BFC(格式化上下文)
    【C++进阶】继承
    JTS:02 使用WKB操作数据
  • 原文地址:https://www.cnblogs.com/anboy/p/18281768