`

AOP几个重要的概念

    博客分类:
  • java
阅读更多

《Spring参考手册》中定义了以下几个AOP的重要概念:

 1.切面(Aspect) :

      官方的抽象定义为“一个关注点的模块化,这个关注点可能会横切多个对象”,在本例中,“切面”就是类TestAspect所关注的具体行为,例如,AServiceImpl.barA()的调用就是切面TestAspect所关注的行为之一。“切面”在ApplicationContext中<aspect>来配置。 连接点(Joinpoint) :程序执行过程中的某一行为,例如,AServiceImpl.barA()的调用或者BServiceImpl.barB(String _msg, int _type)抛出异常等行为。

2.通知(Advice) :

     “切面”对于某个“连接点”所产生的动作,例如,TestAspect中对com.spring.service包下所有类的方法进行日志记录的动作就是一个Advice。其中,一个“切面”可以包含多个“Advice”

3.切入点(Pointcut) :

       匹配连接点的断言,在AOP中通知和一个切入点表达式关联。例如,TestAspect中的所有通知所关注的连接点,都由切入点表达式execution(* com.spring.service.*.*(..))来决定

4.目标对象(Target Object) :

       被一个或者多个切面所通知的对象。例如,AServcieImpl和BServiceImpl,当然在实际运行时,Spring AOP采用代理实现,实际AOP操作的是TargetObject的代理对象。

5.AOP代理(AOP Proxy) 在Spring AOP中有两种代理方式,JDK动态代理和CGLIB代理。默认情况下,TargetObject实现了接口时,则采用JDK动态代理,例如,AServiceImpl;反之,采用CGLIB代理,例如,BServiceImpl。强制使用CGLIB代理需要将 <config> 的 proxy-target-class 属性设为true 通知(Advice)类型

 

6.前置通知(Before advice) :

       在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。ApplicationContext中在<aspect>里面使用<before>元素进行声明。例如,TestAspect中的doBefore方法 后通知(After advice) :当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。ApplicationContext中在<aspect>里面使用<after>元素进行声明。例如,TestAspect中的doAfter方法,所以AOPTest中调用BServiceImpl.barB抛出异常时,doAfter方法仍然执行

7.返回后通知(After return advice) :

      在某连接点正常完成后执行的通知,不包括抛出异常的情况。ApplicationContext中在<aspect>里面使用<after-returning>元素进行声明。

 8.环绕通知(Around advice) :

      包围一个连接点的通知,类似Web中Servlet规范中的Filter的doFilter方法。可以在方法的调用前后完成自定义的行为,也可以选择不执行。ApplicationContext中在<aspect>里面使用<around>元素进行声明。例如,TestAspect中的doAround方法。

9.抛出异常后通知(After throwing advice) :

      在方法抛出异常退出时执行的通知。 ApplicationContext中在<aspect>里面使用<after-throwing>元素进行声明。例如,TestAspect中的doThrowing方法。 切入点表达式 通常情况下,表达式中使用”execution“就可以满足大部分的要求。表达式格式如下: execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?) execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?) modifiers-pattern:方法的操作权限 ret-type-pattern:返回值 declaring-type-pattern:方法所在的包 name-pattern:方法名 parm-pattern:参数名 throws-pattern:异常 其中,除ret-type-pattern和name-pattern之外,其他都是可选的。上例中,execution(* com.spring.service.*.*(..))表示com.spring.service包下,返回值为任意类型;方法名任意;参数不作限制的所有方法。 通知参数 可以通过args来绑定参数,这样就可以在通知(Advice)中访问具体参数了。例如,<aspect>配置如下 Java代码 <config><aspect id="TestAspect" ref="aspectBean"><pointcut id="businessService" expression="execution(* com.spring.service.*.*(String,..)) and args(msg,..)"></pointcut><after pointcut-ref="businessService" method="doAfter"></after></aspect></config><config><aspect id="TestAspect" ref="aspectBean"><pointcut id="businessService" expression="execution(* com.spring.service.*.*(String,..)) and args(msg,..)"></pointcut><after pointcut-ref="businessService" method="doAfter"></after></aspect></config> TestAspect的doAfter方法中就可以访问msg参数,但这样以来AService中的barA()和BServiceImpl中的barB()就不再是连接点,因为execution(* com.spring.service.*.*(String,..))只配置第一个参数为String类型的方法。其中,doAfter方法定义如下: Java代码 public void doAfter(JoinPoint jp,String msg) public void doAfter(JoinPoint jp,String msg) 访问当前的连接点 任何通知(Advice)方法可以将第一个参数定义为 org.aspectj.lang.JoinPoint 类型。JoinPoint 接口提供了一系列有用的方法, 比如 getArgs() (返回方法参数)、getThis() (返回代理对象)、getTarget() (返回目标)、getSignature() (返回正在被通知的方法相关信息)和 toString() (打印出正在被通知的方法的有用信息)

分享到:
评论

相关推荐

    AOP技术的发展及应用

    本人自己的课程作业,主要从AOP的概念、结构、技术优势、应用等几个方面,探讨了AOP技术的研究方向和发展前景。

    浅谈C# AOP的简单实现

    这篇打算写写AOP,说起AOP,其实博主接触这个概念也才几个月,了解后才知道,原来之前自己写的好多代码原理就是基于AOP的,比如MVC的过滤器Filter,它里面的异常捕捉可以通过FilterAttribute,IExceptionFilter去处理...

    C#进阶系列??AOP

    说起AOP,其实博主接触这个概念也才几个月,了解后才知道,原来之前自己写的好多代码原理是基于AOP的,比如MVC的过滤器Filter,它里面的异常捕捉可以通过FilterAttribute,IExceptionFilter去处理,这两个对象的处理...

    SpringAOP使用介绍,从前世到今生

    AOP的实现并不是因为Java提供了什么神奇的钩子,可以把方法的几个生命周期告诉我们,而是我们要实现一个代理,实际运行的实例其实是生成的代理类的实例。作为Java开发者,我们都很熟悉AspectJ这个词,甚至于我们提到...

    SpringFramework常见知识点.md

    Spring常见知识点 - 什么是Spring Framework?... - AOP的组成元素和概念有哪些? - AOP实现方式有哪些? - AspectJ AOP 和 Spring AOP的区别? - cglib动态代理和jdk动态代理的区别? Spring常见知识

    2023java面试题大全及答案大厂面试经典问题

    这份面试题,无论你是刚毕业还是几年的老司机,这些题都是面试必问的经典,简单的可以跳过,涵盖知识点比较全面。 包括基础的JavaSE内容(如类,对象,接口,继承,多态,封装,抽象以及更高级的一些概念,如组合、...

    2021-数据库系统原理试题.docx

    检查点的执行频率如何影响以下几个方面: 1、 没有故障发生时系统的性能。 2、 从系统崩溃中恢复所占用的时间。 3、 从磁盘崩溃中恢复所占用的时间。 八、(10分) 查询优化的方法主要有几类?分别叙述每类方法的...

    Xiuno BBS 高负载安全论坛 v2.1.0 Build20130925.zip

    正式版在以下几个方面做了改进: 一级版块分类 多维主题分类 随着帖子的增多,需要归类,现有的多级版块系统存在的弊端: 1. 入口多让用户不知如何选择。 2. 人气的分散,各个板块间的用户很难互动。 3. 斑竹的...

    java面试题笔试题-spring-interview-guide:关于Spring、SpringBoot和SpringMVC的200+问答

    java面试题笔试题Spring面试指南 - 200+ 问答 Spring 框架是有史以来最流行的 ...你能举几个依赖注入的例子吗? 什么是汽车布线? IOC Container 的重要作用是什么? 什么是 Bean 工厂和应用程序上下文? 你能

    沪江学习安卓端重构实践

    如图所示,这次重构围绕一个老生常谈的概念「解耦」展开,设定几个目标:清晰划分各模块的角色明确架构层级及各个模块所在的层级提高整个架构横向扩展的能力提高编译效率,由于我们项目大量使用Kotlin开发和AOP技术...

    java面试宝典

    244、客服端调用EJB对象的几个基本步骤 56 245、 如何给weblogic指定大小的内存? 56 246、如何设定的weblogic的热启动模式(开发模式)与产品发布模式? 57 247、如何启动时不需输入用户名与密码? 57 248、在...

    千方百计笔试题大全

    244、客服端调用EJB对象的几个基本步骤 56 245、 如何给weblogic指定大小的内存? 56 246、如何设定的weblogic的热启动模式(开发模式)与产品发布模式? 57 247、如何启动时不需输入用户名与密码? 57 248、在weblogic...

    asp.net知识库

    与正则表达式相关的几个小工具 你真的了解.NET中的String吗? .NET中的方法及其调用(一) 如何判断ArrayList,Hashtable,SortedList 这类对象是否相等 帮助解决网页和JS文件中的中文编码问题的小工具 慎用const...

    Java语言基础下载

    DOM以及广义的基于树的处理具有几个优点 399 文档对象模型(DOM)解析实例 402 DOM对象 404 DOM解析的例子: 406 SAX解析实例 409 DOM4J解析实例 412 JDOM解析实例 413 JAVA操纵XML 实例讲解 414 通过JAVA写数据到...

    Java面试宝典2010版

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 17.介绍一下Hibernate的二级缓存 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message 属性, ...

    最新Java面试宝典pdf版

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...

    Java面试笔试资料大全

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...

    JAVA面试宝典2010

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...

Global site tag (gtag.js) - Google Analytics