激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務器之家 - 編程語言 - Java教程 - Spring AOP手動實現簡單動態代理的代碼

Spring AOP手動實現簡單動態代理的代碼

2019-06-22 16:59sweet_sauce Java教程

今天小編就為大家分享一篇關于Spring AOP手動實現簡單動態代理的代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

什么是AOP我們先來看一張圖

Spring AOP手動實現簡單動態代理的代碼

圖中A就是通知,比如你要給每個方法前都加一個before()方法,目標類的每一個方法叫joinpoint(切入點),每個切入點都會用到通知,把通知和切入點連起來,點成線,線成面,這就是切面,也就是AOP,下面我們來簡單寫個小例子來實現一下

目標類的接口

1public interface UserService {
2  public void addUser() ;
3  public void updateUser();
4  public void deleteUser();
5}

目標類接口的實現

01public class UserServiceImpl implements UserService {
02  @Override
03  public void addUser() {
04    System.out.println("addUser");
05  }
06  @Override
07  public void updateUser() {
08    System.out.println("updateUser");
09  }
10  @Override
11  public void deleteUser() {
12    System.out.println("deleteUser");
13  }
14}

通知類

1public class MyAspect {
2  public void before(){
3    System.out.println("before");
4  }
5  public void after(){
6    System.out.println("after");
7  }
8}

代理類

01public class MyBeanFactory {
02  public static UserService createService(){
03    //1.目標類
04    final UserService userService = new UserServiceImpl() ;
05    //2.切面類
06    final MyAspect myAspect = new MyAspect();
07//    切入點和切面類結合
08//   三個參數
09//    1. loader ,類加載器 運行是加載,用類加載器將其加載到內存
10//    2. interfaces 代理類需要實現的所有接口
11//    3. invocationHandler 處理類,一般采用匿名內部類
12//    提供了invoke方法 代理類每個方法執行時都將調用一次invoke ,又有三個參數
13//    1. Object proxy 代理對象
14//    2. Method method 代理對象方法的反射
15//    3. Object[] args 方法的實際參數
16    UserService proxyService = (UserService) Proxy.newProxyInstance(MyBeanFactory.class.getClassLoader(),
17        userService.getClass().getInterfaces(),
18        new InvocationHandler() {
19          @Override
20          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
21            System.out.println(method.getName());
22            myAspect.before();
23            Object obj = method.invoke(userService, args);
24            myAspect.after();
25            return obj ;
26          }
27        });
28    return proxyService ;
29  }
30}

測試類

1public class UserServiceImplTest {
2  @org.junit.jupiter.api.Test
3  public void demo() throws Exception {
4      UserService userService = MyBeanFactory.createService();
5      userService.addUser();
6      userService.deleteUser();
7      userService.updateUser();
8  }
9}

結果

addUser
before
addUser
after
deleteUser
before
deleteUser
after
updateUser
before
updateUser
after
Process finished with exit code 0

我們可以看到每個方法都執行了通知,用了動態代理就不用手動的給每個方法前后加入通知,這樣既節省了時間,也保證了主體代碼不被改變

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。

延伸 · 閱讀

精彩推薦
428
主站蜘蛛池模板: 精品一区二区三区中文字幕老牛 | 亚洲午夜在线视频 | 久久草在线视频 | 91精选视频在线观看 | 中国7777高潮网站 | 成人毛片视频免费看 | 久久久精品视频免费看 | 亚洲一级片在线观看 | 欧美第1页 | 羞羞漫画无遮挡观看 | 亚洲欧美日韩久久精品第一区 | 大学生a级毛片免费视频 | 成人福利软件 | 超碰人人射 | 色婷婷久久久久久 | 毛片118极品美女写真 | 黄污网站在线 | 91精品成人福利在线播放 | 亚洲影视在线观看 | 国产精品一二区 | 久久精品国产亚洲7777小说 | 国产一级免费在线视频 | 最新在线黄色网址 | 青草av.久久免费一区 | 欧美乱码精品一区 | 午夜激情视频免费 | 欧美日韩成人一区二区 | 成人免费一区 | 看片一区| 久久久久久久久久亚洲 | 一区二区三区欧洲 | 精品国产99久久久久久宅男i | av色先锋| 毛片免费看的 | 成人精品一区二区三区中文字幕 | 久久久久久久一区二区 | 欧美wwwwww | 欧美一级黄色录像片 | 免费男女视频 | 色阁阁69婷婷 | 黄色三级三级三级 |