<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      喜歡與改變

      導航

      spring aop之父子容器

      需求;項目對外提供接口,要求每個對外接口都要進行token認證。
      解決辦法:寫一個token認證的工具類,在每個需要認證的接口方法開始的地方,調用工具類中的token認證方法。
      問題:因為要滿足指定條件才可以進行下一步,在接口中調用token認證的時候,要返回結果進行判斷,不止是一行代碼可以解決問題。
      優化:使用aop 切面編程,在執行接口的內容之前,進行認證。通過注解的方式,織入到切點中。這樣在需要進行認證的接口上只需要添加一個注解就可以token認證功能。
      問題:基于Aspect注解實現該功能,在程序啟動時,訪問接口,直接進入接口,沒有進入切面。
       
      AuthController 
      @RestController
      public class AuthController {
      
          @PostMapping("authentication")
          @TokenChecker
          public Result getToken(String username,String password){
              return null;
          }
      }

       

      切面類:execution 表達式沒有任何問題。
      @Aspect
      @Component
      public class TokenAspect {
        //匹配指定類下的有指定注解的方法。只要在要切入的方法上加上注解就可以將該方法作為切入點。
          @Pointcut("execution (public * com.cotroller..*.*(..)) && @annotation(com.annotation.TokenChecker)")
          public void addAdvice() {
          }
      
          @Before("addAdvice()")
          public void before() {
              System.err.println("before");
          }
      
          @After("addAdvice()")
          public void after() {
              System.err.println("after");
          }
          
      }
       
      wen.xml配置文件,關鍵的兩個配置
      <context-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>classpath*:/applicationContext.xml</param-value>
          </context-param>
      <servlet>
              <servlet-name>spring-mvc</servlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
              <init-param>
                  <param-name>contextConfigLocation</param-name>
                  <param-value>classpath*:/applicationContext-mvc.xml</param-value>
              </init-param>
              <load-on-startup>2</load-on-startup>
          </servlet>

      applicationContext.xml關鍵配置信息
      <aop:aspectj-autoproxy/>
      <context:component-scan base-package="com"
                                  name-generator="com.xxx">
              <!-- 不掃描Controller注解 -->
              <context:exclude-filter type="annotation"
                                      expression="org.springframework.stereotype.Controller" />
              <context:exclude-filter type="annotation"
                                      expression="org.springframework.context.annotation.Configuration" />
          </context:component-scan>

      applicationContext-mvc.xml關鍵配置信息
      <context:component-scan base-package="com"
              use-default-filters="false">
              <!-- 掃描controller注解 -->
              <context:include-filter type="annotation"
                  expression="org.springframework.stereotype.Controller" />
              <context:include-filter type="annotation"
                      expression="org.springframework.context.annotation.Configuration" />    
          </context:component-scan>

      需要具備知識:

        Spring 框架允許在一個應用中創建多個上下文容器。但是建議容器之間有父子關系。可以通過 ConfigurableApplicationContext 接口中定義的 setParent 方法設置父容器。一旦設置父子關系,則可以通過子容器獲取父容器中除 PropertyPlaceHolder 以外的所有資源,父容器不能獲取子容器中的任意資源(類似 Java 中的類型繼承)。

        典型的父子容器: spring 和 springmvc 同時使用的時候。ContextLoaderListener 創建的容器是父容器,DispatcherServlet 創建的容器是子容器。保證一個 JVM 中,只有一個樹狀結構的容器樹。可以通過子容器訪問父容器資源。
       
      常見場景:

      1. 對于傳統的web項目來說,通常使用spring和springmvc,因此對于這種項目來講,他是有兩個容器的,一個是spring容器,一般我們會把Service層的東西注入到spring容器中,另一個是springmvc的容器,通常這個容器里注入的是Controller層的東西,這里我們認為spring容器是父容器,springmvc是子容器的概念,然后我們大家都知道通過父子繼承關系可知,子容器是可以讀取到父容器中的東西,但是父容器是無法讀到子容器中的內容,因此基于這個場景,有的同學,把Aop的實現類注入到了spring容器中,并且將Aop的切點表達式配置<aop:config> <aop:pointcut的execution也配到了spring容器的xml,而巧了這位同學要切的類方法,正好是Controller,也就是springmvc容器中的東西,那么這時候問題就來了,aop在初始化時會在自己的容器中尋找能夠匹配的類方法,然后給他套上一層代理,此時他在自己能夠訪問到的spring容器中根本找不到與之匹配的類和方法,因為這些類和方法是在springmvc容器中管理的,因此就沒有代理成功。

      那么對于上述問題要怎么修改呢?只需要確保你要Aop切的類和方法與你Aop配置切點<aop:config> <aop:pointcut的execution表達式聲明是在同一個容器中即可,此時只需要講這個配置移到springmvc容器的xml中即可

      2. 第二種情況與第一種情況有些許的類似,但并不相同,是關于重復掃描的,比如你在spring容器中配置了一個Aop,并且把他托管給spring容器管理,而且execution表達式切的也是spring容器中管理的類和方法,理論上這個時候是好用的,這批execution切到的類都被加了代理,但是巧了,springmvc容器中由于配置的是包路徑掃描,恰好把execution表達式切的這一批對象又掃了一遍,又都托管給了springmvc容器,而此時掃到的這批對象,是重新new出來交給springmvc管理的,因此并沒有被aop代理,所以在使用時,注入進來的可能是springmvc容器管理的這批對象,因此使用時發現Aop代理失效了。

      這個問題的解決方案,就是避免兩個容器重復掃描。

      3. 第三個問題就比較簡單了,他的現象是有些方法被Aop代理成功了,但有個別方法沒有代理成功,究其原因發現這部分沒有代理成功的方法并不是通過代理對象調用的,而是自身調用的,故被調用的方法沒有被Aop代理,無法織入橫切邏輯。

      這個問題如果理解起來困難的話我舉個例子,比如A.a(),A.b()是被代理的類和方法,那么當我調用A.a()時,此時a被代理了,成功執行代理類的內容,但還沒有完,a()方法中調用了自身的方法b(),此時我們以為b也會被代理類代理,但實際上并沒有,因為他是自身方法調用了并不是通過代理類A調用的,如果通過A.b()這種調用方式,那么b是可以被成功代理的。

      分析:

      1.我們的Controller類,使用注解@RestController,在applicationContext.xml中不掃描Controller注解的類,在applicationContext-mvc掃描Controller注解的類,結合web.xml可知我們的Controller AuthController被子容器管理。

      2.我們的切面使用的注解是@Aspect和@Component, 結合 applicationContext.xml與web.xml可知,切面實例被父容器管理。

      3.解決 因為我們切面類中使用的@Component注解會被Spring父容器管理,不適用注解,在application-mvc.xml中使用xml方法方式實例化切面類。這樣Controller和切面類在同一個容器中管理,就可以正常的進行aop代理。

      錯誤的嘗試:

      1.Controller使用@Component注解,想讓其鬼父容器管理這樣Controller和切面就歸同一個容器管理了:這時候通過postman訪問接口請求失敗。

      2.切面類,使用@Controller 還是沒有進入切面類。看到配置中不但把Controller注解還有Configuration注解都歸子容器管理,把切面類的注解改為@Configuration同樣還是沒有進入切面。

       

      總結:

      1.分析的問題的時候,注意web.xml的重要性,好多問題都可以從web.xml 這個配置文件開始往后面推。

      2.深刻的理解一下父子容器的關系。哪些注解的類初始化后被父容器管理,哪些被子容器管理。

      3. 動態代理 JDK與CGLIB的區別。我這個項目中就有一個被final修飾的Controller。導致在設置代理方式的出錯。在不同的配置文件中設置代理方式應該是對加載這個配置的容器管理的類有影響,對別的容器不影響。

      posted on 2019-12-09 17:28  喜歡與改變  閱讀(734)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 丰满岳乱妇三级高清| 干老熟女干老穴干老女人| 秋霞人妻无码中文字幕| 亚洲国产av剧一区二区三区| 国产激情av一区二区三区| 高级艳妇交换俱乐部小说| 亚洲一二三区精品美妇| 理塘县| 91久久天天躁狠狠躁夜夜| 久久人与动人物a级毛片| 成熟丰满熟妇av无码区| 色五月丁香五月综合五月4438| 亚洲熟女片嫩草影院| 午夜免费无码福利视频麻豆| 里番全彩爆乳女教师| 无遮高潮国产免费观看| 中文字幕精品亚洲字幕成| 中文字幕乱码亚洲无线三区 | 曰批免费视频播放免费| 久国产精品韩国三级视频| 无码人妻aⅴ一区二区三区蜜桃| 曰本丰满熟妇xxxx性| 99久热在线精品视频| 国产内射XXXXX在线| 深夜av免费在线观看| 人妻精品久久无码区| 久久天天躁狠狠躁夜夜躁2o2o| 欧美偷窥清纯综合图区| 国产第一页浮力影院入口| 永久黄网站色视频免费直播| 国产乱人伦真实精品视频| 色综合激情丁香七月色综合| 国产精品免费看久久久| 精品免费国产一区二区三区四区 | 日本丰满少妇高潮呻吟| 国产精品SM捆绑调教视频| 人妻激情一区二区三区四区| 伊人精品无码av一区二区三区| 亚洲天堂亚洲天堂亚洲色图| 亚洲AV高清一区二区三区尤物| 精品熟女日韩中文十区|