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

使用Spring配置文件实现AOP

前面我们已经学会了使用Spring的注解方式实现AOP,现在我们就要学习使用Spring配置文件实现AOP。本文是建立在使用Spring的注解方式实现AOP的细节的案例的基础之上的。 
我们首先将MyInterceptor类的代码修改为:

/**
* 切面
* @author li ayun
*
*/
@Aspect
public 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配置文件的内容修改为:

<?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: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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd"> <aop:aspectj-autoproxy />
<bean id="personService" class="cn.itcast.service.impl.PersonServiceImpl"></bean>
<bean id="aspetbean" class="cn.itcast.service.MyInterceptor"></bean>
<aop:config>
<aop:aspect id="asp" ref="aspetbean">
<aop:pointcut expression="execution(* cn.itcast.service.impl.PersonServiceImpl.*(..))" id="mycut"/>
<aop:before pointcut-ref="mycut" method="doAccessCheck"/>
<aop:after-returning pointcut-ref="mycut" method="doAfterReturning"/>
<aop:after-throwing pointcut-ref="mycut" method="doAfterThrowing"/>
<aop:after pointcut-ref="mycut" method="doAfter"/>
<aop:around pointcut-ref="mycut" method="doBasicProfiling"/>
</aop:aspect>
</aop:config>
</beans>
  • 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,我们就学习到这里。如要查看源码,可点击使用Spring配置文件实现AOP进行下载。

aspectj的切入点语法定义细节

使用Spring的注解方式实现AOP入门一文中,我们就初步了解了一下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..*.*(..))

(转)使用Spring配置文件实现AOP的更多相关文章

  1. 8 -- 深入使用Spring -- 4...6 AOP代理:基于注解的XML配置文件的管理方式

    8.4.6 基于XML配置文件的管理方式 Spring 2.x 提供一个新的aop:命名空间来定义切面.切入点和增强处理. XML配置方式优点: ⊙ 如果应用没有使用JDK 1.5 以上版本,那么应用 ...

  2. 你不知道的Spring配置文件

    Spring配置文件是用于指导Spring工厂进行Bean生产.依赖关系注入(装配)及Bean实例分发的"图纸".Java EE程序员必须学会并灵活应用这份"图纸&quo ...

  3. Spring系列之AOP实现的两种方式

    AOP常用的实现方式有两种,一种是采用声明的方式来实现(基于XML),一种是采用注解的方式来实现(基于AspectJ). 首先复习下AOP中一些比较重要的概念: Joinpoint(连接点):程序执行 ...

  4. Spring系列之AOP

    一.什么是AOPAOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引 ...

  5. Spring配置文件详解

      转自: http://book.51cto.com/art/201004/193743.htm 此处详细的为我们讲解了spring2.5的实现原理,感觉非常有用 spring配置文件是用于指导Sp ...

  6. Hibernate SQL方言 (hibernate.dialect) Spring配置文件applicationContext.xml

    转自:http://www.cnblogs.com/wj-wangjun/archive/2009/10/21/1587624.html Hibernate SQL方言 (hibernate.dial ...

  7. spring配置文件详解--真的蛮详细

    spring配置文件详解--真的蛮详细   转自: http://book.51cto.com/art/201004/193743.htm 此处详细的为我们讲解了spring2.5的实现原理,感觉非常 ...

  8. Spring 配置文件详解 (以2.5为例)

    转载自:http://blog.csdn.net/zzjjiandan/article/details/22922847          Spring配置文件是用于指导Spring工厂进行Bean生 ...

  9. Spring 配置文件applicationContext.xml

    Spring配置文件是用于指导Spring工厂进行Bean生产.依赖关系注入(装配)及Bean实例分发的"图纸". Spring配置文件是一个或多个标准的XML文档,applica ...

随机推荐

  1. UIWindow学习

    写在前面 本文内容绝大部分都参考唐巧大神的<iOS开发进阶>,只是结合不是特别长的开发经验加以补充:最后基于UIWindow自定义了一个类似于微信的ActionSheet. UIWindo ...

  2. 获取服务器基本信息.sh

    #获取linux服务器基本信息脚本 #!/bin/bash # #Name:system_info #Ver:1.0 #Author:lykyl # # #程序说明: #获取服务器基本信息脚本 # e ...

  3. API接口文档的撰写

    接口文档: 要写:接口简介.请求参数.返回结果.注意事项. 下面以“喜马拉雅的 ‘圈子’ ”为例子: 接口一 (1)接口简介 http://ipservice.mogujie.com/ipservic ...

  4. 输出文章段落首行空格缩进在IE和chrome显示不一致的问题

    一般的编辑文章时,首行都缩进两格,而执行的操作则是一个tab键或者四个空格键,在html代码中体现的往往都是4个 然而我在输出时却发现了同样的html代码,在IE上显示的是缩进了一个字符,在chrom ...

  5. 基于事件驱动机制,在Service Mesh中进行消息传递的探讨

    翻译 | 宋松 原文 | https://www.infoq.com/articles/service-mesh-event-driven-messaging 关键点 当前流行的Service Mes ...

  6. 浅谈Floyd的三种用法 By cellur925

    Floyd大家可能第一时间想到的是他求多源最短路的n³算法.其实它还有另外两种算法的嘛qwq.写一发总结好了qwq. 一.多源最短路 放段代码跑,注意枚举顺序,用邻接矩阵存图.本质是一种动规. 复杂度 ...

  7. Ubuntu18 安装jdk8

    按照网上能找到的方法,添加仓库已经不行了,具体原因如下: I look up to the webupd8 site and it seems that the ppa was discontinue ...

  8. VS2008/2010 都不能使用Access2010数据库

    VS2008/2010 都不能使用Access2010数据库,因为VS2008/2010都不能使用X64位的Access数据库引擎.

  9. socket_IO模型

    1 背景知识 1.1 用户空间和内核空间 比如32位系统,寻址空间是4G.内存分为用户空间和内核空间,内核空间仅供内核使用,用户空间给各个进程使用.os的核心是内核,只有内核可以访问被保护的内存空间. ...

  10. 【数据结构(C语言版)系列三】 队列

    队列的定义 队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素.这和我们日常生活中的排队是一致的,最早进入队列的元素最早离开.在队列中,允许插入的一端叫做队尾(rear),允许 ...