最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2019年03月14日 12:02:09   作者:sweet_sauce  
今天小編就為大家分享一篇關(guān)于Spring AOP手動實(shí)現(xiàn)簡單動態(tài)代理的代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧

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

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

目標(biāo)類的接口

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

目標(biāo)類接口的實(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");
  }
}

通知類

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

測試類

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

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

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

相關(guān)文章

  • Spring Security使用中Preflight請求和跨域問題詳解

    Spring Security使用中Preflight請求和跨域問題詳解

    這篇文章主要給大家介紹了關(guān)于Spring Security使用中Preflight請求和跨域問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • 好用!解決maven包沖突的插件

    好用!解決maven包沖突的插件

    今天的主要內(nèi)容是介紹一款插件,該插件的主要用途是當(dāng)maven包沖突了以后,使用這款插件直接解決問題。
    2020-10-10
  • 解析spring-security權(quán)限控制和校驗(yàn)的問題

    解析spring-security權(quán)限控制和校驗(yàn)的問題

    這篇文章主要介紹了解析spring-security權(quán)限控制和校驗(yàn)的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • SpringMVC響應(yīng)視圖和結(jié)果視圖詳解

    SpringMVC響應(yīng)視圖和結(jié)果視圖詳解

    這篇文章主要介紹了SpringMVC響應(yīng)視圖和結(jié)果視圖,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot中注冊Bean的方式總結(jié)

    SpringBoot中注冊Bean的方式總結(jié)

    這篇文章主要介紹了SpringBoot中注冊Bean的方式總結(jié),@ComponentScan + @Componet相關(guān)注解,@Bean,@Import和spring.factories這四種方式,文中代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • Java中的volatile實(shí)現(xiàn)機(jī)制詳細(xì)解析

    Java中的volatile實(shí)現(xiàn)機(jī)制詳細(xì)解析

    這篇文章主要介紹了Java中的volatile實(shí)現(xiàn)機(jī)制詳細(xì)解析,本文的主要內(nèi)容就在于要理解volatile的緩存的一致性協(xié)議導(dǎo)致的共享變量可見性,以及volatile在解析成為匯編語言的時(shí)候?qū)ψ兞考渔i兩塊理論內(nèi)容,需要的朋友可以參考下
    2024-01-01
  • Java實(shí)現(xiàn)音頻添加自定義時(shí)長靜音的示例代碼

    Java實(shí)現(xiàn)音頻添加自定義時(shí)長靜音的示例代碼

    這篇文章主要介紹了一個Java工具類,可以實(shí)現(xiàn)給一個wav音頻添加自定義時(shí)長靜音。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下
    2022-01-01
  • 網(wǎng)關(guān)Gateway過濾器的使用詳解

    網(wǎng)關(guān)Gateway過濾器的使用詳解

    Gateway網(wǎng)關(guān)的過濾器分為兩種,一種是局部過濾器,一種是全局過濾器,過濾器就是過濾一些請求,在這里,全局過濾器的作用是處理一切進(jìn)入網(wǎng)關(guān)的請求和微服務(wù)響應(yīng),與GatewayFilter的作用一樣,本文給大家介紹網(wǎng)關(guān)Gateway過濾器的使用,感興趣的朋友一起看看吧
    2022-07-07
  • 解決Eclipse配置Tomcat出現(xiàn)Cannot create a server using the selected type錯誤

    解決Eclipse配置Tomcat出現(xiàn)Cannot create a server using the selected

    這篇文章主要介紹了解決Eclipse配置Tomcat出現(xiàn)Cannot create a server using the selected type錯誤的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Java并發(fā)編程之CountDownLatch源碼解析

    Java并發(fā)編程之CountDownLatch源碼解析

    這篇文章主要介紹了Java并發(fā)編程之CountDownLatch源碼解析,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java并發(fā)編程的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04

最新評論

营山县| 新郑市| 商都县| 图木舒克市| 定结县| 平潭县| 塔城市| 达拉特旗| 宜宾市| 江达县| 左云县| 嘉禾县| 体育| 个旧市| 台安县| 布尔津县| 巴林左旗| 互助| 平度市| 新干县| 汶上县| 桂平市| 彭山县| 凤山市| 岳池县| 虹口区| 太保市| 武冈市| 万荣县| 皮山县| 梁河县| 太仓市| 米林县| 崇礼县| 封丘县| 甘德县| 宝清县| 雷州市| 曲水县| 库伦旗| 汶上县|