AspectJ-Based方式的AOP,通知类不需要实现任何接口,且前置通知,后置通知,环绕通知,异常通知都可以写在一个类中,下面先实现一个简单的,不带参数的通知。
第一步定义通知类,通知类中的通知(方法)名称可以任意取
package com.airplan.pojo; import org.aspectj.lang.ProceedingJoinPoint; public class AspectJAdvice {
/*
* 前置通知
*/
public void before() {
System.out.println("前置通知执行");
} /*
* 后置通知,after通知,无论切点是否发生异常都会执行
*/
public Object after() {
System.out.println("after 通知执行了");
return null;
} /*
* 后置通知,after-returning,只有切点正常结束时才会执行
*/
public Object afterReturn() {
System.out.println("afterReturn 通知执行了");
return null;
} /**
* 环绕通知需要有一个返回值,以及一个参数
* @param p
* @return
* @throws Throwable
*/
public Object arround(ProceedingJoinPoint p) throws Throwable{
System.out.println("执行环绕");
System.out.println("环绕-前置");
Object result = p.proceed();
System.out.println("环绕后置");
return result;
} /*
* 异常通知
*/
public void mythrow(){
System.out.println("异常");
}
}
第二步配置
<?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: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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 第一步:注册通知类 ,与切点类--> <bean id="advices" class="com.airplan.pojo.AspectJAdvice"></bean>
<bean id="pointCutClass" class="com.airplan.pojo.PointCutClass"></bean>
<!-- 第二步:配置切面 -->
<aop:config>
<!-- 配置切面,绑定通知类 -->
<aop:aspect ref="advices">
<!-- 配置切点 -->
<aop:pointcut expression="execution(* com.airplan.pojo.PointCutClass.*(..))" id="pointCutFun"/>
<!-- 配置通知与切点关联 -->
<aop:after method="after" pointcut-ref="pointCutFun"/>
<aop:before method="before" pointcut-ref="pointCutFun"/>
<aop:after-returning method="afterReturn" pointcut-ref="pointCutFun"/>
<aop:around method="arround" pointcut-ref="pointCutFun"/>
<aop:after-throwing method="mythrow" pointcut-ref="pointCutFun"/>
</aop:aspect>
</aop:config> </beans>
第三步:测试代码
package com.airplan.test; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.airplan.pojo.PointCutClass; public class AopDemo {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
PointCutClass pc = ac.getBean("pointCutClass",PointCutClass.class);
pc.pointCutFun();
}
}