spring @Value字段、Lombok和构造函数注入的最佳实践?

cetgtptt  于 2023-02-28  发布在  Spring
关注(0)|答案(2)|浏览(153)

我正在开发一个Java Spring应用程序。我的应用程序中有一些字段是使用. yml配置文件配置的。我想在这些字段上使用@Value注解导入这些值。我还想使用构造函数注入而不是字段注入的最佳实践。但是我想用Lombok来写我的构造函数,而不是手工写。有没有办法一次完成所有这些事情呢?举个例子,这个方法不起作用,但是和我想做的很相似:

@AllArgsConstructor
public class my service {
    @Value("${my.config.value}")
    private String myField;

    private Object myDependency;

    ...
}

在本例中,我需要的是Lombok生成一个只设置myDependency的构造函数,并从我的配置文件中读取myField。
谢谢!

kb5ga3dv

kb5ga3dv1#

您需要@RequiredArgsConstructor并将myDependency标记为final。在这种情况下,Lombok将基于作为参数的“required”final字段生成一个构造函数,例如:

@RequiredArgsConstructor
@Service
public class MyService {

    @Value("${my.config.value}")
    private String myField;

    private final MyComponent myComponent;

    //...
}

这等于:

@Service
public class MyService {

    @Value("${my.config.value}")
    private String myField;

    private final MyComponent myComponent;

    public MyService(MyComponent myComponent) { // <= implicit injection
        this.myComponent = myComponent;
    } 

    //...
}

因为这里只有一个构造函数,所以Spring注入MyComponentwithout the explicit use of the @Autowired annotation

d5vmydt9

d5vmydt92#

请确保您使用的Lombok版本至少为1.18.4,并且您已将所需的注解添加到lombok.config文件中。

lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Value

下面是您的类:

@AllArgsConstructor(onConstructor = @__(@Autowired))
public class MyService{

    @Value("${my.config.value}")
    private String myField;

    private Object myDependency;
}

下面是Lombok生成的类:

public class MyService {

@Value("${my.config.value}")
private String myField;

private Object myDependency;

@Autowired
@Generated
public MyService(@Value("${my.config.value}") final String myField, final Object myDependency) {
    this.myField = myField;
    this.myDependency = myDependency;
}

PS:确保你在/src/main/java文件夹下有lombok.config文件。我试着把它添加到/src/main/resources,它不起作用。
响应取自Lombok - retain field's annotation in constructor input params

相关问题