最近两天在学习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>
在springMVC的springMVC.xml的配置是:只扫描controller包。
<!-- 扫描controller包 -->
<context:component-scan base-package="com.zkw.controller" />
然后我想给一个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>
增强类com.zkw.aop.monitor.TimeTest的代码如下:
public class TimeTest {
public void beforeAdvice() {
System.out.println("增强开始前");
}
public void afterAdvice() {
System.out.println("增强结束后");
}
}
就是在方法执行前打印一句话,方法完成后再打印一句话。而切点函数为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的配置就不会起作用。 至于原因,暂时还没有搞清楚。