Spring 动态代理
AOP (Aspect Oriented Programming) 面向切面编程!
代理类:运行时产生,运行结束时销毁!
在不改变原方法代码的基础上对该方法进行增强
动态代理:spring 提供两种方式实现动态代理
1)、JDK动态代理
2)、cglib 动态代理
-
JDK 动态代理
- 创建代理类,实例化该类的对象 使用Proxy类的newProxyInstance()方法
- 被代理类必须实现接口,可以是一个也可以是多个,并且代理类只能增强接口中定义的方法
- 传入代理类需要的参数,参1 被代理类的类加载器,参2 被代理类实现的接口,参3 处理器(写要增强的代码语句或调用需要增强的逻辑方法)
-
案例
-
pom.xml文件中导入spring需要的依赖
-
接口
public interface ILaoZong { void eat(); }
-
被代理类
public class LaoZong implements ILaoZong{ public void eat(){ System.out.println("eat san xia guo"); System.out.println("eat wa wa cai"); } }
-
其他类
public class MiShu { public void laiBeiJiu(){ System.out.println("laiBeiJiu"); } public void laiGenYan(){ System.out.println("laiGenYan"); } }
-
测试
public class TestJdkProxy { public static void main(String[] args) { //Jdk代理 //ILaoZong LaoZong laoZong = new LaoZong(); MiShu miShu = new MiShu(); //1 创建一个代理类,创建该类的对象 ClassLoader classLoader = LaoZong.class.getClassLoader(); Class[] interfaces= new Class[]{ILaoZong.class}; //处理器 InvocationHandler handler = new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //调 laibeijiu() miShu.laiBeiJiu(); //调 eat() //laoZong.eat(); //method 被增加的方法 Object returnValue = method.invoke(laoZong,args); //调 laiGenYan() miShu.laiGenYan(); return returnValue; } }; ILaoZong iLaoZong = (ILaoZong) Proxy.newProxyInstance(classLoader,interfaces,handler); iLaoZong.eat(); } }
-