请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

Transactional与AOP相关的一个问题

(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 + "]");
    }

}

正在回答 回答被采纳积分+3

1回答

翔仔 2022-03-24 22:48:45

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

0 回复 有任何疑惑可以回复我~
  • 提问者 慕斯卡0991186 #1
    那如果Tranctional注解在类上,是不是如果不指定order注解,对同一个方法的执行顺序就是随机的?
    回复 有任何疑惑可以回复我~ 2022-03-24 22:57:04
  • 翔仔 回复 提问者 慕斯卡0991186 #2
    可以实际验证一下,我印象里面应该是按照首字母顺序
    回复 有任何疑惑可以回复我~ 2022-03-25 23:32:09
  • 提问者 慕斯卡0991186 回复 翔仔 #3
    翔仔老师,我代码跟踪发现事务advisor会优先于其他普通AOP类的创建(是创建哦,在容器缓存中(list)居于高位),其在容器中的名称与实例类是:
    beanName:internalTransactionAdvisor
    beanClass: BeanFactoryTransactionAttributeSourceAdvisor
    事务AOP默认order是Integer.MAX_VALUE,该值也是普通AOP对应advisor的默认order。
    
    事务AOP优先感觉也是有道理的,也利于事务传递。
    这里也分享一下我的多数据源配置过程中发现的有趣事情。代码调试发现 TransactionInterceptor会先创建事务处理对象,然后再执行ReflectiveMethodInvocation的proceed方法从而继续链式调用其他advisor。这里在自定义多数据源配置的时候如果没有指定数据源,在创建事务处理对象的时候就会报错(因为要通过数据源创建数据库连接),因此就要显示的指定其他AOP的order优先一点,比事务快一步执行设置数据源操作。
    回复 有任何疑惑可以回复我~ 2022-03-26 15:59:43
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号