# 代码结构
# 启动类的位置
通常建议你将你启动类放在一个根 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 可以用于生产环境,由于它们是独立的,非常适合部署到云服务中。