spring aop 如何切面到mvc 的controller

网上搜罗半天,不知道什么原因,看了源码,好像他们说的controller 是不受代理的,也对哈,不知道怎么办,于是在http://stackoverflow.com/questions/17834958/spring-aop-is-not-working-in-with-mvc-structure?rq=1 这个地方有个人说了:

<context:component-scan base-package="com.dao" />
<mvc:annotation-driven/>

<aop:aspectj-autoproxy />  
from application-context.xml to controller-servlet.xml?

The aspects and the beans to be applied needs to be in the same ApplicationContext but ApplicationContext is not aware of WebApplicationContext .


Indeed your controller (annotated by @Controller) and your aspects (annotated by @Aspect) should be in the same Spring context.

Usually people define their controllers in the dispatch-servlet.xml or xxx-servlet.xml and their service beans (including the aspects) in the main applicationContext.xml. It will not work.

When Spring initializes the MVC context, it will create a proxy for your controller but if your aspects are not in the same context, Spring will not create interceptors for them.


这个人说的好像很对啊。我把aspectj 和springmvc的配置文件放到一起就可以用到controller上了。

spring-mvc.xml

	<context:component-scan base-package="com.cms.controller" />
	<context:component-scan base-package="com.cms.aspectj" />
	<!-- <bean id="sysLogAspectJ" class="com.cms.aspectj.SysLogAspectJ" /> -->
	<aop:aspectj-autoproxy proxy-target-class="true">
	<!-- 	<aop:include name="sysLogAspectJ" /> -->
	</aop:aspectj-autoproxy>
	<!-- <mvc:annotation-driven /> -->
	<bean
		class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
	<bean
		class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />


sysLogAspectJ

package com.cms.aspectj;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class SysLogAspectJ {

	@Pointcut("within(@org.springframework.stereotype.Controller *)")
	public void cutController(){
		
	}
	
	@Around("cutController()")
	public Object recordSysLog(ProceedingJoinPoint point) throws Throwable{
		System.out.println("lfkdjj================================================================");
		return point.proceed();
	}
	
	
	
}







猜你喜欢

转载自yjian84.iteye.com/blog/1920787