【问题标题】:AspectJ with Spring Security带有 Spring Security 的 AspectJ
【发布时间】: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


【解决方案1】:

很可能它不适合您,因为aop:aspectj-autoproxy 是在一个应用程序上下文中定义的,而您的控制器在不同的应用程序上下文中。通常,BeanFactoryProcessors(当aop:aspectj-autoproxy 在上下文中时执行实际工作)仅作用于定义它们的容器中的bean。因此,例如,如果您在根应用上下文中定义了 aspectj-autoproxy,它不会作用于在 *-servlet.xml 上下文中定义的 bean。

您可以找到与此主题相关的相关文档here

BeanPostProcessor 的范围是每个容器。这仅在您使用容器层次结构时才相关。如果您在一个容器中定义一个 BeanPostProcessor,它只会对该容器中的 bean 进行后处理。换句话说,在一个容器中定义的 bean 不会由另一个容器中定义的 BeanPostProcessor 进行后处理,即使两个容器属于同一层次结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2011-01-15
    • 2020-06-11
    相关资源
    最近更新 更多