Spring MVC Spring AOP(方面)未执行

qgelzfjb  于 2023-01-21  发布在  Spring
关注(0)|答案(7)|浏览(232)

我正在使用Spring 2.5.6,asm 1.5.3,aspectjrt/aspectjweaver 1.6.1,cglib 2.1_3在我的基于Web的Spring应用程序中,我有以下类:

package uk.co.txttools.aspects;

@Aspect
public class LoggingAspect {
    @Before("execution(* uk.co.txttools.web.controller.compose.PreviewMessageController.set*(..))")
    public void setLoggingAdvice(){
        System.out.println("********************************* Advice run..... set mothod called....");
    }

    @AfterThrowing("execution(* uk.co.txttools.web.controller.compose.PreviewMessageController.onSubmit(..) throws java.lang.Exception)")
    public void hadleException(){
       System.out.println("================= PreviewMessageController =========== ON SUBMIT Exception Throwen ==================");
    }

    @Before("execution(* uk.co.txttools.web.controller.compose.PreviewMessageController.onSubmit(..) throws java.lang.Exception)")
    public void OnSubmitAspect(){
        System.out.println("================= PreviewMessageController =========== ON SUBMIT CALLED ==================");
    }
}

我有一个关于Submit()的应用程序上下文.xml '文件。
我的springapp-servlet.xml(它在web.xml文件中与org.springframework.web.servlet.DispatcherServlet一起使用)文件看起来像这样:

<?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:aop="http://www.springframework.org/schema/aop"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd">

<aop:aspectj-autoproxy proxy-target-class="true" />

<bean id="loggingAspect" class="uk.co.txttools.aspects.LoggingAspect" />
.
.

下面在相同的xml文件PreviewMessageController中获取初始化,这意味着我的控制器和方面live是相同的容器。
我没有得到任何异常,而运行应用程序,但我的方面类LoggingAspect从来没有得到调用。我不知道是什么丢失或我做错了。请帮助我..
谢谢

emeijp43

emeijp431#

我不确定我做的是否正确,但对我来说,解决这个问题的方法是将@Component添加到“Aspect'ed”类中-

@Aspect
@Component
public class PerformanceLogger {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Around("within(com.something.rest.service..*)")
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
        long start = System.currentTimeMillis();
        Object retVal = pjp.proceed();
        long end = System.currentTimeMillis();
        logger.debug(pjp.getSignature().toShortString() + " Finish: " + (end - start) + "ms");
        return retVal;
    }
}

(And结束循环-如果您使用基于注解的,不要忘记将@EnableAspectJAutoProxy添加到Config类中。

@EnableAspectJAutoProxy
okxuctiv

okxuctiv2#

对于选择JavaConfig的用户,可以将Aspect声明为bean,并添加@EnableAspectJAutoProxy注解以打开自动代理:

@Configuration
@EnableAspectJAutoProxy
@ComponentScan
public class MyConfig {
    @Bean
    public LoggingAspect loggingAspect(){
        return new LoggingAspect();
    }
}
7kjnsjlb

7kjnsjlb3#

终于解决了。
我想我错过了aspectj-maven-plugin。它是Spring编织方面所必需的。但是没有教程提供这个信息。在我的pom.xml中添加了以下内容。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.0</version>
    <dependencies>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjtools</artifactId>
            <version>1.6.1</version>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
                <goal>test-compile</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <outxml>true</outxml>
        <verbose>true</verbose>
        <showWeaveInfo>true</showWeaveInfo>
        <aspectLibraries>
            <aspectLibrary>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
            </aspectLibrary>
        </aspectLibraries>
        <source>1.6</source>
        <target>1.6</target>
    </configuration>
</plugin>

谢谢你们

7nbnzgx9

7nbnzgx94#

如果您还没有尝试过...请尝试基于xml的spring-aop配置,如下所示:

<aop:config>
    <aop:aspect ref="loggingAspect">
        <aop:pointcut expression="execution(* uk.co.txttools.web.controller.compose.PreviewMessageController.set*(..))" id="previewMessageControllerSetters"/>
        <aop:before method="setLoggingAdvice" pointcut-ref="previewMessageControllerSetters"/>

         // set other 2 pointcuts similarly....
        </aop:aspect>       
    </aop:config>
    <bean id="loggingAspect" class="uk.co.txttools.aspects.LoggingAspect" />
ac1kyiln

ac1kyiln5#

只是为了使可能的答案列表完整:
在我看来,您的mavenpom.xml中似乎缺少以下依赖项:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aop</artifactId>
  <version>2.5.6</version>
</dependency>
yvgpqqbh

yvgpqqbh6#

在配置文件中尝试以下操作:

<aop:aspectj-autoproxy proxy-target-class="true">
     <aop:include name="loggingAspect"/>
</aop:aspectj-autoproxy>
7gs2gvoe

7gs2gvoe7#

我遇到了这个问题,因为我不知道原因,所以我提到了它。我的问题与组件扫描有关。有一个配置类如下:

@ComponentScan(basePackages = {
    "com.example.web.controller",
    "com.example.service",
    "com.example.repository"})

方面类位于日志包中,需要将其添加到@ComponentScan中。

相关问题