jive中代理漫天飞,其中代理有两个用处,1 访问控制;2对象缓存。这两个归究还是一个问题。所以只提访问控制。
jive 做的代理思路如下:
先定义一个接口,共代理和被代理的类继承
有一个具体实现类(被代理类):
第三:代理类,用于控制被访问对象DbForum
使用时就是这样了:
#########################################
大家会看到,这样用代理,有好处也有坏处。
坏: 使代码量翻倍,增大了开发难度
好:使业务对象更加专注于业务逻辑,将烦琐而又必须的操作(权限检查,日志打印)转给代理类来完成。
而本文着重介绍的技术叫:动态代理,在JDK1.3后引入java,先看看动态代理是如何做上述权限控制的。
先看动态代理的Client代码:
看见没有,所有的烦琐的权限控制都在InvocationHandler guarder 里面呢。这个接口你得自己实现了。这个接口只有一个方法:
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;