使用 Setter 方法实现 Spring 依赖注入

在 Spring 框架中,依赖注入(Dependency Injection, DI)是一种重要的设计模式,它允许我们通过容器管理对象的创建及其依赖关系。除了构造函数注入之外,Spring 还支持通过 Setter 方法注入依赖。本文将详细介绍如何使用 Setter 方法注入实现 Spring 依赖注入。

一、什么是依赖注入

依赖注入是一种设计模式,它将对象的依赖关系交给外部容器管理,而不是在对象内部自行创建这些依赖。Spring 框架通过 IoC(控制反转)容器实现了依赖注入,允许开发者轻松地管理对象及其依赖关系。

二、Setter 方法注入概述

Setter 方法注入是通过对象的 Setter 方法来注入依赖。这种方式的特点是可以在对象创建后再设置其依赖,因此比较灵活,可以在对象生命周期中动态更改依赖。

优点

  • 灵活性:可以在对象创建之后再设置依赖。
  • 可选依赖:适合用于可选依赖的场景。

缺点

  • 延迟初始化:依赖注入可能会在对象创建之后进行,容易导致依赖未及时注入的问题。
  • 依赖散布:依赖关系分散在多个 Setter 方法中,可能导致代码的可读性下降。

三、使用 Setter 方法注入实现依赖注入

1. 项目结构

一个典型的 Spring 项目结构如下:

my-spring-setter-injection-project/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── example/
│   │   │           └── project/
│   │   │               ├── config/
│   │   │               │   └── AppConfig.java
│   │   │               ├── service/
│   │   │               │   ├── ExampleService.java
│   │   │               │   └── AnotherService.java
│   │   │               └── controller/
│   │   │                   └── ExampleController.java
│   └── resources/
│       └── application.properties
└── pom.xml

2. Java 类定义

// ExampleService.java
package com.example.project.service;import org.springframework.stereotype.Service;@Service
public class ExampleService {public String serve() {return "Service is serving";}
}
// AnotherService.java
package com.example.project.service;import org.springframework.stereotype.Service;@Service
public class AnotherService {public String assist() {return "Another service is assisting";}
}
// ExampleController.java
package com.example.project.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.example.project.service.ExampleService;
import com.example.project.service.AnotherService;@Controller
public class ExampleController {private ExampleService exampleService;private AnotherService anotherService;@Autowiredpublic void setExampleService(ExampleService exampleService) {this.exampleService = exampleService;}@Autowiredpublic void setAnotherService(AnotherService anotherService) {this.anotherService = anotherService;}public void doSomething() {System.out.println(exampleService.serve());System.out.println(anotherService.assist());}
}

3. 配置类

// AppConfig.java
package com.example.project.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan(basePackages = "com.example.project")
public class AppConfig {
}

4. 启动类

Spring Boot 项目通常包含一个启动类,用于启动 Spring 应用。

// Application.java
package com.example.project;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

5. application.properties

配置文件用于配置应用程序参数,如服务器端口、数据库连接等。

server.port=8080

6. 测试类

// ApplicationTests.java
package com.example.project;import com.example.project.controller.ExampleController;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class ApplicationTests {@Autowiredprivate ExampleController exampleController;@Testpublic void testDoSomething() {exampleController.doSomething();}
}

四、总结

