我有这个注释和一个方面类
@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”。它可以在服务层上正常工作,但不能在contollers上工作。我怀疑Spring Security是因为它扫描了所有控制器组件。如何使它们在控制器上工作?
最佳答案
很可能对您不起作用,因为aop:aspectj-autoproxy
是在一个应用程序上下文中定义的,而您的控制器在另一个应用程序上下文中。通常,BeanFactoryProcessors
(在aop:aspectj-autoproxy
处于上下文中时会执行实际工作)仅对定义它们的容器中的bean起作用。因此,例如,如果您在根应用程序上下文中定义了aspectj-autoproxy
,它将不会对在*-servlet.xml
上下文中定义的bean起作用。
您可以找到与此主题相关的相关文档here:
BeanPostProcessor按容器划分作用域。仅在使用容器层次结构时才有意义。如果在一个容器中定义BeanPostProcessor,它将仅对该容器中的bean进行后处理。换句话说,一个容器中定义的bean不会由另一个容器中定义的BeanPostProcessor进行后处理,即使这两个容器是同一层次结构的一部分。