Spring AOP的作用,动态代理模式

AOP即面向切面编程。AOP是基于代理模式的。

代理模式:

当我们需要修改一个类,在类中加入代码时,为了不破坏这个类的封装性。可以使用代理模式,建立一个代理类。

比如:修改需求,在调用UserController类的saveUser()方法之前要判断用户是否有权限,普通的办法我们可以直接修改类中的saveUser()方法。用代理模式就是,建立一个代理类,在调用saveUser()方法之前再加入鉴权的方法,以后调用时我们调用代理类,而不直接调用UserController类了。

class UserControllerProxy {
    private UserController userController;

    public void saveUser() {
        checkAuth();
        userController.saveUser();
    }
}

不过这只是静态代理,AOP的一个重要应用是Spring AOP,它是基于动态代理的,道理和静态代理差不多。对于实现了接口的,Spring AOP会使用JDK Proxy,去创建代理对象,后面直接调用代理对象,而对于没有实现接口而是继承了类的对象,Spring AOP会使用Cglib,生成一个被代理对象的子类,后面直接调用子类。

Spring AOP的作用,动态代理模式_第1张图片

不过Spring AOP是在程序运行的过程中织入的,是动态织入。还有一种面向切面的是AspectJ,它是基于静态织入的。静态织入是指在编译时期就织入,即编译出来的class文件,字节码就已经被织入了。官方文档的一张图:

Spring AOP的作用,动态代理模式_第2张图片

 

AOP相关概念:

将多个类共有的功能抽象出来,形成一个新的类,这个类就叫做切面,或者切片(Aspect),在我们需要用到这个功能的时候就调用这个切面类中的方法,依靠依赖注入DI将功能注入进去。

例如上面的添加鉴权功能,就可以建立一个鉴权的切面类,在需要用到的地方切进去,这个切入的地方就叫做切入点(Joinpoint)。类似的功能就是拦截器(Intercepter)。拦截这个概念是AOP的一种实现策略,在某个方法被执行时,拦截器可以拦截下来,在方法执行之前执行别的方法,比如鉴权。也可以在方法执行之后再执行别的方法,拦截器就是一个动态拦截Action调用的对象。他提供了中机制是开发者可以在一个Action执行之前或执行之后插入需要的代码。 

 

你可能感兴趣的:(java,web,设计模式)