我有这个注释和一个方面类

@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进行后处理,即使这两个容器是同一层次结构的一部分。

09-30 17:14
查看更多