对Spring的AOP体系的一些个人想法

04-11-08 recher
         

(1)首先spring 的aop体系兼容了spring 的javabeans的配置和IOC的配置体系形成了比较风格统一,正因为spring作者Rod Johnson是aopalliance定制人之一,理所当然的spring也支持和遵守aopalliance的规范。从他的内核看来并不复杂就是通过Cglib和JDK动态代理这两种方式实现的,默认是Cglib的方式.

(2)Spring的AOP体系实现的重扩展和开放的角度看是比较完美的,但是我个人觉得(不知道对不对的,大家就看看的心态好了,自己鉴别好了),使用的复杂性和AOP的开关原则又存在一些弊端(哈哈有点自大了,竟然攻击Johnson):AOP是从更广的抽象正交分离关注点,但是使用Spring的AOP体系方式并没有使织入者与被织入者的关系分离(因为你还是必须写一个的类实现MethodInterceptor,把两者的织入关系代码里写)这就必须让使用者的AOP观念很强才能正常使用,初学者很难去理解.

(3)我自己认为,可以简单的使用配置声明织入者,被织入者和织入点(织入方式:befor/after),和织入的方法函数和被织入的方法函数,那么后台就能通过一个工厂直接形成一个Advisor(完全扮演了一个横切观念,包括被织入的代码片断和织入点----代理顾问)再根据其完全可以实现一些AOP的操作,而不需要再手工去处理那么多逻辑。不可否认这样的开关决策必然会降低开放性和用户的参与和改造能力,但是还是有机会可以补偿的:可以开放一个核心的实现例如Cglib2AopProxy.java和JdkDynamicAopProxy给一些有志改造或需要的人员进行继承派生就行了。毕竟AOP的核心观念就是织入者,被织入者,织入点和织入的条件。织入的情况大多就是之前,之后,还有就是一段代码中(同时有之前之后).根本就可以创造一个AOP体系完成织入的用户定义的逻辑。

(4)说了一些个人觉得说缺点的地方,我也觉得有一些偏激了,我是多么的尊敬Rod Johnson的毕竟他是我们这些人的前辈同时很无私的提供很多优秀的观念给我们,是时候也要说一说Spring AOP中很好的地方,第一他把AOP的过程分的更细了(我并没有很详细的看的代码体系,只是从接口的编排和一些比较核心代码理解的),在每一个环节中很好的分离面出来。提供了很多优化服务:例如Cache,区分单实例,和非单实例实现;同时也提出支持配置过滤函数名的织入方法,也提供了不少虚类,给用户去改造(但是框架改造的难度比较大,还不如自己写了)

(5)我自己正着手写包含一个简单AOP体系的开源项目,如果大家有什么不同的看法或觉得我说的不对的地方请指出来,小弟十分的感谢.

         

1
banq
2004-11-09 11:00

recher 至少是有理性精神的人,recher 指出了Spring对AOP实现的一些不足,我觉得以后版本它会开放它的核心的实现例如Cglib2AopProxy.java和JdkDynamicAopProxy,因为这些地方都是有待改进的地方,特别是J2SE 1.5出来后,这些地方可以使用新的特性,能更简捷和高效。

虽然Spring内部实现AOP复杂,但是使用起来还是比较简单,使用者基本无需AOP概念,就可以配置Spring的文件,这点我认为是Spring的极大贡献阿。

recher
2004-11-10 10:49

板桥大哥:您好,我的想法是如果用户使用AOP的框架,连拦截器都不用写,例如我现在想构想一个改良的框架:用户只需要编写两个类:被织入的类,和织入的类,然后通过配置文件的定义,框架会有一个自动拦截器制造工厂,完成织入的动作不需要用户去关心。例如可以采取以下的配置方式:

<AOP>

<TargetClass>Sourcetarget</TargetClass>

<Weavings>

<TargetClassMethod>method1</TargetClassMethod>

<WeavingsClass>

<WeavingClass>Class1</WeavingClass>

<WeavingMethod>

<Method>method1</Method>

<Mode>befor</Mode>

</WeavingMethod>

<WeavingMethod>

<Method>method2</Method>

<Mode>befor</Mode>

</WeavingMethod>

</WeavingsClass>

<WeavingsClass>

<WeavingClass>Class2</WeavingClass>

<WeavingMethod>

<Method>method3</Method>

<Mode>befor</Mode>

</WeavingMethod>

<WeavingMethod>

<Method>method4</Method>

<Mode>afert</Mode>

</WeavingMethod>

</WeavingsClass>

</Weavings>

</AOP>

recher
2004-11-10 10:53

[AOP]

[TargetClass]Sourcetarget[TargetClass]

[Weavings]

[TargetClassMethod]method1[TargetClassMethod]

[WeavingsClass]

[WeavingClass]Class1[WeavingClass]

[WeavingMethod]

[Method]method1[Method]

[Mode]befor[Mode]

[WeavingMethod]

[WeavingMethod]

[Method]method2[Method]

[Mode]befor[Mode]

[WeavingMethod]

[WeavingsClass]

[WeavingsClass]

[WeavingClass]Class2[WeavingClass]

[WeavingMethod]

[Method]method3[Method]

[Mode]befor[Mode]

[WeavingMethod]

[WeavingMethod]

[Method]method4[Method]

[Mode]afert[Mode]

[WeavingMethod]

[WeavingsClass]

[Weavings]

[AOP]

banq
2004-11-10 12:06

哈哈 非常棒,你的这个想法其实已经被EJB的ejb-jar.xml文件实现,看看E下面配置文件一段:

<assembly-descriptor>

<security-role>

<description>the role is super user </description>

<role-name>Admin</role-name>

</security-role>

<security-role>

<description>register user</description>

<role-name>User</role-name>

</security-role>

<method-permission>

<role-name>User</role-name>

<method>

<ejb-name>RoleManager</ejb-name>

<method-name>*</method-name>

</method>

</method-permission>

</assembly-descriptor>

这段配置是告诉EJB容器只有User角色才能访问RoleManager某个方法或所有方法,那么EJB容器是如何实现的?JBoss 4.0这样基于AOP的EJB容器就是使用了拦截器原理来实现。

同样,EJB事务机制也是在JBoss 4.0中使用AOP实现,不必象Spring那样要配置一个事务拦截器。

不知我说明白没有?

4Go 1 2 3 4 下一页