Spring DI

目录

什么是依赖注入

属性注入

构造函数注入

[Setter 注入](#Setter 注入)

依赖注入的优势


什么是依赖注入

依赖注入是一种设计模式,它通过外部实体(通常是容器)来注入一个对象的依赖关系,而不是在对象内部创建这些依赖关系。这种方式使得对象的创建和管理变得更加灵活,可以轻松地替换和升级各种组件。也就是说依赖注⼊是⼀个过程,是指IoC容器在创建Bean时,去提供运⾏时所依赖的对象。

关于依赖注入,Spring 为我们提供了三种方法:

  1. 属性注入(Filed Injection)

  2. 构造方法注入(Constructor Injection)

  3. Setter 注入(Setter Injection)


属性注入

使⽤ @Autowired 实现的。

java 复制代码
@Controller
public class UserController {
	//属性注入
    @Autowired
    private UserService userService;
    public void sayHi() {
        System.out.println("Hi UserController...");
        userService.sayHi();
    }
}

构造函数注入

在类的构造⽅法中实现注⼊。

当只有一个构造函数的时候前面可以不加 @Autowired,其他情况必须加上 @Autowired。

当有多个构造函数的时候,Spring 使用会默认无参的构造函数,如果没有会报错。

java 复制代码
@Controller
public class UserController2 {
    //构造方法注入
    private UserService userService;
    
    @Autowired
    public UserController2(UserService userService) {
        this.userService = userService;
    }
    
    public void sayHi() {
        System.out.println("Hi UserController2");
        userService.sayHi();
    }
}

Setter 注入

Setter 注⼊和属性的 Setter ⽅法实现类似,只不过在设置 set ⽅法的时候需要加上 @Autowired 注

解。

java 复制代码
@Controller
public class UserController3 {
    //setter方法注入
    private UserService userService;
    
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    
    public void sayHi() {
        System.out.println("Hi UserController3");
        userService.sayHi();
    }
}

依赖注入的优势

  1. 松耦合性(Loose Coupling): 依赖注入降低了组件之间的耦合度,使得它们更容易被替换、升级和测试。

  2. 可测试性: 由于依赖被注入,我们可以轻松地通过模拟对象来进行单元测试,而不必依赖于具体的实现。

  3. 可维护性: 依赖注入使得代码更易于维护和理解。通过注入依赖,代码的职责更加清晰。

  4. 灵活性: 可以通过配置文件或注解来改变对象之间的关系,而无需修改代码,提高了系统的灵活性。

相关推荐
电商API&Tina1 天前
电商数据采集 API 接口 全维度解析(技术 + 商业 + 合规)
java·大数据·开发语言·数据库·人工智能·json
liwulin05061 天前
【JSON】使用com.fasterxml.jackson解析json字符串
java·数据库·json
what丶k1 天前
深度解析:以Kafka为例,消息队列消费幂等性的实现方案与生产实践
java·数据结构·kafka
星火开发设计1 天前
C++ 输入输出流:cin 与 cout 的基础用法
java·开发语言·c++·学习·算法·编程·知识
毕设源码-邱学长1 天前
【开题答辩全过程】以 基于Springboot的酒店住宿信息管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
仟濹1 天前
【Java加强】1 异常 | 打卡day1
java·开发语言·python
AllData公司负责人1 天前
【亲测好用】实时开发平台能力演示
java·c语言·数据库
pcm1235671 天前
设计C/S架构的IM通信软件(3)
java·c语言·架构
咖啡啡不加糖1 天前
Grafana 监控服务指标使用指南:打造可视化监控体系
java·后端·grafana
€8111 天前
Java入门级教程26——序列化和反序列化,Redis存储Java对象、查询数据库与实现多消费者消息队列
java·拦截器·序列化和反序列化·数据库查询·redis存储java对象·多消费者消息队列