首页 > 解决方案 > @AllArgsConstructor 和 Spring 的构造函数注入:需要私有 final 吗?

问题描述

假设我有以下构造函数注入(不是自动装配):

@Service
public class FooService {

    private final OrderService orderService;

    public FooService(OrderService orderService) {
        this.orderService = orderService;
    }
}

可以替换为:

@Service
@AllArgsConstructor
public class FooService {

    private final OrderService orderService;

}

我是否需要将其声明为privatefinal注入此服务?龙目岛会像对待@Data豆类一样处理这个问题吗?有什么副作用吗?

标签: spring-bootjava-8lombokconstructor-injection

解决方案


您应该@RequiredArgsConstructor改用,您需要一个构造函数来填充必填字段。所以你标记了它们final并使用这个注解来生成一个主构造函数。 @AllArgsConstructor容易出错,因为它可能会产生 Spring 可能无法处理的多个构造函数。在您的特定情况下,@AllArgsConstructorand的结果@RequiredArgsConstructor恰好是相同的,因为您只有一个final字段。

请注意,Spring 文档鼓励使用基于构造函数的注入(https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-setter-injection),并且建议避免同时使用多种注射技术。

@Service
@RequiredArgsConstructor
public class FooService {

    private final OrderService orderService;

}

推荐阅读