@Value字段、龙目岛和构造函数注入的最佳实践?

2022-09-01 05:10:29

我正在开发一个Java Spring应用程序。我的应用程序中有一些字段是使用.yml配置文件配置的。我想在相关字段上使用@Value注释导入这些值。我也想使用构造函数注入而不是字段注入的最佳实践,但我想使用龙目岛而不是手动编写构造函数。有没有办法同时完成所有这些事情?例如,这不起作用,但与我想做的类似:

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

    private Object myDependency;

    ...
}

在这种情况下,我想要的是龙目岛生成一个只设置myDependency的构造函数,并从我的配置文件中读取myField。

谢谢!


答案 1

您需要并标记为最终状态。在这种情况下,龙目岛将基于“必需”最终提交为参数生成构造函数,例如:@RequiredArgsConstructormyDependency

@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注入没有显式使用@Autowired注释MyComponent


答案 2

男性确定您使用的至少是龙目岛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;
}

下面是龙目岛生成的类:

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,但它不起作用。

从这里得到的回应。


推荐