package cn.itcast.service; public interface PersonService { public void save(String name); public void update(String name, Integer personid); public String getPersonName(Integer personid); }
package cn.itcast.service.impl; import cn.itcast.service.PersonService; public class PersonServiceBean implements PersonService { private String user = null; public String getUser() { return user; } public PersonServiceBean() { } public PersonServiceBean(String user) { this.user = user; } public String getPersonName(Integer personid) { System.out.println("我是getPersonName()方法"); return "xxx"; } public void save(String name) { System.out.println("我是save()方法"); } public void update(String name, Integer personid) { System.out.println("我是update()方法"); } }
package cn.itcast.aop; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import cn.itcast.service.impl.PersonServiceBean; public class JDKProxyFactory implements InvocationHandler { // 目标类 private Object targetObject; public Object createProxyIntance(Object targetObject) { this.targetObject = targetObject; /* * Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) * 第一个参数设置代码使用的类装载器,一般采用跟目标类相同的类装载器 * 第二个参数设置代理类实现的接口 * 第三个参数设置回调对象,当代理对象的方法被调用时,会委派给该参数指定对象的invoke方法 */ return Proxy.newProxyInstance(this.targetObject.getClass() .getClassLoader(), this.targetObject.getClass().getInterfaces(), this); } // 该方法自动调用 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 环绕通知 PersonServiceBean bean = (PersonServiceBean) this.targetObject; Object result = null; if (bean.getUser() != null) { // ..... advice()-->前置通知 try { result = method.invoke(targetObject, args); // 把方法调用委派给目标对象 // afteradvice() -->后置通知 } catch (RuntimeException e) { // exceptionadvice()--> 例外通知 } finally { // finallyadvice(); -->最终通知 } } return result; } }
package cn.itcast.aop; import java.lang.reflect.Method; import cn.itcast.service.impl.PersonServiceBean; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class CGlibProxyFactory implements MethodInterceptor { private Object targetObject; public Object createProxyIntance(Object targetObject) { this.targetObject = targetObject; Enhancer enhancer = new Enhancer(); // 该类用于生成代理对象 enhancer.setSuperclass(this.targetObject.getClass()); // 设置父类,非final enhancer.setCallback(this); // 设置回调用对象为本身 return enhancer.create(); } // 该方法自动调用 public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { PersonServiceBean bean = (PersonServiceBean) this.targetObject; Object result = null; if (bean.getUser() != null) { result = methodProxy.invoke(targetObject, args); } return result; } }
package junit.test; import org.junit.Test; import cn.itcast.aop.CGlibProxyFactory; import cn.itcast.aop.JDKProxyFactory; import cn.itcast.service.PersonService; import cn.itcast.service.impl.PersonServiceBean; public class AOPTest { @Test public void jdkProxyTest() { JDKProxyFactory factory = new JDKProxyFactory(); PersonService service = (PersonService) factory .createProxyIntance(new PersonServiceBean("xxx")); service.save("jdkProxyTest"); } @Test public void cglibProxyTest() { CGlibProxyFactory factory = new CGlibProxyFactory(); PersonServiceBean service = (PersonServiceBean) factory .createProxyIntance(new PersonServiceBean("xxx")); service.save("cglibProxyTest"); } }