2017-09-18 5 views
1

良い一日、みんな。私は、Springbootを使用しているときに私のクラスにサービスをautowiringすることに関して質問をします。これは、注入クラスがあるSpringBootで@Autowireサービスを行う方法

package com.example.service; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 

@Service 
public class DatabaseAccountService implements AccountService { 
private final RiskAssessor riskAssessor; 

@Autowired 
public DatabaseAccountService(RiskAssessor riskAssessor) { 
this.riskAssessor = riskAssessor; 
} 
// ... 
} 

:私は、インターネット上だけでなく、Springboot仕様で見てきた例はすべて、同様の何か(Springbootバージョン1.5.7仕様からの抜粋を取る)を行いますコンストラクタを@Autowiringすることにより、そのコンストラクタを介してプロパティを取得します。

applicationContext.getAutowireCapableBeanFactory().autowireBean(Object.class) 

:私はこれらの2つの方法が機能するために、私は、私はこの方法を使用する必要があると言われている、仕事

@Autowired 
private final RiskAssessor riskAssessor 

しかし、:別の形は、このような性質を@Autowireすることです彼らは@Autowired注釈が機能するために必要なことを教えてくれました。

私の質問は、なぜ@Autowireが正しく機能するようにする簡単な注釈がないのですか? (@AutowiredClassのようなもの)。上記のメソッドはあまりにも冗長で覚えにくいので、Grailsでちょうどdef someServiceと言っているように、サービスを注入するために@Autowiredをクラスに追加するより良い方法があるはずです。

+0

あなたの質問は少し不明です...実際に 'applicationContext.getAutowireCapableBeanFactory()。autowireBean(DatabaseAccountService .class) '? 「はい」の場合は、その必要はありません。 「コンポーネントスキャン」を正しく設定するだけです。 – Tom

+0

私は特別なwrtアプリケーションコンテキストを行う必要はないと思います。 RiskAssessor BeanがSpringの設定のどこかに作成されていることを確認してください。 –

+0

Springブートでは、Mainクラスのパッケージまたはそのサブパッケージに入っている限り、必要はありません。 –

答えて

0

あなたはそれを拾うだろう@Serviceまたは@ComponentそうとしてRestServiceの実装に注釈を付ける必要があります。

@Service 
public class MyRiskAssessorImpl implements RiskAssessor { 
/// 
} 
+0

注入されたサービスを@コンポーネントで受け取るクラスに注釈を付ける必要があるので、@ Autowiredを使用してクラスにサービスを注入することができますか? – Greg

+0

「@ Autowired」になるクラスに注釈を付ける必要があることを意味します。 – Zilvinas

1

今、あなたに私の質問は:なぜ@Autowireが正しく機能することを可能にする簡単な注釈はありませんか?

があります:@SpringBootApplication

あなたがいる限り、あなたのサービスが同じパッケージまたはサブパッケージであるとして、アプリケーションのルート(メインクラスを含むファイル)でこれを入れている場合は、春には、適切なクラスを自動的に発見し、インスタンス化し、注入します。このウォークスルーの例があります

は:REST Service with Spring Boot、そのページで説明したように

@SpringBootApplicationは、以下のすべての追加便利な注釈です: @Configurationは、クラスとしてのタグアプリケーションコンテキストのBean定義のソース。 @EnableAutoConfigurationは、クラスパス設定、その他のBean、およびさまざまなプロパティ設定に基づいてBeanの追加を開始するようSpringブートに指示します。 @ComponentScanは、helloパッケージ内の他のコンポーネント、構成、サービスを検索し、コントローラを見つけることをSpringに指示します。

0

@Autowiredはほぼそのまま使用できます。 autowireにしたいクラスのコンポーネントスキャンを実行するだけです。主なクラス(または主な構成クラス)が@ComponentScan("{com.example.app}")または@SpringBootApplication(メインクラス)を使用していることを確認してください。あなたが正しく、ばねブートアプリケーションで@Autowiredを使用したい場合は、次の手順を実行する必要があります

1

docsかなり良いこのようなものを説明します

  • @Service@Component注釈を追加

    1. があなたのメインクラスに@SpringBootApplicationを追加あなたが注入したいクラスに
    2. あなたが問題にして説明する2つの方法のうちの1つを使用して、オートワイヤします。
  • +0

    サービスを注入するクラスに@Componentを追加する部分が欠落していると思います。私は時間があり、あなたの解決策をチェックするときにこれをテストします。 – Greg

    2

    パッケージ構造がなく、メインクラスパッケージに春にインスタンス化する(直接またはサブパッケージ内にある)すべての他のクラスが含まれている場合は、メインクラスのシンプルなアノテーション@ComponentScanがボイラープレートのコードをすべて保存するのに役立ちます。そうすれば、春は魔法を行い、パッケージ(およびサブパッケージ)をスキャンし、@Service@Componentなどで注釈付けされたクラスを探してインスタンス化します。

    メインクラスで@SpringBootApplicationを使用すると、@Configurationも同様に扱われます。もし緑色のフィールドプロジェクトであれば、私はstart.spring.ioから始めることをお勧めします。春のためのテンプレート生成/足場ツール

    +0

    サービスを注入したいクラスで@Componentスキャンが必要ですか? – Greg

    関連する問題