@Aspect的使用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
项目结构
@Component
public class User {
public String add(String message) {
System.out.println("执行User添加方法:" + message);
return "add:" + message;
}
public int addNum(String message, int num) {
System.out.println("执行User添加方法:" + message + ",编号:" + num);
return num + 5;
}
}
AfterReturning是在Around后面调用,如果同时使用这两个注解,Around需要返回结果,否则AfterReturning拿不到返回参数
@Component
@Aspect
public class AopSpringAspect {
// // 异常通知
@AfterThrowing("execution(* com.stude.freemarker.aspect.server.User.*(..))")
public void afterThrowing() {
System.out.println("任务执行异常");
}
// 环绕通知
@Around("execution(* com.stude.freemarker.aspect.server.User.*(..))")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("环绕执行任务前");
Object rvt = proceedingJoinPoint.proceed();
System.out.println("环绕执行任务后: " + new Gson().toJson(rvt));
return rvt;
}
@Before("within(com.stude.freemarker.aspect.server.*)")
public void before(JoinPoint joinPoint){
Object args[] = joinPoint.getArgs();
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
Method method = signature.getMethod();
System.out.println("传入参数" + method.getDeclaringClass().getName());
System.out.println("传入参数" + method.getName());
System.out.println("传入参数" + new Gson().toJson(args));
}
@AfterReturning(value = "within(com.stude.freemarker.aspect.server.*)",returning = "rvt")
public void after(JoinPoint joinPoint,Object rvt){
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
Method method = signature.getMethod();
System.out.println("返回参数" + method.getDeclaringClass().getName());
System.out.println("返回参数" + method.getName());
System.out.println("返回参数" + new Gson().toJson(rvt));
}
}
@EnableAsync
@SpringBootApplication
public class AsyncApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(AsyncApplication.class, args);
User myconf = (User) context.getBean("user");
myconf.add("test001");
int name = myconf.addNum("002",02);
System.out.println("ss");
}
}
1.事务工具类
/**
* Created on 2019/4/6.
*
* @author Grak
* @since 1.0
*/
@Component
public class TransactionUtils {
@Autowired
private DataSourceTransactionManager dataSourceTransactionManager;
// 开启事务
public TransactionStatus begin() {
TransactionStatus transaction = dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());
return transaction;
}
// 提交事务
public void commit(TransactionStatus transactionStatus) {
dataSourceTransactionManager.commit(transactionStatus);
}
// 回滚事务
public void rollback(TransactionStatus transactionStatus) {
dataSourceTransactionManager.rollback(transactionStatus);
}
}
2、添加切面类
/**
* Created on 2019/4/6.
*
* @author Grak
* @since 1.0
*/
@Component
@Aspect
public class AopSpringAspect {
@Autowired
private TransactionUtils transactionUtils;
// // 异常通知
@AfterThrowing("execution(* com.stude.aop.aspect.jdbcaspect.DemoAspect.runAspect(..))")
public void afterThrowing() {
System.out.println("程序已经回滚");
// 获取程序当前事务 进行回滚
transactionUtils.rollback(TransactionAspectSupport.currentTransactionStatus());
// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
// 环绕通知
@Around("execution(* com.stude.aop.aspect.jdbcaspect.DemoAspect.runAspect(..))")
public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("开启事务");
TransactionStatus begin = transactionUtils.begin();
proceedingJoinPoint.proceed();
transactionUtils.commit(begin);
System.out.println("提交事务");
}
}
3、被监听方法
/**
* Created on 2019/4/5.
*
* @author Grak
* @since 1.0
*/
@Component
public class User {
public void add(String message) {
System.out.println("执行User添加方法:" + message);
}
public void addNum(String message, int num) {
System.out.println("执行User添加方法:" + message + ",编号:" + num);
}
}
4、执行方法
@SpringBootApplication
public class AopApplication {
public static void main(String[] args) {
ConfigurableApplicationContext ctx = SpringApplication.run(AopApplication.class, args);
//AopAspect执行
User myconf = (User) ctx.getBean("user");
myconf.add("test001");
}
}