Java Spring AOP在tomcat 8上的web应用程序中不工作

Java Spring AOP在tomcat 8上的web应用程序中不工作,java,tomcat,spring-aop,Java,Tomcat,Spring Aop,我想在我的应用程序中使用SpringAOP进行一些日志记录。我已经在一个独立的应用程序中使用了AOP,但现在在tomcat上的一个web应用程序中它不起作用了 我有一个应用程序核心和一个应用程序web项目,在核心项目中,所有逻辑都发生了,web项目只包含与web相关的内容 首先,我尝试将LoggingAspect类添加到我的核心项目中,因为这不起作用,我现在将其移动到web项目中,但尽管在那里它不起作用 这是我的applicationContext.xml,它位于文件夹:/application

我想在我的应用程序中使用SpringAOP进行一些日志记录。我已经在一个独立的应用程序中使用了AOP,但现在在tomcat上的一个web应用程序中它不起作用了

我有一个应用程序核心和一个应用程序web项目,在核心项目中,所有逻辑都发生了,web项目只包含与web相关的内容

首先,我尝试将LoggingAspect类添加到我的核心项目中,因为这不起作用,我现在将其移动到web项目中,但尽管在那里它不起作用

这是我的applicationContext.xml,它位于文件夹:/applicationweb/src/main/webapp中

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop.xsd">

        <!-- Add AspectJ autoproxy support for AOP -->
        <aop:aspectj-autoproxy/>


        <!-- Step 3: Add support for component scanning -->
        <context:component-scan base-package="my.foobar"/>

        <!-- Step 4: Add support for conversion, formatting and validation support -->
        <mvc:annotation-driven/>

        <!-- Step 5: Define Spring MVC view resolver -->
        <bean
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/view/" />
            <property name="suffix" value=".jsp" />
        </bean>
    </beans>
我还向我的应用程序web项目添加了一个类

@Configurable
@EnableAspectJAutoProxy
@ComponentScan("my.foobar")
public class ApplicationWebAppConfig {

}

我所期望的是,调用的每个方法都会被记录下来,但这不会发生。

我想我已经解决了我的问题。我想我可以在我的应用程序中使用SpringAOP作为一个独立的功能。我添加了一些JSP页面,这是我第一次使用SpringMVC,在这期间我看到了SpringAOP,我想为什么不使用它来对我的方法进行一些额外的度量。我的示例独立应用程序运行得非常好,这就是为什么我尝试将其应用到我现有的应用程序中。但问题开始了,我想测量的方法与spring无关,因此,正如@kriegaex在这里发布的,这不起作用。

Al-Phaba写道:


我想我解决了我的问题。我想我可以在我的应用程序中使用SpringAOP作为一个独立的功能。我添加了一些JSP页面,这是我第一次使用SpringMVC,在这期间我看到了SpringAOP,我想为什么不使用它来对我的方法进行一些额外的度量。我的示例独立应用程序运行得非常好,这就是为什么我尝试将其应用到我现有的应用程序中。但问题开始了,我想测量的方法与spring无关,所以从kriegaex发布的这不起作用

是的,Spring在默认情况下依赖于动态代理,JDK代理用于实现接口的类,CGLIB代理用于未实现接口的类,这些代理仅在Spring组件上工作,因为只有那些代理在连接应用程序时才由Spring代理。然而,AspectJ直接编入原始类的字节码,也可以应用于非Spring类,只要在激活AspectJ时它们还没有加载,例如JRE类

我的解决方案有点令人失望,我在此时停止了我的特性分支,因为目前解决它需要付出很大的努力,正如我读到的和您的回答所建议的,我需要通过LTW切换到AspectJ


好的,如果您的应用程序已经在工作,如果您做得正确,那么将配置从SpringAOP更改为AspectJ只需几分钟,如中所述。我鼓励你尝试一下,其实没那么难。祝你好运。

如果你想让组件扫描检测到,你的方面需要是@组件。它还需要在您为组件扫描指定的包中。我添加了@component,但它也不起作用,方面在我在componentscan中定义的包中。我尝试打破一些切入点语法,在这里我收到一些切入点格式不好的异常,所以我猜我的LoggingAspect已经加载,但不知何故它不是活动的?请公开你的@Around建议。春天需要找到它。如果这还不够,请公开切入点。如果这两个都不够,请在公开方面中的每个方法之后告诉我最后一步,如果将completePackage切入点更改为execution**,会发生什么情况?当更改切入点时,是否如我所说,除了公开所有内容之外,还做了其他事情?您的目标类也是组件吗?您是否曾经在Tomcat上运行过基于示例项目的SpringAOP方面?可能您有一些配置问题。如果所有这些我不喜欢的猜测都无济于事,请编辑你的问题,并提供一个最佳准备,以便在GitHub上克隆和构建Maven。我刚刚看到Gretty的评论。我在谷歌搜索它之前甚至不知道它是什么,所以我不能说它有什么聪明的地方。对于初学者来说,可能保持简单,手动启动Tomcat以排除其他可能的错误源。运行尽可能简单的设置,然后对其进行优化和自动化。这样你就会发现问题所在。如果你刚刚开始使用一项新技术,那么调试所有激活的铃声和口哨可能有点过于雄心勃勃。我得说,我有点失望你把我的评论变成了你自己的答案。你找到了我的另一个答案,很好。但即使在我之前的评论中,我也明确地问过你,你的目标类是否是@Components,在我醒来告诉你这就是问题之前,你说了不。如果你已经回答了你的问题并窃取了我的观点,你能至少描述一下你为解决你的问题做了什么吗
问题例如,您是否在Spring配置中通过LTW从Spring切换到AspectJ?看,这就是为什么我想要一个MCVE来回答你的问题。很抱歉让你失望,你真的很有帮助,我很感谢你的回答。我尝试了你描述的一切,通过这些答案和阅读一些文档,我得出了这个结论。我的解决方案有点令人失望,我在此时停止了我的特性分支,因为目前解决它需要付出很大的努力,正如我读到的和您的回答所建议的,我需要通过LTW切换到AspectJ。你可以发布一个答案,我会接受它作为解决方案。我不想偷任何东西,我想你可以比我更好地总结这个话题。再次感谢你,谢谢你接受我的回答。所以现在请删除这个多余的答案和我们所有的评论。整个问题+答案看起来更简洁,没有那么多余。
@Configurable
@EnableAspectJAutoProxy
@ComponentScan("my.foobar")
public class ApplicationWebAppConfig {

}