@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;
}
我是否需要将此声明为private
并final
注入此服务? Lombok 会像处理 @Data
和 bean 那样处理这个问题吗?有什么副作用吗?
@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;
}
假设我有以下构造函数注入(不是自动装配):
@Service
public class FooService {
private final OrderService orderService;
public FooService(OrderService orderService) {
this.orderService = orderService;
}
}
可以替换为:
@Service
@AllArgsConstructor
public class FooService {
private final OrderService orderService;
}
我是否需要将此声明为private
并final
注入此服务? Lombok 会像处理 @Data
和 bean 那样处理这个问题吗?有什么副作用吗?
@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;
}