【发布时间】:2014-08-12 08:38:53
【问题描述】:
我有这个注解和一个方面类
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AroundHere {
}
@Aspect
@Component
public class SomeAspect {
@Around("@annotation(com.annotation.AroundHere)")
public Object redirectIfNotEditingStatus(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("hi");
return pjp.proceed();
}
}
我想在一些带有@AroundHere 注释的方法上打印“hi”。它在服务层上运行良好,但不适用于控制器。我怀疑 Spring Security,因为它会扫描所有控制器组件。
如何让它们在控制器上工作?
【问题讨论】:
-
也许控制器是在 Web 上下文定义中定义的,而您的服务(和您的方面)是在应用程序上下文中定义的?
-
正如@micha 所说,很可能它对您不起作用,因为
aop:aspectj-autoproxy是在一个应用程序上下文中定义的,而您的控制器在不同的应用程序上下文中。通常,BeanFactoryProcessors(当aop:aspectj-autoproxy在上下文中时执行实际工作)仅作用于定义它们的容器中的bean。因此,例如,如果您在根应用程序上下文中定义了aspectj-autoproxy,它将不会作用于 *-servlet.xml 上下文中定义的 bean。 -
另一个原因可能是服务通常实现了一个接口,而控制器却没有。而 Spring AOP 需要一个实现接口的 bean。
-
@AndreiStefan 哇,你们完全正确。请把它们写在答案表中,以便我给你一些分数。谢谢!
标签: java spring spring-mvc spring-security aspectj