spring中优雅的DI

简介: 只有聪明人才能看见的摘要~( ̄▽ ̄~)~

spring常用的注入方式分为三种:属性注入,setter注入,构造器注入。


属性注入缺点

1、容易违背单一职责(通常因为使用过多的依赖而未察觉)

2、类和容器强耦合。对于IOC容器以外的环境,只能通过反射提供它需要的依赖

3、可能在属性注入前就被引用,导致NPE;也可能注入失败,导致NPE无法尽早暴露,因为不调用就不会发现。

3、可测试性差(要测试一个类必须启动整个IOC,这还不够可恶吗)

4、循环依赖无检测,有循环依赖隐患


构造器注入

定义私有final变量,使用构造器传递参数并初始化,构造器添加@Autowired(如果使用spring 4.3+,可以完全将类与DI框架解耦。其支持一个构造函数场景的隐式构造函数注入)(可用lombok的@RequiredArgsConstructor)

优点:

1、保证依赖不为空,保证依赖不可变

2、保证调用时是完全初始化状态,方便单元测试;提升了代码的可复用性;明确成员变量的注入顺序

3、避免了循环依赖(循环依赖通常是糟糕设计的标志)

缺点:注入参数较多时,代码臃肿,不够友好。但这更好地提醒了单一职责。


setter注入

定义对应的setter并添加@Autowired。setter注入类似于选择性注入,允许在类构造完成后重新注入。使用setter注入依赖项。类应该能够在不提供它们的情况下工作。在对象实例化之后,可以随时更改依赖项。

应尽量避免Field注入。推荐使用构造函数或方法注入依赖项。两者各有利弊,用法取决于具体情况。可以结合setter注入和构造函数注入,构造函数更适合于强制依赖项和以不变性为目标的情况。对于可选的依赖项更适合setter注入。


如果一定要使用@Autowired,替换为@Resource注解。至少idea不警告,不会看着难受。

@Autowired,@Qualifier,@Resource区别

@Autowired:通过byType装配,找不到或找到多个都抛出异常。

@Qualifier:使用@Qualifier指定@Autowired进行byName装配

@Resource:相当于@Autowired,但@Resource默认按照byName装配, 如果没有匹配,则退回到byType方式装配。@Resource是Javax包提供的,不依赖于Spring框架,可以方便替换Ioc容器框架。

目录
相关文章
|
4天前
|
Java 容器 Spring
Spring-依赖注入(DI)入门案例及bean基础配置
Spring-依赖注入(DI)入门案例及bean基础配置
44 0
|
4天前
|
XML Java 数据格式
深入理解 Spring IoC 和 DI:掌握控制反转和依赖注入的精髓
在本文中,我们将介绍 IoC(控制反转)和 DI(依赖注入)的概念,以及如何在 Spring 框架中实现它们。
75 0
|
7月前
|
XML Java 应用服务中间件
面试官问我咋实现Spring框架IOC和DI好吧打趴下,深度解析手动实现Spring框架的IOC与DI功能
面试官问我咋实现Spring框架IOC和DI好吧打趴下,深度解析手动实现Spring框架的IOC与DI功能
49 0
|
4天前
|
Java Spring
Spring5深入浅出篇:Spring中ioc(控制反转)与DI(依赖注入)
Spring5深入浅出篇:Spring中ioc(控制反转)与DI(依赖注入)
|
4天前
|
Java API Spring
Spring6-IoC(Inversion of Control)控制反转和DI(Dependency Injection)依赖注入,手动实现IOC
Spring6-IoC(Inversion of Control)控制反转和DI(Dependency Injection)依赖注入,手动实现IOC
|
4天前
|
XML Java 数据格式
Spring框架入门:IoC与DI
【5月更文挑战第15天】本文介绍了Spring框架的核心特性——IoC(控制反转)和DI(依赖注入)。IoC通过将对象的创建和依赖关系管理交给容器,实现解耦。DI作为IoC的实现方式,允许外部注入依赖对象。文章讨论了过度依赖容器、配置复杂度等常见问题,并提出通过合理划分配置、使用注解简化管理等解决策略。同时,提醒开发者注意过度依赖注入和循环依赖,建议适度使用构造器注入和避免循环引用。通过代码示例展示了注解实现DI和配置类的使用。掌握IoC和DI能提升应用的灵活性和可维护性,实践中的反思和优化至关重要。
17 4
|
4天前
|
存储 Java 对象存储
【JavaEE】DI与DL的介绍-Spring项目的创建-Bean对象的存储与获取
【JavaEE】DI与DL的介绍-Spring项目的创建-Bean对象的存储与获取
9 0
|
4天前
|
Java Spring 容器
Spring05 SpringIOC & DI
Spring05 SpringIOC & DI
9 0
|
4天前
|
Java Spring 容器
【Spring系列笔记】IOC与DI
IoC 和 DI 是面向对象编程中的两个相关概念,它们主要用于解决程序中的依赖管理和解耦问题。 控制反转是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入和依赖查找。
35 2
|
7月前
|
Java Spring 容器
面试官问我咋实现Spring框架IOC和DI好吧打趴下,深度解析手动实现Spring框架的IOC与DI功能2
面试官问我咋实现Spring框架IOC和DI好吧打趴下,深度解析手动实现Spring框架的IOC与DI功能2
26 0