第3章 Spring的AOP实现
3.1 正则表达式简介
3.2 认识AOP
3.2.1 代理机制
3.2.2 AOP中的常用术语
3.3 传统的AOP支持
3.3.1 前置通知Before Advice
3.3.2 后置通知After Advice
3.3.3 环绕通知Around Advice
3.3.4 异常通知Throw Advice
3.3.5 NameMatchMethodPointAdvisor
3.3.6 RegexpMethodPointcutAdvisor
3.3.7 DefaultPointcutAdvisor
3.3.8 引介
3.4 Spring 2.0中的AOP
3.4.1 Spring2.0中的Pointcut定义
3.4.2 基于XML Schema的前置通知
3.4.3 基于Annotation的前置通知
3.4.4 基于XML Schema的后置通知
3.4.5 基于Annotation的后置通知
3.4.6 基于XML Schema的环绕通知
3.4.7 基于Annotation的环绕通知
3.4.8 基于XML Schema的异常通知
3.4.9 基于Annotation的异常通知
3.4.10 SpringAOP综合运用之超级玛丽完结篇
3.5 小结

试读部分:

3.4 Spring 2.0中的AOP

Spring2.0中除了支持3.3节中讲述的传统的AOP支持,还提供了2种实现AOP的方式:
1、基于XML的配置,使用基于Schema的XML配置来完成AOP,而且Advice也不用再实现任何其他特定的接口。
2、使用JDK5的注释来完成AOP的实现,只需要一个简单的标签就完成了AOP的整个过程。
3.4.1 Spring2.0中的Pointcut定义
     Spring2.0中的切入点Pointcut的定义有2种方式,表达式配置和Annotation配置,下面具体讲解。
1、表达式
Spring2.0中的Pointcut的定义支持的关键字有:execution(方法执行的连接点,
这是Spring 中最主要的切入点指定者),within(限定匹配特定类型的连接点),this(连接点本身),target(连接点目标对象),arg(连接点参数)等,表达式的定义如下格式:
execution(modifiers-pattern?
ret-type-pattern
declaring-type-pattern?
name-pattern(param-pattern)
throws-pattern?)
有“?”号的部分表示可省略的,modifers-pattern 表示修饰符如 public、protected 等,
ret-type-pattern 表示方法返回类型,declaring-type-pattern 代表特定的类,name-pattern 代表方法名称,param-pattern表示参数,throws-pattern表示抛出的异常。在切入点表达式中,可以使用*来代表任意字符,用..来表示任意个参数(注意这里不是正则表达式),比喻前面的
execution(void spring.chapter3.proxy.Component.business*(..))
就表示执行spring.chapter3.proxy.Component中所有business开头的方法,这里的省略了第一个参数,第二个参数为void,在很多情况下传回值可以用*表示所有传回值均匹配,第三个参数这里指定了类spring.chapter3.proxy.Component,第四个参数为business*表示所有business开头的方法,这里方法的参数为(..),表示0个或者任意个参数,也可以使用*来指定任意参数,比如business*(*,String),表示2个参数,第一个为任意类型,第二个为String类型,同时还可以使用within关键字来表示,例如within(spring.chapter3.proxy.*)表示spring.chapter3.proxy包下的任何方法,由于within用的比较少,同时功能也有所局限,这里不再花太多的篇幅介绍。
2、Annotation表达式
基于JDK5.0以上我们还可以使用Annotation来配置切入点,表达式写法和前面一样,只不过这里不再需要使用配置文件来声明表达式了,直接使用@Pointcut("execution()")就可以表示一个切入点了,以后在需要应用该切入点的时候就可以使用其标识的方法了。
比如:
@Pointcut("execution(void spring.chapter3.proxy.Component.business*(..))")
public void beforePointcut(){}
表示在spring.chapter3.proxy.Component中所有business开头的方法这样一个切入点,在执行前置通知或者其他需要使用的时候直接使用:
@before("beforePointcut")
也就相当于@before("execution(void spring.chapter3.proxy.Component.business*(..))")
3.4.2基于XML Schema的前置通知
 Spring2.0提供了Schema来通过配置文件解决了前置通知的限定接口,以改写3.3.1中的实例来讲解,AdviceBeforeComponent不再需要实现MethodBeforeAdvice接口,改后的代码如下:
