web-dev-qa-db-ja.com

Spring Bootで@Autowireサービスを実行する方法

こんにちは、皆さん。 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そして自動的に注入されます。

6
Greg

適切に使用する場合は、@Autowiredスプリングブートアプリケーションでは、次の手順を実行する必要があります。

  1. 追加 @SpringBootApplicationメインクラスへ
  2. 追加 @Serviceまたは@Component注入したいクラスへの注釈
  3. 問題を説明する2つの方法のいずれかを使用して、自動配線します
3
Pavlo Pastushok

Wieredパッケージ構造がなく、メインクラスパッケージに、スプリングでインスタンス化する他のすべてのクラスが(直接またはサブパッケージで)含まれている場合、メインクラスの単純な注釈@ComponentScanがすべてのボイラーを保存するのに役立ちますプレートコード。その後、Springは魔法をかけ、パッケージ(およびサブパッケージ)をスキャンして、@Service@Componentなどの注釈が付けられたクラスを探し、インスタンス化します。

さらに良いことに、メインクラスで@SpringBootApplicationを使用すると、@Configurationもカバーされます。グリーンフィールドプロジェクトの場合、 start.spring.io -春のテンプレート生成/足場ツールから開始することをお勧めします

2
Joanna

さて、私の質問は次のとおりです。@ Autowireを正しく機能させるための簡単な注釈がないのはなぜですか。

有る: @SpringBootApplication

これをアプリケーション(メインクラスを含むファイル)のルートに配置し、サービスが同じパッケージまたはサブパッケージにある限り、Springは適切なクラスを自動検出、インスタンス化、および注入します。

このウォークスルーには例があります: REST Service with Spring Boot

そのページで説明されているように:

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

1
Cuga

RestServiceの実装に@Serviceまたは@Componentとして注釈を付ける必要があるので、Springが選択します。

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

_@Autowired_はほとんどすぐに使用できます。目的のクラスのコンポーネントスキャンを実行するだけでautowire完了です。メインクラス(またはメイン構成クラス)が@ComponentScan("{com.example.app}")または_@SpringBootApplication_(メインクラス)を使用していることを確認してください。 docs かなり良いことを説明しています

0
Urosh T.