web-dev-qa-db-ja.com

@Valueフィールド、Lombok、およびコンストラクターインジェクションのベストプラクティス?

Java Springアプリケーションを開発しています。アプリケーションに.yml構成ファイルを使用して構成されているフィールドがいくつかあります。フィールドに@Valueアノテーションを使用してこれらの値をインポートしたいと思います。また、フィールドインジェクションではなくコンストラクタインジェクションのベストプラクティスを使用したいのですが、手動ではなくLombokを使用してコンストラクタを記述したいと思います。これらすべてを一度に行う方法はありますか?例として、これは機能しませんが、私がやりたいことに似ています:

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

    private Object myDependency;

    ...
}

この場合、LombokがmyDependencyのみを設定するコンストラクターを生成し、myFieldが構成ファイルから読み取られるようにする必要があります。

ありがとう!

6
Ertai87

@RequiredArgsConstructorが必要で、myDependencyを最終版としてマークします。この場合、Lombokは、引数として提出された「必須」の最終ファイルに基づいてコンストラクターを生成します。次に例を示します。

@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;
    } 

    //...
}

ここではコンストラクタが1つしかないため、SpringはMyComponent@Autowiredアノテーションを明示的に使用せずに を挿入します。

8
Cepr0