书签 分享 收藏 举报 版权申诉 / 28
上传文档赚钱

类型《基于新信息技术的Java-EE应用开发实训》课件第二章.pptx

  • 上传人(卖家):momomo
  • 文档编号:7669602
  • 上传时间:2024-06-24
  • 格式:PPTX
  • 页数:28
  • 大小:178.02KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《《基于新信息技术的Java-EE应用开发实训》课件第二章.pptx》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    基于新信息技术的Java-EE应用开发实训 基于 信息技术 Java EE 应用 开发 课件 第二
    资源描述:

    1、第2章Spring AOP2.1AOP基础2.2通知和切面第2章Spring AOP2.1AOP基础第2章Spring AOP2.1.1AOP概述如图2-1所示,AOP采用横向切割的方式,把横切逻辑,即和业务本身无关的逻辑独立出来,再根据需要把这些独立的模块织入到业务方法中。除了IoC容器,Spring Framework的另一个核心模块就是AOP框架。但是,Spring的IoC模块并不依赖于AOP,如果项目中不需要则完全可以不使用AOP模块。目前,市场上有很多种AOP框架,主流的只有以下三种开源的AOP框架。(1)AspectJ,5.0版本后与AspectWerkz合并。(2)JBoss A

    2、OP,它是JBoss应用程序服务器项目的一个子项目。第2章Spring AOP(3)Spring AOP,它是Spring Framework的一部分。其中,AspectJ是Java社区里最完整、最流行的AOP框架。同时,Spring AOP也提供了另外一种完整的AOP实现,但它不是AspectJ的竞争者,它的目的是给Spring IoC容器提供一种一致性集成的AOP解决方案。Spring AOP的设计理念是:无论开发人员采用什么样的技术,Spring都会提供一个融合这些技术的平台,所以,尽管Spring本身的AOP不是很强大,但是Spring本身提供了对AspectJ的封装,以支持对Aspe

    3、ctJ的使用。2.1.2 AOP常用术语AOP常用术语见下。(1)JoinPoint:连接点,在程序执行过程中某个特定的点。(2)PointCut:切入点,匹配连接点(JoinPoint);通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行。(3)Advice:通知,在切点的某个特定连接点上执行的动作,它定义了切面是什么、什么时候使用。第2章Spring AOP(4)Introduce:引入,可看作是一种特殊的通知,允许为已存在类添加新方法和属性。例如,可以创建一个稽查通知来记录对象的最后修改时间。只要用一个方法setLastModified(Date)以及一个保存这个状态的变量,即

    4、可在不改变已存在类的情况下将状态引入,设置新的行为和状态。(5)Aspect:切面,由切入点和通知组成,它既包括了横切逻辑的定义,也包括了连接点的定义。(6)Target:目标对象,通知对象织入的目标对象,通常这个对象只需要关注业务逻辑操作,非业务的横切逻辑在通知中,AOP可以动态地把通知织入到这些目标中。(7)Weaving:织入,采用某种方式把通知添加到目标对象中的过程。图2-2展示了AOP的关键概念。第2章Spring AOP2.1.3 动态代理使用代理的目的是不希望客户直接访问原始对象,这样可以起到保护原始对象的作用,有时也可以屏蔽使用原始对象的细节。代理对象负责决定是否以及何时将方法

    5、调用转发到原始对象上,此外,围绕着每个方法的调用,代理对象也可以执行一些额外任务。这样的例子在实际生活中有很多,比如服务器代理、防火墙代理、代理商等。代理模式是GOF23中经典模式之一,其基本思想是给某一对象提供代理对象,并由代理对象控制具体对象的引用。图2-3展示了代理设计模式的思路。第2章Spring AOP在Java里,实现代理设计模式有两种方法。一种是静态代理,另一种是动态代理。Spring AOP的核心实现技术是动态代理。在JDK1.3以后,Java提供了动态代理技术,允许开发人员在运行期间创建接口的代理实例。使用Java的代理类必须要求目标类和代理类实现一个共同的接口。JDK的动态

    6、代理类使用java.lang.reflect包中的两个主要类:Proxy和InvocationHandler。其中,InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射的机制调用目标类代码,动态地把横切逻辑和业务逻辑编织在一起。Proxy则是利用InvocationHandler动态创建一个和目标类接口相同的实例,从而产生目标类的代理对象。举例说明,有一个电脑类接口,代码如下:public interface Computer /启动 void start();/停止 void stop();第2章Spring AOP /打印 void print();接口

    7、中有三个方法,分别表示:启动、停止和打印。接下来,写一个简单的实现:public class PC implements Computer Override public void start()System.out.println(启动电脑.);Override第2章Spring AOP public void stop()System.out.println(停止电脑.);Override public void print()System.out.println(打印.);第2章Spring AOPComputerImpl做了一个简单的实现,提示每个方法正在进行的操作,现在需要给这个PC

    8、类的每个方法添加一个横切的逻辑,希望在执行每个方法之后,打印出该方法运行的开始时间和结束时间。如果采用静态代理的方法,则需要另外写一个静态代理类PCStaticProxy,其代码如下:public class PCStaticProxy implements Computer /目标类 PC pc=new PC();Override public void start()System.out.println(new Date()+开始运行!);pc.start();System.out.println(new Date()+结束运行!);第2章Spring AOP Override publi

    9、c void stop()System.out.println(new Date()+开始运行!);pc.stop();System.out.println(new Date()+结束运行!);Override public void print()System.out.println(new Date()+开始运行!);pc.print();第2章Spring AOP System.out.println(new Date()+结束运行!);PCStaticProxy是PC的静态代理类实现。PCStaticProxy中有一个pc属性,这个属性就是PCStaticProxy要代理的目标类,PC

    10、StaticProxy所做的就是调用目标类的方法,同时把横切的代码织入其中,这样就完成了对PC类的静态代理。在客户端使用的时候,不再直接使用PC类,而是使用PC的代理类PCStaticProxy。由上面代码可以看出,使用静态代理类实现代码横切几乎要重写目标类代码,增加了大量的重复性工作,并且一旦横切代码需要改变,就会引起大量的代码改动,极不利于代码的维护,若使用动态代理则不会出现上述问题,下面来看看动态代理是如何实现的。使用动态代理类首先需要实现InvocationHandler接口。InvocationHandler接口表示如下:package java.lang.reflect;publi

    11、c interface InvocationHandler public Object invoke(Object proxy,Method method,Object args)throws Throwable;第2章Spring AOP 接口中声明方法invoke(),在方法中控制整个调用过程。invoke()方法的第一个参数是最终产生的代理实例,第二个参数是表示被代理的目标实例的方法名,最后一个参数是表示被调用的目标方法的参数数组。事实上,可以将接口看成一个织入器,在invoke方法中,可以把需要织入的横切代码和目标代码编织在一起。本例中,创建一个PCHandler类实现接口Invoca

    12、tionHandler:public class PCHandler implements InvocationHandler /代理类 Object target;public PCHandler(Object target)this.target=target;第2章Spring AOP Override public Object invoke(Object proxy,Method method,Object args)throws Throwable Object obj=null;System.out.println(method.getName()+于:+new Date()+开

    13、始运行!);obj=method.invoke(this.target,args);System.out.println(method.getName()+于:+new Date()+结束运行!);return obj;该实现类中有一个target属性,表示需要代理的目标类,实现类实例化的时候需要知道这个目标类。以下代码利用了Java中的反射技术执行目标类的方法:obj=method.invoke(this.target,args);第2章Spring AOPPCHandler只相当于一个代码织入器,并没有产生最终的代理类。产生代理类需要使用Proxy类的newInstance方法,其声明如下

    14、:public static Object newProxyInstance(ClassLoader loader,Class interfaces,InvocationHandler h)该方法需要三个参数,第一个参数负责注册该代理,在绝大部分情况下,它应该就是加载原始类的加载器;第二个参数由该代理需要实现的接口组成,通常需要代理目标类的所有接口;第三个参数传递空值,最后用它来进行计算,此时所有的方法调用都将通过日志来处理程序。有了Proxy之后,就可以使用该类创建所需要的代理类给客户端使用,代码如下:/创建代理目标类的实例Computer target=new PC();/创建Comput

    15、er的动态代理Computer comp=(Computer)Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new PCHandler(target);comp.start();第2章Spring AOP2.2 通知和切面第2章Spring AOP2.2.1 通知Spring AOP主要通过Advice定义横切逻辑。在Spring中支持5种类型的Advice,这5种类型的Advice如表2-1所示。通常应根据需要实现这些接口中的方法。在接口方法中定义横切逻辑

    16、,就可以把它们织入到目标类的方法中,以前置通知为例,使用Spring的AOP方式,给前面定义的PC类的所有方法执行加上前置横切逻辑,并打印“方法开始执行”。首先,实现MethodBeforeAdvice接口,代码如下:public class BeforeAdviceDemo implements MethodBeforeAdvice 第2章Spring AOP Override public void before(Method arg0,Object arg1,Object arg2)throws Throwable System.out.println(arg0.getName()+方法

    17、执行.);MethodBeforeAdvice继承了Before Advice接口,该接口表示前置通知,需要实现MethodBeforeAdvice接口里面的before方法。before方法有三个参数,其中arg0表示执行的目标类方法,arg1表示目标类方法的参数,arg2表示目标实例类。在before方法中,需要定义横切的逻辑代码,然后把横切的代码与目标类代码编织在一起。第2章Spring AOP在Spring中,需要使用ProxyFactory类产生目标类代码,同时使用它编织横切代码。下面看看如何使用ProxyFactory类产生代理类。public class BeforeAdvice

    18、DemoTest public static void main(String args)/获取Spring代理工厂 ProxyFactory pf=new ProxyFactory();/设置代理目标 pf.setTarget(new PC();/设置通知 pf.addAdvice(new BeforeAdviceDemo();/创建代理PC proxy=(PC)pf.getProxy();第2章Spring AOP proxy.start();ProxyFactory使用比较简单,由名字可以看出,它是一个类代理工厂,专门用于产生类代理。Spring会根据需要使用JDK的代理或者是CGLib

    19、的代理,通过ProxyFactory的addAdvice方法可以增加通知。addAdvice方法可以添加多个通知,最终形成通知链,调用的顺序和增加通知的顺序一致,使用setTarget方法可以指定代理目标,最后通过getProxy()方法产生一个目标类的代理类。除了使用ProxyFactory创建代理外,还可以通过Spring配置IoC的方式产生代理类。使用Spring配置的方式,配置代码如下:第2章Spring AOP在使用配置文件的时候,通知和目标对象通过Spring的IoC管理起来,然后用ProxyFactoryBean作为代理对象。配置后,就可以通过实例调用方法,从Spring容器中获

    20、取代理类的实例,代码如下:ApplicationContext ctx=new ClassPathXmlApplicationContext(beans.xml);PC pc=(PC)ctx.getBean(proxy);pc.start();其他的通知方式和前置通知类似。对于所有的通知,都可以通过Pointcut切点,把通知有选择地置入连接点中。2.2.2 切面在OOP中模块化的关键单元是类(classes),而在AOP中模块化的单元则是切面。切面能对关注点进行模块化,例如横切多个类型和对象的事务管理。Spring提供了3种方式定义和组织切点:编程方式、注解方式和XML配置方式。本小节以XM

    21、L配置方式为例,介绍使用切面的方法。第2章Spring AOP用下面的例子来了解一个基于配置方式是如何处理的。第2章Spring AOP SimpleAdvice类定义如下:public class SimpleAdvice 第2章Spring AOP /打印时间 public void printTime(JoinPoint jp)System.out.println(方法:+jp.getSignature().getName()+开始执行时间:+new Date();SimpleAdvice是一个普通的类,用于定义横切逻辑,使用XML配置AOP的时候,横切逻辑可以是任意一个JavaBean

    22、,不需要实现任何接口。要使用XML配置AOP切面,首先需要在beans标签中添加相应的命名空间,其次通过一系列的以aop开头的标记配置切面,具体步骤如下:1.声明切面在Bean配置文件中,所有的Spring AOP配置都必须定义在元素内部。每个切面,都要创建一个元素来为具体的切面实现引用后端Bean实例。因此,切面Bean必须有一个标识符,供第2章Spring AOP元素引用。需要注意的是该Bean可以是任意一个简单的JavaBean,不需要实现任何接口。例如:2.声明切入点切入点必须定义在元素下,或者直接定义在元素下。在前一种情况中,切入点只对声明的切面可见;而后一种情况则是一个全局的切入点

    23、定义,它对所有切面均可见。第2章Spring AOP以上配置定义了一个切点,切点是用来描述连接点的集合,配置中使用了AspectJ的表达式语法。其中,execution是AspectJ的切点函数,其语法如下:execution(?()?)以方法签名定义切入点,例如:execution(public*(.):匹配目标类所有的public方法,第一个*表示返回任意类型,第二个*匹配方法名称,(.)匹配任意参数。execution(public*Pre*(.):匹配目标类所有以Pre开头的public方法。通过类定义切点,例如:execution(*com.ssoft.PC.*(.):匹配com.s

    24、soft.PC类中的所有的方法,第一个*表示返回任意类型,第二个*匹配所有方法。通过包名定义切点,例如:execution(*com.ssoft.*(.):匹配com.ssoft包中所有类的所有的方法。execution(*com.ssoft.*(.):匹配com.ssoft包及其子包中所有类的所有方法。第2章Spring AOP3.声明通知在AOP Schema中,每种通知类型都对应一个特定的XML元素。通知元素需要pointcut-ref属性来引用切入点,或者用pointcut属性直接嵌入切入点表达式。method属性指定切面类中通知方法的名称。常用的通知如下:前置通知:后置通知:环绕通知:异常通知:

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:《基于新信息技术的Java-EE应用开发实训》课件第二章.pptx
    链接地址:https://www.163wenku.com/p-7669602.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库