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
同学好,一般的原则是越小越优先,即方法专属的会先于对所有方法都生效的
042022-03-26
相似问题
关于一个方法
回答 2
关于JDK动态代理的问题
回答 1