首页 > 其他分享 >Spring为什么建议构造器注入?看看和你所理解的一样吗?

Spring为什么建议构造器注入?看看和你所理解的一样吗?

时间:2023-10-29 11:06:56浏览次数:33  
标签:OrderRepository Spring orderRepository 构造 依赖 OrderService public 注入

Spring为什么建议构造器注入?看看和你所理解的一样吗?_架构师

Spring框架鼓励使用构造器注入的主要原因是出于设计原则和最佳实践的考虑,这有助于提高代码的可维护性、可测试性和整体质量。以下是详细说明为什么Spring建议构造器注入以及相关实例代码:

1. 易于测试

构造器注入使得对类的单元测试变得更加容易。通过将依赖项作为构造函数的参数传递,您可以轻松地在测试中传递模拟对象或存根对象,从而控制和验证类的行为。

public class OrderService {
    private final OrderRepository orderRepository;

    public OrderService(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }

    // ...
}

在单元测试中,您可以轻松传入模拟的OrderRepository对象,以验证OrderService的行为。

@Test
public void testCreateOrder() {
    OrderRepository mockRepository = Mockito.mock(OrderRepository.class);
    OrderService orderService = new OrderService(mockRepository);

    // Test the behavior of orderService
    // ...
}

2. 易于理解和维护

构造器注入提供了清晰的依赖关系,使代码更易于理解和维护。构造函数参数直观地表示了类所需的依赖项,降低了代码的复杂性。

public class PaymentProcessor {
    private final PaymentGateway paymentGateway;

    public PaymentProcessor(PaymentGateway paymentGateway) {
        this.paymentGateway = paymentGateway;
    }

    // ...
}

在这里,您一目了然地知道PaymentProcessor依赖于PaymentGateway,而不需要查看配置文件或其他地方来查找这些信息。

3. 依赖注入的一致性

构造器注入鼓励将所有依赖项都放在构造函数中,从而确保类的实例在被创建时处于一致的状态。这有助于避免在使用对象时遇到空指针异常或未初始化的依赖项。

4. 不可变性

通过使用final关键字,构造器注入可以实现不可变性,这意味着一旦依赖项被设置,它们不能再被修改。这可以提高代码的安全性和稳定性。

public class ShoppingCart {
    private final List<Item> items;

    public ShoppingCart(List<Item> items) {
        this.items = Collections.unmodifiableList(items);
    }

    // ...
}

5. 依赖项解析

构造器注入使依赖项的解析变得更加明确。当容器创建Bean实例时,容器只需查找所需的构造函数参数,而不需要进行复杂的解析或猜测。

6. 避免循环依赖

构造器注入有助于避免循环依赖问题,因为在创建Bean实例时,构造函数参数必须已经可用。这有助于减少潜在的运行时错误。

实例代码:

public class OrderService {
    private final OrderRepository orderRepository;

    public OrderService(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }

    public void createOrder(Order order) {
        // Business logic to create an order
        orderRepository.save(order);
    }
}

在这个示例中,OrderService的依赖项OrderRepository通过构造器注入。这使得OrderService的单元测试变得容易,同时也提高了代码的可读性和可维护性。

Spring鼓励构造器注入是出于提高代码质量、可测试性和可维护性的考虑。通过构造器注入,您可以更轻松地测试类、减少复杂性、提高代码可读性和维护性,并避免循环依赖问题。这是编写高质量Spring应用程序的最佳实践之一。

更多技术文章,技术资源请关注公众号:架构师宝库

更多免费高清电子书PDF版本下载   https://book.sjtt.cc

作者简介: 公众号【架构师宝库】,头条号【架构师老卢】20年资深软件架构师,分享编程、软件设计经验,教授前沿技术,分享技术资源(每天分享一本电子书),分享职场感悟。

标签:OrderRepository,Spring,orderRepository,构造,依赖,OrderService,public,注入
From: https://blog.51cto.com/u_4701487/8076517

相关文章

  • SpringBoot使用Redis分布式缓存
    Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sortedset有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基......
  • springboot项目实现断点续传功能
    这篇文章主要介绍了springboot项目实现断点续传,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 java代码packagecom.ruoyi.web.upload.controller;importcom.ruoyi.web.upload.dto.FileChunkDTO;importcom.ruoyi.......
  • 整合spring security自定义认证
    一、认证1.自定义组件  (1)UserDetails自定义,实现用户登录方法;publicinterfaceUserDetailsServiceextendsorg.springframework.security.core.userdetails.UserDetailsService{/***根据用户名获取用户对象(获取不到直接抛异常)*/@OverrideUser......
  • springMVC controller控制器方法HttpServletRequest等参数的是谁传递进来的
    SpringMVC中两个重要的接口:请求方法参数的处理、响应返回值的处理,分别是HandlerMethodArgumentResolver和HandlerMethodReturnValueHandlerHandlerMethodArgumentResolver的实现类 ServletRequestMethodArgumentResolver 参数类型是实现或继承或是WebRequest、ServletRequest......
  • 一些研发工程师在Springboot注意点
    一些研发工程师在Springboot注意点1.正确设计代码目录结构虽然您有很大的自由度,但有一些基本规则值得遵循来设计您的源代码结构。避免使用默认包。确保所有内容(包括入口点)都在命名良好的包中,这样您就可以避免与组装和组件扫描相关的意外情况;将Application.java(应用程序的入口类)......
  • 为什么Spring和IDEA不推荐使用@Autowired注解,有哪些替代方案?
    引言在使用Spring框架和JetBrainsIDEA集成开发环境(IDE)进行Java开发时,你可能经常会遇到@Autowired注解。@Autowired是Spring框架中用于实现依赖注入的核心注解之一。然而,近年来,Spring和IDEA都不再推荐使用@Autowired注解,并提出了更好的替代方案。本文将详细分析为什么Spring和IDE......
  • SpringBoot 自定义注解实现过程
    1、新建SpringBoot-Test 其中pom.xml文件如下:<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schem......
  • Hook重载方法和构造方法
    Hook重载方法和构造方法1.1hook重载方法/*adbshellsucd/data/local/tmp/./frida-server-16.0.19-android-arm64端口转发adbforwardtcp:27042tcp:27042adbforwardtcp:27043tcp:27043*///搜索setPwd(Md5importfridaimportsys#连接手机设备rdev=......
  • SSTI模板注入学习
    一、前言最近在练ctf的时候遇到了不少模板注入的漏洞,自己对这一块也一直是一知半解的,所以记录一下,对这一块知识也进行一个总结。二、什么是模板注入SSTI(服务器端模板注入)是格式化字符串的一个非常好的例子,如今的开发已经形成了非常成熟的MVC的模式,我们的输入通过V接收,交给......
  • 用友GRP-U8 license_check.jsp sql注入漏洞
    漏洞描述用友GRP-U8license_check.jsp存在sql注入,攻击者可利用该漏洞执行任意SQL语句,如查询数据、下载数据、写入webshell、执行系统命令以及绕过登录限制等。漏洞复现fofa语法:app="用友-GRP-U8"登录页面如下:POC:/u8qx/license_check.jsp?kjnd=1%27;WAITFOR%20DELAY%20%2......