如何在Spring 3中将@Aspect与@Controller结合起来?

我正在尝试使用@Controller,基于注释的方法设置Spring 3 Web MVC项目。

package my.package @Controller @RequestMapping("/admin/*") public class AdminMultiActionController { @RequestMapping(value = "admin.htm", method = RequestMethod.GET) public String showAdminSection() { return "admin"; } 

我的dispatcher-servlet具有以下Controller处理程序:

    

使用提供的maven工件,webapp运行良好:

  org.springframework spring-webmvc 3.0.2.RELEASE  

现在我想添加@AspectJ AOP。 我得到了libs:

  org.aspectj aspectjweaver 1.6.9   org.aspectj aspectjrt 1.6.9  

添加到我的applicationContext.xml:

  

确保在applicationContext.xml中创建相关的bean:

  

并开始充实@Aspect:

 package my.package.service @Aspect public class SecurityInterceptor { @Pointcut("execution(* showAdminSection(..))")// the pointcut expression private void foo() { System.out.println("fooo"); }// the pointcut signature 

现在这就是它停止工作的地方。 从未打印过“fooo”。

可能是,因为切入点(拼写?)对象必须是弹簧管理的bean,而我的@Controller与DefaultAnnotationHandlerMapping一起被认为不是这样的?

任何帮助,将不胜感激。 如果我忘记包含任何信息,请询问。 希望有人可以帮助我。

非常感谢!

切入点方法定义了切入点,它不会在匹配时被调用,您需要定义实际发生的事情。 例如,

 @Before("foo()") public void beforeFoo(JoinPoint joinPoint) { System.out.println("foooo"); } 

唉上帝……终于搞定了!

谢谢你的回复Affe!

对于好奇:

  1. 不要使用组件扫描和defaultannotationhandler来获取控制器
  2. 用弹簧xml连接它们
  3. 当aop config位于applicationContext中时,在dispatcher-servlet中没有所述控制器。
  4. 将两者都移到dispatcher-servlet

  5. 当然Affe是对的:不要忘记建议:p

对于第二个chzbrgla,对于那些稍后查看它的人(像我一样),我的问题在将控制器组件扫描和aop配置移动到调度程序servlet之后解决了,如下所示:

 ...       ... 

如您所见,组件扫描仍然适用于我的情况。 移动到调度程序servlet解决了它。

apspect(在本例中为myApect1)配置如下:

 @Pointcut("within(@org.springframework.stereotype.Controller *)") public void controller() {} @Pointcut("execution(* *(..))") public void method() {} @Before("controller() && method()") public void doAccessCheck(JoinPoint joinPoint) { System.out.println(joinPoint.getSignature()); // For testing purposes. }