SSH与SSM学习之Spring13——动态代理之通知的使用
来源:互联网 发布:天龙八部染发好看数据 编辑:程序博客网 时间:2024/05/29 13:44
- SSH与SSM学习之Spring13动态代理之通知的使用
- 一说明
- 二实现
- 三测试
SSH与SSM学习之Spring13——动态代理之通知的使用
一、说明
前面的动态代理实现中,我们实现了方法调用前后打印数据的需求。但是我们的打印是死的,如果我换成不是打印了是其他处理就不行了。如下图
如果在上图中的 log()是一个对象,处理的时候调用对象的方法,那么问题不就解决了吗。
二、实现
上面所说的操作方式。实现步骤如下:
- 创建一个抽象类 Advice,这个抽象类中定义一些方法,比如调用前,调用后等。如下
package com.qwm.spring2.c_proxy;import java.lang.reflect.Method;/** * @author:qiwenming * @date:2017/10/24 0024 22:20 * @description: * 通知抽象类 */public abstract class Advice { /** * 方法调用之前(前置通知) */ public void before(){} /** * 方法调用之后(后置通知) * 异常了不会调用 */ void afterReturning(){} /** * 可以自己调用方法(环绕通知) */ void around(Object proxy, Method method, Object[] args){} /** * 异常时候调用(异常通知) */ void afterException(){} /** * 方法调用之后(后置通知) * 异常了也会调用 */ void after(){}}
- 创建一个生成代理类的方法,这个方法中需要传递目标对象和上面的通知(Advice)的实现类。
在代理前后调用 通知的相应方法。如下
package com.qwm.spring2.c_proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * @author:qiwenming * @date:2017/10/24 0024 22:28 * @description: * 获取代理 */public class ProxyFactory { public static Object getProxyObject(Object target,Advice advice){ if(target==null){ throw new IllegalArgumentException("target can not null"); } return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object obj = null; if(advice==null){//如果没有通知,那么直接调用 obj = method.invoke(target,args); }else{ advice.before(); try { advice.around(target, method, args); obj = method.invoke(target, args); advice.afterReturning(); advice.after(); }catch (Exception e){// e.printStackTrace(); advice.after(); advice.afterException(); } } return obj; } }); }}
三、测试
上面我们实现了,通过传入来处理通知。现在来测试一把
测试代码一
@Test public void test2(){ IUser iu = (IUser)ProxyFactory.getProxyObject(new IUser() { @Override public void saveUser() { } @Override public void delete() { System.out.println("删除用户"); } }, new Advice() { @Override public void before() { System.out.println("------before----"); } @Override void after() { System.out.println("-----after-----"); } }); iu.delete(); }
结果
------before----删除用户-----after-----
更多的处理,请看源码
https://github.com/wimingxxx/spring01/tree/master/src/com/qwm/spring2/c_proxy
阅读全文
0 0
- SSH与SSM学习之Spring13——动态代理之通知的使用
- SSH与SSM学习之Spring14——动态代理之自己的AOP框架
- SSH与SSM学习之Spring12——动态代理之实现
- SSH与SSM学习之Spring15——cglib代理
- SSH与SSM学习之Spring16——Spring中AOP之使用配置文件配置
- SSH与SSM学习之Spring17——Spring中AOP之使用注解配置
- SSH与SSM学习之SSH整合09——Spring的aop事务
- SSH与SSM学习之hibernate04——Configuration
- SSH与SSM学习之hibernate05——SessionFactory
- SSH与SSM学习之hibernate06——Session
- SSH与SSM学习之hibernate07——Transaction
- SSH与SSM学习之hibernate13——HQL查询
- SSH与SSM学习之hibernate14——Criteria查询
- SSH与SSM学习之hibernate21——离线查询
- SSH与SSM学习之hibernate25——批量抓取
- SSH与SSM学习之Struts206——参数获取
- SSH与SSM学习之Struts211——拦截器
- SSH与SSM学习之Struts212——标签
- Docker环境安装以及基本使用
- SQL中内连接和外连接
- 利用ffmpeg将RTSP传输的h264原始码流保存到文件中
- python中的列表推导与生成器
- Java String 处理
- SSH与SSM学习之Spring13——动态代理之通知的使用
- 仿美团下拉刷新控件(一)
- NorFlash与NandFlash对比
- centOS7下编译安装nginx-1.12.2+php-7.1.9
- Javascript中call和apply的区别与详解
- Ajax基础
- 线程和进程的区别和联系
- SSH与SSM学习之Spring14——动态代理之自己的AOP框架
- 这是我的第一个程序