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();
}
}