2008-04-17
再学Spring Aop 原理
关键字: spring
再学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的代理机制吧
概念:
切面(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的代理机制吧
评论
handsome224521
2008-04-29
补充一句:AOP的代理默认使用的是JDK代理。当然Aop的事件机制里也是和JDK中的事件机制是同样的原理。只不过是通过代理的方式来实现JDK的代理罢了。
handsome224521
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 文档。
不知道有没回答到你。或者使你明白。呵呵
ApplicationContext中的事件处理是通过ApplicationEvent类和ApplicationListener接口来提供的。如果在上下文中部署一个实现了ApplicationListener接口的bean,那么每当一个ApplicationEvent发布到ApplicationContext时,这个bean就得到通知。实质上,这是标准的Observer设计模式。Spring提供了三个标准事件:ContextRefreshedEvent 、ContextClosedEvent、RequestHandledEvent 同样你也是可以自定义事件的仅仅是简单地调用ApplicationContext的publishEvent()方法。
至于java的事件也就是包括事件状态、事件原型、事件源对象和事件订阅对象几个部分组成。Java 要求订阅者提供一个实现了特定事件原型接口的对象。有关事件的更多细节,可以查看 SDK 文档。
不知道有没回答到你。或者使你明白。呵呵
KKFC
2008-04-29
敢问一句,AOP与事件机制Event有没有相同的地方,和不同的地方?
handsome224521
2008-04-29
的确如此
Spring目前仅支持使用方法调用作为连接点。
虽然可以在不影响到Spring AOP核心API的情况下加入对成员变量拦截器支持,但Spring并没有实现成员变量拦截器。 如果你需要把对成员变量的访问和更新也作为通知的连接点,可以考虑其它语法的Java语言,例如AspectJ。
就像楼上你说的那样。
但是这正是我要说明的啊。spring正是包容其他比较好的东西。这样也体现了开源的强大。人家已经又好用的了,没必要再高一些重复的,大家应该花时间在一些有必要的地方。呵呵
Spring目前仅支持使用方法调用作为连接点。
虽然可以在不影响到Spring AOP核心API的情况下加入对成员变量拦截器支持,但Spring并没有实现成员变量拦截器。 如果你需要把对成员变量的访问和更新也作为通知的连接点,可以考虑其它语法的Java语言,例如AspectJ。
就像楼上你说的那样。
但是这正是我要说明的啊。spring正是包容其他比较好的东西。这样也体现了开源的强大。人家已经又好用的了,没必要再高一些重复的,大家应该花时间在一些有必要的地方。呵呵
likeblood
2008-04-28
动态代理和cglib只能是通过对象调用方法时能被拦截,方法内部调用就没办法了,远不如aspectj那样的weaven方式,因此spring也只能去集成aspectj来解决
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 1646 次
- 性别:

- 来自: 合肥

- 详细资料
搜索本博客
最近加入圈子
链接
最新评论
-
教你写正则(二)
学习了··
-- by Emy -
教你写正则(二)
不好意思,平翘舌不分。谢谢了提醒。已经改了!!呵呵
-- by handsome224521 -
教你写正则(二)
第一,应该放到综合技术。第二,是正则不是正者。写东西连标题都写错了。
-- by 魔力猫咪 -
WebSphere Integration De ...
????? 不会呀
-- by xiaoqiangcn -
再学Spring Aop 原理
补充一句:AOP的代理默认使用的是JDK代理。当然Aop的事件机制里也是和JDK ...
-- by handsome224521






评论排行榜