# 代码结构

# 启动类的位置

通常建议你将你启动类放在一个根 package 中,高于其他的类, @SpringBootApplication 注解一般都是注解在启动类上的。它默认会扫描当前类下的所有子包。例如,如果你正在编写一个 JPA 应用程序,你的  @Entity  类只有定义在启动类的子包下才能被扫描加载到。

一个项目典型的布局如下。

com
 +- example
     +- myapplication
         +- MyApplication.java
         |
         +- customer
         |   +- Customer.java
         |   +- CustomerController.java
         |   +- CustomerService.java
         |   +- CustomerRepository.java
         |
         +- order
             +- Order.java
             +- OrderController.java
             +- OrderService.java
             +- OrderRepository.java

MyApplication.java  文件声明了  main  方法,以及标识了基本的  @SpringBootApplication  注解。

将表对应的实体类、接口、服务层、控制层放在同一个文件夹中。

# Spring Bean 和 依赖注入

Bean 应该就是组件

可以使用任何标准的 Spring 技术来定义你的 Bean 以及依赖注入关系。 推荐使用构造函数注入,并使用  @ComponentScan  注解来扫描 Bean。

可以在启动类添加  @ComponentScan  注解,也不需要定义它任何参数, 你的所有应用组件( @Component@Service@Repository@Controller  和其他)都会自动注册为 Spring Bean。

也可以直接使用  @SpringBootApplication  注解(该注解已经包含了  @ComponentScan )。

# 构造函数注入依赖

下面的例子展示了一个  @Service  Bean,它使用构造器注入的方式注入了  RiskAssessor  Bean。

@Service 
public class MyAccountService implements AccountService { 
	private final RiskAssessor riskAssessor; 
	public MyAccountService(RiskAssessor riskAssessor) { 
		this.riskAssessor = riskAssessor; 
	} 
	// ... 
}

如果一个 Bean 有多个构造函数,你需要用  @Autowired  注解来告诉 Spring 该用哪个构造函数进行注入。

# @SpringBootApplication 注解

在主应用类中,使用  @SpringBootApplication  注解来启用 Spring Boot。

一个  @SpringBootApplication  注解就可以用来启用多个功能,比如:

  • @EnableAutoConfiguration :启用 Spring Boot 的自动配置机制。
  • @ComponentScan :对应用程序所在的包启用  @Component  扫描(见最佳实践)。
  • @SpringBootConfiguration :允许在 Context 中注册额外的 Bean 或导入额外的配置类。这是 Spring 标准的  @Configuration  的替代方案,有助于在你的集成测试中检测配置

这些功能都不是强制必须的,你可以随时只使用其中任意功能的注解。

# 运行应用与打包

打包成 jar 文件运行或部署。可执行 jar 可以用于生产环境,由于它们是独立的,非常适合部署到云服务中。