详解spring AOP

来源:互联网 发布:淘宝上的组装机能买吗 编辑:程序博客网 时间:2024/06/16 20:16

1.什么是AOP

AOP是对OOP的补充,在OOP的思想是定义一个父类来存放一些公共的逻辑,然而要是某些与业务无关又在多个类中都必须要有的时候,就会导致这些非业务代码包裹着业务逻辑代码,这样就重复了很多相同的代码并且使业务逻辑不清晰,比如:性能检测,访问控制,事务管理及日志记录等,而AOP能把这些逻辑以一个切面的形式插入到目标类中


2.AOP的实现者

2.1.AspectJ:编译期提供横切代码的织入,需要专门的编译期

2.2.AspectWerkz:运行期或类装载期织入横切代码,需要特殊的类装载器

2.3.JBoss Aop

2.4.Spring Aop:运行期通过代理方式向目标类织入增强代码


3.Spring Aop:JDK动态代理(必须提供接口)和CGLIB动态代理(可以普通代理类)

3.1.JDK动态代理:主要涉及java.lang.reflect包中的Proxy和InvocationHandler,其中InvocationHandler是一个接口,可以通过该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态的将横切逻辑和业务代码编织在一起。而Proxy利用InvocationHandler动态创建一个符合某一个接口的实例,生成目标类的代理对象

3.2.CGLIB动态代理:对于没有定义接口的业务方法类就无法使用jdk的动态代理了,从Proxy.newProxyInstance(ClassLoader loader,Class[] interface,InvocationHandler h)可以看出,jdk代理必须要有接口,CGLIB采用字节码技术,可以为一个类创建子类

3.3.如果只用到以上两种代理方式,则会出现以下问题:

3.3.1.对目标类的所有方法添加横切逻辑

3.3.2.通过硬编码的方式添加横切织入点

3.3.3手工编写代理实例的创建过程,在为不同的类创建代理时,需要分别编写相应的创建代码,无法通用

3.3.4.spring AOP的做法是通过Advisor来解决这个问题

3.4.创建增强类

增强类型有以下五类:前置增强,后置增强,环绕增强,异常抛出增强,引介增强,这五种方式可以都可以通过spring配置来完成


小结:AOP是OOP的延伸,它为程序开发提供了一个崭新的思考角度,可以将重复性的横切逻辑抽取到统一的模块中,通过OOP的纵向抽象和AOP的横向抽取,程序才可以真正解决重复性代码问题。

Spring采用JDK动态代理和CGLIB动态代理技术在运行期织入增强,所以不需要装备特殊的编译器或类装载器就可以使用AOP的功能。要使用JDK动态代理,目标类必须实现接口,而CGLIB不对目标类作任何限制,它通过生成目标类子类的方式提供代理。JDK在创建代理对象时的性能高于CGLIB,而生成的代理对象的运行性能却比CGLIB的低,如果是singleton的代理,则推荐使用CGLIB代理

Spring只能在方法级别织入增强,增强既包括横切代码又包括切点逻辑