Transactional与AOP相关的一个问题

来源:1-1 剑指造轮子,决胜Spring源码

慕斯卡0991186

2022-03-24

(1)Transactional标注在DBServiceImpl 类上的updateMediaInfo方法。
(2)DBServiceImpl 类同样定义了一个切面类DynamicDataSourceAspectJ,
对DBServiceImpl 类上的所有方法都进行AOP操作。
(3)transactional与DynamicDataSourceAspectJ执行的先后顺序是咋样的呀?(我代码测试发现是会先执行transactional,但是代码原理我不知道,哭泣中)

@Service("idbService")
public class DBServiceImpl implements IDBService {
    private MediaInfoDao mediaInfoDao;

    @Autowired
    public DBServiceImpl(MediaInfoDao mediaInfoDao) {
        this.mediaInfoDao = mediaInfoDao;
    }

    @Override
    public List<Map<String, Object>> listMediaInfo(String dbSeq, String tbName, String fastdfsUrl) {
        List<Map<String, Object>> result = mediaInfoDao.listMediaInfo(tbName, fastdfsUrl);
        return result;
    }

    @Transactional
    @Override
    public void updateMediaInfo(String dbSeq, String tbName, Long id, String fastdfsUrl, String fastdfsUrlValue) {
        mediaInfoDao.updateMediaInfo(tbName, id, fastdfsUrl, fastdfsUrlValue);
    }
}
@Aspect
@Component
public class DynamicDataSourceAspectJ {
    @Pointcut("execution(*  com.sunt.ossasync.service.impl.DBServiceImpl.*(..))")
    public void plugin() {
    }

    @Before("plugin()")
    public void before(JoinPoint joinPoint) {
        System.out.println("进行before拦截 " + joinPoint);
        Object[] args = joinPoint.getArgs(); // 参数值
        String dataSource = "datasource" + args[0];
        DataSourceHolder.setDataSource(dataSource);
    }

    @After("plugin()")
    public void after(JoinPoint joinPoint) {
        System.out.println("进行after拦截 " + joinPoint);
    }

    @AfterReturning(pointcut = "plugin()", returning = "returnValue")
    public void afterReturning(JoinPoint joinPoint, Object returnValue) {
        System.out.println("进行return拦截  " + joinPoint + ",返回值[" + returnValue + "]");
    }

}
写回答

1回答

翔仔

2022-03-24

同学好,一般的原则是越小越优先,即方法专属的会先于对所有方法都生效的

0
4
翔仔
回复
慕斯卡0991186
感谢同学的分享,经过这样的调试,相信同学对spring的aop又有了更深的认识,加油:)
2022-03-26
共4条回复

剑指Java自研框架,决胜Spring源码

快速入门Spring核心源码+从零开发自研框架

1498 学习 · 495 问题

查看课程