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容器框架。

目录
相关文章
|
7月前
|
Java Spring
Spring5深入浅出篇:Spring中ioc(控制反转)与DI(依赖注入)
Spring5深入浅出篇:Spring中ioc(控制反转)与DI(依赖注入)
|
7月前
|
Java API Spring
Spring6-IoC(Inversion of Control)控制反转和DI(Dependency Injection)依赖注入,手动实现IOC
Spring6-IoC(Inversion of Control)控制反转和DI(Dependency Injection)依赖注入,手动实现IOC
|
7月前
|
XML Java 数据格式
Spring框架入门:IoC与DI
【5月更文挑战第15天】本文介绍了Spring框架的核心特性——IoC(控制反转)和DI(依赖注入)。IoC通过将对象的创建和依赖关系管理交给容器,实现解耦。DI作为IoC的实现方式,允许外部注入依赖对象。文章讨论了过度依赖容器、配置复杂度等常见问题,并提出通过合理划分配置、使用注解简化管理等解决策略。同时,提醒开发者注意过度依赖注入和循环依赖,建议适度使用构造器注入和避免循环引用。通过代码示例展示了注解实现DI和配置类的使用。掌握IoC和DI能提升应用的灵活性和可维护性,实践中的反思和优化至关重要。
425 4
|
2月前
|
存储 Java 程序员
SpringIOC和DI的代码实现,Spring如何存取对象?@Controller、@Service、@Repository、@Component、@Configuration、@Bean DI详解
本文详细讲解了Spring框架中IOC容器如何存储和取出Bean对象,包括五大类注解(@Controller、@Service、@Repository、@Component、@Configuration)和方法注解@Bean的用法,以及DI(依赖注入)的三种注入方式:属性注入、构造方法注入和Setter注入,并分析了它们的优缺点。
40 0
SpringIOC和DI的代码实现,Spring如何存取对象?@Controller、@Service、@Repository、@Component、@Configuration、@Bean DI详解
|
2月前
|
存储 开发框架 Java
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
38 0
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
|
3月前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
3月前
|
Java 数据库连接 Maven
Spring基础1——Spring(配置开发版),IOC和DI
spring介绍、入门案例、控制反转IOC、IOC容器、Bean、依赖注入DI
Spring基础1——Spring(配置开发版),IOC和DI
|
6月前
|
存储 Java 测试技术
Java Spring IoC&DI :探索Java Spring中控制反转和依赖注入的威力,增强灵活性和可维护性
Java Spring IoC&DI :探索Java Spring中控制反转和依赖注入的威力,增强灵活性和可维护性
44 1
|
6月前
|
存储 Java 程序员
Spring IoC&DI(2)—IoC详解
Spring IoC&DI(2)—IoC详解
51 2
|
6月前
|
存储 Java C++
理解SpringIOC和DI第一课(Spring的特点),IOC对应五大注解,ApplicationContext vs BeanFactory
理解SpringIOC和DI第一课(Spring的特点),IOC对应五大注解,ApplicationContext vs BeanFactory
下一篇
DataWorks