@AllArgsConstructor 和 Spring 的构造函数注入:是否需要 private final?

@AllArgsConstructor and Constructor Injection with Spring: is private final needed?

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

@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注入此服务? Lombok 会像处理 @Data 和 bean 那样处理这个问题吗?有什么副作用吗?

根据documentation

@AllArgsConstructor generates a constructor with 1 parameter for each field in your class. Fields marked with @NonNull result in null checks on those parameters.

所以,不,它不会使您的字段 private & final 例如 @Value 注释。

您应该改用 @RequiredArgsConstructor,您需要一个 primary 构造函数来填充必填字段。因此,您将它们标记为 final 并使用此注释生成主构造函数。 @AllArgsConstructor 容易出错,因为它可能会生成多个 Spring 可能无法处理的构造函数。 在您的特定情况下,@AllArgsConstructor@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;

}