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

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

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

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

圖中A就是通知,比如你要給每個(gè)方法前都加一個(gè)before()方法,目標(biāo)類的每一個(gè)方法叫joinpoint(切入點(diǎn)),每個(gè)切入點(diǎn)都會(huì)用到通知,把通知和切入點(diǎn)連起來,點(diǎn)成線,線成面,這就是切面,也就是AOP,下面我們來簡(jiǎn)單寫個(gè)小例子來實(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é)合
//   三個(gè)參數(shù)
//    1. loader ,類加載器 運(yùn)行是加載,用類加載器將其加載到內(nèi)存
//    2. interfaces 代理類需要實(shí)現(xiàn)的所有接口
//    3. invocationHandler 處理類,一般采用匿名內(nèi)部類
//    提供了invoke方法 代理類每個(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è)試類

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ì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • Spring Security使用中Preflight請(qǐng)求和跨域問題詳解

    Spring Security使用中Preflight請(qǐng)求和跨域問題詳解

    這篇文章主要給大家介紹了關(guān)于Spring Security使用中Preflight請(qǐng)求和跨域問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(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ì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • SpringMVC響應(yīng)視圖和結(jié)果視圖詳解

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

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

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

    這篇文章主要介紹了SpringBoot中注冊(cè)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í)長靜音的示例代碼

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

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

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

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

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

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

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

最新評(píng)論

大方县| 贡嘎县| 蒙自县| 阜宁县| 梧州市| 河东区| 武强县| 临澧县| 攀枝花市| 汉寿县| 和静县| 民乐县| 常州市| 方正县| 潍坊市| 长宁区| 抚顺市| 乐亭县| 乌鲁木齐县| 云龙县| 镇雄县| 青岛市| 安达市| 耒阳市| 南汇区| 泾川县| 高青县| 观塘区| 太仓市| 奇台县| 武功县| 潞西市| 全南县| 柘荣县| 峨眉山市| 鹰潭市| 中阳县| 龙口市| 苗栗县| 巴彦淖尔市| 上林县|