こんにちは、皆さん。 Springbootを使用するときに、クラスへの自動配線サービスについて質問があります。インターネットやSpringboot仕様で見たすべての例は、似たようなことをします(Springbootバージョン1.5.7仕様からの抜粋)。
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;
}
// ...
}
これは、コンストラクターを@Autowiringすることにより、コンストラクターを介してプロパティを注入するクラスです。別の形式は、次のようにプロパティを@Autowireすることです。
@Autowired
private final RiskAssessor riskAssessor
しかし、私が仕事をしている場合、これら2つの方法が機能するには、この方法を使用する必要があると言われています。
applicationContext.getAutowireCapableBeanFactory().autowireBean(Object.class)
@Autowiredアノテーションが機能するためにはこれが必要だと彼らは私に言った。
さて、私の質問は次のとおりです。@ Autowireを正しく機能させるための簡単な注釈がないのはなぜですか。 (@AutowiredClassのようなもの)。上記のメソッドは冗長すぎて覚えにくいため、Grailsでdef someService
そして自動的に注入されます。
適切に使用する場合は、@Autowired
スプリングブートアプリケーションでは、次の手順を実行する必要があります。
@SpringBootApplication
メインクラスへ@Service
または@Component
注入したいクラスへの注釈Wieredパッケージ構造がなく、メインクラスパッケージに、スプリングでインスタンス化する他のすべてのクラスが(直接またはサブパッケージで)含まれている場合、メインクラスの単純な注釈@ComponentScan
がすべてのボイラーを保存するのに役立ちますプレートコード。その後、Springは魔法をかけ、パッケージ(およびサブパッケージ)をスキャンして、@Service
、@Component
などの注釈が付けられたクラスを探し、インスタンス化します。
さらに良いことに、メインクラスで@SpringBootApplication
を使用すると、@Configuration
もカバーされます。グリーンフィールドプロジェクトの場合、 start.spring.io -春のテンプレート生成/足場ツールから開始することをお勧めします
さて、私の質問は次のとおりです。@ Autowireを正しく機能させるための簡単な注釈がないのはなぜですか。
有る: @SpringBootApplication
これをアプリケーション(メインクラスを含むファイル)のルートに配置し、サービスが同じパッケージまたはサブパッケージにある限り、Springは適切なクラスを自動検出、インスタンス化、および注入します。
このウォークスルーには例があります: REST Service with Spring Boot
そのページで説明されているように:
@SpringBootApplicationは、次のすべてを追加する便利なアノテーションです。@ Configurationは、アプリケーションコンテキストのBean定義のソースとしてクラスにタグを付けます。 @EnableAutoConfigurationは、クラスパス設定、他のBean、およびさまざまなプロパティ設定に基づいてBeanの追加を開始するようSpring Bootに指示します。 @ComponentScanは、helloパッケージ内の他のコンポーネント、構成、およびサービスを検索するようSpringに指示し、コントローラーを検出できるようにします。
RestService
の実装に@Service
または@Component
として注釈を付ける必要があるので、Springが選択します。
@Service
public class MyRiskAssessorImpl implements RiskAssessor {
///
}
_@Autowired
_はほとんどすぐに使用できます。目的のクラスのコンポーネントスキャンを実行するだけでautowire完了です。メインクラス(またはメイン構成クラス)が@ComponentScan("{com.example.app}")
または_@SpringBootApplication
_(メインクラス)を使用していることを確認してください。 docs かなり良いことを説明しています