Setter 方法注入是实现 Spring 依赖注入的一种灵活方式。它通过对象的 Setter 方法来设置依赖,适合用于需要在对象创建后动态更改依赖的场景。虽然 Setter 方法注入具有灵活性,但也可能导致依赖延迟初始化的问题。在实际开发中,应根据具体需求选择合适的依赖注入方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/31866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[C#]winform基于opencvsharp实现黑白图像上色

【算法简介】 技术有时会提高艺术,但有时也会破坏艺术。着色黑白电影是一个可以追溯到1902年的古老想法。几十年来,许多电影创作者反对将黑白电影着色的想法,并将其视为对艺术的破坏。但今天它被接受为艺术形式的增强。该技术本身已经从艰苦…

不同层级管理者的职责,你弄清了吗?

在企业这座金字塔中,不同层次的管理者各自扮演着不同的角色,承担着不同的职责。这些职责不仅难以互相替代,而且必须明确划分,以确保企业能够高效、有序地运转。如果职责出现交叉、替代或重叠,将会带来一系列问题&#…

PCB行业迈入数字化新时代,智能工厂引领未来制造

在传统的PCB生产过程中,人工操作、纸质记录、经验判断等方式占据了主导地位。然而,这种方式不仅效率低下,而且容易出现误差,导致产品质量不稳定。同时,随着市场竞争的加剧,客户对产品的交期、质量、成本等方…

一种快速高效的点云表面重建算法

文章目录 一、概述二、算法流程1. 获取数据点R的相邻点集2. 投影R和 C R C_R CR​至二维平面3. 按角度排序4. 根据可见度删除数据点(Pruning by Visibility)5. 根据角度删除数据点(Pruning by Angle Criterion)6. 三角化三、参考文献一、概述 贪婪投影算法(Greedy Projecti…

顺序存储和链式存储的区别,以及如何比较两个数组或两个链表的长度

顺序存储和链式存储是数据结构中两种基本的存储方式,它们在数据元素的表示和关系的表示上有显著的区别。以下是对这两种存储方式的具体解释和比较: 顺序存储 定义:顺序存储是将数据元素存放在地址连续的存储单元里,其数据间的逻…

自制HTML5游戏《开心消消乐》

1. 引言 游戏介绍 《开心消消乐》是一款基于HTML5技术开发的网页游戏,以其简单的操作方式、轻松的游戏体验和高度的互动性,迅速在社交平台上获得了广泛的关注和传播。玩家通过消除相同类型的元素来获得分数,游戏设计巧妙,易于上手…

力扣SQL50 项目员工 I ROUND AVG

Problem: 1075. 项目员工 I 👨‍🏫 参考题解 Code select project_id,ROUND(AVG(e.experience_years),2) as average_years FROMproject as p LEFT JOINemployee as e ONp.employee_id e.employee_id GROUP BYp.project_id;

P5713 【深基3.例5】洛谷团队系统

1. 题目链接 https://www.luogu.com.cn/problem/P5713 P5713 【深基3.例5】洛谷团队系统 2. 题目描述 题目描述:本地添加题目,一题要5分钟;在洛谷团队添加一题要3分钟,但是添加题目之前要花11分钟配置 输入:一个整数…

视觉与运动控制2

运动控制卡 原理 运动控制卡是基于总线的电机运动控制卡 优点 运动控制卡在专机系统的开发过程中,具有更大的灵活性和开放性。使得使用者能在短期内开发出功能强大的运动控制系统。 供应商 动控制卡公司有美国的GALIL、PAMAC,英国的翠欧&#xff0…

E2000 ThreadX 适配

Phytium-ThreadX-SDK v0.1.0 ReleaseNote 1. 介绍 本项目发布了Phytium系列CPU的Eclipse ThreadX源代码,参考例程以及配置构建工具,本项目基于 Eclipse ThreadX 6.4.1 开发 2. 硬件支持情况 芯片ThreadXThreadX SMPE2000D支持开发中E2000Q支持开发中…

SUSE linux 15的网络管理

1 手工配置网络 wicked提供了一种新的网络配置框架。自SUSE 12起,SUSE使用了新的网络管理工具wicked,这个是区别与其他常见发行版的。常见的发行版目前大多使用的是NetworkManager服务进行网络管理。 1.1 wicked网络配置 传统网络接口管理面临的挑战之…

Python 学习 第四册 第10章 系统(1)

---用教授的方式学习 目录 10.1 文件 10.1.2 用exists()检查文件是否存在 10.1.3 用isfile()检查是否为文件 10.1.4 用copy()复制文件 10.1.5 用rename()重命名文件 10.1.6 用link()或者symlink()创建链接 10.1.7 用chmod()修改权限 10.1.8 用chown()修改所有…

mysqladmin——MySQL Server管理程序(一)

mysqladmin 是一个命令行工具,用于执行简单的 MySQL 服务器管理任务,如检查服务器的状态、创建和删除数据库、重载权限等。 调用mysqladmin如下: mysqladmin [options] command [command-arg] [command [command-arg]] ... mysqladmin支持…

sdlan如何智能组网?

【天联】组网是一款异地组网内网穿透产品,由北京金万维科技有限公司自主研发,旨在解决不同地区电脑与电脑、设备与设备、电脑与设备之间的信息远程通信问题。【天联】的操作简单、跨平台应用、无网络要求以及独创的安全加速方案等特点,使得它…

什么是局域网IP?

局域网IP(Local Area Network IP)指的是在局域网内使用的IP地址。局域网是指在某个地理区域内,由一组相互连接的计算机组成的小型网络,常见于家庭、学校、办公室等场所。局域网IP可以用来实现内网穿透,即在复杂的网络环…

【性能优化】表分区实践最佳案例

背景 随着数字化建设的持续深入,企业的业务规模迎来了高速发展,其数据规模也呈现爆炸式增长,如果继续使用传统解决方案,将所有数据存储在一个表中,对数据的查询和维护效率将是一个巨大的挑战,在这个背景下…

MySQL数据备份操作步骤

常见的数据备份命令 备份命令备份速度恢复速度介绍功能适用场景lvm2快照快快一般、支持几乎热备、速度快一般中小型数据量的备份cp快快物理备份、灵活性低很弱少量数据备份xtrabackup较快较快实现innodb热备、对存储引擎有要求强大较大规模的备份mysqldump慢慢逻辑备份、适用所…

【React】AntD组件---极客园--01.项目前置准备

项目搭建 基于CRA创建项目 CRA是一个底层基于webpack快速创建React项目的脚手架工具 # 使用npx创建项目 npx create-react-app react-jike# 进入到项 cd react-jike# 启动项目 npm start调整项目目录结构 -src-apis 项目接口函数-assets 项目资源文件&…

制作WIFI二维码,实现一键扫描连接WIFI

在现代社会,Wi-Fi已成为我们日常生活中不可或缺的一部分。无论是在家庭、办公室还是公共场所,我们都希望能够快速方便地连接到Wi-Fi网络。下面小编就来和大家分享通过制作WIFI二维码,来实现一键扫描就可以连接WIFI的方法。连接WIFI不用在告诉…

课时162:脚本发布_大型脚本_锁文件

2.2.4 锁文件 学习目标 这一节,我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 简介 需求:同一时间段内,只允许有一个用户来执行这个脚本如果脚本执行的时候,有人在执行,那么输出报错:脚本…