浅谈spring(五)
软件重构的理念,如果多个类中出现相同的代码,可以考虑定义一个共同的抽象类,将这些相同的代码提取到抽象类中。
但如果是重复的横切代码(比如性能监控,方法开始时,执行一段代码,方法快结束时再执行一段代码)就很难采用上面的方式。
如图:

此时,AOP(aspect oriented programming)应运而生,通过横向抽取机制为这类无法通过纵向继承体系进行抽象的重复性代码提供了解决方案。将分散在各个业务逻辑代码中的相同代码,通过横向切割的方式抽取到一个独立的模块中,从而和业务保持一个较低的耦合性。当然抽取只是从代码简洁性、复用性的角度考虑,最终程序执行还是要按原来的串行顺序,一步一步执行。
AOP的专用术语
1. 连接点:程序执行的某个特定位置,如类初始化前、某个方法调用前
2. 切点:特定的连接点,如果将连接点比作数据库中的记录,那么切点相当于查询条件
3. 增加:织入到目标类连接点的一段代码
4. 引介:一种特殊的增强,要为类增加一些属性和方法
5. 织入:将代码添加到连接点上的过程
编译前织入,要求特殊的java编译器
类装载织入,要求特殊的类装载器
动态代理织入,在运行期间为目标类添加增强生成子类的方式
6. 代理:一个类一旦被增强后,就产生一个子类,融合了原类和增强逻辑的功能
spring AOP使用两种代理机制:一种基于JDK的动态代理;另一种是基于CGLib的动态代理
区别是JDK只提供接口的代理,而不支持类的代理
代码实例:
一、传统实现
业务逻辑类:
//使用CGLib动态代理CglibProxy proxy = new CglibProxy();ForumService forumService = (ForumService)proxy.getProxy(ForumServiceImpl.class);forumService.removeForum(10);forumService.removeTopic(1023);参考例子:http://blog.csdn.net/cb_121/article/details/2653196