package spring.chapter3.aop.schema;
publicclass AdviceBeforeComponent ...{
   publicvoid before()...{
     System.out.println("用户验证");
        }
}
这里的代码更加简介,before()方法是自己定义的,可以任意定义方法名,方法可以接口JoinPoint作为参数,也可以不用任何参数,接着修改advice.xml配置文件如下:
<?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-2.0.xsd 
     http://www.springframework.org/schema/aop 
     http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
    <aop:config>
       <aop:pointcut id="beforePointcut"
           expression="execution(* spring.chapter3.proxy.IComponent.*(..))" />
       <aop:aspect id="before" ref="beforeAdvice">
           <aop:before pointcut-ref="beforePointcut" method="before" />
       </aop:aspect>
    </aop:config>
    <bean id="beforeAdvice"
       class="spring.chapter3.aop.schema.AdviceBeforeComponent" />
    <bean id="component" class="spring.chapter3.proxy.Component" />
</beans>
首先加入schema的命名空间,然后就可以使用<aop:config>标签来配置了,在<aop:config>中首先定义了一个<aop:pointcut>这样就pointcut单独提出去来便于后面的使用,<aop:pointcut>相当于一个bean的配置,只是他只在<aop:config>范围有效,这里要注意的是正则表达式
execution(* spring.chapter3.proxy.IComponent.*(..))中的“*”和后面的表达式间要有个空格,否则会提示正则表达式错误,<aop:aspect>表示一个切面的定义,该切面引用beforeAdvice这个bean作为通知,<aop:before>表示一个前置通知的定义,该通知的规则引用beforePointcut这个切入点的表达式,method表示要引用的beforeAdvice中的before方法。
<aop:config>配置规则如下:
<aop:config> 
<aop:pointcut id="somePointcut" expression=""/> 
<aop:advisor id="someAdvisor" pointcut-ref="" advice-ref=""/> 
<aop:aspect id="someAspect" ref="someBean"> 
<aop:adviceType id="someAdvice" .../> 
</aop:aspect> 
</aop:config> 
针对上面的代码编写一个测试文件:
package spring.chapter3.aop.schema;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import spring.chapter3.proxy.IComponent;
publicclass TestSchema ...{
    publicstaticvoid main(String[] args) ...{
       ApplicationContext context = new ClassPathXmlApplicationContext(
              "spring/chapter3/aop/schema/advice.xml");
       IComponent component = (IComponent) context.getBean("component");
       component.bussiness1();
       component.bussiness2();
       component.bussiness3();
    }
}
运行结果如下:
用户验证
业务1
用户验证
业务2
用户验证
业务3
,达到预先效果,在每个business方法前均执行了用户验证,这里要注意的是:除了直接引用spring.jar外,还需要aspectweaver.jar、asm-*.jar、asm-commons-*.jar。
3.4.3基于Annotation的前置通知
  Spring2.0结合JDK5及以上版本,还提供了Annotation设置AOP的Advice,避免了XML的配置,更加简化了AOP实现,这里将3.4.2节中的示例改为Annotation配置AOP,首先修改AdviceBeforeComponent如下:
package spring.chapter3.aop.schema;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class AdviceBeforeComponent ...{
    @Before("execution(* spring.chapter3.proxy.IComponent.*(..))")
  public void before()...{
      System.out.println("用户验证");
        }
}
@Aspect标签表示将该类设置为一个Aspect,@Before标签表示该方法在是一个前置通知,他遵守的规则是execution(* spring.chapter3.proxy.IComponent.*(..)),也就是spring.chapter3.proxy.Icomponent接口中的所有方法,接着修改一下XML配置文件如下:
<?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-2.0.xsd 
     http://www.springframework.org/schema/aop 
     http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
    <aop:aspectj-autoproxy />
    <bean id="beforeAdvice"
       class="spring.chapter3.aop.schema.AdviceBeforeComponent" />
    <bean id="component" class="spring.chapter3.proxy.Component" />
</beans>
这里没有了前面的<aop:config>等配置,只有一个<aop:aspectj-autoproxy/>表示自动进行代理,其余的一切你都不用管了,交给Spring就是了,从这个例子可以看出基于Annotation的AOP配置是最简化的,但是他使用了@Aspect等标签,这样给系统造成了一定的耦合,在实际应用中药选择哪个完全取决于个人意向。
本书近期由电子工业出版社出版!敬请关注!谢谢

