用动态代理实现权限管理-just a demo

jive中代理漫天飞,其中代理有两个用处,1 访问控制;2对象缓存。这两个归究还是一个问题。所以只提访问控制。

jive 做的代理思路如下:
先定义一个接口,共代理和被代理的类继承
public interface Forum {

public List getThreads();;
public String getName();;
}


有一个具体实现类(被代理类):

public class DbForum implements Forum {

private Log logger = LogFactory.getLog(this.getClass(););;

public List getThreads(); {
logger.info("正在取出论坛的帖子");;
return Arrays.asList(new String[] { "topic1", "topic1", "topic1" });;

}

public String getName(); {
logger.info("正在取出论坛的名称");;
String name = "论坛名";
return name;
}

}

第三:代理类,用于控制被访问对象DbForum
/*
* 在DbForum的方法执行前,做一些比如权限检查的操作
*/public class ForumProxy implements Forum {

private Log logger = LogFactory.getLog(this.getClass(););;

private Forum forumImpl;

private Auth auth;

public ForumProxy(Forum forumImpl, Auth auth); {
this.forumImpl = forumImpl;
this.auth = auth;
}

public List getThreads(); throws UnAuthorizedException {
if (auth.isAuthorized();); {
logger.debug("权限检测通过!");;
return forumImpl.getThreads();;
}
logger.warn("权限检测没有通过,抛出异常");;
throw new UnAuthorizedException();;
}
public String getName();{return forumImpl.getName();;}


}


使用时就是这样了:
              Forum f=new DbForum();;
Auth auth=new Auth(true);;
ForumProxy fproxy=new ForumProxy(f,auth);;
try {
System.out.print(fproxy.getThreads(););;
} catch (UnAuthorizedException e); {
// 无权限
e.printStackTrace();;
}

#########################################
大家会看到,这样用代理,有好处也有坏处。
坏: 使代码量翻倍,增大了开发难度
好:使业务对象更加专注于业务逻辑,将烦琐而又必须的操作(权限检查,日志打印)转给代理类来完成。
而本文着重介绍的技术叫:动态代理,在JDK1.3后引入java,先看看动态代理是如何做上述权限控制的。
先看动态代理的Client代码:

		/*
* 动态代理,将切面和被代理的业务对象完全分开
*/
// 业务对象,关注于业务细节
Object protectedObject = new DbForum();;

Auth auth=new Auth(true);;

// 切面对象,拦截业务对象方法的执行,并在被保护对象执行前后做自己的处理
InvocationHandler guarder = new Guarder(protectedObject,auth);;

/*
* 构造出的代理对象,将前两者巧妙地结合起来,你 只需去调用该对象的方法,
而实际上是调用了 切面对象的相应的方法。
*/
Forum proxy = (Forum); Proxy.newProxyInstance(protectedObject.getClass();.getClassLoader();, protectedObject.getClass();.getInterfaces();, guarder);;


List threads = proxy.getThreads();;

proxy.getName();;

看见没有,所有的烦琐的权限控制都在InvocationHandler guarder 里面呢。这个接口你得自己实现了。这个接口只有一个方法:
	    public Object invoke(Object proxy, Method method, Object[] args);
throws Throwable;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值