一:@Async
springboot想要使用异步处理的时候,我们会使用到@Async注解,表明某个方法为异步调用,我们需要使用@EnableAsync开启异步调用。
但是有时候明明加了这两个注解,异步确没有起作用,我在开发中也遇到了这个问题,结果查阅资料发现调用异步的方法和异步方法不能在同一个类中,下面例子
@Test
public void TestAsync()throws InterruptedException {
System.out.println("开始");
testService.async();
//async();这里调用同类中的async()不会起作用
System.out.println("结束");
Thread.sleep(5000);
}@Async
public void async(){
try {
System.out.println("async start");
Thread.sleep(2000);
System.out.println("async end");
}catch (InterruptedException e) {
e.printStackTrace();
}
}
二:@Transactional
使用@Transactional时,有几点需要注意:
1)、必须保证这个注解修饰的方法是public方法
2)、想要异常回滚,必须是非检查异常,即不用try-catch包裹,除非手动指明回滚类型rollbackFor=Exception.class
3)、调用事务的方法必须和事务方法不在同一个类中
具体原因是springboot使用@Transactional注解和@Async注解的时候是使用代理模式,jdk代理或者是cglib代理需要被实现或者继承,所以必须是public方法,并且在同一类中方法在类体中执行,没法截获方法调用