16-2.Java实现拦截.doc

上传人:cn****1 文档编号:562855509 上传时间:2022-11-25 格式:DOC 页数:5 大小:47.51KB
返回 下载 相关 举报
16-2.Java实现拦截.doc_第1页
第1页 / 共5页
16-2.Java实现拦截.doc_第2页
第2页 / 共5页
16-2.Java实现拦截.doc_第3页
第3页 / 共5页
16-2.Java实现拦截.doc_第4页
第4页 / 共5页
16-2.Java实现拦截.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《16-2.Java实现拦截.doc》由会员分享,可在线阅读,更多相关《16-2.Java实现拦截.doc(5页珍藏版)》请在金锄头文库上搜索。

1、16.Java实现拦截【以下分享全是个人看法,不敢保证准确性和完整性】拦截是干嘛呢?个人理解为在执行某一动作,或是某一系列相同动作前与后进行的数据处理,就像EAF框架中的before 和after 。这就引发了AOP编程的概念。AOP (Aspect Orient Program ) 面向切面编程。AOP从程序运行角度来考虑程序的流程,取得业务逻辑处理过程的切面,在特定切面通过系统自动插入特定方法,AOP面向的是程序运行中的各个步骤,以一种松耦合方式来组合业务处理的各个步骤。在AOP的 方式中,有三个总有概念。1:目标对象 包含被拦截方法的原始对象2:被插入的处理方法 定义在拦截器中 会在拦截

2、方法之前,之后自动执行的方法3:代理对象 已目标对象为蓝本,有系统创建的新对象。简单的来说 用什么在何时候代理什么。下面我们举个例子说明。在数据库访问时,我们都会经历这个流程打开数据库连接 数据操作 (添加,修改,查询,删除)关闭数据库连接现在我们将其公用部分抽取出来,打开数据库和关闭数据库是每次都会执行,并且代码都是相同的。这时我们对数据操作类进行拦截。数据操作前加上打开数据库,在操作后关闭数据库.首先定义一个接口。IDbpackage demo.lqq;public interface Idb public void update();public void insert();public

3、 void delete();public void findOne();public void findRow();public void findAll();public void debug();接口中定义了7个抽象方法,他们都没有具体的实现。再定义一个数据库连接类DbCompackage demo.lqq;public class DbConn public Boolean getConn() System.out.println(连接数据库.);return true;public Boolean close() System.out.println(关闭数据库.);return t

4、rue;数据库连接类中 有两个方法 连接数据库和关闭数据库.第三,拦截器实现类package demo.lqq;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class ProxyHandler implements InvocationHandler /需要被代理的目标对象private Object target;/创建拦截器实例DbConn di = new DbConn();/执行代理的目标方法时,该invoke方法会被自动调用public Object invoke(

5、Object proxy, Method method, Object args)throws Throwable Object result = null;if(method.getName().equals(update)|method.getName().equals(insert)|method.getName().equals(delete)Boolean isConnOK = di.getConn();if(isConnOK)result = method.invoke(target, args);di.close();elseSystem.out.println(数据库连接失败)

6、;else result = method.invoke(target, args);System.out.println(此方法不需要连接数据库);return result;public void setTarget(Object target) this.target = target;第四,定义个代理工厂类MyProxyFactory package demo.lqq;import java.lang.reflect.Proxy;/* * 代理工厂 * author LiQingQing * */public class MyProxyFactory public static Obj

7、ect getPrixy(Object obj) /代理的处理类ProxyHandler handler = new ProxyHandler(); /用谁代理什么handler.setTarget(obj); /第一个参数 是用来创建动态代理的ClassLoader对象/只要该对象能访问Idb接口即可/第二个参数是接口数组,正是代理该接口数组/第三个参数是代理包含的处理实例return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler);最后我们写具体

8、的数据库操作类package demo.lqq;public class Mst3000cDAO implements IdbIdb IDB = null; public Mst3000cDAO() Object proxy = MyProxyFactory.getPrixy(this); if (proxy instanceof Idb) IDB = (Idb)proxy;public void delete() System.out.println(正在执行+this.getClass().getName()+的 delete().); public void findAll() Syst

9、em.out.println(正在执行+this.getClass().getName()+的 findAll().); public void findOne() System.out.println(正在执行+this.getClass().getName()+的 findOne().);public void findRow() System.out.println(正在执行+this.getClass().getName()+的 findRow().);public void insert() System.out.println(正在执行+this.getClass().getNam

10、e()+的 insert().);public void debug() System.out.println(正在执行+this.getClass().getName()+的 debug().);public void update() System.out.println(正在执行+this.getClass().getName()+的 update().); 测试一下 我们写的代码package demo.lqq; public class Test public static void main(String args) Mst3000cDAO mst300cDAO = new Mst

11、3000cDAO();/ 测试代理的方法 mst300cDAO.IDB.insert();mst300cDAO.debug(); 使用对象mst3000cDAO调用IDB在调用方法的话 会在insert、update、delete等方法前加入数据库的连接和在方法后加入关闭数据库的操作。而调用debug方法时就不会打开数据了测试类输出:连接数据库.正在执行demo.lqq.Mst3000cDAO的 insert().关闭数据库.正在执行demo.lqq.Mst3000cDAO的 debug().当然上述代码只是为了说明AOP和拦截之间的功能。代码的有效性和可行性需要商榷。面向切面的最终目的是不让程序中出现重复的代码,将公用的代码统一管理。降低代码的耦合。应用到记录日志、事务处理、权限检查等等还有很多用到才能想到的地方。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号