一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - Spring AOP手動(dòng)實(shí)現(xiàn)簡(jiǎn)單動(dòng)態(tài)代理的代碼

Spring AOP手動(dòng)實(shí)現(xiàn)簡(jiǎn)單動(dòng)態(tài)代理的代碼

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

今天小編就為大家分享一篇關(guān)于Spring AOP手動(dòng)實(shí)現(xiàn)簡(jiǎn)單動(dòng)態(tài)代理的代碼,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧

什么是AOP我們先來(lái)看一張圖

Spring AOP手動(dòng)實(shí)現(xiàn)簡(jiǎn)單動(dòng)態(tài)代理的代碼

圖中A就是通知,比如你要給每個(gè)方法前都加一個(gè)before()方法,目標(biāo)類(lèi)的每一個(gè)方法叫joinpoint(切入點(diǎn)),每個(gè)切入點(diǎn)都會(huì)用到通知,把通知和切入點(diǎn)連起來(lái),點(diǎn)成線,線成面,這就是切面,也就是AOP,下面我們來(lái)簡(jiǎn)單寫(xiě)個(gè)小例子來(lái)實(shí)現(xiàn)一下

目標(biāo)類(lèi)的接口

public interface UserService {
  public void addUser() ;
  public void updateUser();
  public void deleteUser();
}

目標(biāo)類(lèi)接口的實(shí)現(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");
  }
}

通知類(lèi)

public class MyAspect {
  public void before(){
    System.out.println("before");
  }
  public void after(){
    System.out.println("after");
  }
}

代理類(lèi)

public class MyBeanFactory {
  public static UserService createService(){
    //1.目標(biāo)類(lèi)
    final UserService userService = new UserServiceImpl() ;
    //2.切面類(lèi)
    final MyAspect myAspect = new MyAspect();
//    切入點(diǎn)和切面類(lèi)結(jié)合
//   三個(gè)參數(shù)
//    1. loader ,類(lèi)加載器 運(yùn)行是加載,用類(lèi)加載器將其加載到內(nèi)存
//    2. interfaces 代理類(lèi)需要實(shí)現(xiàn)的所有接口
//    3. invocationHandler 處理類(lèi),一般采用匿名內(nèi)部類(lèi)
//    提供了invoke方法 代理類(lèi)每個(gè)方法執(zhí)行時(shí)都將調(diào)用一次invoke ,又有三個(gè)參數(shù)
//    1. Object proxy 代理對(duì)象
//    2. Method method 代理對(duì)象方法的反射
//    3. Object[] args 方法的實(shí)際參數(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 ;
  }
}

測(cè)試類(lèi)

public class UserServiceImplTest {
  @org.junit.jupiter.api.Test
  public void demo() throws Exception {
      UserService userService = MyBeanFactory.createService();
      userService.addUser();
      userService.deleteUser();
      userService.updateUser();
  }
}

結(jié)果

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

我們可以看到每個(gè)方法都執(zhí)行了通知,用了動(dòng)態(tài)代理就不用手動(dòng)的給每個(gè)方法前后加入通知,這樣既節(jié)省了時(shí)間,也保證了主體代碼不被改變

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)服務(wù)器之家的支持。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本艳鉧动漫1~6完整版在 | 国产精品香蕉一区二区三区 | 五月最新商场女厕所高跟嘘嘘 | 国产精品不卡高清在线观看 | 国产成人综合亚洲亚洲欧美 | jk制服白丝超短裙流白浆 | 毛片大全免费看 | 久久国产乱子伦免费精品 | 色噜噜亚洲男人的天堂www | 男人网站视频 | free极度另类性欧美 | 特级淫片欧美高清视频蜜桃 | 色老妇 | 媳妇和公公小说 | 2023最新伦理片 | 狠狠躁夜夜躁人人爽天天miya | 手机看片国产免费久久网 | 婷婷综合久久中文字幕 | 色综合久久六月婷婷中文字幕 | 91九色在线视频 | tobu8中国在线观看免费视频 | 欧美兽皇另类 | 国产亚洲精品综合在线网址 | 久久久91精品国产一区二区 | 疯狂激吻添下边小说 | 小向美奈子av | 毛片一级毛片 | 精品久久免费视频 | 国产一区二区免费视频 | 亚洲午夜精品久久久久久抢 | 男人日女人的逼视频 | а天堂中文最新版在线 | 91精品国产高清久久久久久 | 好姑娘完整版在线观看中文 | 嗯啊视频在线 | 456成人免费高清视频 | 亚洲国产第一 | 2012中文字幕中字视频 | 亚洲 欧美 国产 在线观看 | 狠狠干综合网 | 精品国产福利一区二区在线 |