首页
Preview

如何使用依赖反转和依赖注入

依赖倒置原则(DIP)和依赖注入(DI)是相关的概念,但它们具有不同的含义。让我们讨论它们之间的区别,并为每个概念提供一个示例。

依赖倒置原则(DIP)

依赖倒置原则是一种设计原则,它指出高层次的类不应该直接依赖于低层次的类。相反,高层次和低层次的模块都应该依赖于抽象(接口或抽象类)。该原则通过解耦模块来促进松散耦合和模块化,从而实现更容易的维护和扩展。

DIP的示例:

让我们考虑一个支付系统的示例。我们有一个 PaymentService 类,它依赖于具体的 PaymentGateway 类。

public class PaymentService {
    private PaymentGateway paymentGateway;

    public PaymentService() {
        this.paymentGateway = new PaymentGateway();
    }

    public void processPayment(double amount) {
        paymentGateway.processPayment(amount);
    }
}

在这个示例中,PaymentService 类直接依赖于 PaymentGateway 类,这违反了依赖倒置原则。如果我们想要更改支付网关实现或引入新的支付网关,我们需要修改 PaymentService 类。

为了遵循依赖倒置原则,我们引入一个抽象(接口)PaymentProvider,并让高层次的 PaymentService 和低层次的 PaymentGateway 都依赖于这个抽象:

public interface PaymentProvider {
    void processPayment(double amount);
}

public class PaymentGateway implements PaymentProvider {
    public void processPayment(double amount) {
        // Process payment using the payment gateway
    }
}

public class PaymentService {
    private PaymentProvider paymentProvider;

    public PaymentService(PaymentProvider paymentProvider) {
        this.paymentProvider = paymentProvider;
    }

    public void processPayment(double amount) {
        paymentProvider.processPayment(amount);
    }

    public static void main(String[] args){
        paymentProvider = new PaymentGateway();
        PaymentService paymentService= new PaymentService(paymentProvider);
        paymentService.processPayment(1000);
    }
}

通过引入 PaymentProvider 接口,PaymentService 类现在依赖于抽象而不是具体实现。它不再紧密地耦合到 PaymentGateway 类,使得更容易在不修改 PaymentService 类的情况下切换或引入新的支付网关。

依赖注入

依赖注入是通过构造函数注入和设置器注入的方式注入框架组件的依赖,它确保类之间松散耦合。

构造函数依赖注入(CDI):在这种情况下,依赖关系将通过构造函数注入。

public interface UserRepository {
    void save(User user);
}

@Repository
public class UserRepositoryImpl implements UserRepository {
    public void save(User user) {
        // Save user to the database
    }
}

@Service
public class UserService {
    private UserRepository userRepository;

    // Dependency Injection via Constructor
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void registerUser(User user) {
        // Perform user registration logic
        userRepository.save(user);
    }
}

public class User {
    // User class implementation
}

设置器依赖注入(SDI):在这种情况下,依赖关系将通过设置器方法注入。

@Service
public class UserService {
    private UserRepository userRepository;

    // Dependency Injection via Setter Method
    public void setUser(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void registerUser(User user) {
        // Perform user registration logic
        userRepository.save(user);
    }
}

使用Autowire:Spring Boot 应用程序中,你可以使用 @Autowired 注解将依赖项注入到你的类中。Spring Boot 根据注释和配置自动创建和注入所需的依赖项。

结论

依赖注入更注重代码结构,其重点是保持代码松散耦合。另一方面,依赖注入是代码功能如何工作的方式。在使用 Spring Framework 进行编程时,Spring 使用依赖注入来组装应用程序。

其他 Spring Boot 概念的参考链接:

Spring Security 基于角色的访问控制与 Spring Boot

使用JWT进行Spring Security身份验证和授权

Spring AOP 教程

Spring Boot 日志记录教程

Spring Boot 中的集中式配置

Spring Boot 中的自定义验证

javinpaul

Domenico Nicoli

Trey Huffine

Mehmet Arsl

Mehmet Ozkaya

The Educative Team

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
阿波
The minute I see you, I want your clothes gone!

评论(0)

添加评论