1. 程式人生 > >Spring AOP 對Spring MVC的Controller切面攔截不起作用

Spring AOP 對Spring MVC的Controller切面攔截不起作用

1 問題描述

當使用Spring AOP對Controller層的Controller類的方法進行切面攔截,不起作用。AOP配置沒有任何問題。

2 排查過程

  1. Spring AOP配置沒有任何問題;【正常】
  2. 斷點除錯:Spring原始碼斷點除錯,在呼叫Controller方法時,Controller的例項被JDK進行動態代理了;【不正常】
  3. Spring預設的代理方式為JDK動態代理;【正常】

3 解決問題

AOP有的人說攔截不到Controller。有的人說想攔AnnotationMethodHandlerAdapter截到Controller必須得攔截org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

首先AOP可以攔截到Controller的,這個是毋容置疑的其次須攔截AnnotationMethodHandlerAdapter也不是必須的。最起碼我沒有驗證成功過這個。這個方式就不在這兒介紹說明了。

AOP之所以有的人說攔截不到Controller,原因是該註解的Controller已被spring容器內部代理了。我們只要把它交給cglib代理就可以了。Spring MVC的配置檔案dispatcher-servlet.xml:

<!-- 通知spring使用cglib而不是jdk的來生成代理方法 AOP可以攔截到Controller -->
<aop:aspectj-autoproxy proxy-target-class="true" />

4 問題總結

Spring MVC 和 Spring 整合的時候,SpringMVC的dispatcher-servlet.xml檔案中配置掃描包,不要包含 service的註解,Spring的applicationContext.xml檔案中配置掃描包時,不要包含controller的註解,如下所示:

Spring MVC dispatcher-servlet.xml:

    <context:component-scan base-package="com.qding">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    </context:component-scan>

Spring MVC啟動時的配置檔案,包含元件掃描、url對映以及設定freemarker引數,讓spring不掃描帶有@Service註解的類。為什麼要這樣設定?因為springmvc.xml與applicationContext.xml不是同時載入,如果不進行這樣的設定,那麼,spring就會將所有帶@Service註解的類都掃描到容器中,等到載入applicationContext.xml的時候,會因為容器已經存在Service類,使得cglib將不對Service進行代理,直接導致的結果就是在applicationContext 中的事務配置不起作用,發生異常時,無法對資料進行回滾。以上就是原因所在。

同樣的在Spring的applicationContext.xml配置如下:

    <context:component-scan base-package="com.qding">           
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

<context:component-scan/> 掃描指定的包中的類上的註解,常用的註解有:

@Controller 宣告Action元件
@Service    宣告Service元件    @Service("myMovieLister") 
@Repository 宣告Dao元件
@Component   泛指元件, 當不好歸類時. 
@RequestMapping("/menu")  請求對映
@Resource  用於注入,( j2ee提供的 ) 預設按名稱裝配,@Resource(name="beanName") 
@Autowired 用於注入,(srping提供的) 預設按型別裝配 
@Transactional( rollbackFor={Exception.class}) 事務管理
@ResponseBody
@Scope("prototype")   設定bean的作用域

相關推薦

Spring AOP Spring MVC的Controller切面攔截作用

1 問題描述 當使用Spring AOP對Controller層的Controller類的方法進行切面攔截,不起作用。AOP配置沒有任何問題。 2 排查過程 Spring AOP配置沒有任何問題;【正常】 斷點除錯:Spring原始碼斷點除錯,在呼叫Controller方法時,Controller的例項被JD

spring 與 mybatis整合,mybatis註解作用

一、首先配置好基礎的資料來源及註解管理器 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><pro

spring 同一個類中方法呼叫 註解作用

spring  同一個類中方法呼叫 註解不起作用 需要新增 AopContext.currentProxy() 這樣

selenium2webdriverWrapped元素的click()作用怎麼辦?

這個問題困擾了我快一天的時間,我遇到的問題:WebElement是一個Wrapped的span元素,點選後出現一個選單。這個span元素可以用xpath定位到,但是element.click()就是不起作用, google了下,似乎有很多網友反映,應該是Selenium2.0的bug。針對我個人的問題,我嘗

spring cloud】spring cloud 使用feign呼叫,1.fallback熔斷器作用,2.啟動報錯Caused by: java.lang.ClassNotFoundException: com.netflix.hystrix.contrib.javanica.aop.asp

1.首先使用feign呼叫,需要配置熔斷器 2.配置熔斷器需要將熔斷器注入Bean,被spring可以掃描到 3.熔斷器類需要實現feignClient介面 4.hystrix的jar需要被maven引用,並且在classpath下 5.注意,feignClient上儘量不要使用@RequestMap

Spring Boot 攔截器無效,作用; 原文:https://blog.csdn.net/u012862619/article/details/81557779

在Spring MVC中,攔截器有兩種寫法:要麼實現HandlerInterceptor介面,要麼實現WebRequestInterceptor介面,具體內容請看這裡詳述 Spring MVC 框架中攔截器 Interceptor 的使用方法。  而Spring Boot也只是集成了Spr

