4.AOP原理模擬
AOP Aspect-Oriented-Programming 面向切面編程
a)是對面向對象的思維方式的有力補充
好處:可以動態的添加和刪除在切面上的邏輯而不影響原來的執行代碼
a)Filter
b)Struts2 的 interceptor
Spring AOP的實現依賴於 Java的 Proxy 類
1.首先創建目標對象(需要被代理的對象)(即該對象的方法的執行前後有業務邏輯的添加)
UserService service = new UserServiceImpl();
2.創建一個 InvocationHandler,在這個InvocationHandler中,可以指明需要添加的業務邏輯
Interceptor interceptor = new Interceptor (); //public class Interceptor implements InvocationHandler
3.將目標對象放到 InvocationHandler中,由InvocationHandler 來執行整個業務(添加的業務 + 原來的業務)
interceptor.setTarget(service);
4.代理對象的創建,在創建時,會參考被代理對象實現的接口,代理對象也去實現這些接口
另外,每個代理裏面帝實有 InvocationHandler 對象存在的
UserService userProxy = (UserService) Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), interceptor);
如上:userProxy 其實是一個實現了UserService接口的 Proxy對象,
//可能這也是為什麽 Proxy.newProxyInstance 只能由 接口去接收的原因吧
註:!!一個類 如果在實現了接口的情況下,來為這個類創建一個代理對象時,實現代理時,用jdk 自帶的 Proxy 和 InvocationHandler,來幫你產生代理
這個類如果沒有實現接口,那麽它會直接用操作二進制碼的類庫(cglib.jar)來幫你產生代理的代碼
5.使用代理對象,調用add方法(因為userProxy 是實現了UserService接口的,所以是可以調用的)
userProxy.add();
//5.1 一旦代理對象調用 add方法,代理對象會 反射Method m = UserDAO.getClass.getMethod 拿到add方法對應的Method對象
//5.2 然後調用InvocationHandler 中的 invoke (Object proxy, Method method, Object[] args)
代理對象 add 方法的調用 實際上就是讓 InvocationHandler 去處理了,代理對象負責拿到執行方法必要的條件
InvocationHandler 的實現類
1 public class Interceptor implements InvocationHandler { 2 3 //被代理對象 4 private Object target; 5 6 public Object getTarget() { 7 return target; 8 } 9 public void setTarget(Object target) { 10 this.target = target; 11 } 12 13 public Object invoke(Object proxy, Method method, Object[] args) 14 throws Throwable { 15 System.out.println("方法要執行了"); 16 //調用被代理對象的方法,指明調用哪個被代理對象 ,用到了哪些參數 17 method.invoke(target, args); 18 return null; 19 } 20 21 }
感覺像是在 被代理的對象上面 先包了一層 InvocationHandler,然後在InvocationHandler上再包了一層 Proxy
然後調用的時候,先去調用Proxy 的 add方法,調用的時候可以拿到執行add方法所必須的條件參數
然後內部再去調用 InvocationHandler 的invoke方法,在InvocationHandler 的invoke方法裏面,
有新添加的業務邏輯和 本來要執行方法,通過這個invoke方法的執行,來完成動態的添加和刪除在切面上的邏輯,
而不影響原來的執行代碼
為什麽要分 Proxy 和 InvocationHandler
因為InvocationHandler 獲取不到 執行原本的方法 所需要的參數,必須要通過Proxy 給它
Proxy 又不能完成業務邏輯的增加和刪除,所以 各司其職
4.AOP原理模擬