Spring AOP手動實現(xiàn)簡單動態(tài)代理的代碼
什么是AOP我們先來看一張圖
圖中A就是通知,比如你要給每個方法前都加一個before()
方法,目標類的每一個方法叫joinpoint(切入點),每個切入點都會用到通知,把通知和切入點連起來,點成線,線成面,這就是切面,也就是AOP,下面我們來簡單寫個小例子來實現(xiàn)一下
目標類的接口
public interface UserService { public void addUser() ; public void updateUser(); public void deleteUser(); }
目標類接口的實現(xiàn)
public class UserServiceImpl implements UserService { @Override public void addUser() { System.out.println("addUser"); } @Override public void updateUser() { System.out.println("updateUser"); } @Override public void deleteUser() { System.out.println("deleteUser"); } }
通知類
public class MyAspect { public void before(){ System.out.println("before"); } public void after(){ System.out.println("after"); } }
代理類
public class MyBeanFactory { public static UserService createService(){ //1.目標類 final UserService userService = new UserServiceImpl() ; //2.切面類 final MyAspect myAspect = new MyAspect(); // 切入點和切面類結合 // 三個參數(shù) // 1. loader ,類加載器 運行是加載,用類加載器將其加載到內(nèi)存 // 2. interfaces 代理類需要實現(xiàn)的所有接口 // 3. invocationHandler 處理類,一般采用匿名內(nèi)部類 // 提供了invoke方法 代理類每個方法執(zhí)行時都將調(diào)用一次invoke ,又有三個參數(shù) // 1. Object proxy 代理對象 // 2. Method method 代理對象方法的反射 // 3. Object[] args 方法的實際參數(shù) UserService proxyService = (UserService) Proxy.newProxyInstance(MyBeanFactory.class.getClassLoader(), userService.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(method.getName()); myAspect.before(); Object obj = method.invoke(userService, args); myAspect.after(); return obj ; } }); return proxyService ; } }
測試類
public class UserServiceImplTest { @org.junit.jupiter.api.Test public void demo() throws Exception { UserService userService = MyBeanFactory.createService(); userService.addUser(); userService.deleteUser(); userService.updateUser(); } }
結果
addUser
before
addUser
after
deleteUser
before
deleteUser
after
updateUser
before
updateUser
after
Process finished with exit code 0
我們可以看到每個方法都執(zhí)行了通知,用了動態(tài)代理就不用手動的給每個方法前后加入通知,這樣既節(jié)省了時間,也保證了主體代碼不被改變
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內(nèi)容請查看下面相關鏈接
相關文章
java模擬TCP通信實現(xiàn)客戶端上傳文件到服務器端
這篇文章主要為大家詳細介紹了java模擬TCP通信實現(xiàn)客戶端上傳文件到服務器端,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-10-10Java 采用反射獲取class屬性值的實現(xiàn)代碼
以下是對在Java中采用反射獲取class屬性值的實現(xiàn)代碼進行了分析介紹,需要的朋友可以過來參考下2013-08-08Java中將 int[] 數(shù)組 轉換為 List分享
這篇文章主要介紹了Java中將 int[] 數(shù)組 轉換為 List分享的相關資料,需要的朋友可以參考下2022-12-12使用CORS實現(xiàn)JavaWeb跨域請求問題的方法
這篇文章主要介紹了使用Cors實現(xiàn)JavaWeb跨域請求問題的方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09