1. Spring框架核心机制解析
1.1 IOC容器工作原理深度剖析
IOC(控制反转)是Spring框架最核心的设计理念。传统Java开发中,对象创建和依赖管理由程序员手动完成,而Spring通过IOC容器接管了这一过程。具体实现上,Spring提供了两种容器:
- BeanFactory:基础容器接口,提供最基本的DI支持
- ApplicationContext:扩展容器,添加了企业级功能如:
- 国际化支持
- 事件发布机制
- 资源访问能力
- AOP集成
Bean生命周期管理是IOC的核心能力,完整流程如下:
-
实例化阶段:
- 通过反射调用构造方法创建Bean实例
- 优先使用@Autowired标注的构造器
- 若无指定则使用无参构造器
-
属性填充阶段:
- 解析@Autowired/@Value注解
- 处理setter方法注入
- 解决依赖关系(可能触发依赖Bean的创建)
-
初始化阶段:
- 执行@PostConstruct方法
- 实现InitializingBean接口的afterPropertiesSet()
- 自定义init-method
-
销毁阶段:
- 执行@PreDestroy方法
- 实现DisposableBean接口的destroy()
- 自定义destroy-method
关键提示:Bean默认是单例的,prototype作用域的Bean不会执行销毁方法
1.2 循环依赖的解决方案实战
循环依赖是面试高频考点,Spring通过三级缓存机制解决:
java复制// 三级缓存结构示意
Map<String, Object> singletonObjects = new ConcurrentHashMap<>(); // 一级缓存:完整Bean
Map<String, Object> earlySingletonObjects = new HashMap<>(); // 二级缓存:早期引用
Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>();// 三级缓存:对象工厂
典型解决流程(以A依赖B,B依赖A为例):
- 创建A实例,放入三级缓存
- A发现需要B,触发B的创建
- 创建B实例,放入三级缓存
- B发现需要A,从三级缓存获取A的早期引用
- B完成创建,移入一级缓存
- A获取到完整的B,完成创建
避坑指南:
- 构造器注入无法解决循环依赖(会抛出BeanCurrentlyInCreationException)
- prototype作用域的Bean不支持循环依赖
- 必要时使用@Lazy延迟初始化打破循环
1.3 AOP实现原理与最佳实践
Spring AOP通过代理模式实现,支持两种代理方式:
| 代理类型 | 实现原理 | 触发条件 | 性能对比 |
|---|---|---|---|
| JDK动态代理 | 基于接口,使用Proxy.newProxyInstance() | 目标类实现接口 | 创建快,运行稍慢 |
| CGLIB代理 | 生成子类,使用Enhancer.create() | 无接口或proxyTargetClass=true | 创建慢,运行快 |
典型切面配置示例:
java复制@Aspect
@Component
public class LogAspect {
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceLayer() {}
@Around("serviceLayer()")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object result = joinPoint.proceed();
long duration = System.currentTimeMillis() - start;
System.out.println(joinPoint.getSignature() + " executed in " + duration + "ms");
return result;
}
}
事务管理实现细节:
- 代理机制:@Transactional通过AOP实现
- 传播行为:通过TransactionDefinition定义7种传播特性
- 隔离级别:默认为ISOLATION_DEFAULT(使用数据库默认)
- 回滚规则:默认对RuntimeException和Error回滚
常见坑点:同类方法调用会导致事务失效,因为绕过代理直接调用
2. SpringBoot自动配置揭秘
2.1 条件装配机制解析
SpringBoot通过@Conditional系列注解实现智能装配:
- @ConditionalOnClass:类路径存在指定类时生效
- @ConditionalOnMissingBean:容器不存在指定Bean时生效
- @ConditionalOnProperty:配置属性满足条件时生效
- @ConditionalOnWebApplication:Web环境时生效
自动配置加载流程:
- 启动时加载META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
- 按顺序处理各个自动配置类
- 通过条件注解过滤无效配置
- 最终生效的配置注册为Bean
2.2 Starter开发规范
自定义Starter需要遵循的规范:
- 命名规范:xxx-spring-boot-starter
- 结构划分:
- autoconfigure模块:包含自动配置类
- starter模块:仅包含pom依赖
- 必要文件:
- META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
- META-INF/spring-configuration-metadata.json(配置元数据)
示例Starter项目结构:
code复制my-starter/
├── my-spring-boot-autoconfigure
│ ├── src/main/java
│ │ └── com/example/autoconfigure
│ │ ├── MyAutoConfiguration.java
│ │ └── MyProperties.java
│ └── src/main/resources
│ └── META-INF
│ ├── spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ └── spring-configuration-metadata.json
└── my-spring-boot-starter
└── pom.xml
2.3 内嵌容器启动流程
Tomcat启动关键步骤:
- 检测类路径中的Tomcat依赖
- 创建TomcatServletWebServerFactory
- 初始化WebServer(包括端口绑定、上下文创建)
- 启动Tomcat实例
性能调优参数示例(application.properties):
properties复制server.tomcat.max-threads=200
server.tomcat.accept-count=100
server.tomcat.connection-timeout=5s
server.compression.enabled=true
3. SpringMVC核心架构解析
3.1 请求处理全流程
-
请求进入阶段:
- DispatcherServlet接收所有请求
- 通过HandlerMapping找到对应Controller
-
处理执行阶段:
- HandlerAdapter执行目标方法
- 参数解析器处理各类注解:
- @RequestParam
- @PathVariable
- @RequestBody
- @ModelAttribute
-
响应返回阶段:
- 视图解析器处理返回值
- 消息转换器处理@ResponseBody
- 异常处理器处理各类异常
性能优化点:
- 合理配置静态资源映射
- 使用异步处理(DeferredResult/Callable)
- 启用响应压缩
- 合理设置缓存头
3.2 RESTful设计实践
最佳实践示例:
java复制@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping
public ResponseEntity<List<User>> listUsers(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size) {
// 分页查询逻辑
return ResponseEntity.ok().body(users);
}
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
// 查询单个用户
return ResponseEntity.ok().body(user);
}
@PostMapping
public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
// 创建用户
return ResponseEntity.created(URI.create("/users/"+id)).body(user);
}
@PutMapping("/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id,
@Valid @RequestBody User user) {
// 更新用户
return ResponseEntity.ok().body(updatedUser);
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
// 删除用户
return ResponseEntity.noContent().build();
}
}
4. ORM框架深度对比
4.1 MyBatis核心特性
-
动态SQL能力:
/ 条件判断 循环处理 变量绑定
-
缓存机制:
- 一级缓存(SqlSession级别)
- 二级缓存(Mapper级别)
-
插件扩展:
- 拦截器接口:Interceptor
- 可拦截点:
- Executor
- StatementHandler
- ParameterHandler
- ResultSetHandler
4.2 MyBatis-Plus增强功能
对比原生MyBatis的优势:
| 功能 | MyBatis | MyBatis-Plus |
|---|---|---|
| CRUD操作 | 需手动编写 | 内置通用Mapper |
| 分页支持 | 需插件 | 内置分页插件 |
| 代码生成 | 需额外工具 | 内置生成器 |
| 条件构造 | XML中写 | Lambda表达式 |
| 乐观锁 | 手动实现 | @Version注解 |
示例Lambda查询:
java复制List<User> users = userMapper.selectList(
Wrappers.<User>lambdaQuery()
.eq(User::getAge, 25)
.like(User::getName, "张")
.orderByAsc(User::getCreateTime)
);
5. SpringSecurity安全体系
5.1 认证流程解析
标准认证流程:
- 用户提交凭证
- AuthenticationFilter拦截请求
- AuthenticationManager委托AuthenticationProvider
- Provider调用UserDetailsService加载用户
- PasswordEncoder校验密码
- 生成认证后的Authentication对象
- 存入SecurityContext
密码加密配置示例:
java复制@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public UserDetailsService userDetailsService() {
return username -> {
User user = userRepository.findByUsername(username);
if (user == null) throw new UsernameNotFoundException(username);
return org.springframework.security.core.userdetails.User
.withUsername(user.getUsername())
.password(user.getPassword())
.roles(user.getRoles().toArray(new String[0]))
.build();
};
}
5.2 JWT集成方案
JWT实现步骤:
- 添加依赖:
xml复制<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
- 配置JWT工具类:
java复制public class JwtUtils {
private static final String SECRET = "your-secret-key";
private static final long EXPIRATION = 86400000; // 24小时
public static String generateToken(UserDetails userDetails) {
return Jwts.builder()
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION))
.signWith(SignatureAlgorithm.HS512, SECRET)
.compact();
}
public static String getUsernameFromToken(String token) {
return Jwts.parser()
.setSigningKey(SECRET)
.parseClaimsJws(token)
.getBody()
.getSubject();
}
}
- 配置JWT过滤器:
java复制public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain chain) throws IOException, ServletException {
String token = resolveToken(request);
if (token != null && validateToken(token)) {
Authentication auth = getAuthentication(token);
SecurityContextHolder.getContext().setAuthentication(auth);
}
chain.doFilter(request, response);
}
// 辅助方法实现...
}
6. 高频面试题深度解析
6.1 Spring事务传播机制详解
七种传播行为对比:
| 传播行为 | 说明 | 适用场景 |
|---|---|---|
| REQUIRED | 当前有事务则加入,没有则新建 | 默认选择 |
| SUPPORTS | 当前有事务则加入,没有则以非事务运行 | 查询操作 |
| MANDATORY | 必须在事务中运行,否则抛异常 | 强制事务场景 |
| REQUIRES_NEW | 新建事务,挂起当前事务 | 独立业务操作 |
| NOT_SUPPORTED | 以非事务方式运行,挂起当前事务 | 不涉及数据一致性的操作 |
| NEVER | 必须在非事务环境运行,否则抛异常 | 与事务操作冲突的场景 |
| NESTED | 在当前事务中嵌套子事务 | 复杂业务分步处理 |
6.2 Bean作用域对比
Spring支持的Bean作用域:
| 作用域 | 说明 | 线程安全 | 适用场景 |
|---|---|---|---|
| singleton | 单例,容器启动时创建 | 需要自行保证 | 无状态服务 |
| prototype | 每次获取新建实例 | 不适用 | 有状态对象 |
| request | 每个HTTP请求一个实例 | 不适用 | Web请求相关 |
| session | 每个会话一个实例 | 不适用 | 用户会话数据 |
| application | ServletContext生命周期 | 需要保证 | 全局共享数据 |
| websocket | WebSocket会话周期 | 不适用 | 实时通信场景 |
6.3 设计模式应用分析
Spring中经典设计模式实现:
-
工厂模式:
- BeanFactory
- ApplicationContext
-
代理模式:
- AOP实现
- @Transactional
-
模板方法:
- JdbcTemplate
- RestTemplate
-
观察者模式:
- ApplicationEvent
- ApplicationListener
-
适配器模式:
- HandlerAdapter
- AdvisorAdapter
-
装饰器模式:
- BeanWrapper
- HttpRequestWrapper
7. 性能优化实战技巧
7.1 Spring应用调优
-
容器优化:
- 合理设置Bean作用域
- 延迟初始化(@Lazy)
- 避免过度扫描(@ComponentScan范围)
-
AOP优化:
- 精确设置切点表达式
- 避免在切面中处理耗时操作
- 考虑使用AspectJ编译时织入
-
事务优化:
- 设置合适的事务隔离级别
- 控制事务方法粒度
- 只读事务标记(@Transactional(readOnly=true))
7.2 数据库访问优化
MyBatis优化建议:
- 合理使用二级缓存
- 批量操作代替循环单条
- 使用ResultHandler处理大数据集
- 合理设置fetchSize
- 避免N+1查询问题
连接池配置示例(HikariCP):
properties复制spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.max-lifetime=1800000
8. 常见问题排查指南
8.1 典型异常解决方案
-
Bean创建异常:
- NoSuchBeanDefinitionException:检查组件扫描路径
- BeanCreationException:查看嵌套异常定位具体问题
-
事务失效场景:
- 检查方法是否为public
- 确认是通过代理对象调用
- 检查异常类型是否匹配回滚规则
-
AOP不生效排查:
- 确认切点表达式匹配
- 检查是否被其他AOP拦截
- 确认目标类被Spring管理
8.2 启动问题排查
SpringBoot启动失败常见原因:
- 端口冲突:检查server.port
- 配置错误:检查application.properties
- 依赖缺失:检查pom.xml依赖
- Bean冲突:使用@Primary解决
- 循环依赖:重构代码或使用@Lazy
调试技巧:
- 添加--debug参数查看自动配置报告
- 使用ConditionEvaluationReport记录条件评估结果
- 设置logging.level.root=DEBUG查看详细日志
9. 最新特性与演进方向
9.1 Spring Framework 6新特性
- 全面支持JDK 17+
- 响应式编程增强
- AOT(Ahead-Of-Time)编译支持
- 改进的Null安全注解
- 更简洁的配置方式
9.2 SpringBoot 3升级要点
-
基线要求:
- Java 17+
- Jakarta EE 9+(javax包迁移到jakarta)
-
重要变化:
- 自动配置机制优化
- 原生镜像支持增强
- 监控指标改进
-
迁移建议:
- 先升级到SpringBoot 2.7.x
- 处理废弃API替换
- 逐步测试各功能模块
10. 架构设计最佳实践
10.1 分层架构规范
推荐项目结构:
code复制src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ ├── config/ # 配置类
│ │ ├── controller/ # 表现层
│ │ ├── service/ # 业务层
│ │ ├── repository/ # 数据层
│ │ ├── model/ # 领域对象
│ │ ├── exception/ # 异常处理
│ │ └── Application.java
│ └── resources/
│ ├── static/ # 静态资源
│ ├── templates/ # 模板文件
│ └── application.yml
└── test/ # 测试代码
10.2 微服务设计要点
SpringCloud集成建议:
- 服务发现:使用Nacos或Eureka
- 配置中心:SpringCloud Config或Nacos
- 服务调用:OpenFeign+Ribbon
- 熔断降级:Sentinel或Hystrix
- 网关路由:SpringCloud Gateway
性能关键配置:
yaml复制spring:
cloud:
loadbalancer:
enabled: true
circuitbreaker:
enabled: true
gateway:
httpclient:
pool:
max-connections: 1000
max-idle-time: 60s
11. 测试策略与质量保障
11.1 单元测试实践
SpringBoot测试注解:
- @SpringBootTest:集成测试
- @WebMvcTest:Controller层测试
- @DataJpaTest:Repository层测试
- @MockBean:模拟依赖组件
测试示例:
java复制@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserService userService;
@Test
void getUserById() throws Exception {
User mockUser = new User(1L, "test");
when(userService.getById(1L)).thenReturn(mockUser);
mockMvc.perform(get("/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("test"));
}
}
11.2 集成测试方案
测试容器使用示例:
java复制@Testcontainers
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class UserRepositoryTest {
@Container
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:13");
@DynamicPropertySource
static void configureProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", postgres::getJdbcUrl);
registry.add("spring.datasource.username", postgres::getUsername);
registry.add("spring.datasource.password", postgres::getPassword);
}
@Autowired
private UserRepository userRepository;
@Test
void shouldSaveUser() {
User user = new User("test");
User saved = userRepository.save(user);
assertNotNull(saved.getId());
}
}
12. 开发者工具与效率提升
12.1 必备开发工具
-
IDE插件:
- Spring Assistant
- MyBatisX
- Lombok
-
调试工具:
- Arthas
- jstack/jmap
- VisualVM
-
效率工具:
- MapStruct(DTO转换)
- JPA Buddy(可视化JPA设计)
- PlantUML(架构图生成)
12.2 代码生成技巧
MyBatis-Plus生成器配置示例:
java复制FastAutoGenerator.create("jdbc:mysql://localhost:3306/test", "root", "password")
.globalConfig(builder -> {
builder.author("developer")
.outputDir("src/main/java");
})
.packageConfig(builder -> {
builder.parent("com.example")
.moduleName("system");
})
.strategyConfig(builder -> {
builder.addInclude("user", "role")
.entityBuilder()
.enableLombok()
.controllerBuilder()
.enableRestStyle();
})
.execute();
13. 安全防护与漏洞防范
13.1 常见安全威胁防护
-
SQL注入:
- 使用预编译语句
- MyBatis使用#{}代替${}
-
XSS攻击:
- 输出编码
- 使用HttpOnly Cookie
-
CSRF防护:
- 启用SpringSecurity的CSRF保护
- 关键操作使用POST
-
越权访问:
- 方法级权限控制(@PreAuthorize)
- 数据级权限过滤
13.2 安全加固配置
SpringSecurity推荐配置:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/public/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.logoutSuccessUrl("/")
.permitAll()
.and()
.headers()
.xssProtection()
.and()
.contentSecurityPolicy("default-src 'self'");
return http.build();
}
}
14. 监控与运维方案
14.1 健康检查与指标
SpringBoot Actuator配置:
properties复制management.endpoints.web.exposure.include=health,info,metrics
management.endpoint.health.show-details=always
management.metrics.tags.application=${spring.application.name}
自定义健康检查:
java复制@Component
public class CustomHealthIndicator implements HealthIndicator {
@Override
public Health health() {
// 检查逻辑
if (checkPassed) {
return Health.up().withDetail("detail", "正常").build();
}
return Health.down().withDetail("error", "异常原因").build();
}
}
14.2 日志收集方案
ELK集成配置示例:
properties复制logging.file.name=app.log
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
# Logstash配置
logging.logstash.enabled=true
logging.logstash.host=logstash.example.com
logging.logstash.port=5044
15. 云原生适配实践
15.1 Kubernetes部署方案
推荐部署配置:
yaml复制apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-app
spec:
replicas: 3
selector:
matchLabels:
app: springboot-app
template:
metadata:
labels:
app: springboot-app
spec:
containers:
- name: app
image: registry.example.com/app:1.0.0
ports:
- containerPort: 8080
env:
- name: SPRING_PROFILES_ACTIVE
value: prod
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "1"
memory: "1Gi"
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
15.2 服务网格集成
Istio集成关键配置:
- 注入Sidecar:
yaml复制annotations:
sidecar.istio.io/inject: "true"
- 流量管理:
yaml复制apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: springboot-vs
spec:
hosts:
- springboot-app.example.com
http:
- route:
- destination:
host: springboot-app
subset: v1
timeout: 3s
retries:
attempts: 3
perTryTimeout: 2s
16. 持续集成与交付
16.1 CI/CD流水线设计
GitLab CI示例:
yaml复制stages:
- build
- test
- package
- deploy
variables:
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
build:
stage: build
image: maven:3.8.4-jdk-11
script:
- mvn compile
test:
stage: test
image: maven:3.8.4-jdk-11
script:
- mvn test
package:
stage: package
image: maven:3.8.4-jdk-11
script:
- mvn package -DskipTests
artifacts:
paths:
- target/*.jar
deploy:
stage: deploy
image: alpine/k8s:1.21.2
script:
- kubectl apply -f k8s/deployment.yaml
only:
- master
16.2 镜像构建优化
多阶段构建Dockerfile示例:
dockerfile复制# 构建阶段
FROM maven:3.8.4-jdk-11 AS build
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src/ /app/src/
RUN mvn package -DskipTests
# 运行阶段
FROM eclipse-temurin:11-jre
WORKDIR /app
COPY --from=build /app/target/app.jar .
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
优化技巧:
- 分层构建减少镜像大小
- 使用.dockerignore过滤无用文件
- 多阶段构建分离构建和运行环境
- 使用轻量级基础镜像(如alpine)
17. 领域驱动设计实践
17.1 DDD分层架构实现
SpringBoot项目结构调整:
code复制src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ ├── application/ # 应用服务层
│ │ ├── domain/ # 领域层
│ │ │ ├── model/ # 聚合根/实体/值对象
│ │ │ ├── service/ # 领域服务
│ │ │ └── repository/ # 领域仓储接口
│ │ ├── infrastructure/ # 基础设施层
│ │ │ ├── persistence/ # 持久化实现
│ │ │ └── client/ # 外部服务调用
│ │ ├── interfaces/ # 表现层
│ │ │ ├── web/ # REST接口
│ │ │ └── dto/ # 数据传输对象
│ │ └── Application.java
│ └── resources/
└── test/
17.2 聚合设计模式
订单聚合示例:
java复制// 聚合根
public class Order {
private Long id;
private String orderNo;
private List<OrderItem> items;
private Address shippingAddress;
public void addItem(Product product, int quantity) {
// 业务规则校验
items.add(new OrderItem(product, quantity));
}
public BigDecimal getTotalAmount() {
return items.stream()
.map(OrderItem::getSubTotal)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
}
// 值对象
public class Address {
private final String province;
private final String city;
private final String detail;
// 不变性保证
public Address(String province, String city, String detail) {
this.province = province;
this.city = city;
this.detail = detail;
}
}
18. 响应式编程实践
18.1 WebFlux核心概念
与传统MVC对比:
| 特性 | Spring MVC | WebFlux |
|---|---|---|
| 编程模型 | 命令式 | 响应式 |
| 线程模型 | 阻塞IO | 非阻塞IO |
| 并发能力 | 线程池限制 | 少量线程处理高并发 |
| 适用场景 | 传统应用 | 高并发IO密集型 |
基础组件:
- Mono:0-1个结果的异步序列
- Flux:0-N个结果的异步序列
- RouterFunction:函数式路由定义
- WebClient:响应式HTTP客户端
18.2 响应式Repository
R2DBC配置示例:
java复制@Configuration
@EnableR2dbcRepositories
public class R2dbcConfig extends AbstractR2dbcConfiguration {
@Override
@Bean
public ConnectionFactory connectionFactory() {
return new PostgresqlConnectionFactory(
PostgresqlConnectionConfiguration.builder()
.host("localhost")
.port(5432)
.database("test")
.username("user")
.password("pass")
.build()
);
}
}
public interface UserRepository extends ReactiveCrudRepository<User, Long> {
Flux<User> findByAgeGreaterThan(int age);
}
19. 国际化与本地化方案
19.1 消息资源管理
多语言配置示例:
-
创建消息文件:
- messages.properties(默认)
- messages_zh_CN.properties
- messages_en_US.properties
-
配置MessageSource:
java复制@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setDefaultEncoding("UTF-8");
messageSource.setCacheSeconds(3600);
return messageSource;
}
- 使用示例:
java复制@RestController
public class GreetingController {
@Autowired
private MessageSource messageSource;
@GetMapping("/greet")
public String greet(@RequestHeader("Accept-Language") String lang) {
Locale locale = Locale.forLanguageTag(lang);
return messageSource.getMessage("greeting.message", null, locale);
}
}
19.2 时区处理方案
统一时区管理:
- 应用级时区设置:
java复制@PostConstruct
void init() {
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
}
- 数据库时区配置:
properties复制spring.jpa.properties.hibernate.jdbc.time_zone=Asia/Shanghai
- 前端时区处理:
javascript复制// 前端发送时间时带上时区信息
const dateWithTimezone = new Date().toISOString();
20. 前沿技术探索
20.1 云原生技术栈
Spring Native关键特性:
- 编译为原生镜像
- 极速启动(<100ms)
- 更低的内存占用
- 使用GraalVM构建
构建命令:
bash复制mvn spring-boot:build-image -Dspring-boot.build-image.imageName=demo-app
20.2 Serverless适配
Spring Cloud Function示例:
java复制@SpringBootApplication
public class FunctionApplication {
public static void main(String[] args) {
SpringApplication.run(FunctionApplication.class, args);
}
@Bean
public Function<String, String> uppercase() {
return value -> value.toUpperCase();
}
}
部署到AWS Lambda:
- 添加依赖:
xml复制<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-function-adapter-aws</artifactId>
</dependency>
- 实现请求处理器:
java复制public class AWSLambdaHandler extends SpringBootRequestHandler<String, String> {
}