【问题标题】:@AllArgsConstructor and Constructor Injection with Spring: is private final needed?@AllArgsConstructor 和 Spring 的构造函数注入:需要私有 final 吗?
【发布时间】:2020-10-19 05:24:33
【问题描述】:

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

@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 和 beans 一样处理这个问题吗?有什么副作用吗?

【问题讨论】:

  • 你在哪里看到静态的?
  • @AllArgsConstructor 使用 Lombok,将生成一个构造函数来设置所有声明的(不是最终的,不是静态的)字段。
  • @Adrian,不打算将静态作为问题的一部分。已删除。

标签: spring-boot java-8 lombok constructor-injection


【解决方案1】:

根据documentation

@AllArgsConstructor 为类中的每个字段生成一个带有 1 个参数的构造函数。标有@NonNull 的字段会导致对这些参数进行空检查。

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

【讨论】:

    【解决方案2】:

    您应该改用@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;
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多