package cn.tedu.test; import org.junit.Test; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface Star{ public void eat(); public void sign(); } class FBB implements Star{ public void eat(){ System.out.println("FBB吃饭.."); } public void sign(){ System.out.println("FBB签名.."); } public void shufa(){ System.out.println("FBB书法.."); } } public class Test01 { /** *代理设计模式--动态代理--cglib动态代理 * 解决功能代码和业务代码混杂的问题 * 能解决代码重复的问题 * cglib动态代码基于继承实现的,即使不属于任何接口的方法也可以实现代理 * 需要导入第三方包才可以使用 * 相对来说性能低一些 */ @Test public void test04(){ //被代理者 FBB fbb=new FBB(); //代理者 //创造增强器 Enhancer enhancer=new Enhancer(); //指定要实现的接口们,非强制 enhancer.setInterfaces(fbb.getClass().getInterfaces()); //指定父类,强制 enhancer.setSuperclass(fbb.getClass()); //指定回调函数 enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy mp) throws Throwable { System.out.println("你谁啊??"); Object retObj=method.invoke(fbb,args); System.out.println("记录一下.."); return retObj; } }); //创建代理者 FBB xp=(FBB)enhancer.create(); //有事找代理者 xp.eat(); xp.sign(); xp.shufa(); } /** * 代理设计模式--动态代理--java动态代理 * 解决功能代码和业务代码混杂的问题 * 能解决代码重复的问题 * java动态代理是基于接口实现的,不属于任何接口的方法无法实现代理 */ @Test public void test03(){ //被代理者 FBB fbb=new FBB(); //代理者 Star zqd=(Star) Proxy.newProxyInstance( //类加载器 fbb.getClass().getClassLoader(), //要实现的接口们 fbb.getClass().getInterfaces(), //处理器 new InvocationHandler() { /** * * @param proxy 代理者 * @param method 当前正在被调用到方法 * @param args 当前正在被调用的方法传入的参数们 * @return 此处返回的返回值会作为正在调用的方法的返回值返回 * @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("你谁啊??"); Object retObj=method.invoke(fbb,args); System.out.println("记录一下.."); return retObj; } }); //有事找代理 zqd.eat(); zqd.sign(); } /** * 代理设计模式--静态代理 * 可以解决功能代码和业务代码混杂的问题 * 不能解决代码重复的问题 */ @Test public void test02(){ FBB fbb=new FBB(); class ZL implements Star{ @Override public void eat() { System.out.println("ZL你谁啊??"); fbb.eat(); System.out.println("ZL记录一下.."); } @Override public void sign() { System.out.println("ZL你谁啊??"); fbb.sign(); System.out.println("ZL记录一下.."); } } ZL zl=new ZL(); zl.eat(); zl.sign(); } /** * 原始方法 */ @Test public void test01(){ FBB fbb=new FBB(); fbb.eat(); fbb.sign(); } }
SpringAOP - 代理设计模式
最新推荐文章于 2023-08-03 17:21:03 发布