使用 Spring 进行依赖注入的最佳实践

news/2024/7/8 3:38:57 标签: 后端

大家好我是易安,本篇文章我将向你展示如何使用Lombok来实现Spring框架中的最佳实践。

Spring框架本身提供了各种不同的方法来执行依赖注入。选项的灵活性是Spring框架的优势之一。但是,并非所有的依赖注入选项都被认为是最佳实践。有些选项实际上非常糟糕。

依赖注入示例

我设置了一些示例,以便我们审查可以使用的不同依赖注入选项。

让我们使用一个示例Spring服务。对于我们的目的,该服务具有返回字符串的一个方法。我们将使用Spring将我们的“服务”注入到一些伪控制器中。请记住,我们只是探索如何使用Spring框架进行依赖注入。

示例服务

@Service
public class MyService {

public String getHello(){

    return "Hello";

 }
}

我们的字段控制器有一个公共属性来保存该服务。我们可以注释此字段,Spring将注入服务实例。

属性注入

@Controller
public class FieldController {
@Autowired

MyService myService;

public String saySomething(){

    return myService.getHello();

 }
}

这只是一个公共属性,没有setter。很明显,这不是一个好习惯。也不是推荐的方法。

我们可以稍微改进一下,使字段访问变为私有的。Spring框架允许您自动装配私有字段。你确实会看到有人这样做。Spring会执行一些反射操作来实现依赖注入。

私有化

@Controller
public class PrivateFieldController {
@Autowired

private MyService myService;

public String saySomething(){

    return myService.getHello();

 }
}

虽然比仅使用私有字段好,但测试会变得麻烦。您要么需要启动Spring上下文,要么使用一些Spring实用程序来执行测试的依赖注入。虽然不是世界末日,但通常很烦人。

我们可以通过为私有属性提供setter方法来改进这一点。在面向对象编程中,Getter和Setter通常被视为最佳实践。通过对setter方法进行注释,可以轻松地指示Spring使用setter进行依赖注入。

方法注入

Setter控制器

@Controller

public class SetterController {
private MyService myService;

@Autowired

public void setMyService(MyService myService) {

    this.myService = myService;

}

public String saySomething(){

    return myService.getHello();

 }
}

这比使用私有字段要好得多。有人会抱怨这是要写太多代码了

依赖注入最佳实践

依赖注入的最佳实践是利用接口、构造函数和 final 属性。

我已经设置了一个“最佳实践”服务接口,并提供了一个带有 Spring Service 注释的服务实现。

最佳实践服务接口

public interface BpService {

    String getHello();
}

最佳实践服务实现

@Service
public class BpServiceImpl implements BpService {

    @Override
    public String getHello() {
        return "The Best Hello!";
    }
}

使用 Project Lombok

现在,使用 Lombok 实现依赖注入的最佳实践,我们需要:

  • 声明一个接口类型的 final 属性
  • 使用 Project Lombok 的 @RequiredArgsConstructor 注释标注类

现在,Project Lombok 将为所有声明为 final 的属性生成构造函数。Spring 将自动使用 Lombok 提供的构造函数进行自动装配。

Lombok 控制器

@RequiredArgsConstructor
@Controller
public class BpFinalConstructorController {

    private final BpService bpService;

    public String saySomething(){
        return bpService.getHello();
    }
}

这是一种非常不错的方式。您的代码会保持非常干净。在使用 Spring 时,通常需要多个自动装配的属性。

当您需要添加另一个 bean 时,只需声明一个 final 属性即可。

如果您进行了重构,不再需要一个由 Spring 管理的依赖项,只需删除 final 属性即可。

您不再需要维护 setter 或构造函数代码。Lombok 为您解决这个枯燥的任务。

我在日常编码中已经使用这种技术一段时间了。它确实节省了很多时间,并使代码更加清晰。不再存在未使用的属性和未使用的构造函数参数。现在重构就少了一些痛苦!

本文由 mdnice 多平台发布


http://www.niftyadmin.cn/n/232708.html

相关文章

基于深度学习PaddleOcr身份证识别

之前使用opencv机械学习处理图片,使用Testseract-OCR进行身份证和姓名识别,发现受背景图片的影响比较大,转PaddleOcr,识别成功率能达到使用要求。 PaddleOcr官网地址:飞桨PaddlePaddle-源于产业实践的开源深度学习平台…

Spring中Bean初始化和销毁的多种方式

Spring中Bean初始化和销毁的多种方式一、Bean的多种初始化方式1.PostConstruct注解2.实现InitializingBean接口3.声明init-method方法二、Bean的多种销毁方式1.PreDestroy注解2.实现DisposableBean接口3.声明destroy-method方法三、总结Spring中支持在Bean的加载时声明初始化方…

怎样找回u盘里误删的文件

相信有很多人都喜欢通过u盘来存储文件,方便我们在日常生活和工作中使用。通常,这些将是一些重要的文件,如照片、工作文档等等。但在使用过程中,不可避免的会进行文件的清理等,如果我们不小心误删了u盘里的文件呢&#…

hive sql和mysql区别

mssql 的正式名字是 SQL Server MS公司出的。图形操作界面好一些,性能还可以。在在mssql和oracle上不能互换.支持OLEDB连接.asp、mssaql只能for window mysql 就是mysql 下面是readme:免费软件。性能也可以。速度快,用于小规模.命令行界面.(可以装图形操…

Linux应用编程(信号基础)

一、基本概念 信号是事件发生时对进程的通知机制,也可以把它称为软件中断。信号与硬件中断的相似之处在于能够打断程序当前执行的正常流程,其实是在软件层次上对中断机制的一种模拟。大多数情况下,是无法预测信号达到的准确时间,…

AutoSAR软件组件开发的两类工作流程(Matlab/Simulink)

目录 前面 自顶向下 导入arxml文件 生成模型框架 搭建算法模型 生成代码 自下向上 前面 如何在Matlab进行AutoSAR软件组件SWC的开发?也就是下图红框标识出来的部分。 常规的有两种方式自顶向下与自下而上: 从上往下:从软件组件描述文…

总结824

学习目标: 4月(复习完高数18讲内容,背诵21篇短文,熟词僻义300词基础词) 学习内容: 英语:早上 读了《nasty place》,单词150个 高数:看了12讲二重积分的内容&#xff0…

虚拟直播需要哪些设备?如何搭建虚拟直播团队?

虚拟直播不止是新兴的娱乐途径 ,还是新的商业模式 。虚拟直播的出现,是互联网娱乐趋势的变化,带来了更加丰富多彩的娱乐形式,同时也优化了传统直播模式下的人力物力成本,使直播行业更加效率及智能。 科技不断发展&…