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; } }
上面的代碼使用了動態代理,因爲這段代碼的重要性,這裏有必要討論其實現過程。