用Java创建自己的AOP
介紹
如您所知,AOP是Spring框架提供的最好的功能之一,它在實現跨領域關注的同時提供了最大的靈活性。 您是否想到過AOP在Spring如何工作? 有時這是高級技術面試時要問的問題。 有時,僅涉及核心Java時,這個問題變得更加重要。 最近,我的一位朋友去參加采訪,他面臨一個尷尬的問題,即如何僅在核心Java中使用AOP而無需使用Spring和相關庫。 在本文中,我將為您提供有關如何僅在具有某些限制的情況下僅在核心Java中創建自己的AOP的概述。 這不是Spring AOP和Java AOP之間的比較研究。 但是,您可以使用適當的設計模式在一定程度上用Java實現AOP。
大家都知道AOP以及如何使用Spring框架使用AOP,本文將使您深入了解不使用Spring就能在Java中實現AOP的方法。 作為參考,Spring使用JDK代理和CGlib來提供AOP實現。 JDK動態代理提供了一種靈活的方法來掛鉤方法并以一定的限制執行某些操作。 限制是應該有一個接口,并且應該有該接口的實現。 到目前為止,還不清楚。 讓我們舉個例子。 我們有一個計算器,通過它我們可以執行一些數學運算。 讓我們考慮用一個數字除以另一個數字。 現在的問題是有人已經在核心框架中提供了除法運算的實現,是否有可能在該方法中進行劫持以執行額外的驗證? 是的。 為此,我在下面的代碼片段中提供了這種簡單的情況。 基本的抽象代碼如下。
public interface Calculator {public int calculate( int a , int b); }該實現的代碼如下。
public class CalculatorImpl implements Calculator {@Overridepublic int calculate(int a, int b) {return a/b;} }想象一下,上面的代碼已凍結,并且內核中不能進行更多修改,但是您必須毫無問題地實現功能。 怎么做 ? 讓我們使用JDK動態代理的功能。
public class SomeHandler implements InvocationHandler {// Code omitted for simplicity…..@Overridepublic Object invoke(Object proxy, Method method, Object[] params) throws Throwable { // Your complex business validation and logicObject result = method.invoke(targetObject ,params);return result;}}讓我們來看一下使用我們的jdk動態代理來執行所需功能的測試類。
public static void main(String[] args) {CalculatorImpl calcImpl = new CalculatorImpl();Calculator proxied = (Calculator) getProxy (Calculator.class, calcImpl, new SomeHandler(calcImpl));int result = proxied.calculate(20, 10);System.out.println("FInal Result :::" + result);}如您所見,我們只是通過簡單地實現了偉大的接口調用“ InvocationHandler ”而提供了一個掛鉤實現。 根據Java文檔,它處理代理實例上的方法調用。
現在,您已經在上面看到了我們可以使用InvocationHandler's invoke()方法執行某些操作來獲得所需的結果。 現在我們想到的問題是,在實際方法執行之前和之后如何做些事情。 有可能在執行方法之前做些什么然后在執行該方法之后做些什么嗎? 為了使它更具體,我們可以添加多個aops(之前,之后,周圍)來掛鉤一個方法嗎? 我們可以通過制作簡化的代碼模板來實現。 讓我們按照以下步驟實現它。
簡要的技術實施
按照以下方式創建抽象處理程序。
public abstract class AbstractHandler implements InvocationHandler {private Object targetObject;public void setTargetObject(Object targetObject) {this.targetObject = targetObject;} }創建靈活的開發人員友好的處理程序,例如BeforeHandler和AfterHandler 。
apublic abstract class BeforeHandler extends AbstractHandler {public abstract void handleBefore(Object proxy, Method method, Object[] args);public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {handleBefore(proxy, method, args);return method.invoke(getTargetObject(), args);} }public abstract class AfterHandler extends AbstractHandler {public abstract void handleAfter(Object proxy, Method method, Object[] args);public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object result = method.invoke(getTargetObject(), args);handleAfter(proxy, method, args);return result;} }創建代理實用程序。
public class ProxyFactory {public static Object getProxy(Object targetObject,List<AbstractHandler> handlers) {//Code to get the proxyreturn proxyObject;} else {return targetObject;}} }現在,下面給出了測試工具代碼段。
CalculatorImpl calcImpl = new CalculatorImpl(); BeforeHandler before = new BeforeHandlerImpl(); AfterHandler after = new AfterHandlerImpl(); List<AbstractHandler> handlers = new ArrayList<AbstractHandler>(); handlers.add(before); handlers.add(after); Calculator proxy = (Calculator) ProxyFactory.getProxy(calcImpl,handlers); int result = proxy.calculate(20, 10);組態
以上所有代碼段都很簡短,以使您對結構實現更加清楚。 進行實際的品味/測試來實現現實總是更好。 從下面的github鏈接下載完整的項目,并在您喜歡的Java編輯器中對其進行配置,然后運行測試類以查看效果。
- https://github.com/debjava/aopusingjdkdynamicproxy
結論
希望您喜歡我關于Java的AOP的小文章,發表一些評論以豐富和增強雙方的知識。 在本文之前和之后的文章中,我將“ Around”和“ Throw” AOP留給讀者。
翻譯自: https://www.javacodegeeks.com/2015/03/create-your-own-aop-in-java.html
總結
以上是生活随笔為你收集整理的用Java创建自己的AOP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 负债100万,不知道怎么办了?
- 下一篇: 全球骑士卡是真的吗?