博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转)使用Spring配置文件实现AOP
阅读量:7070 次
发布时间:2019-06-28

本文共 3197 字,大约阅读时间需要 10 分钟。

http://blog.csdn.net/yerenyuan_pku/article/details/52880558

使用Spring配置文件实现AOP

前面我们已经学会了使用Spring的注解方式实现AOP,现在我们就要学习使用Spring配置文件实现AOP。本文是建立在使用Spring的注解方式实现AOP的细节的案例的基础之上的。 

我们首先将MyInterceptor类的代码修改为:

/** * 切面 * @author li ayun * */@Aspectpublic class MyInterceptor { public void doAccessCheck() { System.out.println("前置通知"); } public void doAfterReturning() { System.out.println("后置通知"); } public void doAfter() { System.out.println("最终通知"); } public void doAfterThrowing() { System.out.println("异常通知"); } public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { System.out.println("进入方法"); Object result = pjp.proceed(); System.out.println("退出方法"); return result; } }
  • 1
  • 2

从上可知MyInterceptor不过就是一个普通的JavaBean。现在若要使用Spring配置文件实现AOP,则须将Spring配置文件的内容修改为:

  • 1

如果PersonServiceImpl类的代码为:

public class PersonServiceImpl implements PersonService { @Override public void save(String name) { // throw new RuntimeException("我是异常"); System.out.println("我是save()方法"); } @Override public void update(String name, Integer id) { System.out.println("我是update()方法"); } @Override public String getPersonName(Integer id) { System.out.println("我是getPersonName()方法"); return "xxx"; } }
  • 1

那么除了异常通知外,其他通知都将会执行。此时,测试SpringAOPTest类的interceptorTest()方法,会发现Eclipse控制台打印: 

 
如果PersonServiceImpl类的代码为:

public class PersonServiceImpl implements PersonService { @Override public void save(String name) { throw new RuntimeException("我是异常"); // System.out.println("我是save()方法"); } @Override public void update(String name, Integer id) { System.out.println("我是update()方法"); } @Override public String getPersonName(Integer id) { System.out.println("我是getPersonName()方法"); return "xxx"; } }
  • 1

那么,异常通知就会被执行。此时,测试SpringAOPTest类的interceptorTest()方法,会发现Eclipse控制台打印:

这里写图片描述 
并且还抛出异常。 
基于Spring配置文件实现AOP,我们就学习到这里。如要查看源码,可点击进行下载。

aspectj的切入点语法定义细节

在一文中,我们就初步了解了一下aspectj的切入点语法。我们可利用方法签名来编写aspectj的切入点表达式。最典型的切入点表达式是根据方法的签名来匹配各种方法:

  • execution (* cn.itcast.service.impl.PersonServiceImpl.*(..)):匹配PersonServiceImpl类中声明的所有方法。第一个*代表任意修饰符及任意返回值类型,第二个*代表任意方法,..匹配任意数量任意类型的参数,若目标类与该切面在同一个包中,可以省略包名。
  • execution public * cn.itcast.service.impl.PersonServiceImpl.*(..):匹配PersonServiceImpl类中的所有公有方法。
  • execution public double cn.itcast.service.impl.PersonServiceImpl.*(..):匹配PersonServiceImpl类中返回值类型为double类型的所有公有方法。
  • execution public double cn.itcast.service.impl.PersonServiceImpl.*(double, ..):匹配PersonServiceImpl类中第一个参数为double类型,后面不管有无参数的所有公有方法,并且该方法的返回值类型为double类型。
  • execution public double cn.itcast.service.impl.PersonServiceImpl.*(double, double):匹配PersonServiceImpl类中参数类型为double,double类型的,并且返回值类型也为double类型的所有公有方法。

现在若要求只拦截PersonServiceImpl类中返回值类型为String的方法,则aspectj的切入点表达式应该这样写:

execution(java.lang.String cn.itcast.service.impl.PersonServiceImpl.*(..))
  • 1
  • 1

若要求拦截PersonServiceImpl类中输入参数中的第一个参数类型为String,后面不管有没有参数的方法,则aspectj的切入点表达式应该这样写:

execution(* cn.itcast.service.impl.PersonServiceImpl.*(java.lang.String, ..))

若要求拦截PersonServiceImpl类中返回值类型不是void的所有方法,则aspectj的切入点表达式应该这样写:

execution(!void cn.itcast.service.impl.PersonServiceImpl.*(..))

若要求拦截cn.itcast.service包及其子包下的所有类的所有方法,则aspectj的切入点表达式应该这样写:

execution(* cn.itcast.service..*.*(..))
你可能感兴趣的文章
如何扩展ESXi虚拟机磁盘容量
查看>>
sqlserver 登录方式修改,由默认的windows账户改为用sa等sql server账户登录
查看>>
Apache+tomcat 快速部署Java环境
查看>>
获取Android控件尺寸
查看>>
强大的命令行工具wmic
查看>>
Powershell通过变量、数组批量添加DHCP保留地址
查看>>
引导过程和服务控制
查看>>
拖拽即可创建HTML5网站的建站平台
查看>>
我的友情链接
查看>>
mod_fastcgi和mod_fcgid的区别
查看>>
Delphi字节位操作
查看>>
百兆、千兆网线的做法
查看>>
cisco 10条IOS管理命令
查看>>
文娱产业兴起 娱乐有了 文化在哪?
查看>>
Inotifywait解决监控子目录树的情况
查看>>
两棵树是否相同
查看>>
基本正则表达式和扩展正则表达式中的括号问题
查看>>
nginx+tomcat7 DOCKER镜像的dockerfile
查看>>
关于笔记本电脑网卡出问题的简单解决
查看>>
IPV4与IPV6表示方法
查看>>