关于带注释控制器的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