SpringBoot 官方文档中文版 - 5. Spring Beans 和 DI

前言

这是 SpringBoot 官方文档中文翻译版系列的第五篇文章:

前四篇文章如下:

SpringBoot 官方文档中文版 - 1. 入门指南

SpringBoot 官方文档中文版 - 2. 构建系统

SpringBoot 官方文档中文版 - 3. 构建你的代码

SpringBoot 官方文档中文版 - 4. 配置类与自动化配置

Spring Beans and Dependency Injection

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

如果按照上面的建议构造代码(将应用程序类放在顶级包中),可以不带任何参数地添加 @ComponentScan,或者使用 @SpringBootApplication 注释(它隐式地包含了它)。你的所有应用组件(@Component, @Service, @Repository, @Controller等等)都会自动注册为 Spring bean

下面的示例展示了一个 @Service Bean,它使用构造函数注入来获取所需的 RiskAssessor Bean:

import org.springframework.stereotype.Service;

@Service
public class MyAccountService implements AccountService {

    private final RiskAssessor riskAssessor;

    public MyAccountService(RiskAssessor riskAssessor) {
        this.riskAssessor = riskAssessor;
    }

    // ...

}

如果一个 bean 有多个构造函数,你需要用 @Autowired 标记你想让 Spring 使用的那个构造函数:

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;
    }

    // ...

}

请注意,使用构造函数注入时,riskAssessor 字段被标记为 final,表明它不能随意更改。

每天学习一点点,每天进步一点点。

posted @ 2021-07-25 08:34  爱吃西瓜的番茄酱  阅读(2188)  评论(0编辑  收藏  举报