Spring 的 setter 注入可以解决某些类型的循环依赖问题

参考:https://blog.csdn.net/weixin_50055999/article/details/147493914?utm_source=miniapp_weixin

Setter 方法注入 (Setter Injection)

在类中提供一个 setter 方法,并在该方法上使用 @Autowired、@Resource 等注解。

代码示例

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class OrderService {

    private PaymentService paymentService;

    // 使用 @Autowired 进行 Setter 注入
    @Autowired
    public void setPaymentService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }

    // 也可以使用 @Resource
    // @Resource
    // public void setInventoryService(InventoryService inventoryService) {
    //     this.inventoryService = inventoryService;
    // }

    public void processOrder(Order order) {
        boolean paid = paymentService.pay(order.getAmount());
        if (paid) {
            System.out.println("Order processed successfully.");
        }
    }
}

优点:

支持循环依赖:Spring 的 setter 注入可以解决某些类型的循环依赖问题(A 依赖 B,B 依赖 A)。

依赖可变:允许在对象创建后重新设置依赖(虽然这在实践中不常见且可能带来问题)。

比字段注入更"显式":依赖通过方法暴露出来。

便于单元测试:可以在测试中直接调用 setPaymentService(mockPaymentService) 来注入模拟对象。

缺点:

代码稍多:需要编写额外的 setter 方法。

对象可能处于不完整状态:对象可以被创建,但依赖可能还没有通过 setter 注入,如果在注入前就使用,会导致 NPE。虽然 Spring 保证在初始化完成后才暴露 Bean,但设计上不如构造函数注入"强制"。

可以被意外覆盖:setter 方法是公开的,理论上可以在运行时被多次调用,改变依赖。