SpringでField InjectionよりConstructor Injectionが推奨される理由 を読んで、Springにおいて@Autowiredをフィールドに付与するField Injection、普通に使ってしまっているなぁ…と考えつつ、Constructor Injectionの方が確かに良さそうなので試してみた。これ自体は補足することはないが、Spring 4.2以前+Gradle+Querydslという点で少し躓いたのでメモ。
各種バージョンなどは以下のとおり。(いずれも少し古い)
Lombokを使っているので@RequiredArgsConstructor
を使った。
ここで問題となったのが@__
の部分。
Querydslも使っているプロジェクトでは、Lombokが動く前にQuerydsl用のクラスの自動生成をAnnotation Processorで行うため、@__
が解決できずコンパイルエラーになってしまう。
Gradleでの解決策が見つからなかったが、以下を発見。
https://github.com/ewerk/gradle-plugins/issues/59
LombokのProcessorを同時に指定してあげれば解決できるということ。
上記Issueに書かれているものを少し変えて、以下のような感じでprocessorを複数指定して無事解決。
task generateQuerydsl(type: JavaCompile) {
source = sourceSets.main.java
classpath = configurations.compile + configurations.provided
destinationDir = querydslDir
options.compilerArgs += [
'-proc:only',
'-processor', [
'com.mysema.query.apt.jpa.JPAAnnotationProcessor',
'lombok.launch.AnnotationProcessorHider$AnnotationProcessor',
].join(',')
]
}
@Configuration
に対して適用したところBean Creationが失敗。
ドキュメントを確認すると
@Configuration
ではCGLIBを利用する影響でデフォルトコンストラクタが必要(Spring 4.2まで)@Component
にすればそうした制約はないということで、@Configuration
を@Component
に変えてみると確かに動く。
とはいえ動いたとしても@Configuration
をやめるほどのメリットがわからなかったので現時点ではやめておく。