说真的,对于spring提供AOP的功能,个人实在不敢太过于恭维。主要是Spring的AOP功能没那么强大,而且必须是对于spring容器管理的bean才能实施AOP功能,对于容器外的bean就无能为力了。而且spring没有提供属性的AOP功能。在这些方面,spring AOP真的不能和Aspectj相比。Aspectj的AOP功能才真的是真正意义的AOP框架,提供的功能非常强大,几乎可以实现任何类型的AOP。不过Aspectj的学习曲线相对要比spring AOP稍微陡峭一点,主要是spring AOP可以当成普通javabean来处理,而Aspectj还要另外做编译器,比较麻烦。不过,庆幸的是,eclipse下面有Aspectj插件,开发起来也是很方便。所以一般,复杂的AOP功能,还是推荐用Aspectj
对于一般的J2EE开发来说,要实现一些比较常用的AOP,Spring 还是能满足的。比如事务、异常、日志、权限等等,在这些方面,spring AOP还是比较方便的,特别是事务处理,spring提供了相当好的集成。如果事务处理用Aspectj来实现,不见得好多少。
一直以来,觉得spring AOP最好用的一个地方就是提供了BeanNameAutoProxyCreator,这个类真的非常方便,以至于个人一旦遇到要实现AOP,首先就是求组于BeanNameAutoProxyCreator,如果BeanNameAutoProxyCreator实现不了,再考虑别的。不过,一般情况来说,BeanNameAutoProxyCreator的确能满足需要了,除非你的需求真的千奇百怪。
在应用spring AOP功能时,优先考虑用接口。因为如果用接口的话,那么spring会创建一个代理,并在代理里面实现AOP增强代码,并调用真正的实例对象。不过,spring AOP功能不一定非要用接口,一些普通类也是可以的。对于普通类,spring会用CGLIB来动态生成一个新类。并且CGLIB会保持一个生成类的cache,因此它不会一直生成新类。spring使用ProxyCallbackFilter对象把其它对象放进map进行管理。如果没有管理好cache,将会产生大量的java对象,直至出现OutOfMemoryErrors。因此使用spring的aop时,一定要正确实现equals and hashCode。
不过,不管怎么样,在应用spring AOP时,还是优先考虑接口方式,毕竟面向接口方式还是值得推荐的一个编程思想。
posted on 2006-07-31 19:37
jspark 阅读(4098)
评论(11) 编辑 收藏