kotlinで@AutowiredのようなSpringアノテーションを使用するにはどうすればよいですか?


84

Kotlinで次のようなことを行うことは可能ですか?

@Autowired
internal var mongoTemplate: MongoTemplate

@Autowired
internal var solrClient: SolrClient

3
やってみました?そしてもう少し建設的にするために..SpringBootテンプレート全体がありますが、答えは間違いなく「はい」です。
mabi 2016

@mabiチュートリアルリンクをありがとう:)
eendroroy 2016

回答:


187

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であり、実行時のオーバーヘッドはほとんどありません。また、コンストラクターを使用してクラスをテストするために、リフレクションは必要ありません。

リンク:

  1. lateinitに関するドキュメント
  2. コンストラクターに関するドキュメント
  3. Kotlinを使用したSpringBootアプリケーションの開発

@Autowiredwithプライマリコンストラクターパラメーターを使用できますか?
Asif Mushtaq 2018

確かに、2番目と3番目の例ではインジェクションにプライマリコンストラクターを使用しています。
Ruslan

autowiredbyセッターも追加できますか?
Asif Mushtaq 2018

@IRus、あなたはあなたの例でプライベート値を使用しましたが、インターネットで見つけたすべての例の80%は、Kotlinに関しては「プライベート」修飾子がないものだと思います。これは、Javaではコードの臭いと見なされます。その理由は何ですか?あなたはたまたま知っていますか?私はそれが別の質問に値するとさえ思います。
yuranos 2018

@ yuranos87その開発者の注入を想像YourBeanしてFooBeanたとき場合には、YourBean依存関係がパブリックになります(デフォルト修飾子Kotlinで)開発者が利用可能YourBeanで依存関係をFooBeanyourBean.mongoTemplate)。ただし、YourBean依存関係は彼の公開契約ではなく、実装の詳細にすぎないため、これは許可されるべきではありません(ほとんどの場合)。代わりに、FooBean独自のコンストラクターで独自の依存関係を定義する必要があります。
ルスラン

6

はい、JavaアノテーションはKotlinでほとんどJavaと同様にサポートされています。1つの落とし穴は、プライマリコンストラクターのアノテーションに明示的な「コンストラクター」キーワードが必要なことです。

https://kotlinlang.org/docs/reference/annotations.htmlから

クラスのプライマリコンストラクターにアノテーションを付ける必要がある場合は、コンストラクター宣言にコンストラクターキーワードを追加し、その前にアノテーションを追加する必要があります。

class Foo @Inject constructor(dependency: MyDependency) {
  // ...
}

4

コンストラクターを介して依存関係を自動配線することもできます。依存関係に@Configuration, @Component, @Serviceetcで注釈を付けることを忘れないでください

import org.springframework.stereotype.Component

@Component
class Foo (private val dependency: MyDependency) {
    //...
}

0

そのように

@Component class Girl( @Autowired var outfit: Outfit)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.