SpringBoot概述
1. 核心概念
1.1 自动配置
-
Spring Boot 根据项目的依赖自动配置 Spring 应用。
-
Spring Boot 会自动配置数据源、JPA 相关 Bean 等。
-
开发者可以通过
application.properties
或application.yml
覆盖默认配置。
1.2 约定优于配置(Convention over Configuration)
-
Spring Boot 提供了大量默认配置,开发者只需在需要时进行覆盖。
-
例如,默认的静态资源路径是
src/main/resources/static
,默认的配置文件是application.properties
或application.yml
。
1.3 独立运行(Standalone)
-
Spring Boot 应用可以打包成可执行的 JAR 或 WAR 文件,内嵌 Tomcat、Jetty 或 Undertow 服务器,无需部署到外部容器。
-
通过
java -jar
命令即可运行应用。
2. Spring Boot 的核心组件
2.1 Spring Boot Starter
-
提供了一系列依赖描述符,简化了依赖管理。
-
每个 Starter 都包含一组相关的依赖,开发者只需引入一个 Starter 即可使用相关功能。
2.2 Spring Boot AutoConfigure
-
自动配置模块,根据类路径上的依赖自动配置 Spring 应用。
2.3 Spring Boot Actuator
-
提供了生产级别的监控和管理功能。
-
主要功能包括:
-
健康检查(
/actuator/health
)。 -
应用信息(
/actuator/info
)。 -
指标收集(
/actuator/metrics
)。 -
环境信息(
/actuator/env
)。
-
2.4 Spring Boot CLI
-
命令行工具,用于快速开发和测试 Spring Boot 应用。
-
支持 Groovy 脚本,可以快速编写和运行 Spring Boot 应用。
3. Spring Boot 的开发流程
3.1 项目创建
-
使用 Spring Initializr(https://start.spring.io/)快速生成项目结构。
-
选择依赖(如 Web、JPA、Security 等),生成项目后导入 IDE。
3.2 编写代码
-
主类使用
@SpringBootApplication
注解,标记为 Spring Boot 应用的入口。 -
编写 Controller、Service、Repository 等组件。
3.3 运行应用
-
通过
mvn spring-boot:run
或直接运行主类来启动应用。 -
应用启动后,内嵌服务器会监听指定端口(默认 8080)。
3.4 打包部署
-
使用
mvn package
打包成可执行的 JAR 或 WAR 文件。 -
通过
java -jar
命令运行 JAR 文件,或部署到外部服务器。
4. Spring Boot 的配置文件
4.1 配置文件格式
-
支持
application.properties
和application.yml
两种格式。 -
YAML 格式更适合复杂的配置结构。
4.2 多环境配置
-
通过
application-{profile}.properties
或application-{profile}.yml
实现不同环境的配置。 -
例如:
-
application-dev.properties
:开发环境配置。 -
application-prod.properties
:生产环境配置。
-
-
通过
spring.profiles.active
指定激活的环境。
4.3 外部化配置
-
支持从多种来源加载配置,包括:
-
命令行参数。
-
环境变量。
-
外部配置文件(如
/config/application.properties
)。
-
5. Spring Boot 的数据库集成
5.1 Spring Data JPA
-
简化了 JPA 的使用,提供了 CRUD 操作的默认实现。
-
主要注解:
-
@Entity
:标记实体类。 -
@Repository
:标记数据访问层。 -
@Query
:自定义查询。
-
5.2 MyBatis
-
支持 SQL 映射,提供了更灵活的 SQL 操作。
-
通过
@Mapper
注解标记 MyBatis 接口。
5.3 数据库迁移工具
-
集成 Flyway 或 Liquibase,用于管理数据库版本控制。
6.Spring Boot 的测试
6.1 单元测试
-
使用 JUnit 和 Mockito 编写单元测试。
6.2 集成测试
-
使用
@SpringBootTest
注解进行集成测试。
6.3 端到端测试
-
使用工具如 Selenium 或 RestAssured 进行端到端测试。
7. Spring Boot 的优缺点
7.1 优点
-
快速开发,减少配置。
-
内嵌服务器,简化部署。
-
丰富的生态系统和社区支持。
7.2 缺点
-
自动配置可能导致不透明性,调试困难。
-
对于非常复杂的应用,可能需要手动配置。
SpringBoot中注解
1. 核心注解
1.1 @SpringBootApplication
-
作用:标记主类,表示这是一个 Spring Boot 应用。
-
组合注解:包含
@Configuration
、@EnableAutoConfiguration
和@ComponentScan
。
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
1.2 @Configuration
-
作用:标记一个类为配置类,相当于 Spring 的 XML 配置文件。
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
1.3 @ComponentScan
-
作用:自动扫描并注册指定包下的组件(如
@Component
、@Service
、@Repository
等)。
@ComponentScan(basePackages = "com.example")
public class AppConfig {}
1.4 @EnableAutoConfiguration
-
作用:启用 Spring Boot 的自动配置机制。
@EnableAutoConfiguration
public class MyApplication {}
2. Web 相关注解
2.1 @RestController
-
作用:组合了
@Controller
和@ResponseBody
,用于定义 RESTful Web 服务。
@RestController
public class MyController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
2.2 @RequestMapping
-
作用:映射 HTTP 请求到处理方法。
@RequestMapping(value = "/api", method = RequestMethod.GET)
public String getData() {
return "Data";
}
2.3 @GetMapping / @PostMapping / @PutMapping / @DeleteMapping
-
作用:简化
@RequestMapping
的写法,分别用于处理 GET、POST、PUT、DELETE 请求。
@GetMapping("/users")
public List<User> getUsers() {
return userService.getAllUsers();
}
2.4 @RequestParam
-
作用:绑定 HTTP 请求参数到方法参数。
@GetMapping("/user")
public User getUser(@RequestParam("id") Long id) {
return userService.getUserById(id);
}
2.5 @PathVariable
-
作用:绑定 URL 路径变量到方法参数。
@GetMapping("/user/{id}")
public User getUser(@PathVariable("id") Long id) {
return userService.getUserById(id);
}
2.6 @RequestBody
-
作用:将 HTTP 请求体绑定到方法参数,通常用于接收 JSON 数据。
@PostMapping("/user")
public User createUser(@RequestBody User user) {
return userService.saveUser(user);
}
2.7 @ResponseBody
-
作用:将方法返回值直接写入 HTTP 响应体。
@GetMapping("/hello")
@ResponseBody
public String hello() {
return "Hello, World!";
}
3. 依赖注入相关注解
3.1 @Autowired
-
作用:自动注入依赖,可以用于字段、构造方法或 Setter 方法。
@Service
public class MyService {
@Autowired
private MyRepository myRepository;
}
3.2 @Component
-
作用:标记一个类为 Spring 组件,由 Spring 容器管理。
@Component
public class MyComponent {}
3.3 @Service
-
作用:标记一个类为服务层组件。
@Service
public class MyService {}
3.4 @Repository
-
作用:标记一个类为数据访问层组件,通常用于 DAO 类。
@Repository
public class MyRepository {}
3.5 @Bean
-
作用:标记一个方法返回的对象为 Spring Bean。
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
4. 配置相关注解
4.1 @Value
-
作用:注入配置文件中的属性值。
@Value("${app.name}")
private String appName;
4.2 @ConfigurationProperties
-
作用:将配置文件中的属性绑定到一个 Java 对象。
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private String name;
private String version;
// getters and setters
}
4.3 @PropertySource
-
作用:指定自定义的配置文件。
@Configuration
@PropertySource("classpath:custom.properties")
public class CustomConfig {}
5. 测试相关注解
5.1 @SpringBootTest
-
作用:用于集成测试,加载完整的 Spring 应用上下文。
@SpringBootTest
public class MyIntegrationTest {}
5.2 @MockBean
-
作用:在测试中模拟一个 Spring Bean。
@SpringBootTest
public class MyServiceTest {
@MockBean
private MyRepository myRepository;
}
5.3 @Test
-
作用:标记一个方法为测试方法。
@Test
public void testMethod() {
// 测试逻辑
}
6. AOP 相关注解
6.1 @Aspect
-
作用:标记一个类为切面。
@Before("execution(* com.example.service.*.*(..))")
public void beforeAdvice() {
System.out.println("Before method execution");
}
6.2 @Before / @After / @Around
-
作用:定义切面通知,分别在方法执行前、执行后或环绕执行。
@Before("execution(* com.example.service.*.*(..))")
public void beforeAdvice() {
System.out.println("Before method execution");
}
7. 事务管理相关注解
7.1 @Transactional
-
作用:标记一个方法或类需要事务管理。
@Transactional
public void updateUser(User user) {
userRepository.save(user);
}
8. 缓存相关注解
8.1 @Cacheable
-
作用:标记方法的返回值需要缓存。
@Cacheable("users")
public User getUserById(Long id) {
return userRepository.findById(id);
}
8.2 @CacheEvict
-
作用:清除缓存。
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
9. 定时任务相关注解
9.1 @Scheduled
-
作用:标记一个方法为定时任务。
@Scheduled(fixedRate = 5000)
public void runTask() {
System.out.println("Task executed");
}
10. 国际化相关注解
10.1 @MessageSource
-
作用:注入消息源,用于国际化。
@Autowired
private MessageSource messageSource;