论坛首页 Java企业应用论坛

再学Spring Aop 原理

浏览 16522 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-04-17  
再学AOP
概念:
切面(aspect):一个关注点的模块化,这个关注点可能会横切多个对象。

连接点:Joinpoint:在程序执行过程中某个特定的点,一个连接点总是代表一个方法的执行。通过声明使(advice)通知的主体部分获得连接

点的信息。

通知(advice)在某个特定的连接点上执行的动作。许多aop框架包括spring都是以拦截器做通知的模型的,并维护一个以连接点为中心的拦截

器链。

切入点(Pointcut):匹配连接点的断言。
引入(Introduction):声明额外的方法或者麽各类型的字段,spring允许引入新的接口到任何被代理的对象。通过使用一个引入来使bean实

现IsModify接口,以简便缓存机制。

目标对象(Target Object):被一个或者多个切面所通知的对象

Aop代理(AOPProxy):Aop框架创建的对象,用来实现切面契约(aspect contract)包括通知方法执行等功能。spring中是JDK动态代理。或

者是CGLIB代理spring2.0最新引入的基于模式(schema-based)风格和AspectJ注解风格的切面声明,对与使用这些风格的用户来说,代理的创

建使的

织入(Weaving):把切面连接到其他的应用程序类型或者对象上,并创建一个通知的对象,

前置通知:在连接点之前执行的通知,但这个通知不能阻止连接点前的执行

返回后通知:在连接点正常完成后执行的通知

抛出异常后的通知:在方法抛出异常退出时执行的通知。

后通知:当某连接退出的时候执行的通知。

环绕通知:包围一个连接点的通知。

注意:尽量使用最简单的通知类型来实现需要的功能,用合适的通知类型会使编程变得简单,并且能够避免很多潜在的错误。

切入点和连接点匹配的概念是AOP的关键,这使得AOP不同于其他仅仅提

供拦截功能的旧技术。

AOP的功能和目标
上面简单的说了一些Aop的概念,进来有看了一下,感觉应该继续写下去,继续写一下它的功能和目标吧:
Spring AOP用纯Java实现。它不需要专门的编译过程。Spring AOP不需要控制类装载器层次,因此它适用于J2EE web容器或应用服务器,

Spring目前仅支持使用方法调用作为连接点(join point)虽可以加入对成员变量拦截器支持,但Spring并没有实现成员变量拦截器。Spring

并不是要尝试提供最完整的AOP实现(尽管Spring AOP有这个能力), 相反的,它其实侧重于提供一种AOP实现和Spring IoC容器的整合,用于

帮助解决在企业级开发中的常见问题。因此,它通常都和IoC容器一起使用。与其他AOP实现相比这是一个显著的区别。有些事使用Spring AOP

是无法轻松或者高效的完成的,比如说通知一个细粒度的对象。事实证明只要适合AOP来解决的,Spring AOP都没有问题,Spring AOP提供了一

个非常好的解决方案。而且spring从不去竞争哪个框架,而是去包容她,互补她。呵呵是不是一个最完美的情人....不爱她你还爱谁?
下一次我准备再看看AOP的代理机制吧
   发表时间:2008-04-28  
动态代理和cglib只能是通过对象调用方法时能被拦截,方法内部调用就没办法了,远不如aspectj那样的weaven方式,因此spring也只能去集成aspectj来解决
0 请登录后投票
   发表时间:2008-04-29  
的确如此
Spring目前仅支持使用方法调用作为连接点。
虽然可以在不影响到Spring AOP核心API的情况下加入对成员变量拦截器支持,但Spring并没有实现成员变量拦截器。 如果你需要把对成员变量的访问和更新也作为通知的连接点,可以考虑其它语法的Java语言,例如AspectJ。
就像楼上你说的那样。
但是这正是我要说明的啊。spring正是包容其他比较好的东西。这样也体现了开源的强大。人家已经又好用的了,没必要再高一些重复的,大家应该花时间在一些有必要的地方。呵呵
1 请登录后投票
   发表时间:2008-04-29  
敢问一句,AOP与事件机制Event有没有相同的地方,和不同的地方?
0 请登录后投票
   发表时间:2008-04-29  
楼下兄弟不知为何这样问:真不知怎么回答。我认为AOP和事件机制是没办法比较的。就像我问你OO和和多态的区别一样。他们没有可比性的。首先AOP是一种思想,一种模式,而他会用到事件机制来实现一些功能,但不能说用到了他就有他的特点,甚至认为就是它。我相信你说的是AOP中的事件和普通的java Event的区别吧。实际上:
ApplicationContext中的事件处理是通过ApplicationEvent类和ApplicationListener接口来提供的。如果在上下文中部署一个实现了ApplicationListener接口的bean,那么每当一个ApplicationEvent发布到ApplicationContext时,这个bean就得到通知。实质上,这是标准的Observer设计模式。Spring提供了三个标准事件:ContextRefreshedEvent 、ContextClosedEvent、RequestHandledEvent 同样你也是可以自定义事件的仅仅是简单地调用ApplicationContext的publishEvent()方法。
至于java的事件也就是包括事件状态、事件原型、事件源对象和事件订阅对象几个部分组成。Java 要求订阅者提供一个实现了特定事件原型接口的对象。有关事件的更多细节,可以查看 SDK 文档。
不知道有没回答到你。或者使你明白。呵呵
0 请登录后投票
   发表时间:2008-04-29  
补充一句:AOP的代理默认使用的是JDK代理。当然Aop的事件机制里也是和JDK中的事件机制是同样的原理。只不过是通过代理的方式来实现JDK的代理罢了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics