一.AOP?
AOP:面向切向,采用横向抽取机制,取代传统的纵向继承
AOP是一种面向切面的思想,但是我们平常说的spring使用了AOP,实际上说的是spring实现AOP思想的底层原理,而底层原理就是使用动态代理来增强某个方法。所以平常说AOP技术实际上就是指通过动态代理来对方法进行增强。
举个例子:如果你想加强一个类中写好的方法,一般来说我们用继承来写,但是随着子类过多,那么重写方法就变得麻烦了,
所以现在我们用AOP,将要增强的方法提取到一个类中,然后将需要增强的方法通过代理类将其方法增强
传统的纵向继承
二.动态代理的两个方式
1.JDK动态管理 (接口+实现类) 2.cglib代理(实现类)
下面是每个方式的实例
1.JDK动态管理
2.目标类:
3.切面类
4.代理类
package com.zlj; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * jdk代理类 * @author 邹龄晋 * */ public class JdkProxy implements InvocationHandler{ //目标接口 private UserDao userDao; //创建代理方法 public Object createProxy(UserDao userDao){ this.userDao = userDao; //1.类加载器 ClassLoader classLoader = JdkProxy.class.getClassLoader(); //2.被代理对象实现所有的接口 Class [] clazz = userDao.getClass().getInterfaces(); //3.使用代理类,进行增强,返回的是代理后的对象 return Proxy.newProxyInstance(classLoader, clazz, this); } /** * 所有动态代理类的方法调用都会在invoke方法中进行 * proxy是代理后的对象 * method将要被执行的方法信息(反射) * args执行方法时需要的参数 */ public Object invoke(Object proxy, Method method, Object[] args)throws Throwable { //声明切面 MyAspect myAspect = new MyAspect(); //前增强 myAspect.check_Permissions(); //在目标类上调用方法并且传入参数 Object obj = method.invoke(userDao, args); //后增强 myAspect.log(); return obj; } }
5.测试类