Spring框架之AOP

Spring AOP的应用场景:

AOP为IOC的使用提供了很多便利,一方面应用可以直接使用AOP的功能,设计应用的横切关注点,把跨越应用程序多个模块的功能抽象出来,并通过简单的AOP使用,灵活的编制到模块中,比如可以通过AOP实现应用程序中的日志功能。另一方面在Spring内部,一些支持模块也是通过SpringAOP实现的,比如事务处理。

Spring AOP的核心技术是动态代理:

动态代理模式:

 

                                            静态类图

subject为对象访问接口,RealSubject实际对象和Proxy代理对象都实现了该接口,所以在client访问实际对象的时候会先被代理对象拦截下来,加入额外处理的动作。
 

 

                                         Proxy时序图

Spring以动态代理为基础,设计出了一系列AOP的横切实现,比如前置通知、返回通知、异常通知等

对于使用Spring AOP的应用,ProxyFactoryBean和ProxyFactory都提供了AOP功能封装,只是使用ProxyFactoryBean可以在IOC容器中完成声明式配置,而使用ProxyFactory,则需要编程式使用Spring AOP的功能。

AOP的实现:1、为目标建立代理对象 2、启动代理对象的拦截器来完成各种横切面的织入

JDK1.3以上实现了动态代理的特性,即可以为任意的java对象创建代理对象。但同时也可以通过第三方类生成器CGLIB来实现代理对象的建立,一般而言,默认方式是使用JDK来产生AopProxy代理对象,但如果遇到配置的目标不是接口类的实现,会使用CGLIB来产生AopProxy代理对象。

1、JDK实现代理对象

JDK的动态代理的特性是通过Java Reflection API来实现的,java的reflection包中有Proxy对象,该对象类似于Proxy模式中的Proxy对象。在使用时还需要为代理对象设计一个回调方法,该回调方法的作用是在其中加入作为代理需要的额外处理的动作即preOperation和postOperation方法。

在JDK中需要实现InvocationHandler接口。

/*

*proxy 代理对象实例

*method 被调用的方法

*args 调用方法的参数*/

public interface InvocationHandler {

         public Object invoke(Object proxy,Method method,Object[] args) throws Throwable;

}

在通过Porxy.newInstance方法生成具体的Proxy对象时将InvocationHandler设置到参数里面就可以让invoke方法和Proxy联系起来了。

 2、CGLIB生成代理对象

1、配置Enhancer对象,通过Enhancer对象生成代理对象,

2、设置Enhancer的callback回调,如JDK的Proxy对象的invoke回调方法一样。

建立AopProxy代理对象的过程

1、配置ProxyFactoryBean

     1)定义使用的通知器,

     2)定义ProxyFactoryBean,把它作为一个Bean来定义,它是封装AOP功能的主要类。

    3)定义target属性,目标对象

 2、ProxyFactoryBean生成AopProxy代理对象

     ProxyFactoryBean的AOP实现需要依赖JDK或者CGLIB提供的Proxy特性。

猜你喜欢

转载自cindyliao.iteye.com/blog/2296619