Spring Beans 和依賴注入

你可以自由使用任何標準的 Spring Framework 技術來定義你的 bean 及其注入的依賴項。我們通常建議使用建構函式注入來連線依賴項,並使用 @ComponentScan 來查詢 bean。

如果你按照上面建議的方式組織程式碼(將你的應用類放在頂層包中),你可以在不帶任何引數的情況下新增 @ComponentScan,或者使用隱式包含它的 @SpringBootApplication 註解。你的所有應用元件(@Component@Service@Repository@Controller 等)都會被自動註冊為 Spring Beans。

以下示例展示了一個 @Service Bean,它使用建構函式注入來獲取所需的 RiskAssessor 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 有多個建構函式,你需要使用 @Autowired 標記 Spring 希望使用的那個

  • 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,表明它隨後不能被更改。