spring aop前传

来源:互联网 发布:mysql 命令 编辑:程序博客网 时间:2024/06/04 18:26

        在计算中,面向切面编程是一种编程范式,旨在通过横切关注点的分离以提高模块化。它在无需修改代码本身的情况下在现有的代码添加额外的行为,而不是通过切入点规范分别制定哪处代码被修改,这样就可以让分散的(多个类型都需要)业务逻辑添加到程序而没有混乱核心功能代码。

        面向对象编程中,它把数据及相关的处理方法放在一个类里面,这样就把不同的数据及数据相关的处理方法进行隔离开(不同的类),通过继承或组合类的数据及处理方法来完成更大的计算,因此在面向对象程序中的基本单元(模块)是类。然而利用面向对象的方法可以很好地组织代码(模块化),也可以通过继承关系和组合实现代码重用,但是程序中总是会出现一些重复的代码,而且是不太方便使用继承和组合的方法把它们重用和管理起来,它们功能重复并且需要用在不同的模块(类)中。软件工程提倡“高内聚低耦合”原则,遵照该原则设计出来的软件模块更容易复用和维护,面向对象软件的基本模块是类,那么一个类如何高内聚低耦合呢?答案是该类的数据及处理方法仅仅是用来进行一个特定计算的,与这个计算不想关的不在这个类里面,这样就把相同功能类型的代码高度集中在一起了(高内聚),低耦合就是完成该功能在类里面都齐全了,不需要依赖其他类。该原则体现在模块(类)的组成上,完成特定数据处理的代码块应该抽象成一个方法。按照“高内聚低耦合”原则,那些重复但分散在不同模块的业务逻辑理应抽象成一个模块。接下来的问题是这部分逻辑原来是分散在各个模块中的,现在抽象成一个模块如何将它添加到原来的位置上。复用类的方法有继承和组合,假设使用继承,那么每个类都需要继承这个类,然后在需要的位置进行调用公共模块的方法,这个是硬编码方式,同时假如在开发过程当中,有新的公共模块了,每个类又需要继承它,然后在需要的地方进行调用。一方面,调用信息过于分散化,几乎很难知道公共模块在什么地方使用,维护(卸载公共模块/添加新公共模块)的时候,另一方面,由于添加新公共模块需要修改类继承体系,也就不利于接口稳定性,会令开发者和维护者混淆;假如使用组合,组合有两种实现方式,一种是将公共模块做成一个实例注入到要使用类中,一种是使用静态成员方法,在需要调用的位置添加公共模块方法调用请求,虽然与继承相比,组合可以让类的接口稳定,但是它们存在共同点,调用请求信息过于分散,硬编码方式调用。于是对于横跨多个类的公共业务逻辑模块调用信息集中化、灵活化(不再硬编码)需求油然而生,aop就是奔着这一目标而不断前行的。

        集中化就是让公共模块调用位置信息集中起来管理维护,灵活化就是在无需修改代码本身的情况下在现有的代码添加公共模块调用。那么集中化与灵活化加起来就是利用公共模块调用位置信息在无需修改代码本身的情况下将公共模块调用添加进去。在java技术中,填充代码技术有动态代理和java字节码操作技术。其中java动态代理是一种完全填充实现,它由三部分构成,要生成动态代理的接口、Proxy和接口缺省实现InvocationHandler,Proxy是接口与接口缺省实现InvocationHandler的桥梁,它将代理对象的所有请求调用都转发到invocationHandler的invoke方法(上面理应为代理接口个成员方法添加对应具体实现)进行处理,假若为一个类生成代理,与使用接口生成代理无异,依然是进入invoke方法处理,相当于都有的方法里面都是invocationHandler.invoke(proxy,method,args[]),所以是完全填充实现。java字节码操作技术(cglib类库为例),众所周知,java的跨平台在于java生成了中间代码——字节码(jvm指令)文件,各平台jvm实现作为中间件进行底层适配。既然jvm最终加载的是字节码文件,那么假如往字节码文件填充一些合法的字节码(jvm验证通过)指令到对应的位置,jvm加载进来的时候就是处理过的实现了。Enhancer是cglib最常用的类,Enhancer可以为非接口类型创建java代理,它为给定类型创建子类拦截所有方法调用。cglib官方教程在点击打开链接。将公共模块调用点信息元数据集中起来,然后在运行时利用java代理或java字节码操作技术将公共模块调用嵌入到其模块上,这样就可以让横跨多个模块的公共模块在无需修改源码的前提上组合起来,同时公共模块调用信息集中化处理,方便维护。

        spring AOP作为spring平台的aop实现,那么它是如何往我们指定的模块填充横跨多模块的调用呢?spring平台核心之一是ioc容器,在ioc容器的眼中,所有对象都可以是一个bean,也就是说在spring应用中由无数个bean构成。那么spring Aop是如何为我们的bean提供aop的支持呢?接下来将会介绍spring IOC与spring AOP如何在底层一起共同撑起整个具有重大影响的spring平台。

0 0
原创粉丝点击