透析Spring2---第三章试读相关推荐

  1. 《大话数据结构》样章试读

    <大话数据结构>样章试读 各位童鞋,<大话数据结构>从写作到出版,虽然经历了一些坎坷,但终于还是在今天正式在一些网店发售了.现在提供两章的完整版试读PDF文件,希望能给您有所 ...

  2. 计算机过程控制系统教材,过程控制系统-样章试读.PDF

    过程控制系统-样章试读.PDF 高等院校教材 过程控制系统 陈夕松 汪木兰 主编 李 奇 主审 KB2 北 京 内 容 简 介 本书以过程控制系统组成和结构为线索,介绍了过程控制的基本概 念,过程控制 ...

  3. 应用统计所需计算机软件,应用统计学-样章试读.PDF

    应用统计学学习指导软件介绍及习题耿修林编著北京内容简介本书是学习应用统计学的辅助教材编写该书的目的主要是帮助读者理清应用统计学各章的学习要点并通过做习题加深和巩固所学的内容全书共十五章每章的结构安排是 ...

  4. 精华推荐 | 【MySQL技术专题】「主从同步架构」全面详细透析MySQL的三种主从复制(Replication)机制的原理和实战开发(原理+实战)

    前提概要 随着应用业务数据不断的增大,应用的响应速度不断下降,在检测过程中我们不难发现大多数的请求都是查询操作.此时,我们可以将数据库扩展成主从复制模式,将读操作和写操作分离开来,多台数据库分摊请求, ...

  5. 《Linux就是这个范儿》试读有感

    感谢ITeye的7月图书试读活动,使得我有机会接触到当前最热门的技术以及优秀的图书.上一次不经意间的写了微管理的读后感,并且侥幸获奖,这次在写这篇文章的读后感的时候有了一些莫名的压力,那就是如何让本篇 ...

  6. 透析ICMP协议(一): 协议原理

    透析ICMP协议(一): 协议原理 =============================== 这篇文章原创自bugfree/CSDN 平台: VC6 Windows XP ICMP简介: --- ...

  7. 试读angular源码第三章:初始化zone

    直接看人话总结 前言 承接上一章 项目地址 文章地址 angular 版本:8.0.0-rc.4 欢迎看看我的类angular框架 文章列表 试读angular源码第一章:开场与platformBro ...

  8. 《企业自主搞定ERP》试读:第三章-成功案例

    文/开源智造联合创始人老杨 本文来自<企业自主搞定ERP>的试读章节.书籍尚未出版,请勿转载.欢迎您反馈阅读意见. Odoo用户概要 关于Odoo全球的用户,我们来看一些数据: l Odo ...

  9. 《精彩绝伦的CSS》图书试读样章

    [img]http://www.ituring.com.cn/bookcover/924.391.jpg[/img] ----------------------------------------- ...

最新文章

  1. C面向对象之透明指针的运用
  2. 10个例子带你了解机器学习中的线性代数
  3. linux centos7 yum 报错 Public key for *.rpm is not installed 解决方法
  4. 从事数据科学前必须知道的五件事儿
  5. 【Matlab】怎么判断两个字符串相等?
  6. js中setTimeout的用法和JS计时器setTimeout与setInterval方法的区别和confirm方法
  7. 【转】时间序列分析——基于R,王燕
  8. 笔记本长时间不用出现一片黑屏
  9. vue完全编程方式与react在书写和运用上的异同
  10. P4306-[JSOI2010]连通数【bitset】
  11. Github项目汇总
  12. L2-002. 链表去重-PAT团体程序设计天梯赛GPLT
  13. RuntimeError: all elements of input should be between 0 and 1
  14. 对接码是什么意思_聊聊API:API对接是什么意思 API接口程序介绍
  15. 计算机毕业论文工作进展情况,论文中期检查进展怎么写_论文中期检查表怎么写_论文进展情况怎么写...
  16. 单片机计算机实训总结,单片机实习心得体会三篇
  17. 中国大学生在线官方微博入围全国十大中央机构微博、全国十大教育微博
  18. 知识关联视角下金融证券知识图谱构建与相关股票发现
  19. 太阳天顶角、太阳方位角、日地距离、时差、太阳赤纬角
  20. linpack实验:MPI代码调优

热门文章

  1. 币小秘炒币机器人:币圈一场熊市下的博奕游戏
  2. 提示 STOP:c000021a unknown hard error
  3. 设置计算机屏幕保护程序可以使系统节省资源,[判断题] 设置计算机的屏幕保护程序可以使系统节省资源。...
  4. 个人学习日志——树莓派实时人脸识别项目
  5. Nature新规:用ChatGPT写论文可以,列为作者不行
  6. 基于Python实现神经网络中的激活函数图像绘制
  7. 使用SqlSugar连接多个数据库(sqlserver,sqlite,mysql)
  8. 杭电 HDU 1248 Java寒冰王座
  9. PHP语言Laravel9+Layui搭建的系统后台框架
  10. 优酷路由宝L1刷Breed和Padavan固件方法