``` 方法调用 ↓ @Before (前置通知) - 数据源验证和准备 ↓ @Around (环绕通知开始) - 设置数据源、记录开始时间 ↓ 目标方法执行 ↓ ├─ 成功 → @AfterReturning (返回通知) - 记录成功信息 ↓ └─ 失败 → @AfterThrowing (异常通知) - 异常处理 ↓ @Around (环绕通知结束) - 恢复数据源、记录执行时间 ↓ @After (后置通知) - 最终清理和安全检查 ↓ 方法返回 ``` ```angular2html /** * 数据源切面使用示例和最佳实践 * * 示例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 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. 微服务环境下考虑分布式事务的一致性 */ ```