Spring Beans 和依赖注入

你可以自由使用任何标准的 Spring Framework 技术来定义你的 beans 和它们的注入依赖。 我们通常建议使用构造函数注入来连接依赖,并使用 @ComponentScan 来查找 beans。

如果你按照上述建议构建代码(将应用程序类放在顶层包中),你可以添加 @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,表明它之后不能被更改。