1.定位main应用类,Spring Boot应用的入口
我们通常建议将main应用类放在位于其他类上面的根包( root package) 中。 通常使用 @EnableAutoConfiguration 注解
main类, 并且暗地里为某些项定义了一个基础“search package”。 例如, 如果你正在编写一个JPA应用,被 @EnableAutoConfiguration 注解的类所在包将被用来自动搜索 @Entity 项。会自动加载main应用类所在的包下的注解。
使用根包允许你使用 @ComponentScan 注解而不需要定义一个 basePackage 属性。 如果main类位于根包中, 你也可以使
用 @SpringBootApplication 注解。
下面是一个典型的项目结构:
com
+- example
+- myproject
+- Application.java
| +
- domain
| +- Customer.java
| +- CustomerRepository.java
| +
- service
| +- CustomerService.java
| +
- web
+- CustomerController.java
Application.java 文件将声明 main 方法, 还有基本的 @Configuration 。
package com.example.myproject;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2.配置类@configuration
Spring Boot提倡基于Java的配置。 尽管你可以使用一个XML源来调用 SpringApplication.run() , 我们通常建议你使
用 @Configuration 类作为主要源。 一般定义 main 方法的类也是主要 @Configuration 的一个很好选择。
@Configuration主要配置生成Bean的配置类。
- 导入其他配置类
你不需要将所有的 @Configuration 放进一个单独的类。 @Import 注解可以用来导入其他配置类。 另外, 你也可以使
用 @ComponentScan 注解自动收集所有的Spring组件, 包括 @Configuration 类。 - 导入xml配置
如果你必须使用基于XML的配置, 建议你仍旧从一个 @Configuration 类开始。 可以使用附加的 @ImportResource 注
解加载XML配置文件。
3.自动配置
Spring Boot自动配置( auto-configuration) 尝试根据你添加的jar依赖自动配置你的Spring应用。 例如, 如果你的classpath下
存在 HSQLDB , 并且你没有手动配置任何数据库连接beans, 那么我们将自动配置一个内存型( in-memory) 数据库。
你可以通过将 @EnableAutoConfiguration 或 @SpringBootApplication 注解添加到一个 @Configuration 类上来选择自动配置。
注:你只需要添加一个 @EnableAutoConfiguration 注解。 建议你将它添加到主 @Configuration 类上。
- 逐步替换自动配置
自动配置是非侵占性的, 任何时候你都可以定义自己的配置类来替换自动配置的特定部分。 例如, 如果你添加自己
的 DataSource bean, 默认的内嵌数据库支持将不会被加载。
如果需要找出当前应用了哪些自动配置及应用, 你可以使用 --debug 开关启动应用。 这将会记录一个自动配置的报告
并输出到控制台。 - 禁用特定的自动配置
如果发现应用了你不想要的特定自动配置类, 你可以使用 @EnableAutoConfiguration 注解的排除属性来禁用它们。
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}
4.Spring Beans和依赖注入
你可以自由地使用任何标准的Spring框架技术去定义beans和它们注入的依赖。 简单起见, 经常使用 @ComponentScan 注解搜索beans, 并结合 @Autowired 构造器注入。
如果使用上面建议的结构组织代码( 将应用类放到根包下) , 你可以添加 @ComponentScan 注解而不需要任何参数。 你的所有应用程序组件( @Component , @Service , @Repository , @Controller 等) 将被自动注册为Spring Beans
下面是一个 @Service Bean的示例, 它使用构建器注入获取一个需要的 RiskAssessor bean。
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;
}
// ...
}
注:注意如何使用构建器注入来允许 riskAssessor 字段被标记为 final , 这意味着 riskAssessor 后续是不能改变的。
5.使用@SpringBootApplication注解
很多Spring Boot开发者总是使用 @Configuration , @EnableAutoConfiguration 和 @ComponentScan 注解他们的main类。 遵循最简原则, Spring Boot提供一个方便的 @SpringBootApplication 以供选择。等同于原来的@Configuration、@EnableAutoConfiguration、@ComponentScan三个注解同时使用
下面是@SpringBootApplication的注解
package com.example.myproject;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}