`
coolerbaosi
  • 浏览: 729287 次
文章分类
社区版块
存档分类
最新评论

Spring3开发实战 之 第三章:AOP开发(1)

 
阅读更多
AOP是什么(Aspect Oriented Programming)
AOP是一种编程范式,提供从另一个角度来考虑程序结构以完善面向对象编程(OOP)。
AOP为开发者提供了一种描述横切关注点的机制,并能够自动将横切关注点织入到面向对象的软件系统中,从而实现了横切关注点的模块化。
AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理、日志管理、权限控制等,封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
AOP能干什么,也是AOP带来的好处
1:降低模块的耦合度
2:使系统容易扩展
3:设计决定的迟绑定:使用AOP,设计师可以推迟为将来的需求作决定,因为它
可以把这种需求作为独立的方面很容易的实现。
4:更好的代码复用性
仍然存在问题:
大家会发现,需要修改的地方分散在很多个文件中,如果需要修改的文件多那么修改的量会很大,这无疑会增加出错的几率,并且加大系统维护的难度。
而且,如果添加功能的需求是在软件开发的后期才提出的话,这样大量修改已有的文件,也不符合基本的“开-闭原则”。
改进的解决方案
采用装饰器模式或者代理模式来实现。
装饰器模式定义
动态地给一个对象添加一些额外的职责。就增加功能来说, 装饰器模式相比生成子类更为灵活。
代理模式定义
为其他对象提供一种代理以控制对这个对象的访问
JDK动态代理解决方案(比较通用的解决方案)

java代码:
  1. publicclassMyInvocationHandlerimplementsInvocationHandler{
  2. privateObjecttarget;
  3. publicMyInvocationHandler(Objecttarget){
  4. this.target=target;
  5. }
  6. publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)
  7. throwsThrowable{
  8. //1.记录日志2.时间统计开始3.安全检查
  9. ObjectretVal=method.invoke(target,args);
  10. //4.时间统计结束
  11. returnretVal;
  12. }
  13. publicObjectproxy(){
  14. returnProxy.newProxyInstance(target.getClass().getClassLoader(),
  15. target.getClass().getInterfaces(),newMyInvocationHandler(target));
  16. }
  17. }
CGLIB动态代理的解决方案:

java代码:
  1. publicclassMyInterceptorimplementsMethodInterceptor{
  2. privateObjecttarget;
  3. publicMyInterceptor(Objecttarget){
  4. this.target=target;
  5. }
  6. publicObjectintercept(Objectproxy,Methodmethod,Object[]args,
  7. MethodProxyinvocation)throwsThrowable{
  8. //1.记录日志2.时间统计开始3.安全检查
  9. ObjectretVal=invocation.invoke(target,args);
  10. //4.时间统计结束
  11. returnretVal;
  12. }
  13. publicObjectproxy(){
  14. returnEnhancer.create(target.getClass(),newMyInterceptor(target));
  15. }
  16. }
JDK动态代理的特点
不能代理类,只能代理接口
CGLIB动态代理的特点
能代理类和接口,不能代理final类
动态代理的本质
用来实现对目标对象进行增强,最终表现为类,只不过是动态创建子类,不用手工生成子类。
动态代理的限制
只能在父类方法被调用之前或之后进行增强(功能的修改),不能在中间进行修改,要想在方法调用中增强,需要ASM(一个Java 字节码操作和分析框架)
更好的解决方案——AOP提供
人们认识到,传统的程序经常表现出一些不能自然地适合跨越多个程序模块的行为,例如日志记录、对上下文敏感的错误处理等等,人们将这种行为称为“横切关注点(CrossCuttingConcern)”,因为它跨越了给定编程模型中的典型职责界限。
如果使用过用于密切关注点的代码,您就会知道缺乏模块性所带来的问题。因为横切行为的实现是分散的,开发人员发现这种行为难以作逻辑思维、实现和更改。因此,面向方面的编程AOP应运而生。
回过头来再次理解AOP的概念。
关注点
就是所关注的公共功能,比如像事务管理,就是一个关注点。表示“要做什么”
连接点(Joinpoint)
在程序执行过程中某个特定的点,通常在这些点需要添加关注点的功能,比如某方法调用的时候或者处理异常的时候。在Spring AOP中,一个连接点总是代表一个方法的执行。表示“在什么地方做”
通知(Advice):
在切面的某个特定的连接点(Joinpoint)上执行的动作。
通知有各种类型,其中包括“around”、“before”和“after”等通知。 通知的类型将在后面部分进行讨论。许多AOP框架,包括Spring,都是以拦截器做通知模型,并维护一个以连接点为中心的拦截器链。表示“具体怎么做”
切面/方面(Aspect)
一个关注点的模块化,这个关注点可能会横切多个对象。综合表示“在什么地方,要做什么,以及具体如何做”
切入点(Pointcut):
匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。
目标对象(Target Object):
被一个或者多个切面所通知(advise)的对象。也有人把它叫做 被通知(advised) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。
AOP代理(AOP Proxy):
AOP框架使用代理模式创建的对象,从而实现在连接点处插入通知(即应用切面),就是通过代理来对目标对象应用切面。在Spring中,AOP代理可以用JDK动态代理或CGLIB代理实现,而通过拦截器模型应用切面。 注意:Spring引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创建是透明的。
织入(Weaving)
把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象的过程。也就是说织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程。这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。
引入(Introduction):
也被称为内部类型声明(inter-type declaration)。为已有的类声明额外的方法或者某个类型的字段。 Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。 例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。
前置通知(Before advice):
在某连接点之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。
返回后通知(After returning advice):
在某连接点正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。
抛出异常后通知(After throwing advice):
在方法抛出异常退出时执行的通知。
后通知(After (finally) advice):
当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
环绕通知(Around Advice):
包围一个连接点的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。
构建环境和前面一样
定义一个接口如下:

java代码:
  1. packagecn.javass.Spring3.aop;
  2. publicinterfaceApi{
  3. publicStringtestAop();
  4. }
写一个类实现这个接口

java代码:
  1. publicclassImplimplementsApi{
  2. publicStringtestAop(){
  3. System.out.println("testaop");
  4. return"aopisok";
  5. }
  6. }
写一个类作为Before的Advice,没有任何特殊要求,就是一个普通类

java代码:
  1. publicclassMyBefore{
  2. publicvoidb1(){
  3. System.out.println("nowbefoer--------->");
  4. }
  5. }
配置文件,要注意配置的时候要保证一定要有命名空间aop的定义,如下:

java代码:
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="
  8. http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  9. http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsd
  10. http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsd
  11. http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsd
  12. ">
  13. <beanid=“testAopApi”class=“cn.javass.spring3.aop.Impl"></bean>
  14. <beanid=“myBefore”class=“cn.javass.spring3.aop.MyBefore"></bean>
  15. <aop:config>
  16. <aop:aspectid="abcd"ref="myBefore">
  17. <aop:pointcutid="myPointcut"
  18. expression=“execution(*cn.javass.spring3.aop.*.*(..))"/>
  19. <aop:before
  20. pointcut-ref="myPointcut"
  21. method="b1"/>
  22. </aop:aspect>
  23. </aop:config>
  24. </beans>
客户端如下:

java代码:
  1. publicclassClient{
  2. publicstaticvoidmain(String[]args){
  3. ApplicationContextcontext=newClassPathXmlApplicationContext(
  4. newString[]{"applicationContext.xml"});
  5. Apiapi=(Api)context.getBean("testAopApi");
  6. Strings=api.testAop();
  7. System.out.println("s=="+s);
  8. }
  9. }
测试结果如下:
now befoer--------->
test aop
s==aop is ok
视频配套PPT,视频地址【Spring3开发实战-独家视频课程

分享到:
评论

相关推荐

    Spring+3.x企业应用开发实战光盘源码(全)

     第3章:讲解Spring IoC容器的知识,通过具体的实例详细地讲解IoC概念。同时,对Spring框架的三个最重要的框架级接口进行了剖析,并对Bean的生命周期进行讲解。  第4章:讲解如何在Spring配置文件中使用Spring 3.0...

    陈开雄 Spring+3.x企业应用开发实战光盘源码.zip

     第3章:讲解Spring IoC容器的知识,通过具体的实例详细地讲解IoC概念。同时,对Spring框架的三个最重要的框架级接口进行了剖析,并对Bean的生命周期进行讲解。  第4章:讲解如何在Spring配置文件中使用Spring ...

    Spring.3.x企业应用开发实战(完整版).part2

     《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练...

    Spring3.x企业应用开发实战(完整版) part1

     《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    第3 章 Spring 高级话题 48 3.1 Spring Aware 48 3.1.1 点睛 48 3.1.2 示例 49 3.2 多线程 51 3.2.1 点睛 51 3.2.2 示例 51 3.3 计划任务 54 3.3.1 点睛 54 3.3.2 示例 54 3.4 条件注解@Conditional 56 3.4.1 点睛 ...

    Spring Boot实战与原理分析视频课程包含14-18

    Spring Boot实战与原理分析视频课程包含14-18,本视频教程为网络整理,如有侵权,请联系删除。谢谢 Spring Boot实战与原理分析视频课程 课程目录: 1 Spring Boot概述与课程概要介绍20:33 2 Spring4 快速入门59:56...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    第3 章 Spring 高级话题 48 3.1 Spring Aware 48 3.1.1 点睛 48 3.1.2 示例 49 3.2 多线程 51 3.2.1 点睛 51 3.2.2 示例 51 3.3 计划任务 54 3.3.1 点睛 54 3.3.2 示例 54 3.4 条件注解@Conditional 56 3.4.1 点睛 ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    第3 章 Spring 高级话题 48 3.1 Spring Aware 48 3.1.1 点睛 48 3.1.2 示例 49 3.2 多线程 51 3.2.1 点睛 51 3.2.2 示例 51 3.3 计划任务 54 3.3.1 点睛 54 3.3.2 示例 54 3.4 条件注解@Conditional 56 3.4.1 点睛 ...

    spring-boot示例项目

    Spring Boot为Spring平台及第三方库提供开箱即用的设置,这样你就可以有条不紊地开始。多数Spring Boot应用只需要很少的Spring配置。 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Sprin

    Java语言基础下载

    第三十七章 Spring介绍 713 学习目标 713 Spring简介 714 IOC控制反转 714 Spring的容器 715 AOP面向切面编程 715 AOP的专业术语 715 Spring事务管理 718 Spring与Struts整合 719 Spring与Hibernate整合 721 独立...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    共24章,其中,第1篇为技能学习篇,主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e技术入门、...

    《Java Web编程宝典(十年典藏版)》光盘源码

    共24章,其中,第1篇为技能学习篇,主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e技术入门、...

    Java Web程序设计教程

    第3章jsp和servlet 33 3.1开发第一个jsp+servlet应用 33 3.1.1创建工程 33 3.1.2编写程序 34 3.1.3部署应用 35 3.2认识jsp 36 3.2.1jsp的工作原理 37 3.2.2jsp注释方式 37 3.2.3jsp声明方式 38 3.2.4jsp...

    springmybatis

    mybatis实战教程mybatis in action之五与spring3集成附源码 mybatis实战教程mybatis in action之六与Spring MVC 的集成 mybatis实战教程mybatis in action之七实现mybatis分页源码下载 mybatis实战教程mybatis in ...

    J2EE开发全程实录(JAVA项目开发)

    第3章 AOP. 33 3.1 AOP概论... 33 3.2 AspectJ. 35 3.3 Spring AOP. 36 3.3.1 实现Advice. 36 3.3.2 编写业务代码... 37 3.3.3 装配pointcut和advice. 38 3.3.4 运行主程序... 39 3.4 动态代理... 40 3.4.1 CGLib. ...

    Java Web编程宝典

    共24章,其中,第1篇为技能学习篇,主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e技术入门、...

    QTracer源码分析.pdf

    2.Instrument 代码实战,抛弃 SpringAOP 实现 AOP 方法; 3.介绍 Instrument 在 Qunar 的全链路追踪 QTrace 的 Client 端的应用。 通过该系列可以了解到 Instrument 技术以及如何应用。 在第一篇文章中,主要包含...

Global site tag (gtag.js) - Google Analytics