私は2か月間、ロンボクと協力して積極的に使用しています。 With Java私はもう少し慣れています。しかし、初めて、この言語で次の構文構造に直面しました。
@RequiredArgsController(onController = @__(@Autowired))
^^^
それはどういう意味ですか、そしてそれはどのようにコンパイルされますか?
これは実験的なLombok構文であり、_Class<?>[]
_を使用するのではなく、複数のアノテーションを参照するときに間接層をサポートするために作成されました。
構文は少し奇妙です。 3つの
onX
機能のいずれかを使用するには、コンストラクター/メソッド/パラメーターに適用されるアノテーションを@__(@AnnotationGoesHere)
でラップする必要があります。複数のアノテーションを適用するには、@__({@Annotation1, @Annotation2})
を使用します。注釈自体にも明らかにパラメータを含めることができます。
https://projectlombok.org/features/experimental/onX.html
ロンボク開発者からの説明 Roel Spilker :
その理由は、javacは解析フェーズですでにアノテーションを解決しており、アノテーションが無効であると判断できる場合はエラーを出すためです。存在しない注釈_
@__
_を使用することにより、それが偽物であると判断できず(注釈プロセッサによって作成された可能性があります)、すぐにエラーが発生することはありません。これにより、Lombokは作業を行い、コードから_@__
_を削除する時間が与えられます。
これは、生成されたコンストラクター(コントローラーではない)にも_@Autowired
_アノテーションが追加され、Springがその魔法を実行できることを意味します。 lombokを使用すると、次のようなコードを記述できます。
_@RequiredArgsConstructor(onConstructor=@__(@Autowired(required=true)))
public class FooController {
private final FooService service;
interface FooService {}
}
_
そしてlombokはそれを変換します コンパイル中 に
_public class FooController {
private final FooService service;
@Autowired(required=true)
public FooController(FooService service) {
this.service = service;
}
}
_
_@__
_は、注釈のタイプ制限を克服するために使用されます。
_@interface MultipleAnnotations {
Annotation[] value();
}
_
すべての注釈のスーパータイプ自体が注釈ではないため、機能しません。
_@interface MultipleAnnotations {
Class<? extends Annotation>[] value();
}
_
注釈にパラメータを許可しません:@MultipleAnnotations(SomeAnnotation.class)