版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、原理AOP(Aspect Oriented Programming),也就是面向方面编程的技术。AOP 基于 loC 基础,是对 OOP 的有益补充。AOP 将应用系统分为两部分,核心业务逻辑(Core businessconcerns )及横向的通用逻辑,也就是所谓的方面Crosscuttingen terprise con cerns ,例如,所有大中型应用都要涉及到的持久化管理(Persistent )、事务管理(Transaction Management )、安全 管理(Security )、日志管理(Logging )和调试管理(Debugging ) 等。AOP 正在成为软件开发
2、的下一个光环。使用 AOP,你可以将处 理aspect的代码注入主程序, 通常主程序的主要目的并不在于处理这 些aspectoAOP 可以防止代码混乱。Spring framework 是很有前途的 AOP 技术。作为一种非侵略性 的、轻型的 AOP framework ,你无需使用预编译器或其他的元标签, 便可以在Java 程序中使用它。 这意味着开发团队里只需一人要对付 AOP framework ,其他人还是像往常一样编程。AOP 概念让我们从定义一些重要的 AOP 概念开始。方面(Aspect ): 一个关注点的模块化,这个关注点实现可 能另外横切多个对象。事务管理是 J2EE 应用中
3、一个很好的横切关注点 例子。方面用Spring 的 Advisor 或拦截器实现。连接点(Joinpoint ):程序执行过程中明确的点,如方法的 调用或特定的异常被抛出。通知(Advice ):在特定的连接点,AOP 框架执行的动作。 各种类型的通知包括“ around ”、“ before ”和“ throws ”通知。 通知类型将在下面讨论。许多 AOP 框架包括 Spring 都是以拦截器做 通知模型,维护一个“围绕”连接点的拦截器链。切入点(Pointcut):指定一个通知将被引发的一系列连接点 的集合。AOP 框架必须允许开发者指定切入点,例如,使用正则表达 式。弓 I 入(Int
4、roduction ):添加方法或字段到被通知的类。Spring 允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入 使任何对象实现 IsModified 接口,来简化缓存。目标对象(Target Object ):包含连接点的对象,也被称作 被通知或被代理对象。 AOP 代理(AOP Proxy ) : AOP 框架创建的对象,包含通知。在 Spring 中,AOP 代理可以是 JDK 动态代理或 CGLIB 代理。编织(Weaving ):组装方面来创建一个被通知对象。这可 以在编译时完成(例如使用 AspectJ 编译器),也可以在运行时完成。 Spring 和其他纯 Java
5、 AOP 框架一样,在运行时完成织入。各种通知类型包括: Around 通知:包围一个连接点的通知,如方法调用。这是最 强大的通知。Aroud 通知在方法调用前后完成自定义的行为,它们负 责选择继续执行连接点或通过返回它们自己的返回值或抛出异常来短 路执行。Before 通知:在一个连接点之前执行的通知,但这个通知不 能阻止连接点前的执行(除非它抛出一个异常)。Throws 通知:在方法抛出异常时执行的通知。 Spring 提供 强制类型的 Throws 通知,因此你可以书写代码捕获感兴趣的异常(和 它的子类) ,不需要从 Throwable 或 Exception 强制类型转换。 After
6、 returni ng通知:在连接点正常完成后执行的通知,例如,一个方法正常返回,没有抛出异常。Around 通知是最通用的通知类型。 大部分基于拦截的 AOP 框架 (如Nanning 和 Jboss 4 )只提供 Around 通知。如同 AspectJ,Spring 提供所有类型的通知,我们推荐你使用最 为合适的通知类型来实现需要的行为。例如,如果只是需要用一个方法的返回值来更新缓存,你最好实现一个after returni ng 通知,而不3;2.是 around 通知,虽然 around 通知也能完成同样的事情。使用最合 适的通知类型使编程模型变得简单,并能减少潜在错误。例如,你不需
7、要调用在 around 通知中所需使用的 Methodinvocation的proceed。方法,因此就调用失败。切入点的概念是 AOP 的关键, 它使 AOP 区别于其他使用拦截的 技术。切入点使通知独立于00 的层次选定目标。例如,提供声明式事务管理的 around 通知可以被应用到跨越多个对象的一组方法上。 因此切入点构成了 AOP 的结构要素。拦截器(也称拦截机)拦截机(Interceptor),是 AOP (Aspect- OrientedProgramming)的另一种叫法。AOP 本身是一门语言,只不过我们使用的是基于 JAVA 的集成到 Spring 中的 SpringAOP。
8、同样,我们 将通过我们的例子来理解陌生的概念。接口类Java 代码幻1. package com.test.TestSpring3. public in terface UserService / 被拦截的接口45.public void prin tUser(Stri ng user);6. 7. 实现类Java 代码幻1. package com.test.TestSpring3;2.2. public class UserServiceImp implements UserService /UserService 接口3. .4.public void prin tUser(Stri n
9、g user) .5.System.out.pri ntln (pri ntUser user: + user);/显示6.7. 9.8.AOP 拦截器实现userJava 代码1. package com.test.TestSpring3;2.2. import ercept.Methodlnterceptor;3. import ercept.MethodInvocation;5.4. public class UserInterceptor implements MethodInterceptor5. / AOP
10、 方法拦截器6. .9.10. public Object inv oke(Method Inv ocati on argO) throws Throwable .11.12.try .13.14.if (argO.getMethod().getName().equals(pri ntUser)15./ 拦截方法是否是 UserService 接口的printUser 方法16.17.Object args = argO.getArguments();被拦截的参数18.System.out.pri ntln (user: + args0);19.argO.getArgume nts()0 =
11、hello!;/修改被拦截的参数3.System.out.pri ntln (arg0.getMethod().getName() + -!);24.return ceed(); 运行 UserService 接口的 printUser 方法25.25. catch (Exceptio n e) .26.throw e;27.28.29. 30. span style=font-size: medium;31. 测试类Java 代码也1. package com.test.TestSpring3;2.3. import org.springframework
12、.beans.factory.BeanFactory;4.5. import org.springframework.beans.factory.xml.XmlBeanFactory;6. import org.springframework.context.ApplicationContext;7. import org.springframework.context.support.ClassPathXmlAppli cati onContext;8. import org.springframework.context.support.FileSystemXmlAppI icationC
13、on text;9. import org.springframework.core.io.ClassPathResource;10. import org.springframework.core.io.Resource;11. import org.springframework.web.context.support.WebApplicatio nContextUtils;12.12. public class TestInterceptor .14.13.public static void main( Stri ng args) .14.Applicati onCon text ct
14、x = new FileSystemXmlApplicati onCo n text(15.classpath:applicatio nCon text.x ml);16. /Applicati on Co ntext ctx = new ClassPathXmlApplicatio nCon text(applicatio nCon text.xml);19.UserService us = (UserService) ctx.getBea n(userService);3.24. spa n style=fo nt-size: medium;25. 配置文件Xml 代码薔
15、1. 2. 3. 4.6.21.us.pri ntUser(shawn);bea n id=userService7. com.test.TestSpri ng3.UserServiceuserI nterceptorv/bea n 7.28.输出:user:shaw nprin tUser-!prin tUser user:hello!结论:调用方法的时候 传入的值被拦截修改了 .拦截器中的事务管理(事务拦截机)如果不采用拦截机的机制时,在使用JDBC 进行数据库访问时,存在两种情况:
16、?自动提交这是 JDBC 驱动默认的模式,每次数据库操作(CRUD)成功完成后,都作为一个单独的事务自动提交,如果未 成功完成,即抛出了SQLException的话,仅最近的一个操作将回滚。?非自动提交这是想更好的控制事务时需要程序地方式进行控制:o在进行该事务单元的任何操作之前setAutoCommit(false)o在成功完成事务单元后commit()o在异常发生后 rollback。自动提交模式是不被推荐的,因为每个操作都将产生一个事务点,这对于大的应用来说性能将受到影响;再有,对于常见的业务逻辑,这 种模式显得无能为力。比如:转帐,从 A 帐户取出 100 元,将其存入 B 帐户;如果
17、在这两个操作之 间发生了错误,那么用户 A 将损失了 100 元,而本来应该给帐户 B 的, 却因为失败给了银行。所以,建议在所有的应用中,如果使用JDBC 都将不得不采用非自动提交模式(你们要能发现了在我们的JDBC 那个例子中,我们采用的就是自动提交模式,我们是为了把精力放在JDBC 上,而不是事务处理上),即我们不得不在每个方法中:Java 代码 幻1.try 2./在获得连接后,立即通过调用setAutoCommit(false)将事务处理置为非自动提交模式 / Prepare Query to fetch the user In formatio n3.pst = conn .pre
18、pareStateme nt(fi ndByName);4./ .conn. commit();5. catch(Excepti on ex) 6.conn .rollback。;7.throw ex;8.fin ally 9.try 10./ Close Result Set and Stateme nt11.if (rset != n ull) rset.close();12.if (pst != n ull) pst.close();13. catch (Excepti on ex) 14.ex.pri ntStackTrace();15.throw new Exceptio n(SQL
19、 Error while closi ng objects = +ex.toStri ng();16. 17. 18. 这样代码在 AOP 的倡导者看来是“肮脏”的代码。他们认为,所有 的与事务有关的方法都应当可以集中配置(见声明性事务控制),并 自动拦截,程序应当关心他们的主要任务,即商业逻辑,而不应和事 务处理的代码搅和在一起。我先看看 Spring 是怎么做到拦截的:1 Spri ng内置支持的事务处理拦截机 这里因为要用到 JpetStore 项目中的代码,我们将applicati on Co ntext.xml全部内容列出:v?xml versio n=1.0 en codi ng=
20、UTF-8?beansxml ns二/schema/bea nsxml ns:xsi二/2001/XMLSchema-in sta neexml ns:aop二/schema/aopxml ns:tx二/schema/txxsi:schemaLocatio n二/schema/beanshttp:/www.springframewor
21、/schema/bea ns/spri ng-bea ns-2.0.xsd/schema/aop/schema/aop/spri ng-aop-2.0. xsd/schema/tx/schema/tx/spri ng-tx-2.0.xsdGENERALDEFINITIONSvproperty n ame二locati on sWEB-INF/mail.pr
22、opertiesWEB-INF/pertiesvproperty n ame二host value=$mail.host/BUSINESSOBJECT DEFINITIONSbea n id二acco un tValidatorclass二org.spri ngframework.samples.jpetstore.domai n.logic.Ac countValidator/vproperty n ame=acco un tDao ref=acco un tDao/vproperty n ame二categoryDao ref=categoryDao/vproperty n
23、 ame二productDao ref=productDao/vproperty n ame二orderDao ref=orderDao/v/bea nASPECTCONFIGURATIONaop:advisor poin tcut二executi on(*.PetStoreFacade.i nsertOrder(*.Order)advice-ref二emailAdvice/tx:method n ame二update*/vproperty n ame二mailSe nder ref=mailSe nder/ v/bea n v/beans这个配置比想象的要简单的多:Xml 代码自1.2.6.
24、. 所有的拦截机配置都放在 配置元素中.2. 下面还是需要理解一下几个有关AOP 的专用名词,不过,是挺抽象的,最好能会意出其的用意?poi ntcut 切入点,比如:updateAccou nt方法需要进行事务管理,则这个切入点就是“执行方法体”(execution)。Spring 所 有支持的切入点类型在都在Spri ng refere nee: .Supported Poin tcut Desig nators中列出了。?advice要对这个切入点进行什么操作,比如事务控制?advisor Spri ng 特有的概念,将上两个概念合到一个概念中来,即一个 ad
25、visor 包含了一个切入点及对这个切入点所实施的操作。因为方法执行切入点 execution为最常见的切入点类型,我们着重介绍一下,executio n的完全形式为:executi on (modifiers-pattern? ret-type-patterndeclari ng-type-patter n? n ame-patter n( param-patter n) throws-patter n?)这是一个正则表达式,其中由?结尾的部分是可选的。翻译过来就 是:执行(方法访问修饰符?方法返回类型 声明类型?方法名(方法参数类 型)抛出异常?)所有的这些都是用来定义执行切入点,即那些方
26、法应该被侯选为切入占:八、?方法访问修饰符即 public, private 等等?方法返回类型即方法返回的类型,如void, Stri ng 等等?声明类型1.5 的语法,现在可以先忽略它?方法名方法的名字?方法参数类型方法的参数类型?抛出异常方法声明的抛出的异常例如,所有 dao 代码被定义在包 com.xyz.dao 及子包com.xy z. dao.hibernate,或者其它,如果还有的话,子包中,里面定义的是提供 DAO 功能的接口或类,那么表达式:executi on(* com.xyz.dao.*(.)表示切入点为:执行定义在包 com.xyz.dao 及其子包(因为.所致)
27、中的任何方法详细情况可以参见 Spring refernce:6234 Examples因此这个表达式为执行定义在类PetStoreFacade及其实现类中的所有方法,采取的动作定义在 txAdvice 中.关于该 advice 的定义,(见声明性事务控制)一节2 Spring自定拦截机 来为了进行事务控制,我们只需简单地配置几下,所有的工作都由Spring 来做。这样固然很好,但有时我们需要有我们特有的控制逻辑。 因为Spring 不可能包含所有人需要的所有拦截机。所以它提供了通 过程序的方式加以定制的方式。我们的项目中就有这么一个拦截机, 在用户确认付款后,将定单信息通过 email 的方
28、式发送给注册用户的 邮箱中。v/aop:c on fig红色的注释已经说的很清楚这个Advisor 了,它的切入点(pointcut)为 PetStoreFacade 的 void insertOrder(Order order) 方法,采取的动作为引用的 emailAdvice,下面我们就来看看 emailAdvice:vproperty n ame二mailSe nder ref=mailSe nder/它给了这个 advice 的实现类为 logic 包中SendOrderConfirmationEmailAdvice,该 Bean 引用了我们前面定义的邮件发送器(一个 Spring 内
29、置的邮件发送器).下面看看这个实现类:public class Sen dOrderCo nfirmatio nEmailAdviceimpleme nts AfterReturni ngAdvice , In itializi ngBea n/ user jes on localhostprivate static final Stri ng DEFAULT_MAIL_FROM = testppru n. org;private static final Stri ng DEFAULT_SUBJECT = Tha nk you for yourorder!;private final Log
30、 logger =LogFactory.getLog(getClass();private MailSe nder mailSe nder;private Stri ng mailFrom = DEFAULT_MAIL_FROM;private Stri ng subject = DEFAULT_SUBJECT;public void setMailSe nder(MailSe nder mailSe nder) this.mailSe nder = mailSe nder;public void setMailFrom(Stri ng mailFrom) this.mailFrom = ma
31、ilFrom;public void setSubject(Stri ng subject) this.subject = subject;public void throws Excepti on if (this.mailSe nder = n ull) throw new IllegalStateException(mailSender isrequired);* param returnValue被拦截的方法的返回值* param m被拦截的方法的所有信息(Method 类封装了这些信息)* param args被拦截的方法的所有参数组成的数组* param target目标对象,对于
32、方法执行来说,即是方法所在的类的实例(与 this 同,批当前对象)* throws java .lan g.Throwable*/public void afterReturni ng (Object returnValue, Method m, Objectargs, Object target) throws Throwable / 我们被拦截的方法为 void insertOrder(Orderorder),方法只有一个参数,所以可知数据的第 1 个元素即是被传进的order对象/得到了 order 对象,就可以将 order 对应的帐户名及帐 单号发送到邮件中,以便确认无误。Orde
33、r order = (Order) args0;Acco unt acco unt = (PetStoreFacade)target).getAccount( order .getUser().getUsername();/ dont do any thi ng if email address is not set if (acco unt.getEmail() = nu II |acco un t.getEmail ().len gth() = 0) return;Stri ngBuffer text = new Stri ngBuffer();text.appe nd(Dear).appe nd(acco un t.getFirst name().appe nd( ).appe nd(acco un t.getLast name();text.appe nd(”,tha nk your for your order fromJPetStore. +Please note that your
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江西九江市第十一中学2025-2026学年下学期初三道德与法治第一次学情自测(含解析)
- 2022年河南工勤职业道德考试一次拿证必刷题库附完整答案
- 2024年大一思政备考必刷历年真题+2024新题带答案
- 2026液碱新员工入职安全培训试题及标准解析答案
- 2023年诸暨书记员考试题库及答案
- 2020三级田径裁判考试大纲对应练习题及参考答案
- 2023营养学会考试往届高分学员同款模拟题及答案
- 黑龙江哈尔滨市第三中学2025-2026学年度下学期高二学年生物限时训练(含解析)
- 租摊位协议书合同模板
- 放射科放射性污染事故处理流程
- 贵州省六盘水市2025-2026学年九年级上学期期末语文试题(含答案)
- 一年级数学5以内加减法计算专项练习题(每日一练共42份)
- 2026年山西云时代技术有限公司校园招聘笔试备考题库及答案解析
- 数字孪生智慧管网监测系统构建课题申报书
- 统编版(新版)道德与法治八年级下册课件13.1全面依法治国的指导思想
- 汽车驾驶员技师论文
- 2025年三季度云南航空产业投资集团招聘(云南云航投现代物流有限公司岗位)考试笔试历年常考点试题专练附带答案详解2套试卷
- 3.长方体和正方体(单元测试)2025-2026学年五年级数学下册人教版(含答案)
- 八大特殊作业安全管理流程图(可编辑)
- 初中劳动教育试题及答案
- 清明文明安全祭扫课件
评论
0/150
提交评论