配置:
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"
>
<!--开启以注解形式的切面驱动-->
<aop:aspectj-autoproxy/>
<!--定义切面bean-->
<bean id="permApect" class="spring.aspect.PermAspect"/>
<bean id="userService" class="spring.service.impl.UserServiceImpl"/>
<aop:config>
<!--
切点配置:
expression:切点的表达式
-->
<aop:pointcut id="mycut" expression="execution(* spring.service..*.*(..))"/>
<!--切面配置
ref:要关联的切面类
-->
<aop:aspect ref="permApect">
<!--
前置通知
method:切面类的方法
pointcut-ref:切点
-->
<aop:before method="preAvice" pointcut-ref="mycut"/>
<!--后置通知-->
<aop:after method="afterAvice" pointcut-ref="mycut"/>
<!--返回通知
returning:业务方法返回的值,得跟returnAvice方法里的参数同名
-->
<aop:after-returning method="returnAvice" pointcut-ref="mycut" returning="returnval"/>
<!--例外通知
throwing:抛出的异常的变量名
-->
<aop:after-throwing method="exceptionAdvice" pointcut-ref="mycut" throwing="ex"/>
<!--环绕通知-->
<aop:around method="aroundAdvice" pointcut-ref="mycut" />
</aop:aspect>
</aop:config>
</beans>
切面:
package spring.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import spring.model.User;
public class PermAspect {
public void preAvice(JoinPoint jp) {
Object[] args = jp.getArgs();
System.out.println("执行前置通知---业务参数" + args[0]);
}
public void afterAvice(JoinPoint jp) {
Object[] args = jp.getArgs();
System.out.println("执行后置通知---业务参数" + args[0]);
}
public void returnAvice(JoinPoint jp, Object returnval){
if (returnval instanceof User) {
User user = (User) returnval;
user.setUsername("xxx");
}
System.out.println("返回通知----" + returnval);
}
public void exceptionAdvice(JoinPoint js, Exception ex) {
System.out.println("例外通知");
ex.printStackTrace();
}
public Object aroundAdvice(ProceedingJoinPoint jp) {
Object[] args = jp.getArgs();
if (args.length > 0) {
System.out.println("执行环绕通知----" + args[0]);
}
System.out.println("执行环绕通知前置通知---业务参数" + args[0]);
Object o = null;
try {
o = jp.proceed();
System.out.println("执行环绕通知后置通知---业务参数" + args[0]);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return o;
}
}