【Spring】Spring DI(依赖注入)详解——构造器注入与Setter注入——Setter注入的实现方式

依赖注入(Dependency Injection,DI)是实现松耦合设计的重要手段。DI使得对象的创建与其依赖的对象分离,从而提高了代码的可维护性、可测试性和灵活性。在Spring框架中,DI主要通过两种方式实现:构造器注入和Setter注入。 比如,你要给孩子买玩具。你可以选择直接去商店购买玩具(直接创建依赖),这可能会导致你每次都要花时间和精力去选择玩具。或者,你可以让孩子告诉你他们想要什么(依赖注入),然后你再去商店购买。这样,你就能根据孩子的需求灵活选择,而不是每次都要自己决定。

在实际应用中,Setter注入常用于那些依赖是可选的场景,或者在对象创建后可能会改变的依赖。理解Setter注入的原理和实现方式,将帮助我们设计更灵活的应用程序。

一、依赖注入的概念

依赖注入是控制反转(Inversion of Control,IoC)的一种实现方式。通过依赖注入,Spring容器负责创建对象并注入其依赖,而不是让对象自己管理依赖。

1. Setter注入

Setter注入是通过公共的Setter方法来设置依赖的方式。在对象创建后,可以通过Setter方法逐一设置依赖。

优点

  • 依赖可以选择性注入,不必在构造时提供所有依赖。

  • 适合那些依赖是可选的场景。

缺点

  • 可能导致对象在未完全构建时被使用,增加了出错的可能性。

二、Setter注入的实现方式

下面我们通过具体示例来演示Setter注入的实现。

1. 创建服务和依赖类

首先,我们定义一个服务类OrderService,它依赖于一个PaymentService类。

// PaymentService.java
public class PaymentService {
    public void processPayment() {
        System.out.println("Payment processed successfully.");
    }
}

// OrderService.java
public class OrderService {
    private PaymentService paymentService;

    // Setter注入
    public void setPaymentService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }

    public void placeOrder() {
        System.out.println("Order placed.");
        paymentService.processPayment(); // 调用依赖的方法
    }
}

解释

  • PaymentService类负责处理支付逻辑。

  • OrderService类依赖于PaymentService,通过Setter方法进行注入。

2. 配置Spring容器

接下来,我们使用Spring的Java配置来创建这些Bean。

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

@Configuration
public class AppConfig {

    @Bean
    public PaymentService paymentService() {
        return new PaymentService(); // 创建PaymentService实例
    }

    @Bean
    public OrderService orderService() {
        OrderService orderService = new OrderService();
        orderService.setPaymentService(paymentService()); // 通过Setter注入PaymentService
        return orderService;
    }
}

解释

  • @Configuration注解标记AppConfig类为配置类。

  • paymentService()方法创建PaymentService的实例。

  • orderService()方法创建OrderService的实例,并通过Setter方法注入PaymentService的实例。

3. 启动应用

最后,我们创建一个主类来启动Spring应用并获取OrderService Bean。

public class Main {
    public static void main(String[] args) {
        // 创建Spring容器
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        // 获取OrderService Bean
        OrderService orderService = context.getBean(OrderService.class);
        orderService.placeOrder(); // 调用下订单的方法
    }
}

解释

  • AnnotationConfigApplicationContext用于创建基于Java配置的Spring容器。

  • 通过context.getBean(OrderService.class)获取OrderService的实例,并调用其placeOrder()方法。

三、总结

Setter注入是一种灵活的依赖注入方式,它允许在对象创建后设置依赖。这种方式特别适合那些依赖是可选的场景,或者在某些情况下可能会改变的依赖。

通过使用Spring的Setter注入,我们能够创建松耦合、易于测试和维护的应用程序。在实际开发中,选择合适的依赖注入方式对于设计灵活的系统至关重要。

希望通过本次讲解,能够帮助你深入理解Spring中的依赖注入,掌握Setter注入的实现方式及其应用场景。在后续的学习中,可以尝试将Setter注入与构造器注入结合使用,以应对更复杂的场景。

内容概要:本文档《Spring面试专题及答案.pdf》详细介绍了Spring框架的核心概念、优势及其关键特性。文章首先概述了Spring框架作为一个综合性的Java平台,如何帮助开发者解决基础性问题,使其能够专注于应用程序的开发。接着,文档深入探讨了Spring框架的主要模块,包括核心容器、数据访问/集成、Web、AOP(面向切面编程)、工具、消息和测试模块。此外,文档详细解释了Spring框架带来的诸多好处,如依赖注入DI)、轻量级容器、模块化设计、易于测试、Web MVC框架、便捷的事务管理和集成现有技术等。 文档进一步阐述了控制反转(IOC)的概念及其在Spring中的实现方式,特别是依赖注入的三种方式构造器注入Setter方法注入和接口注入。此外,文档对比了BeanFactory和ApplicationContext的区别,解释了Spring的三种配置方式:基于XML、基于注解和基于Java的配置,并提供了详细的配置示例。文档还涵盖了Spring Bean的生命周期、作用域、自动装配模式、集合注入、事件处理等内容,以及Spring框架中常用的设计模式。 适用人群:具备一定Java编程基础,尤其是从事Java企业级应用开发的技术人员,特别是那些准备参加Spring框架相关面试的候选人。 使用场景及目标:①帮助开发者理解Spring框架的核心概念和设计模式;②指导开发者如何在实际项目中配置和使用Spring框架;③为面试者提供常见Spring面试题的答案和解析,提升面试成功率。 其他说明:本文档不仅适合初学者入门Spring框架,也为有一定经验的开发者提供了深入理解和解决问题的参考。文档内容详实,涵盖了Spring框架的各个方面,旨在帮助读者全面掌握Spring的核心技术和应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值