【问题标题】:Spring AOP does not works in Tomcat and tcserverSpring AOP 在 Tomcat 和 tcserver 中不起作用
【发布时间】:2016-09-13 20:40:15
【问题描述】:

当我从单元测试或通过独立应用程序运行它时,我有一个方面可以正常工作。但是,当我将它作为 Web 应用程序的一部分运行并将其托管在 Tomcat 上时,不会应用 Aspects。

我的样子

public class MyAspect {

    @Around("within(com.service..*)")
    public Object doLogging(ProceedingJoinPoint pjp) throws Throwable {
        //do something
        Object obj = pjp.proceed();
        //do something else
        return obj;
    }

}

【问题讨论】:

  • 我在 tcserver(位于 tomcat 之上的 Spring 服务器)中看到了相同的行为。 Jboss 也不行。

标签: java spring aop aspectj spring-aop


【解决方案1】:

我能够解决这个问题。原因是方面是由 Web 应用程序上下文而不是由全局应用程序上下文处理的,所以我必须重组几件事。步骤我已经详述了here

@seanizer Spring 确实支持内部。的确,它只适用于方法,并且在其中会适用于com.service的所有包和子包的方法。有关详细信息,请查看参考文档here

【讨论】:

  • 是的,我承认,within 得到部分支持(当它应用于方法执行时)。 +1 给你
  • 很遗憾,您的链接已从网络上消失。链接内容的核心应该已经包含在答案中。
【解决方案2】:

更新:我将保留它,因为它仍然部分有效,即使它对您的情况没有帮助。不过我会编辑一些地方,编辑标记为 thisthis

如果您使用的是 Spring AOP,它就无法工作。 Spring AOP 仅完全支持execution 切入点。 within 切入点仅在应用于方法执行时才有效要获得within 的全部功能,您将需要 AspectJ(Spring AOP 仅使用一些 AspectJ 切入点,但不是 AspectJ 编织器)。通过静态编译(通常通过MavenAnt)或通过Load-Time-Weaving

另外,您的班级缺少@Aspect 注释。

【讨论】:

  • 在 Pointcut 内确实适用于 Spring。当我通过仅使用 Spring AOP 的独立应用程序运行时,上述方面效果很好
  • Spring AOP 仅支持 Spring bean 的方法执行连接点 来源:static.springsource.org/spring/docs/3.0.x/…
  • 您可能在 IDE 中打开了 AspectJ weaving,因此您认为您使用的是 Spring AOP,而实际上您使用的是 AspectJ。
  • 我的 IDE 没有打开 AspectJ weaving。当我直接在 tomcat 服务器中部署战争并从命令行工具运行服务器时,我也看到了同样的问题(所以不涉及 ide)。
  • 正如我所写:Spring AOP 不支持它,而且不可能,因为 Spring AOP 默认基于 JDK 代理,而它们又基于方法拦截。如果您需要更多,请使用 AspectJ(这正是 Spring AOP 文档所建议的)。
【解决方案3】:

搬家怎么样

<context:component-scan base-package="com.*" />
<mvc:annotation-driven/>
<aop:aspectj-autoproxy />   

到 servlet-mvc.xml?

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-10-27
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 2012-11-05
相关资源
最近更新 更多