Spring Bean と依存性注入

標準の Spring Framework 手法を自由に使用して、Bean とその注入された依存関係を定義できます。通常、コンストラクターインジェクションを使用して依存関係を接続し、@ComponentScan を使用して Bean を検索することをお勧めします。

上記のようにコードを構造化する場合(アプリケーションクラスを最上位パッケージに配置する場合)、引数なしで @ComponentScan を追加するか、暗黙的にそれを含む @SpringBootApplication アノテーションを使用できます。すべてのアプリケーションコンポーネント(@Component@Service@Repository@Controller など)は、Spring Bean として自動的に登録されます。

次の例は、コンストラクターインジェクションを使用して必要な RiskAssessor Bean を取得する @Service Bean を示しています。

  • Java

  • Kotlin

import org.springframework.stereotype.Service;

@Service
public class MyAccountService implements AccountService {

	private final RiskAssessor riskAssessor;

	public MyAccountService(RiskAssessor riskAssessor) {
		this.riskAssessor = riskAssessor;
	}

	// ...

}
import org.springframework.stereotype.Service

@Service
class MyAccountService(private val riskAssessor: RiskAssessor) : AccountService

Bean に複数のコンストラクターがある場合は、Spring で @Autowired で使用するコンストラクターをマークする必要があります。

  • Java

  • Kotlin

import java.io.PrintStream;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MyAccountService implements AccountService {

	private final RiskAssessor riskAssessor;

	private final PrintStream out;

	@Autowired
	public MyAccountService(RiskAssessor riskAssessor) {
		this.riskAssessor = riskAssessor;
		this.out = System.out;
	}

	public MyAccountService(RiskAssessor riskAssessor, PrintStream out) {
		this.riskAssessor = riskAssessor;
		this.out = out;
	}

	// ...

}
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
import java.io.PrintStream

@Service
class MyAccountService : AccountService {

	private val riskAssessor: RiskAssessor

	private val out: PrintStream

	@Autowired
	constructor(riskAssessor: RiskAssessor) {
		this.riskAssessor = riskAssessor
		out = System.out
	}

	constructor(riskAssessor: RiskAssessor, out: PrintStream) {
		this.riskAssessor = riskAssessor
		this.out = out
	}

	// ...

}
コンストラクターインジェクションを使用すると、riskAssessor フィールドが final としてマークされ、その後変更できないことを示すことに注意してください。