Spring Bean 和依賴注入
你可以使用任何標準的 Spring Framework 技術來定義你的 Bean 及其注入的依賴。我們通常建議使用建構函式注入來連線依賴,並使用 @ComponentScan 來查詢 Bean。
如果你的程式碼結構如上所述(將應用程式類放在頂級包中),你可以不帶任何引數新增 @ComponentScan,或者使用隱式包含它的 @SpringBootApplication 註解。你所有的應用程式元件(@Component、@Service、@Repository、@Controller 等)都會自動註冊為 Spring Bean。
以下示例展示了一個 @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,表明它不能隨後被更改。 |