1、Java的动态代理机制
代理模式是常用的Java设计模式。代理类主要负责为委托类预处理消息、过滤信息、把消息转发给委托类,以及事后处理信息等。
动态代理类不仅简化了编程工作,而且提高了软件系统的扩展性和可维护性。我们可以通过实现java.lang.reflect.InvocationHandler接口提供一个执行处理器,然后通过java.lang.reflect.Proxy得到一个代理对象,通过这个代理对象来执行业务逻辑方法,在业务逻辑方法被调用的同时,自动调用会执行处理器。
注意:被代理对象至少实现一个接口
/**
* 动态代理对象处理类
* @author Administrator
*
*/
public class AOPInterceptor implements InvocationHandler{
/**
* 构造函数
* @param target 被代理对象
* @param beforeAdvisor 对象方法执行前顾问
* @param afterAdvisor 对象方法执行后顾问
*/
public AOPInterceptor(Object target, Advisor beforeAdvisor,
Advisor afterAdvisor) {
super();
setTarge(target);
this.beforeAdvisor = beforeAdvisor;
this.afterAdvisor = afterAdvisor;
}
private Object target;
private Object proxy;
private Advisor beforeAdvisor;
private Advisor afterAdvisor;
public void setTarge(Object obj){
this.target = obj;
//生产代理类
Object proxy = Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
this.proxy = proxy;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if(beforeAdvisor != null)
beforeAdvisor.doAdvisor(proxy, method, args);
//执行被代理对象中的方法
Object result = method.invoke(target, args);
if(afterAdvisor != null)
afterAdvisor.doAdvisor(proxy, method, args);
return result;
}
public Object getTarget() {
return target;
}
public Advisor getBeforeAdvisor() {
return beforeAdvisor;
}
public void setBeforeAdvisor(Advisor beforeAdvisor) {
this.beforeAdvisor = beforeAdvisor;
}
public Advisor getAfterAdvisor() {
return afterAdvisor;
}
public void setAfterAdvisor(Advisor afterAdvisor) {
this.afterAdvisor = afterAdvisor;
}
public Object getProxy() {
return proxy;
}
}
测试类
public class ProxyTest {
@Test
public void testAdd(){
MessageBean bean = new MessageBeanImpl();
Advisor beforeAdvisor = new BeforeAdvisor();
Advisor afterAdvisor = new AfterAdvisor();
//动态代理对象处理类,可以获得bean的代理类
AOPInterceptor aop = new AOPInterceptor(bean, beforeAdvisor, afterAdvisor);
//获得代理类并执行add方法
((MessageBean)aop.getProxy()).add("hahha");
}
}
2、cglib动态代理
cglib:code generation library。是一个强大的,高性能,高质量的Code生成类库,可以将没有实现接口的对象实现动态代理。
我们可以通过实现MethodInterceptor接口提供一个执行处理器,然后通过Enhancer获得动态代理类。
现在我们通过cglib动态代理实现权限控制,
(1)首先编写AuthProxy,实现MethodInterceptor接口
public class AuthProxy implements MethodInterceptor{
public AuthProxy(String name) {
super();
this.name = name;
}
private String name;
@Override
public Object intercept(Object obj, Method method, Object[] arg,
MethodProxy proxy) throws Throwable {
if(!"qiang1".equals(this.name)){
return null;
}
return proxy.invokeSuper(obj, arg);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
(2)获得代理对象
/**
* 根据权限获得InfoManager
* @param auth
* @return
*/
public static InfoManager getAuthInstance(AuthProxy auth) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(InfoManager.class);
enhancer.setCallbacks(new Callback[]{auth,NoOp.INSTANCE});
enhancer.setCallbackFilter(new AuthProxyFilter());
return (InfoManager) enhancer.create();
}
这样就实现了只有用户名为"qiang1"的用户才能执行。