Spring Beans 和依赖注入
你可以自由使用任何标准的 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,表明它之后不能被更改。