本文共 3746 字,大约阅读时间需要 12 分钟。
一、通过Scheme配置实现AOP步骤(Spring AOP环境的环境与上篇博文 Spring接口方式相同)
步骤一、编写业务类: public class AspectBusiness { //切入点 public String delete(String obj) { System.out.println("==========调用切入点:" + obj + "说:你敢删除我!===========\n"); return obj + ":瞄~"; } public String add(String obj) { System.out.println("================这个方法不能被切。。。============== \n"); return obj + ":瞄~ 嘿嘿!"; } public String modify(String obj) { System.out.println("=================这个也设置加入切吧====================\n"); return obj + ":瞄改瞄啊!"; } }步骤二、编写切面类:切面类中,包含了所有的通知 public class AspectAdvice { //前置通知 public void doBefore(JoinPoint jp) { System.out.println("===========进入before advice============ \n"); System.out.print("准备在" + jp.getTarget().getClass() + "对象上用"); System.out.print(jp.getSignature().getName() + "方法进行对 '"); System.out.print(jp.getArgs()[0] + "'进行删除!\n\n"); System.out.println("要进入切入点方法了 \n"); } // 后置通知 // @param jp // 连接点 // @param result // 返回值 public void doAfter(JoinPoint jp, String result) { System.out.println("==========进入after advice=========== \n"); System.out.println("切入点方法执行完了 \n"); System.out.print(jp.getArgs()[0] + "在"); System.out.print(jp.getTarget().getClass() + "对象上被"); System.out.print(jp.getSignature().getName() + "方法删除了"); System.out.print("只留下:" + result + "\n\n"); } // 环绕通知 // @param pjp // 连接点 public object doAround(ProceedingJoinPoint pjp) throws Throwable { System.out.println("===========进入around环绕方法!=========== \n"); // 调用目标方法之前执行的动作 System.out.println("调用方法之前: 执行!\n"); // 调用方法的参数 Object[] args = pjp.getArgs(); // 调用的方法名 String method = pjp.getSignature().getName(); // 获取目标对象 Object target = pjp.getTarget(); // 执行完方法的返回值:调用proceed()方法,就会触发切入点方法执行 Object result = pjp.proceed(); System.out.println("输出:" + args[0] + ";" + method + ";" + target + ";" + result + "\n"); System.out.println("调用方法结束:之后执行!\n"); return result; } //异常通知 public void doThrow(JoinPoint jp, Throwable e) { 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:p="http://www.springframework.org/schema/p" 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-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd" default-> <!-- ==============================利用spring 利用aspectj来配置AOP================================ --> <!-- 声明一个业务类 --> <bean id="aspectBusiness" class="aop.schema.AspectBusiness" /> <!-- 声明通知类 --> <bean id="aspectAdvice" class="aop.schema.advice.AspectAdvice" /> <aop:config> <aop:aspect id="businessAspect" ref="aspectAdvice"> <!-- 配置指定切入的对象 --> <aop:pointcut id="point_cut" expression="execution(* aop.schema.*.*(..))" /> <!-- 只匹配add方法作为切入点 <aop:pointcut id="except_add" expression="execution(* aop.schema.*.add(..))" /> --> <!-- 前置通知 --> <aop:before method="doBefore" pointcut-ref="point_cut" /> <!-- 后置通知 returning指定返回参数 --> <aop:after-returning method="doAfter" pointcut-ref="point_cut" returning="result" /> <aop:around method="doAround" pointcut-ref="point_cut"/> <aop:after-throwing method="doThrow" pointcut-ref="point_cut" throwing="e"/> </aop:aspect> </aop:config> </beans>步骤五、测试类: public class Debug { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("aop/schema_aop.xml"); AspectBusiness business = (AspectBusiness) context.getBean("aspectBusiness"); business.delete("猫"); } } 转载地址:http://jkhgx.baihongyu.com/