依赖倒置原则(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 概念的参考链接:
评论(0)