package com.ssm.chapter11.game; public interface Interceptor { public void before(Object obj); public void after(Object obj); public void afterReturning(Object obj); public void afterThrowing(Object obj); }
这里是一个拦截接口,能够对它建立实现类。若是使用过Spring AOP,你就会发现笔者的定义和Spring AOP定义的消息是如此相近。
package com.ssm.chapter11.game; public class ProxyBeanFactory { public static <T> T getBean(T obj, Interceptor interceptor) { return (T) ProxyBeanUtil.getBean(obj, interceptor); } }
具体类ProxyBeanUtil的getBean方法的逻辑不须要去理会,由于这是笔者须要去完成的内容。可是做为读者,你要知道当使用了这个方法后,存在以下约定java
当一个对象经过ProxyBeanFactory的getBean方法定义后,拥有这样的约定。
package com.ssm.chapter11.game.service; import com.ssm.chapter11.game.pojo.Role; public interface RoleService { public void printRole(Role role); }
代码清单:RoleServiceImpl
package com.ssm.chapter11.game.service.impl; import com.ssm.chapter11.game.pojo.Role; import com.ssm.chapter11.game.service.RoleService; public class RoleServiceImpl implements RoleService { // @Override public void printRole(Role role) { System.out.println("{id =" + role.getId() + ", roleName=" + role.getRoleName() + ", note=" + role.getNote() + "}"); } }
代码清单:角色拦截器RoleInterceptor
package com.ssm.chapter11.game.interceptor; import com.ssm.chapter11.game.Interceptor; public class RoleInterceptor implements Interceptor { // @Override public void before(Object obj) { System.out.println("--before-准备打印角色信息"); } // @Override public void after(Object obj) { System.out.println("-after-已经完成角色信息的打印处理"); } // @Override public void afterReturning(Object obj) { System.out.println("-afterReturning-刚刚完成打印功能,一切正常。"); } // @Override public void afterThrowing(Object obj) { System.out.println("-afterThrowing-打印功能执行异常了,查看一下角色对象为空了吗?"); } }
package com.ssm.chapter11.game.main; import com.ssm.chapter11.game.Interceptor; import com.ssm.chapter11.game.ProxyBeanFactory; import com.ssm.chapter11.game.interceptor.RoleInterceptor; import com.ssm.chapter11.game.pojo.Role; import com.ssm.chapter11.game.service.RoleService; import com.ssm.chapter11.game.service.impl.RoleServiceImpl; public class GameMain { public static void main(String[] args) { RoleService roleService = new RoleServiceImpl(); Interceptor interceptor = new RoleInterceptor(); RoleService proxy = ProxyBeanFactory.getBean(roleService, interceptor); Role role = new Role(1L, "role_name_1", "role_note_1"); proxy.printRole(role); System.out.println("############## 测试 afterthrowing方法###############"); role = null; proxy.printRole(role); } }
package com.ssm.chapter11.game; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; class ProxyBeanUtil implements InvocationHandler { //被代理对象 private Object obj; // 拦截器 private Interceptor interceptor = null; /** * 获取动态代理对象. * * @param obj 被代理对象 * @param interceptor 拦截器 * @param aroundFlag 是否启用around方法 * @return 动态代理对象 */ public static Object getBean(Object obj, Interceptor interceptor) { //使用当前类,做为代理方法,此时被代理对象执行方法的时候,会进入当前类的invoke方法里 ProxyBeanUtil _this = new ProxyBeanUtil(); //保存被代理对象 _this.obj = obj; //保存拦截器 _this.interceptor = interceptor; //生成代理对象,并绑定代理方法 return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), _this); } /** * 代理方法 * * @param proxy 代理对象 * @param method 当前调度方法 * @param args 参数 * @return 方法返回 * @throws Throwable 异常 */ // @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object retObj = null; //是否产生异常 boolean exceptionFlag = false; //before方法 interceptor.before(obj); try { //反射原有方法 retObj = method.invoke(obj, args); } catch (Exception ex) { exceptionFlag = true; } finally { //after方法 interceptor.after(obj); } if (exceptionFlag) { //afterThrowing方法 interceptor.afterThrowing(obj); } else { //afterReturning方法 interceptor.afterReturning(obj); } return retObj; } }
上面的代码使用了动态代理,因为这段代码的重要性,这里有必要讨论其实现过程。