Spring AOP在Tomcat 8上的Web应用程序中不工作

wztqucjr  于 2023-03-12  发布在  Spring
关注(0)|答案(2)|浏览(209)

我想在我的应用程序中使用Spring AOP来做一些日志记录的事情,我已经在一个独立的应用程序中使用了AOP,它工作了,但是现在在一个tomcat上的web应用程序中它不工作了。
我有一个应用程序核心和一个应用程序网络项目,在核心项目中所有的逻辑发生,而网络项目只包含网络相关的东西。
首先,我尝试将LoggingAspect类添加到我的核心项目中,因为这不起作用,所以我现在将其移动到Web项目中,但尽管在那里它不起作用。
下面是我的applicationContext.xml文件夹:/应用程序-Web/源代码/主/Web应用程序

<?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>

这是我的LoggingAspect类,现在位于:应用程序-web/src/main/my.foobar.web/方面/日志方面

@Aspect
    @Order(1)
    public class LoggingAspect {
        private static final LogHandler LOG = LogHandler.getLogger(LoggingAspect.class);

        @Pointcut("execution(* my.foobar.*.*.*(..))")
        private void completePackage(){}

        @Pointcut("execution(* my.foobar.*.*.get*(..))")
        private void getterMethods(){}

        @Pointcut("execution(* my.foobar.*.*.set*(..))")
        private void setterMethods(){}

        @Pointcut("completePackage() && !(getterMethods() || setterMethods())")
        private void allMethodsExceptGetterAndSetter(){}

        @Around("completePackage()")
        private Object aroundMethod(ProceedingJoinPoint theProceedingJointPoint) throws Throwable{
            LOG.info("around method");
            String method = theProceedingJointPoint.getSignature().getName();
            Object[] arguments = theProceedingJointPoint.getArgs();

            LOG.info("method call: {0}", method);                
            for(Object arg: arguments){
                LOG.info("argument[{0}]", arg);
            }

            Object result = theProceedingJointPoint.proceed();
            return result;
        }

    }

我还向应用程序Web项目中添加了一个类

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

}

我所期望的是,每个被调用的方法都将被记录,但这并没有发生。

dluptydi

dluptydi1#

  • Al Phaba* 写道:

我想我已经解决了我的问题。我想我可以在我的应用程序中只使用spring-aop作为一个独立的特性。我添加了一些JSP页面,并第一次使用spring-mvc,在此期间,我看到了spring-aop,并想为什么不使用它来对我的方法进行一些额外的测量。我的示例独立应用程序运行得非常好,这就是为什么我试图将其适应我现有的应用程序。但问题从这里开始,我想测量的方法*与Spring无关**,因此从 kriegaexhere发布的这是不工作的。
是的,Spring依赖于动态代理(默认情况下JDK代理实现接口的类,CGLIB代理不实现接口的类),这些代理只在Spring组件上工作,因为只有那些组件在连接应用程序时被Spring代理。AspectJ直接编织到原始类的字节码中,也可以应用于非Spring类。只要它们在AspectJ被激活时还没有被加载(例如JRE类)。
我的解决方案有点令人失望,我在这一点上停止了我的特性分支,因为目前要解决它需要付出很多努力,正如我所读到的,你的回答建议我需要通过LTW切换到AspectJ。
如果你的应用程序已经在工作了,如果你做得对,就像Spring手册中描述的那样,把配置从Spring AOP改为AspectJ只需要几分钟的时间。我鼓励你给予一下,这真的不是那么难。祝你好运。

hs1ihplo

hs1ihplo2#

我想我已经解决了我的问题。我想我可以在我的应用程序中只使用spring-aop作为一个独立的特性。我添加了一些JSP页面,并第一次使用spring-mvc,在此期间,我看到了spring-aop,并想为什么不使用它来对我的方法进行一些额外的测量。我的示例独立应用程序运行得非常好,这就是为什么我试图将其适应我现有的应用程序。但问题从这里开始,我想测量的方法与Spring无关,所以从@kriegaex这里Spring AOP for non spring component发布到这里,这是行不通的

相关问题