AOP学习笔记(一)—— 代理
来源:互联网 发布:机器视觉主流算法 编辑:程序博客网 时间:2024/06/08 20:17
1、什么是代理
代理,或称为Proxy。意思就是你不用去做,别人代替你去处理。
2、静态代理
以一个Hello World为例,代理类代替实现类执行say()。
接口:
public interface Hello{ public void say();}
实现类:
public class HelloImpl implements Hello{ @Override public void say(){ System.out.println("Hello World"); }}
代理类:
public class HelloProxy implements Hello(){ private Hello hello; public HelloProxy(){ hello = new HelloImpl(); } @Override public void say(){ before(); hello.say(); after(); } private void before(){ System.out.println("Before"); } private void after(){ System.out.println("After"); }}
测试类:
public class Test(){ public static void mian(String[] args){ HelloProxy helloProxy = new HelloProxy(); helloProxy.say(); }}
3、JDK动态代理
JDK提供了动态代理技术,静态代理中的代理类需要实现被代理类的接口,这样在开发中必然会有大量的代理类,动态代理可以解决这个问题。
接口类、实现类同上。
代理类;
public class DynamicProxy implements InvocationHandler(){ private Object target; //被代理的类 public DynamicProxy(Object target){ this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] params){ before(); Object result = method.invoke(target, params); after(); return result; } private void before(){ System.out.println("Before"); } private void after(){ System.out.println("After"); } @SupperssWarnings("unchecked") public <T> T getProxy(){ return (T) Proxy.newProxyInstance{//代理对象 target.getClass().getClassLoader(); //参数1:ClassLoader target.getClass().getInterfaces(); //参数2:该实现类的所有接口 this; //参数3:动态代理对象 }; }}
测试类:
public class Test(){ public static void main(String[] args){ DynamicProxy dynamicProxy = new DynamicProxy(new HelloImpl()); //动态代理对象 Hello helloProxy = dynamicProxy.getProxy(); helloProxy.say(); }}
4、CGLIB动态代理
JDK动态代理有限制,即被代理的对象必须实现某个接口,否则无法使用JDK自带的动态代理,因此只能使用一种功能更加强大的动态代理技术-CGLIB。
接口类、实现类同上
代理处理类:
public class CglibProxy implements MethodInterceptor { private static CglibProxy instance = new CglibProxy(); private CglibProxy(){}; public static CglibProxy getInstance(){ return instance; } @Override public Object intercept(Object obj, Method method, Object[] params, MethodProxy proxy) throws Throwable { before(); Object result = proxy.invokeSuper(obj, params); after(); return result; } @SuppressWarnings("unchecked") public <T> T getProxy(Class<T> cls){ return (T) Enhancer.create(cls, this); } public void before(){ System.out.println("Before"); } public void after(){ System.out.println("After"); }}
测试类:
public class Test { public static void main(String[] args) { Hello helloProxy = CglibProxy.getInstance().getProxy(HelloImpl.class); helloProxy.say(); }}
阅读全文
0 0
- AOP学习笔记(一)—— 代理
- 学习笔记09—代理和AOP
- aop原理学习——动态代理
- Spring学习(1)AOP初步—JDK动态代理
- AOP学习笔记(二)——Spring AOP
- 【AOP系列】(一)—静态代理VS动态代理(Java)
- Spring学习笔记之aop动态代理(3)
- AOP学习一:JDK动态代理
- Spring4.0学习笔记007——AOP基础:动态代理、概念解析
- Spring学习笔记:使用代理实现AOP
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
- spring框架学习(八)—静态代理、JDK与CGLIB动态代理、AOP+IoC
- 学习笔记——AOP
- Spring AOP框架学习笔记(1):AOP代理对象的建立
- web学习笔记19-静态代理,动态代理,spring AOP
- AOP之代理模式(一)
- Spring:AOP(一)生成代理对象
- Android中怎样防止内存泄漏?
- 收集各种API文档,提供下载.chm文件,HTML、java、w3school、servlet、js、spring、等等。
- 远程检测客户机上的共享设置情况
- 日志的生成
- 谈谈对「工控安全」和「产品经理」的理解
- AOP学习笔记(一)—— 代理
- 线程间通信的方式
- H5游戏研发发展
- JAVA的23种设计模式---代理模式(二)
- 时间类
- 栈(顺序)
- 回溯算法
- xgboost模型部署及注意相关事宜。
- 经纬度计算Sql语句