2018年最後一天 VsCode中執行nodeJs程式碼的簡單方法 Pgsql和Mysql的對比 Tomcat的最大併發數 Spring AOP作用原因

發現2017的隨筆總結依舊適用,想堅持每天寫點東西分享,但感覺每天能原創分享的內容真的不多,尤其是要把自己想分享的內容寫清楚也需要額外花費很多的時間,這讓本來平時就工作比較忙的自己疲於應付,於是乎就轉載自己看到的一些好的文章分享,甚至有些文章自己都沒完全看完就發,湊合著完成了任務,但自己的成就感很低。因此我不

Spring AOP詳解面向切面程式設計

       Spring中的AOP代理還是離不開Spring的IOC容器,代理的生成,管理及其依賴關係都是由IOC容器負責,Spring預設使用JDK動態代理,在需要代理類而不是代理介面的時候,Spring會自動切換為使用CGLIB代理,不過現在的專案都是面向介面程式設計

spring AOP中的AfterThrowing增強處理能完全處理異常

spring AOP中的AfterThrowing增強處理可以對目標方法的異常進行處理,但這種處理與直接使用catch捕捉處理異常的方式不同,catch捕捉意味著能完全處理異常,即只要catch塊本身不丟擲新的異常,則被處理的異常不會往上級呼叫者進一步傳播下去;但是如果

Spring-AOP 混合使用各種切面型別及不同切面總結

概述 通過我們整個AOP系列的學習,我們可以總結出 4種定義切面的方式: 基於@AspectJ註解的方式 基於<aop:aspect>的方式 基於<aop:adviso

Spring aop作用

aop必須交給Spring容器管理,一般配置在spring-context.xml中,貼上簡單配置 切面簡單設定 因為一般Spring-context.xml管理service所以在這裡面配置有關service的切面,在spring-mvc.xml中配置有關c

5.2 spring5原始碼--spring AOP原始碼分析二--切面的配置方式

目標: 1. 什麼是AOP, 什麼是AspectJ 2. 什麼是Spring AOP 3. Spring AOP註解版實現原理 4. Spring AOP切面原理解析  一. 認識AOP及其使用 詳見博文1: 5.1 Spring5原始碼--Spring AOP原始碼分析一  

5.2 spring5原始碼--spring AOP原始碼分析三---切面原始碼分析

一. AOP切面原始碼分析 原始碼分析分為三部分 1. 解析切面 2. 建立動態代理 3. 呼叫   原始碼的入口 原始碼分析的入口, 從註解開始: 元件的入口是一個註解, 比如啟用AOP的註解@EnableAspectJAutoProxy. 在註解的實現類裡面, 會有一個@Import("

導致spring事務配置作用的一種原因

red something 事務配置 nbsp oid -s color con bsp @Component public class AnalyticsApplication { @Autowired private InitializationAc

Spring Ehcache中@Cacheable作用

cts pri col time 查找文件 後綴名 數值 spring div 確認各項配置沒有問題。 一開始關於EhCache的配置放在了SpringMVC.xml中,移動到applicationContext.xml中,解決。 以下為EhCache的配置: <!-

Spring 事務作用的幾種情況

service() true bean 每次 語句 imp 作用 stc current 1:必須是runtime異常,方法不要有try catch語句。 2:service 中 @Service() public class AServiceImpl1 imple

Atitit Spring事務配置作用可能出現的問題: .是否是資料庫引擎設定不對造成的【筆者就遇到了這個問題,由於筆者使用的是mysql資料,但是在建立表的時候引擎預設(mysql中引擎預設為

Atitit Spring事務配置不起作用可能出現的問題:   .是否是資料庫引擎設定不對造成的【筆者就遇到了這個問題,由於筆者使用的是mysql資料,但是在建立表的時候引擎預設(mysql中引擎預設為MyISAM,是不支援事務操作的),需要修改為InnoDB,就可以支援事務操作了

spring boot2 配置 FastJsonHttpMessageConverter 作用

專案使用自定義 FastJsonHttpMessageConverter 進行API資料響應JSON轉換器 在原來springboot1.X 版本中是可以生效,配置如下: /** * 替換使用 FastJson 解析返回結果 */ @Overrid

spring boot @Transactional註解事務回滾作用無效

使用資料庫新增兩張表是, 一個事務已提交,但例外一個事務已報錯的情況: 當@Transactional不起作用如何排查問題。 可以按照以下幾個步驟逐一確認: 1、首先要看資料庫本身對應的庫、表所設定的引擎是什麼。MyIsam不支援事務,如果需要,則必須改為Innno

codingdict-Spring AOPSpring Batch 教程

Spring AOP環境設定 Spring AOP核心概念 Spring AOP Advice 型別 Spring AOP實現 Spring AOP 基於XML的應用程式 Spring A