因为Spring的Bean扫描和Spring-MVC的Bean扫描是分开的, 两者的Bean位于两个不同的Application, 而且Spring-MVC的Bean扫描要早于Spring的Bean扫描, 所以当Controller Bean生成完成后, 再执行Spring的Bean扫描,Spring会发现要被AOP代理的Controller Bean已经在容器中存在, 配置AOP就无效了。
同样这样的情况也存在于数据库事务中, 如果Service的Bean扫描配置在spring-mvc.xml中, 而数据库事务管理器配置在application.xml中, 会导致数据库事务失效, 原理一样。
所以这里 ,我们需要把AOP放置在Controller扫描配置的文件中。
Spring的配置文件application.xml 配置如下:
<context:component-scan base-package="cn.test.demo.dao" />
<context:component-scan base-package="cn.test.demo.service" />
Spring MVC的配置文件spring-mvc.xml
<!-- 扫描类包,将spring注解的类自动扫描为Bean,同时完成Bean的注入. -->
<context:component-scan base-package="cn.test.demo.controller"