Kotlinで次のようなことを行うことは可能ですか?
@Autowired
internal var mongoTemplate: MongoTemplate
@Autowired
internal var solrClient: SolrClient
Kotlinで次のようなことを行うことは可能ですか?
@Autowired
internal var mongoTemplate: MongoTemplate
@Autowired
internal var solrClient: SolrClient
回答:
Springで依存性注入を行うための推奨されるアプローチはコンストラクター注入です。
@Component
class YourBean(
private val mongoTemplate: MongoTemplate,
private val solrClient: SolrClient
) {
// code
}
Spring 4.3より前では、コンストラクターに次のアノテーションを明示的に付ける必要がありますAutowired
。
@Component
class YourBean @Autowired constructor(
private val mongoTemplate: MongoTemplate,
private val solrClient: SolrClient
) {
// code
}
まれに、フィールドインジェクションを使用したい場合がありますlateinit
。
@Component
class YourBean {
@Autowired
private lateinit var mongoTemplate: MongoTemplate
@Autowired
private lateinit var solrClient: SolrClient
}
コンストラクターの注入は、Beanの作成時にすべての依存関係をチェックしval
、注入されたすべてのフィールドはです。一方、lateinitの注入されたフィールドは、のみvar
であり、実行時のオーバーヘッドはほとんどありません。また、コンストラクターを使用してクラスをテストするために、リフレクションは必要ありません。
リンク:
@Autowired
withプライマリコンストラクターパラメーターを使用できますか?
autowired
byセッターも追加できますか?
YourBean
してFooBean
たとき場合には、YourBean
依存関係がパブリックになります(デフォルト修飾子Kotlinで)開発者が利用可能YourBean
で依存関係をFooBean
(yourBean.mongoTemplate
)。ただし、YourBean
依存関係は彼の公開契約ではなく、実装の詳細にすぎないため、これは許可されるべきではありません(ほとんどの場合)。代わりに、FooBean
独自のコンストラクターで独自の依存関係を定義する必要があります。
はい、JavaアノテーションはKotlinでほとんどJavaと同様にサポートされています。1つの落とし穴は、プライマリコンストラクターのアノテーションに明示的な「コンストラクター」キーワードが必要なことです。
https://kotlinlang.org/docs/reference/annotations.htmlから
クラスのプライマリコンストラクターにアノテーションを付ける必要がある場合は、コンストラクター宣言にコンストラクターキーワードを追加し、その前にアノテーションを追加する必要があります。
class Foo @Inject constructor(dependency: MyDependency) {
// ...
}