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

服務(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ù)器之家的支持。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜影院一区二区三区 | 五月婷婷在线观看 | 欧美三级不卡在线观线看高清 | 韩国免费特一级毛片 | 精品一久久香蕉国产线看播放 | 丝袜兔女郎被啪在线观看91 | 好男人影视社区www在线观看 | 美女舒服好紧太爽了视频 | 农村妇女野外牲交一级毛片 | jk制服蕾丝超短裙流白浆 | 女人把扒开给男人爽 | 国产亚洲精品激情一区二区三区 | 天堂在线中文无弹窗全文阅读 | 美女脱了内裤打开腿让人桶网站o | 亚洲 日本 天堂 国产 在线 | 免费看男人使劲躁女人小说 | 精选国产AV精选一区二区三区 | 9l桃色| 日韩欧美一区二区三区免费观看 | 青草视频网站 | 手机在线免费观看日本推理片 | 精品卡1卡2卡三卡免费视频 | 久久免费黄色 | 波多野结衣中文字幕乱七八糟 | 美女被上漫画 | 猫咪av| 好男人好资源在线观看 | 精品一区视频 | 精品综合 | 人与动人物aaaa | 久久九九精品国产自在现线拍 | 青青青手机视频在线观看 | 99视频免费在线 | 午夜精品久久久久久久99蜜桃 | 女教师巨大乳孔中文字幕免费 | 午夜勾魂曲 | 特黄特色大片免费视频播放 | 欧洲一级| 久久精选视频 | 精品无码国产污污污免费网站2 | 亚洲色图影院 |