Spring Bean と依存性注入
標準の Spring Framework テクニックのいずれかを使用して、Bean とその注入された依存関係を自由に定義できます。一般的に、依存関係を接続するにはコンストラクターインジェクションを使用し、Bean を見つけるには @ComponentScan
(Javadoc) を使用することをお勧めします。
上記のようにコードを構造化する場合 (アプリケーションクラスを最上位パッケージに配置する場合)、引数なしで @ComponentScan
(Javadoc) を追加するか、暗黙的にそれを含む @SpringBootApplication
(Javadoc) アノテーションを使用できます。すべてのアプリケーションコンポーネント (@Component
、@Service
(Javadoc) 、@Repository
(Javadoc) 、@Controller
(Javadoc) など) は、自動的に Spring Bean として登録されます。
次の例は、コンストラクターインジェクションを使用して必要な RiskAssessor
Bean を取得する @Service
(Javadoc) 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
(Javadoc) でマークする必要があります。
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 としてマークされ、その後変更できないことを示すことに注意してください。 |