springMVC中aop配置不起作用的解决方法

时间:2022-12-26 16:33:37

    最近两天在学习spring的aop原理后,想在springMVC里练习一下,按照网上的配置写好了相应的aop类以及在xml做了相应设置。但是aop的设置一直不起作用。查看相关博客后找到了一种解决方法。 
     在我的web环境中spring的ApplicationContext.xml的配置大致为:web容器启动时,扫描除controller之外的service,dao等其他的所有包。

<context:property-placeholder location="classpath:mybatis/db.properties"/>
<context:component-scan base-package="com.zkw">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
  • 1
  • 2
  • 3
  • 4

在springMVC的springMVC.xml的配置是:只扫描controller包。

<!-- 扫描controller包 -->
<context:component-scan base-package="com.zkw.controller" />
  • 1
  • 2

然后我想给一个controller类中的一个方法添加aop。具体为当在执行这个方法前执行一个函数,方法执行完毕后再执行另一个函数。所以先开始我是在ApplicationContext.xml文件中加入了如下配置:

<!-- aop相关 -->
<bean id="timetest" class="com.zkw.aop.monitor.TimeTest" />
    <aop:config>
        <aop:aspect id="timee" ref="timetest">
            <aop:pointcut id="analysis_test" expression="execution(* com.zkw.controller.framework.analysis.analysisController.weiboAnalysis(..))"/>
            <aop:before method="beforeAdvice" pointcut-ref="analysis_test" />
            <aop:after method="afterAdvice" pointcut-ref="analysis_test" />
        </aop:aspect>
    </aop:config>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

增强类com.zkw.aop.monitor.TimeTest的代码如下:

public class TimeTest {
    public void beforeAdvice() {
        System.out.println("增强开始前");
    }

    public void afterAdvice() {
        System.out.println("增强结束后");
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

就是在方法执行前打印一句话,方法完成后再打印一句话。而切点函数为weiboAnalysis(),也只是打印了一句话。 
但是在我运行代码,从前台访问weiboAnalysis()函数的时候,并没有打印出织入的增强。后来参考http://blog.csdn.net/tianjun2012/article/details/47809739 博客后,将aop的配置放入了springMVC.xml中,就能正常完成增强的织入了。 
后来我将ApplicationContext.xml的aop配置改了一下,切点改成了 
<aop:pointcut id="analysis_test" expression="execution(* com.zkw.service.framework.analysis.TestService.*(..))"/>即将切点设置成了ApplicationContext.xml文件扫描的service包中的一个方法,然后运行之后发现同样可以织入增强。 
     总结:对需要织入增强的类或函数进行aop配置时,相应的aop配置需要写在那个扫描该类的配置文件中。对于本例来说,在ApplicationContext.xml中完成了除controller之外的service,dao等的配置,所以在ApplicationContext.xml文件中写入对controller的aop配置就不会起作用,相反springMVC.xml只完成了controller的配置,所以在springMVC.xml中写入对service的配置就不会起作用。 至于原因,暂时还没有搞清楚。