Spring Aop對Controller層攔截失效問題

問題:當(dāng)使用Spring AOP對Controller層的Controller類的方法進(jìn)行切面攔截,不起作用。AOP配置沒有任何問題。

分析:斷點(diǎn)調(diào)試:Spring源碼斷點(diǎn)調(diào)試,在調(diào)用Controller方法時,Controller的實(shí)例被JDK進(jìn)行動態(tài)代理了;

解決:Spring默認(rèn)的代理方式為JDK動態(tài)代理,而Controller層是沒有接口實(shí)現(xiàn)的,所以Jdk無法對Controller接口進(jìn)行動態(tài)代理,接口就無法攔截。不用接口的代理方式我們自然想到cglib,于是增加了cglib的代理配置<aop:aspectj-autoproxy proxy-target-class="true" />

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

Spring MVC dispatcher-servlet.xml:

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

Spring MVC啟動時的配置文件,包含組件掃描、url映射以及設(shè)置freemarker參數(shù),讓spring不掃描帶有@Service注解的類。為什么要這樣設(shè)置?因?yàn)閟pringmvc.xml與applicationContext.xml不是同時加載,如果不進(jìn)行這樣的設(shè)置,那么,spring就會將所有帶@Service注解的類都掃描到容器中,等到加載applicationContext.xml的時候,會因?yàn)槿萜饕呀?jīng)存在Service類,使得cglib將不對Service進(jìn)行代理,直接導(dǎo)致的結(jié)果就是在applicationContext 中的事務(wù)配置不起作用,發(fā)生異常時,無法對數(shù)據(jù)進(jìn)行回滾。以上就是原因所在。

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

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

掃描指定的包中的類上的注解,常用的注解有:

@Controller聲明Action組件

@Service聲明Service組件 ???@Service("myMovieLister")

@Repository聲明Dao組件

@Component泛指組件,當(dāng)不好歸類時.

@RequestMapping("/menu")請求映射

@Resource用于注入,( j2ee提供的 ) 默認(rèn)按名稱裝配,@Resource(name="beanName")

@Autowired用于注入,(srping提供的) 默認(rèn)按類型裝配

@Transactional( rollbackFor={Exception.class})事務(wù)管理

@ResponseBody

@Scope("prototype")設(shè)定bean的作用域

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容