一、核心概念
1. Spring Boot 优点
-
快速创建独立、生产级的Spring应用
-
内嵌服务器(Tomcat/Jetty/Undertow),无需WAR部署
-
自动配置,简化配置
-
提供生产就绪特性(健康检查、指标、外部配置)
-
无代码生成,无需XML配置
2. 核心注解
@SpringBootApplication
// 等价于:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
3. 自动配置原理
// 1. spring.factories 中定义自动配置类
// 2. @Conditional 条件注解控制加载
// 3. 通过 spring-boot-autoconfigure 实现
二、自动配置
1. 条件注解
@ConditionalOnClass // 类路径存在指定类
@ConditionalOnMissingClass
@ConditionalOnBean // 容器中存在指定Bean
@ConditionalOnMissingBean
@ConditionalOnProperty // 配置属性存在
@ConditionalOnResource // 资源存在
@ConditionalOnWebApplication
@ConditionalOnNotWebApplication
@ConditionalOnExpression // SpEL表达式
2. 禁用自动配置
// 方式1:注解
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
// 方式2:配置
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
3. 自定义 Starter
# 1. 创建 spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration
# 2. 创建配置类
@Configuration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyProperties.class)
public class MyAutoConfiguration {
// 自动配置逻辑
}
三、配置管理
1. 配置文件优先级
# 1. 命令行参数
# 2. 系统环境变量
# 3. 外部配置文件(application-{profile}.yml)
# 4. 内部配置文件(application-{profile}.yml)
# 5. @ConfigurationProperties
# 6. 默认值
2. 多环境配置
# application.yml
spring:
profiles:
active: @activatedProperties@ # Maven属性
# application-dev.yml
# application-prod.yml
# application-test.yml
3. 配置绑定
// 方式1:@ConfigurationProperties
@Component
@ConfigurationProperties(prefix = "myapp")
@Data
public class MyConfig {
private String name;
private int port;
private List<String> hosts;
}
// application.yml
myapp:
name: demo
port: 8080
hosts:
- host1
- host2
四、Web开发
1. RESTful API
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
@PostMapping
public User createUser(@Valid @RequestBody User user) {
return userService.save(user);
}
@PutMapping("/{id}")
public User updateUser(@PathVariable Long id,
@RequestBody User user) {
return userService.update(id, user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
userService.delete(id);
}
}
2. 全局异常处理
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public Result handleException(Exception e) {
return Result.error(e.getMessage());
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result handleValidation(MethodArgumentNotValidException e) {
String message = e.getBindingResult()
.getFieldErrors()
.stream()
.map(FieldError::getDefaultMessage)
.collect(Collectors.joining(","));
return Result.error(message);
}
}
3. 拦截器与过滤器
// 拦截器
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
// 鉴权逻辑
return true;
}
}
// 注册拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private AuthInterceptor authInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/login");
}
}
五、数据访问
1. 整合 MyBatis
# application.yml
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.example.entity
configuration:
map-underscore-to-camel-case: true
2. 多数据源配置
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionFactory primarySqlSessionFactory(
@Qualifier("primaryDataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
}
3. 事务管理
@Service
public class UserService {
@Transactional(rollbackFor = Exception.class)
public void createUser(User user) {
// 业务逻辑
userRepository.save(user);
// 异常时回滚
}
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
// 事务传播
}
}
六、缓存
1. 整合 Redis
spring:
redis:
host: localhost
port: 6379
password:
database: 0
lettuce:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 0
2. 缓存注解
@Service
@CacheConfig(cacheNames = "users")
public class UserService {
@Cacheable(key = "#id")
public User getUser(Long id) {
return userRepository.findById(id);
}
@CachePut(key = "#user.id")
public User updateUser(User user) {
return userRepository.save(user);
}
@CacheEvict(key = "#id")
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
@Caching(evict = {
@CacheEvict(key = "#user.id"),
@CacheEvict(key = "'list'")
})
public void update(User user) {
// 更新操作
}
}
七、安全
1. Spring Security 配置
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
2. JWT 集成
@Component
public class JwtTokenUtil {
public String generateToken(UserDetails userDetails) {
Map<String, Object> claims = new HashMap<>();
return Jwts.builder()
.setClaims(claims)
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + expiration))
.signWith(SignatureAlgorithm.HS512, secret)
.compact();
}
}
八、消息队列
1. 整合 RabbitMQ
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
2. 生产者
@Component
public class RabbitProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMessage(String exchange, String routingKey, Object message) {
rabbitTemplate.convertAndSend(exchange, routingKey, message);
}
}
3. 消费者
@Component
@RabbitListener(queues = "queueName")
public class RabbitConsumer {
@RabbitHandler
public void process(String message) {
// 处理消息
}
}
九、监控与管理
1. Actuator 端点
management:
endpoints:
web:
exposure:
include: "*" # 暴露所有端点
endpoint:
health:
show-details: always
常用端点:
-
/actuator/health- 健康检查 -
/actuator/info- 应用信息 -
/actuator/metrics- 指标 -
/actuator/loggers- 日志级别 -
/actuator/beans- Bean信息 -
/actuator/mappings- 请求映射
2. 自定义健康检查
@Component
public class CustomHealthIndicator implements HealthIndicator {
@Override
public Health health() {
// 检查逻辑
boolean isHealthy = checkService();
if (isHealthy) {
return Health.up()
.withDetail("service", "available")
.build();
} else {
return Health.down()
.withDetail("service", "unavailable")
.build();
}
}
}
十、测试
1. 单元测试
@SpringBootTest
@RunWith(SpringRunner.class)
public class UserServiceTest {
@MockBean
private UserRepository userRepository;
@Autowired
private UserService userService;
@Test
public void testGetUser() {
User mockUser = new User();
mockUser.setId(1L);
mockUser.setName("test");
when(userRepository.findById(1L))
.thenReturn(Optional.of(mockUser));
User result = userService.getUser(1L);
assertEquals("test", result.getName());
}
}
2. 集成测试
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserService userService;
@Test
public void testGetUser() throws Exception {
when(userService.getUser(1L))
.thenReturn(new User(1L, "test"));
mockMvc.perform(get("/api/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("test"));
}
}
十一、部署与优化
1. 打包部署
# 打包
mvn clean package
# 运行
java -jar target/myapp.jar
# 指定配置
java -jar myapp.jar --spring.profiles.active=prod
2. Docker 部署
# Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
3. 性能优化
# 应用优化
server:
tomcat:
max-threads: 200
min-spare-threads: 10
# JVM参数
java -Xms512m -Xmx1024m -XX:+UseG1GC -jar app.jar
十二、常见问题
1. 循环依赖
// 场景:A依赖B,B依赖A
// 解决方案:
// 1. 使用@Lazy延迟加载
@Component
public class A {
@Autowired
@Lazy
private B b;
}
// 2. 使用Setter/构造器注入
// 3. 使用@PostConstruct
2. Bean 作用域
@Scope("singleton") // 单例(默认)
@Scope("prototype") // 原型
@Scope("request") // 请求
@Scope("session") // 会话
@Scope("application") // 应用
3. 启动流程
1. 加载 SpringApplication
2. 运行 run() 方法
3. 准备环境 Environment
4. 创建 ApplicationContext
5. 执行 ApplicationContextInitializer
6. 加载 BeanDefinitions
7. refresh() 刷新上下文
8. 执行 Runner
9. 启动完成
十三、新版本特性(2.x/3.x)
1. Spring Boot 2.x
-
响应式编程(WebFlux)
-
Actuator 重构
-
Micrometer 集成
-
支持 Java 11
-
自动配置改进
2. Spring Boot 3.x
-
基于 Spring Framework 6
-
支持 Java 17+
-
迁移到 Jakarta EE 9+
-
原生镜像支持(GraalVM)
-
改进的 AOT 处理
面试准备建议:
-
深入理解自动配置原理
-
掌握常用注解和配置
-
熟悉各模块整合(MyBatis、Redis、MQ等)
-
了解性能优化和监控
-
准备实际项目经验
-
关注版本更新和新特性
-
掌握问题排查和调试技巧
高频问题:
-
Spring Boot启动流程
-
自动配置实现原理
-
如何自定义Starter
-
多环境配置
-
事务管理
-
缓存使用
-
异常处理
-
性能监控
-
部署方案