Files
djangoadmin-web/xiaomayi-common/xiaomayi-datasource/src/main/java/com/xiaomayi/datasource
2026-09-10 21:41:50 +08:00
..
2026-09-10 21:41:50 +08:00
2026-09-10 21:41:50 +08:00
2026-09-10 21:41:50 +08:00
2026-09-10 21:41:50 +08:00
2026-09-10 21:41:50 +08:00
2026-09-10 21:41:50 +08:00

方法调用
    ↓
@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. 微服务环境下考虑分布式事务的一致性
 */