1.参考https://blog.csdn.net/weixin_45460315/article/details/105027525
2.修改application.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:centext="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd ">
<!-- 目标对象 -->
<bean name="userService" class="com.linixn.spring.service.UserServiceImpl"></bean>
<bean name="transactionAdvice" class="com.linixn.spring.advice.TransactionAdive"></bean>
<!-- 开启aop注解 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
3.在通知上添加注解
package com.linixn.spring.advice;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class TransactionAdive {
// 前置通知:在目标方法之前调用
// 后置通知(出现异常就不调用):在目标方法之后调用
// 后置通知(无论是否出现异常都调用):在目标方法之后调用
// 环绕通知:在目标方法之前、后调用
// 异常通知:出现异常则调用
@Before("execution(public void com.linixn.spring.service.UserService.*() )")
public void before() {
System.out.println("前置通知被执行");
}
@AfterReturning("execution(public void com.linixn.spring.service.UserService.*() )")
public void afterReturning() {
System.out.println("后置置通知被执行(出现异常不调用)");
}
@After("execution(public void com.linixn.spring.service.UserService.*() )")
public void after() {
System.out.println("后置通知(无论是否出现异常都调用)");
}
@AfterThrowing("execution(public void com.linixn.spring.service.UserService.*() )")
public void afterException() {
System.out.println("异常通知:出现异常则调用");
}
@Around("execution(public void com.linixn.spring.service.UserService.*() )")
public Object around(ProceedingJoinPoint point) throws Throwable {
System.out.println("环绕通知之前");
Object proceed= point.proceed();
System.out.println("环绕通知之后");
return proceed;
}
}
4.测试
5.补充 在通知上,注解参数重复可以使用
package com.linixn.spring.advice;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class TransactionAdive {
// 前置通知:在目标方法之前调用
// 后置通知(出现异常就不调用):在目标方法之后调用
// 后置通知(无论是否出现异常都调用):在目标方法之后调用
// 环绕通知:在目标方法之前、后调用
// 异常通知:出现异常则调用
@Pointcut("execution(public void com.linixn.spring.service.UserService.*() )")
public void Pointcut() {
}
@Before("TransactionAdive.Pointcut")
public void before() {
System.out.println("前置通知被执行");
}
@AfterReturning()
public void afterReturning() {
System.out.println("后置置通知被执行(出现异常不调用)");
}
@After("TransactionAdive.Pointcut")
public void after() {
System.out.println("后置通知(无论是否出现异常都调用)");
}
@AfterThrowing("TransactionAdive.Pointcut")
public void afterException() {
System.out.println("异常通知:出现异常则调用");
}
@Around("TransactionAdive.Pointcut")
public Object around(ProceedingJoinPoint point) throws Throwable {
System.out.println("环绕通知之前");
Object proceed= point.proceed();
System.out.println("环绕通知之后");
return proceed;
}
}
end