Spring 的AOP底层实现技术:JDK和CGLIB动态代理
Spring 的AOP实现技术之JDK的动态代理技术实例:
接口:IUserService
(Spring的AOP是动态AOP,实现技术:JDK提供的动态代理和cglib代理,
cglib它可以为没有实现接口的类做代理,也可以为接口类做代理.如果有接口,使用JDK动态代理,如果没有,使用cglib动态代理.)
利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理
1 public interface IUserService { 2 public void login(String username,String password); 3 public void regist(); 4 }
实现类
1 public class UserServiceImpl implements IUserService { 2 @Override 3 public void login(String username,String password) { 4 System.out.println("登录......"); 5 } 6 @Override 7 public void regist() { 8 System.out.println("注册......."); 9 } 10 }
代理工厂
1 //使用jdk的proxy完成动态代理工具 2 public class JDKProxyFactory implements InvocationHandler{ 3 //创建目标对象,将传进来的对象赋值给本类对象就代理. 4 private Object target; 5 public JDKProxyFactory(Object target){ 6 this.target=target; 7 }; 8 //通过目标对象创建代理对象 9 public Object createProxy(){ 10 //使用Proxy完成代理对象的创建 11 //得到目标对象的classLoder 12 ClassLoader loader = target.getClass().getClassLoader(); 13 //得到目标对象的interfaces 14 Class<?>[] interfaces = target.getClass().getInterfaces(); 15 //实现InvocationHandler接口,this就是创建代理对象的 16 return Proxy.newProxyInstance(loader, interfaces, this); 17 } 18 @Override 19 public Object invoke(Object proxy, Method method, Object[] args) 20 throws Throwable { 21 //在代理实例上处理方法调用并返回 22 //proxy是代理对象,method是调用的方法的method方法,args是调用的方法的参数 23 System.out.println("日志文件"); 24 //target=UserServiceImpl--目标对象 25 return method.invoke(target, args); 26 }
测试类
1 public class ProxyTest { 2 @Test 3 public void test1(){ 4 //创建目标对象 5 IUserService userService = new UserServiceImpl(); 6 //创建代理对象 7 JDKProxyFactory factory = new JDKProxyFactory(userService); 8 IUserService userServiceProxy = (IUserService) factory.createProxy(); 9 userServiceProxy.login("Tom","123");}}
Spring 的AOP实现技术之CGLIB的动态代理技术实例:
CGLIB包底层是使用一个小而快的字节码处理框架ASM
接口IUserService
public interface IUserService { public void login(String username,String password); public void regist(); }
实现类UserService
public class UserServiceImpl /*implements IUserService*/ { //@Override public void login(String username,String password) { System.out.println("登录......"); } //@Override public void regist() { System.out.println("注册......."); } }
CglibProxyFactory 代理工厂
public class CglibProxyFactory implements MethodInterceptor { //得到目标函数 private Object target; //使用构造方法传递目标对象 public CglibProxyFactory(Object target){ this.target=target; } //创建代理对象 public Object createProxy(){ //1.创建enhancer Enhancer enhancer = new Enhancer(); //2.传递目标对象 enhancer.setSuperclass(target.getClass()); //3.设置回调参数(相当于Invocationhandler) enhancer.setCallback(this); return enhancer.create(); } @Override //增强目标对象 public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { //在代理实例上处理方法调用并返回 System.out.println("执行目标方法前");
Object result =method.invoke(target, args);
System.out.println("执行目标方法后");
return result;
测试类
public class CglibTest { @Test public void test1(){ //创建目标 UserServiceImpl userSerice = new UserServiceImpl(); //创建代理类,传递目标对象 CglibProxyFactory factory= new CglibProxyFactory(userSerice); //生成IUserService的代理类 UserServiceImpl userSericeproxy = (UserServiceImpl) factory.createProxy(); userSericeproxy.login("tom", "123"); }