1582 字
约 5 分钟
2
Spring集成进阶
无标签

第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章 →

Spring集成进阶
http://www.clxhxhhr.top/posts/2862/
作者
clxstart
发布于
2026-09-19
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。