首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Spring复习(4)-静态代理和动态代理

2012-10-08 
Spring温习(4)--静态代理和动态代理代理模式分为静态代理和动态代理。静态代理就是我们自己定义的代理类,动

Spring温习(4)--静态代理和动态代理

代理模式分为静态代理和动态代理。静态代理就是我们自己定义的代理类,动态代理是程序在运行时生成的代理类。

静态代理示例

Service.java

package com.javacrazyer.dao;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 动态代理的处理类: 只针对实现了接口的类才能创建出它的代理对象 * @author cheneywu * */public class SecurityHandler implements InvocationHandler {private Object originalObject;// 将欲代理的对象传入,返回一个代理对象public Object newProxy(Object obj) {this.originalObject = obj;// 三个参数,第一个是欲代理对象的类加载器,第二个是得到这个类的接口集合,第三个参数是一个handlerreturn (Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this));}// 对欲代理对象的方法的调用将会调用这个代理对象的invoke方法// 第一个参数是这个代理对象,第二个参数是欲代理对象实现方法,第三个是方法的参数集合public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {checkSecurity();// 若方法名以out开头则调用下面逻辑if (method.getName().startsWith("out")) {System.out.println("This is a method invoking before the method that was intercepted.");// 调用欲代理对象的相应方法method.invoke(originalObject, args);System.out.println("This is a method invoking after the method that was intercepted.");} else {// 若不是需要拦截的方法则正常执行方法method.invoke(originalObject, args);}return null;}public void checkSecurity()       {           System.out.println("--------ServiceManagerImpl.checkSecurity()----------");       } }

?输出结果

--------ServiceManagerImpl.checkSecurity()----------
This is a method invoking before the method that was intercepted.
I am method outPut
This is a method invoking after the method that was intercepted.
--------ServiceManagerImpl.checkSecurity()----------
I am method putOut

跟预期效果一致,

?

使用这种方式维护起来相对比较好,我想进行安全性检查就进行,不想就不进行,很方便。

?

1 楼 grossofans 2010-11-09   初学者,可不可以把 动态代理示例 全部的实现贴出来。

2 楼 liu2511981 2011-05-20   很好。。。。。我也想看到动态代理的全部实现。



怎么调用的,实际中怎么用的?

热点排行