1、ArithmeticCalculator.java

1 package com.proc;
2
3 public interface ArithmeticCalculator {
4 int add(int i, int j);
5 int sub(int i, int j);
6
7 int mul(int i, int j);
8 int div(int i, int j);
9 }

2、ArithmeticCalculatorImpl.java 实现接口ArithmeticCalculator

 1 package com.proc;
2
3 public class ArithmeticCalculatorImpl implements ArithmeticCalculator{
4 public int add(int i, int j) {
5 int result = i + j;
6 return result;
7 }
8
9 public int sub(int i, int j) {
10 int result = i - j;
11 return result;
12 }
13
14 public int mul(int i, int j) {
15 int result = i * j;
16 return result;
17 }
18
19 public int div(int i, int j) {
20 int result = i / j;
21 return result;
22 }
23 }

3、LoggingAspect.java 日志切面

 1 package com.proc;
2
3 import org.aspectj.lang.JoinPoint;
4 import org.aspectj.lang.ProceedingJoinPoint;
5 import org.aspectj.lang.annotation.After;
6 import org.aspectj.lang.annotation.AfterReturning;
7 import org.aspectj.lang.annotation.AfterThrowing;
8
9
10 public class LoggingAspect {
11
12 public void beforeMethod(JoinPoint point){
13 System.out.println("正在执行方法: "+point.getSignature().getName());
14 }
15
16
17 public void afterMethod(JoinPoint point){
18 System.out.println("方法执行结束: "+point.getSignature().getName());
19 }
20
21
22 public void afterReturningMethod(JoinPoint point,Object retVal){
23 System.out.println("方法: "+point.getSignature().getName()+"执行结果为:"+retVal);
24 }
25
26
27 public void afterThrowingMethod(JoinPoint point,Exception ex){
28 System.out.println("执行方法: "+point.getSignature().getName()+"出现了异常:"+ex.getMessage());
29 }
30
31 public Object aroundMethod(ProceedingJoinPoint point){
32
33 System.out.println("环绕通知: "+point.getSignature().getName());
34 Object result=null;
35 //这里相当于前置通知
36 try {
37 //执行方法
38 result= point.proceed();
39 //这里相当于结果通知
40 } catch (Throwable e) {
41 //这里相当于异常通知
42 e.printStackTrace();
43
44 }
45 //这里相当于后置通知
46 System.out.println("环绕通知: "+point.getSignature().getName());
47 return result;
48 }
49 }

其实这也就是一个普通类,里面定义了写方法

4、ValidateAspect.java 验证切面

1 package com.proc;
2
3 import org.aspectj.lang.JoinPoint;
4
5 public class ValidateAspect {
6 public void beforeMethod(JoinPoint point){
7 System.out.println("验证前置通知: "+point.getSignature().getName());
8 }
9 }

5、applicationContext.xml配置

 1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:aop="http://www.springframework.org/schema/aop"
5 xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
6 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
7
8 <bean id="arithmeticCalculator" class="com.proc.ArithmeticCalculatorImpl"/>
9 <bean id="loggingAspect" class="com.proc.LoggingAspect" />
10 <bean id="validateAspect" class="com.proc.ValidateAspect"/>
11
12 <aop:config>
13 <!-- 配置切面表达式 -->
14 <aop:pointcut expression="execution(* *..*(..))" id="pointcut"/>
15
16 <!-- 配置切面及通知 -->
17 <aop:aspect ref="loggingAspect" order="1">
18 <aop:before method="beforeMethod" pointcut-ref="pointcut"/>
19 <aop:after method="afterMethod" pointcut-ref="pointcut"/>
20 <aop:after-returning method="afterReturningMethod" pointcut-ref="pointcut" returning="retVal"/>
21 <aop:after-throwing method="afterThrowingMethod" pointcut-ref="pointcut" throwing="ex"/>
22 <aop:around method="aroundMethod" pointcut-ref="pointcut" />
23 </aop:aspect>
24
25 <aop:aspect ref="validateAspect" order="2">
26 <aop:before method="beforeMethod" pointcut-ref="pointcut"/>
27 </aop:aspect>
28 </aop:config>
29 </beans>

  

测试代码:

1 ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
2 ArithmeticCalculator calc=(ArithmeticCalculator) ctx.getBean("arithmeticCalculator");
3 System.out.println(calc.add(3, 5));
4 System.out.println(calc.sub(3, 5));
5 System.out.println(calc.mul(6, 2));
6 System.out.println(calc.div(6, 2));

输出结果:

