java Aop兑现(JDKProxyFactory和CGLIBProxyFactory)
java Aop实现(JDKProxyFactory和CGLIBProxyFactory)
UserServiceBean.java //interface
/** * */ package cn.aop.service; /** * @author * */ public interface UserServiceBean { public void add(); }
UserSerivce.java //implement UserServiceBean
/** * */ package cn.aop.service; /** * @author * */ public class UserSerivce implements UserServiceBean { private String user; public UserSerivce() { } public UserSerivce(String user) { this.user = user; } public String getUser() { return user; } public void setUser(String user) { this.user = user; } /** * */ @Override public void add() { System.out.println("add"); } }
JDKProxyFactory.java //jdk proxy
/** * */ package cn.aop.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import cn.aop.service.UserSerivce; /** * @author * */ public class JDKProxyFactory implements InvocationHandler { private Object proxyObject; /** * 拦截所有方法 * @param obj * @return */ public Object createProxObject(Object obj){ this.proxyObject=obj; return Proxy.newProxyInstance(proxyObject.getClass().getClassLoader(), proxyObject.getClass().getInterfaces(), this); } /** *根据user为不为空,来invoke特定的方法 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { UserSerivce userSerivce=(UserSerivce)this.proxyObject; Object result=null; if(userSerivce.getUser()!=null){ result=method.invoke(this.proxyObject,args); } return result; } }
CGLIBProxyFactory.java //cglib proxy
/** * */ package cn.cglib; import java.lang.reflect.Method; import cn.aop.service.UserSerivce; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; /** * @author * */ public class CGLIBProxyFactory implements MethodInterceptor { private Object targerObject; /** * 拦截所有方法 * @param obj * @return */ public Object createProxObject(Object targerObject) { this.targerObject = targerObject; Enhancer enhancer=new Enhancer(); enhancer.setSuperclass(this.targerObject.getClass()); enhancer.setCallback(this); return enhancer.create(); } /** *根据user为不为空,来invoke特定的方法 */ @Override public Object intercept(Object targerObject, Method method, Object[] args, MethodProxy arg3) throws Throwable { UserSerivce userSerivce=(UserSerivce)this.targerObject; Object result=null; if(userSerivce.getUser()!=null){ result=method.invoke(this.targerObject,args); } return result; } }
ProxyTest.java //junit test
package junit.test; import org.junit.BeforeClass; import org.junit.Test; import cn.aop.proxy.JDKProxyFactory; import cn.aop.service.UserSerivce; import cn.aop.service.UserServiceBean; import cn.cglib.CGLIBProxyFactory; public class ProxyTest { @BeforeClass public static void setUpBeforeClass() throws Exception { } @Test public void JDKProxyFactoryTest(){ JDKProxyFactory proxy=new JDKProxyFactory(); UserServiceBean userBean=(UserServiceBean)proxy.createProxObject(new UserSerivce("xxx")); userBean.add(); } @Test public void CGLIBProxyFactoryTest(){ CGLIBProxyFactory proxy=new CGLIBProxyFactory(); UserServiceBean userBean=(UserServiceBean)proxy.createProxObject(new UserSerivce(null)); userBean.add(); } }