1582 字
约 5 分钟
2
Spring集成进阶
2026-09-19
无标签
第20章 Spring集成进阶
深入学习 MyBatis 与 Spring 框架的高级集成特性 学习进度:80% 代码演示按钮 💻 查看完整代码 - 在线IDE体验
🎯 学习目标
📚
理解 Spring 集成核心概念
掌握 MyBatis 与 Spring 框架的高级集成特性和原理 🔧
掌握高级配置技巧
学会 Spring 事务管理、数据源配置等高级特性 💡
了解最佳实践
明确在企业级项目中的应用场景和最佳实践
🌟 Spring 集成概述
Spring 集成进阶是在基础集成的基础上,深入学习 MyBatis 与 Spring 框架的高级特性,包括事务管理、数据源配置、AOP 集成等内容。
🔧 核心特性
🎯 事务管理
深入理解 Spring 声明式事务管理,掌握事务传播行为和隔离级别
🔄 数据源配置
学习多数据源配置、连接池优化和数据源切换策略
📊 AOP 集成
利用 Spring AOP 实现日志记录、性能监控等横切关注点
🚀 缓存集成
集成 Spring Cache 抽象,实现多级缓存和缓存策略
🔐 安全集成
与 Spring Security 集成,实现数据访问权限控制
📈 监控集成
集成 Spring Actuator,实现应用健康检查和性能监控
⚙️ 事务管理配置
@Configuration
@EnableTransactionManagement
public class TransactionConfig {
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
return new TransactionTemplate(transactionManager);
}
}
@Service
@Transactional
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional(propagation = Propagation.REQUIRED)
public void createUser(User user) {
userMapper.insert(user);
}
@Transactional(readOnly = true)
public User getUserById(Long id) {
return userMapper.selectById(id);
}
}
🔄 多数据源配置
@Configuration
public class DataSourceConfig {
@Bean
@Primary
@ConfigurationProperties("spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@Primary
public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/primary/*.xml"));
return bean.getObject();
}
@Bean
public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/secondary/*.xml"));
return bean.getObject();
}
}
📊 AOP 集成示例
@Aspect
@Component
public class DatabaseAuditAspect {
private static final Logger logger = LoggerFactory.getLogger(DatabaseAuditAspect.class);
@Around("@annotation(org.springframework.transaction.annotation.Transactional)")
public Object auditDatabaseOperation(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
String methodName = joinPoint.getSignature().getName();
logger.info("开始执行数据库操作: {}", methodName);
try {
Object result = joinPoint.proceed();
long endTime = System.currentTimeMillis();
logger.info("数据库操作完成: {}, 耗时: {}ms", methodName, endTime - startTime);
return result;
} catch (Exception e) {
logger.error("数据库操作失败: {}, 错误: {}", methodName, e.getMessage());
throw e;
}
}
}
🚀 缓存集成配置
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
ConcurrentMapCacheManager cacheManager = new ConcurrentMapCacheManager();
cacheManager.setCacheNames(Arrays.asList("users", "orders", "products"));
return cacheManager;
}
}
@Service
public class UserService {
@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
return userMapper.selectById(id);
}
@CacheEvict(value = "users", key = "#user.id")
public void updateUser(User user) {
userMapper.updateById(user);
}
@CacheEvict(value = "users", allEntries = true)
public void clearAllUsers() {
// 清除所有用户缓存
}
}
🔐 安全集成
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public UserDetailsService userDetailsService() {
return new CustomUserDetailsService();
}
}
@Service
public class UserService {
@PreAuthorize("hasRole('ADMIN') or #userId == authentication.principal.id")
public User getUserById(Long userId) {
return userMapper.selectById(userId);
}
@PreAuthorize("hasRole('ADMIN')")
public ListgetAllUsers() {
return userMapper.selectAll();
}
}
📈 监控集成
# application.yml
management:
endpoints:
web:
exposure:
include: health,info,metrics,prometheus
endpoint:
health:
show-details: always
metrics:
export:
prometheus:
enabled: true
# 自定义健康检查
@Component
public class DatabaseHealthIndicator implements HealthIndicator {
@Autowired
private SqlSessionFactory sqlSessionFactory;
@Override
public Health health() {
try (SqlSession session = sqlSessionFactory.openSession()) {
session.selectOne("SELECT 1");
return Health.up()
.withDetail("database", "Available")
.withDetail("connection", "Active")
.build();
} catch (Exception e) {
return Health.down()
.withDetail("database", "Unavailable")
.withDetail("error", e.getMessage())
.build();
}
}
}
🎯 最佳实践
- 事务边界设计:合理设计事务边界,避免长事务和事务嵌套问题
- 数据源管理:使用连接池,合理配置连接参数和超时时间
- 缓存策略:根据业务特点选择合适的缓存策略和过期时间
- 异常处理:统一异常处理机制,确保事务正确回滚
- 性能监控:建立完善的监控体系,及时发现性能问题
- 安全防护:实施数据访问权限控制和SQL注入防护
⚠️ 常见问题与解决方案
🔄 事务不生效
- 检查 @Transactional 注解配置
- 确认方法是否为 public
- 避免同类内部方法调用
- 检查事务管理器配置
💾 缓存穿透
- 使用布隆过滤器
- 缓存空值
- 参数校验
- 限流保护
🔗 连接池耗尽
- 合理配置连接池大小
- 设置连接超时时间
- 及时释放连接
- 监控连接使用情况
📊 性能问题
- SQL 优化
- 索引优化
- 分页查询
- 批量操作
🛠️ 实践练习
练习目标通过实际项目练习,掌握 Spring 集成进阶的各种特性和配置方法。
📝 基础练习
- 配置声明式事务管理
- 实现多数据源切换
- 集成 Spring Cache
- 添加 AOP 日志记录
🔧 进阶练习
- 实现分布式事务
- 集成 Spring Security
- 添加性能监控
- 实现读写分离
🚀 高级练习
- 实现动态数据源
- 集成分布式缓存
- 实现数据库分片
- 添加链路追踪
本章小结
📖 本章小结
本章我们深入学习了 MyBatis 与 Spring 框架的高级集成特性,包括:
- 事务管理:掌握了 Spring 声明式事务管理的配置和使用
- 多数据源:学会了多数据源的配置和动态切换
- AOP 集成:了解了如何利用 AOP 实现横切关注点
- 缓存集成:掌握了 Spring Cache 的配置和使用策略
- 安全集成:学习了与 Spring Security 的集成方法
- 监控集成:了解了应用监控和健康检查的实现
- 最佳实践:掌握了企业级应用的最佳实践和常见问题解决方案
通过本章的学习,你已经具备了在企业级项目中使用 MyBatis 和 Spring 进行高级集成的能力。 下一章节 🎉
恭喜完成本章学习!
你已经掌握了 Spring 集成进阶的核心知识 第21章SQL Builder 构建器学习使用 MyBatis 的 SQL Builder 动态构建复杂 SQL 语句⏱️预计 25 分钟📊中等难度开始学习 → ← 第19章 📚 课程目录 第21章 →
评论
0 条
还没有评论,先写一条吧。