方法调用
↓
@Before (前置通知) - 数据源验证和准备
↓
@Around (环绕通知开始) - 设置数据源、记录开始时间
↓
目标方法执行
↓
├─ 成功 → @AfterReturning (返回通知) - 记录成功信息
↓
└─ 失败 → @AfterThrowing (异常通知) - 异常处理
↓
@Around (环绕通知结束) - 恢复数据源、记录执行时间
↓
@After (后置通知) - 最终清理和安全检查
↓
方法返回
/**
* 数据源切面使用示例和最佳实践
*
* 示例1: 方法级别注解(推荐)
* {@code
* @Service
* public class UserService {
*
* // 写操作使用主库
* @DataSource(DataSourceType.MASTER)
* public void createUser(User user) {
* userMapper.insert(user);
* }
*
* // 读操作使用从库
* @DataSource(DataSourceType.SLAVE1)
* public User getUserById(Long id) {
* return userMapper.selectById(id);
* }
* }
* }
*
* 示例2: 类级别注解
* {@code
* // 该服务类所有方法默认使用从库
* @Service
* @DataSource(DataSourceType.SLAVE1)
* public class QueryService {
*
* // 自动使用SLAVE1数据源
* public List<User> getAllUsers() {
* return userMapper.selectList(null);
* }
*
* // 方法级别注解覆盖类级别注解
* @DataSource(DataSourceType.MASTER)
* public void updateUser(User user) {
* userMapper.updateById(user);
* }
* }
* }
*
* 最佳实践:
* 1. 读写分离:写操作用MASTER,读操作用SLAVE
* 2. 事务一致性:在@Transactional方法中谨慎切换数据源
* 3. 性能考虑:避免在循环中频繁切换数据源
* 4. 异常处理:确保业务异常不会影响数据源恢复
* 5. 测试验证:多数据源环境下充分测试事务一致性
*
* 注意事项:
* 1. 确保@DataSource注解的方法在Spring代理范围内(同类调用不生效)
* 2. 事务注解@Transactional应该在数据源切换之后执行
* 3. 避免在异步方法中使用数据源切换(线程切换会导致ThreadLocal失效)
* 4. 微服务环境下考虑分布式事务的一致性
*/