https://blog.csdn.net/hi_kevin/article/details/7325554
https://www.cnblogs.com/zedosu/p/6632260.html
Spring中的AOP之代理模式
springAOP指的是在spring中的AOP,什么是AOP,相对于java中的面向对象(oop),在面向对象中一些公共的行为,像日志记录,权限验证等如果都使用面向对象来做,会在每个业务方法中都写上重复的代码,造成代码的冗余。
而AOP指的是面向切面编程,定义一个切面,用切面去切相应的方法,就可以织入相关的逻辑。
面向切面编程使用代理模式
一、代理模式
代理模式作为23种经典设计模式之一,其比较官方的定义为“为其他对象提供一种代理以控制对这个对象的访问”,简单点说就是,之前A类自己做一件事,在使用代理之后,A类不直接去做,而是由A类的代理类B来去做。代理类其实是在之前类的基础上做了一层封装。java中有静态代理、JDK动态代理、CGLib动态代理的方式。静态代理指的是代理类是在编译期就存在的,相反动态代理则是在程序运行期动态生成的,
二、静态代理
静态代理,简单点来说就是在程序运行之前,代理类和被代理类的关系已经确定。静态代理的实现方式一般有以下几个步骤,首先要定义一个公共的接口,供代理类和被代理类实现,如下
public interface AnimalService { void eat(); void talk(); } public class DogServiceImlp implements AnimalService{ @Override public void eat() { System.out.println("我爱吃骨头"); } @Override public void talk() { System.out.println("汪----汪----汪-----"); } } public class CatServiceImpl implements AnimalService{ @Override public void eat() { System.out.println("我爱吃鱼"); } @Override public void talk() { System.out.println("喵---喵---喵---"); } }
编写代理
public class CatProxy implements AnimalService { private CatServiceImpl cat = new CatServiceImpl(); @Override public void eat() { System.out.println("代理操作,开启事务"); cat.eat(); System.out.println("代理操作,关闭事务"); } @Override public void talk() { System.out.println("代理操作,开启事务"); cat.talk(); System.out.println("代理操作,关闭事务"); } }
使用代理和不使用代理的调用方式
@Test public void ttt() { CatServiceImpl cat = new CatServiceImpl(); cat.eat(); System.out.println("-------------------"); cat.talk(); AnimalService cat2 = new CatProxy(); cat2.eat(); System.out.println("-------------------"); cat2.talk(); }
对比,使用静态代理和不使用静态代理,可以发现使用了代理之后,可以在被代理方法的执行前或后加入别的代码,实现诸如权限及日志的操作。
但,静态代理也存在一定的问题,如果被代理方法很多,就要为每个方法进行代理,增加了代码维护的成本。有没有其他的方式可以减少代码的维护,那就是动态代理。
三、JDK动态代理
JDK提供了动态代理的方式,可以生成代理类,被代理类和接口沿用静态代理中的接口类和接口实现类,接口实现类为被代理类,下面看代理类,