# 17. Spring Beans和依赖注入

你可以自由地使用任何标准的Spring框架技术去定义bean和它们注入的依赖。简单起见，我们经常发现使用`@ComponentScan`（用来注解搜索bean）和`@Autowired`（用来构造器注入）能够很好地工作。

如果遵循以上的建议组织代码结构（将应用的main类放到包的最上层，即root package），那么你就可以添加`@ComponentScan`注解而不需要任何参数，所有应用组件（`@Component`, `@Service`, `@Repository`, `@Controller`等）都会自动注册成Spring Beans。

下面是一个`@Service` Bean的示例，它使用构建器注入获取一个需要的`RiskAssessor` bean：

```java
package com.example.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class DatabaseAccountService implements AccountService {

    private final RiskAssessor riskAssessor;

    @Autowired
    public DatabaseAccountService(RiskAssessor riskAssessor) {
        this.riskAssessor = riskAssessor;
    }

    // ...
}
```

如果bean里面有一个构造器，你可以省略`@Autowired`。

```java
@Service
public class DatabaseAccountService implements AccountService { 

    private final RiskAssessor riskAssessor; 

    public DatabaseAccountService(RiskAssessor riskAssessor) { 

          this .riskAssessor = riskAssessor;
      } 

// ... 

}
```

**注** 注意使用构建器注入允许`riskAssessor`字段被标记为`final`，这意味着`riskAssessor`后续是不能改变的。
