关于带注释控制器的Spring AOP建议

我试图使用AOP在带注释的控制器之后进行一些处理。 一切都在运行,没有错误,但建议没有被执行。

这是控制器代码:

@Controller public class HomeController { @RequestMapping("/home.fo") public String home(ModelMap model) { model = new ModelMap(); return "home"; } } 

和application-config中的设置

        

和实际的建议

 public class TestAdvice implements AfterReturningAdvice { protected final Log logger = LogFactory.getLog(getClass()); public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { logger.info("Called after returning advice!"); } } 

甚至可以在带注释的控制器上获得建议吗? 我使用的是Spring 2.5。

可以在带注释的控制器上获得建议。

我假设你想在使用@Controller注释的类中执行所有方法后给出建议。

这是一个例子:

 import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; @Aspect public class ControllerAspect { @Pointcut("within(@org.springframework.stereotype.Controller *)") public void controllerBean() {} @Pointcut("execution(* *(..))") public void methodPointcut() {} @AfterReturning("controllerBean() && methodPointcut() ") public void afterMethodInControllerClass() { System.out.println("after advice.."); } } 

如果你想使用带有AspectJ语法的Spring AOP,你还需要一个像这样的配置文件:

        

注意:使用Spring AOP,Spring容器只会编织Spring bean。 如果@Controller对象不是Spring bean,则必须使用AspectJ编织。

我有同样的问题,在Repository的建议工作,但Controller的建议不是。 最后我找到了解决方案。 简而言之,您需要确保在Servlet上下文中加载AOP定义,而不是在不同的上下文中加载。

在我的例子中,我的Spring AOP定义在tools-config.xml定义。 从这里移动后

  contextConfigLocation classpath:spring/tools-config.xml   org.springframework.web.context.ContextLoaderListener  

到这里,

  petclinic org.springframework.web.servlet.DispatcherServlet  contextConfigLocation classpath:spring/mvc-core-config.xml, classpath:spring/tools-config.xml  1  

对Controller的建议正在发挥作用。

对于MVC控制器,完成您尝试执行的操作的首选方法是使用拦截器。 见http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-handlermapping-interceptor