正在执行方法: add
环绕通知: add
验证前置通知: add
环绕通知: add
方法: add执行结果为:8
方法执行结束: add
8
正在执行方法: sub
环绕通知: sub
验证前置通知: sub
环绕通知: sub
方法: sub执行结果为:-2
方法执行结束: sub
-2
正在执行方法: mul
环绕通知: mul
验证前置通知: mul
环绕通知: mul
方法: mul执行结果为:12
方法执行结束: mul
12
正在执行方法: div
环绕通知: div
验证前置通知: div
环绕通知: div
方法: div执行结果为:3
方法执行结束: div

Spring 基于xml配置方式的AOP(8)的更多相关文章

  1. Spring 基于xml配置方式的AOP

    我们具体用代码来说明: 1.ArithmeticCalculator.java package com.proc; public interface ArithmeticCalculator { in ...

  2. Spring 基于xml配置方式的事务

    参考前面的声明式事务的例子:http://www.cnblogs.com/caoyc/p/5632198.html 我们做了相应的修改.在dao中和service中的各个类中,去掉所有注解标签.然后为 ...

  3. Spring 基于xml配置方式的事务(14)

    参考前面的声明式事务的例子:http://www.cnblogs.com/caoyc/p/5632198.html 我们做了相应的修改.在dao中和service中的各个类中,去掉所有注解标签.然后为 ...

  4. Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析

    Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析 本文简要介绍了基于 Spring 的 web project 的启动流程,详细分析了 Spring 框架将开发人员基于 XML ...

  5. struts_20_对Action中所有方法、某一个方法进行输入校验(基于XML配置方式实现输入校验)

    第01步:导包 第02步:配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app ...

  6. struts2视频学习笔记 22-23(基于XML配置方式实现对action的所有方法及部分方法进行校验)

    课时22 基于XML配置方式实现对action的所有方法进行校验   使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类 ...

  7. 转载 - Struts2基于XML配置方式实现对action的所有方法进行输入校验

    出处:http://www.cnblogs.com/Laupaul/archive/2012/03/15/2398360.html http://www.blogjava.net/focusJ/arc ...

  8. ssm整合(基于xml配置方式)

    本文是基于xml配置的方式来整合SpringMVC.Spring和Mybatis(基于注解的方式会再写一篇文章),步骤如下: (1)首先自然是依赖包的配置文件 pom.xml <project ...

  9. Spring 基于XML配置

    基于XML的配置 对于基于XML的配置,Spring 1.0的配置文件采用DTD格式,Spring2.0以后采用Schema格式,后者让不同类型的配罝拥有了自己的命名空间,使得配置文件更具扩展性.此外 ...

随机推荐

  1. 通过队列实现进程间的通信(使用阻塞方式调用func函数)

    #_author:来童星#date:2019/12/17#通过队列实现进程间的通信from multiprocessing import Poolimport osimport timedef fun ...

  2. GlobalExceptionHandler 捕获抛出的异常,返回特定值给前端

    /** * @author hhh * @date 2019/1/17 16:28 * @Despriction */ @ResponseBody @ControllerAdvice @Log4j2 ...

  3. java script 数组去重两种方法

    第一种方法: var arr=[1,1,2,3,4,4,4,5,6,6,6,6];    var arrb=Array();    for(var i=0;i<arr.length;i++)   ...

  4. 云栖干货回顾 | 云原生数据库POLARDB专场“硬核”解析

    POLARDB是阿里巴巴自主研发的云原生关系型数据库,目前兼容三种数据库引擎:MySQL.PostgreSQL.Oracle.POLARDB的计算能力最高可扩展至1000核以上,存储容量可达100TB ...

  5. 排列+函数映射——hdu6038好题

    /* 引理:[0,n-1]的排列,i向a[i]连边,那么每个数必定在一个环中 所以数组a可以分割成一些环,数组b也可以分割成一些环 先讨论a的一个环 a[a1]=a2 a[a2]=a3 a[a3]=a ...

  6. NX二次开发-UFUN获取当前显示部件的TAG,UF_PART_ask_display_part

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_part.h> UF_initialize ...

  7. HDU-1226-超级密码-队列+广搜+大数取模

    Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息: 密码是一个C进制的数,并且只能由给定的M个数字构成,同 ...

  8. 20140316 window live write 插件 推荐代码高亮插件 构造函数只能用初始化成员列表方式的例子

    1.window live write 插件:http://www.cnblogs.com/liuxianan/archive/2013/04/13/3018732.html 2.推荐代码高亮插件:W ...

  9. 图像直方图均衡化(C#)

    关于图像直方图均衡化的原理和步骤先不作讨论,我就看看代码吧. private Bitmap picequalization(Bitmap basemap, int width, int height) ...

  10. 5步减小你的CSS样式表

    第一步:学会如何组合选择器 什么是选择器?如果你还不知道什么叫做”选择器”,你可以先参考一下w3schools.com的CSS语法概述. 未优化的CSS代码在下面的图例中,你会看到来自三个不同选择器的 ...