如何确定 Spring Boot 上是否使用了加载时间编织?

问题描述 投票:0回答:1

我正在使用 Spring Boot 3.0.12。启用加载时编织。

这里放置了一个可重现的示例。 (分支 -

aspect
)。要重现该问题,请执行以下操作

curl --request GET 'http://localhost:8080/hello'

我在

aop.xml
下创建了一个
META-INF
,如下所示

<aspectj>
  <aspects>
    <aspect name="com.example.helloworld.aspects.DaoExceptionHandler"/>

    <weaver options="-verbose -showWeaveInfo">
      <include within="com.example.helloworld.*"/>
    </weaver>
  </aspects>
</aspectj>

我用

javaagent:/Users/dm/.m2/repository/org/aspectj/aspectjweaver/1.9.20/aspectjweaver-1.9.20.jar
开始申请。

以下依赖项添加到我的 pom.xml 中

<dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.9.20</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.20</version>
    </dependency>

我的方面代码如下

@Aspect
@Slf4j
public class DaoExceptionHandler {
  @AfterThrowing(
      pointcut =
          "execution(* *(..)) &&"
              + " @annotation(com.example.helloworld.utils.HandleDaoException)",
      throwing = "ex")
  public void handle(RuntimeException ex) {
    log.error("Exception received on dao", ex);
    throw JooqUtil.mapException(ex);
  }
}

我对

@HandleDaoException
的用法如下

@Component
public class DaoImpl {
  @HandleDaoException
  public void getError() {
    throw new IllegalArgumentException("Test");
  }
}

在我的应用程序启动过程中,我看到如下日志

2024-04-23T16:21:08.770+05:30  INFO 33973 --- [           main] c.e.helloworld.HelloWorldApplication     : Started HelloWorldApplication in 0.797 seconds (process running for 1.13)
[MethodUtil@4b627298] info AspectJ Weaver Version 1.9.20 built on Tuesday Aug 15, 2023 at 23:35:34 PDT
[MethodUtil@4b627298] info register classloader sun.reflect.misc.MethodUtil@4b627298
[MethodUtil@4b627298] info using configuration /Users/debrajmanna/code/java/github/spring-boot-hello-world/target/classes/META-INF/aop.xml
[MethodUtil@4b627298] info register aspect com.example.helloworld.aspects.DaoExceptionHandler

当我注释任何方法时

@HandleDaoException
,方面工作正常,我看到如下日志

java.lang.IllegalArgumentException: Test
    at com.example.helloworld.dao.DaoImpl.getError(DaoImpl.java:10) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) ~[spring-aop-6.0.13.jar:6.0.13]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.0.13.jar:6.0.13]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.0.13.jar:6.0.13]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:751) ~[spring-aop-6.0.13.jar:6.0.13]
    at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:64) ~[spring-aop-6.0.13.jar:6.0.13]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173) ~[spring-aop-6.0.13.jar:6.0.13]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:751) ~[spring-aop-6.0.13.jar:6.0.13]
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-6.0.13.jar:6.0.13]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.13.jar:6.0.13]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:751) ~[spring-aop-6.0.13.jar:6.0.13]
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) ~[spring-aop-6.0.13.jar:6.0.13]
    at com.example.helloworld.dao.DaoImpl$$SpringCGLIB$$0.getError(<generated>) ~[classes/:na]
    at com.example.helloworld.controller.HelloWorldController.sendGreetings(HelloWorldController.java:17) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-6.0.13.jar:6.0.13]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-6.0.13.jar:6.0.13]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.0.13.jar:6.0.13]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884) ~[spring-webmvc-6.0.13.jar:6.0.13]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) ~[spring-webmvc-6.0.13.jar:6.0.13]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.0.13.jar:6.0.13]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1081) ~[spring-webmvc-6.0.13.jar:6.0.13]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974) ~[spring-webmvc-6.0.13.jar:6.0.13]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011) ~[spring-webmvc-6.0.13.jar:6.0.13]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.0.13.jar:6.0.13]
...

如果从我的应用程序启动命令中删除

-javaagent
并指定
@EnableAspectJAutoProxy
那么当调用
DaoExceptionHandler
时我也会看到上面的堆栈跟踪。

我的理解是没有加载时间编织弹簧默认为CGLIB代理。从上面的异常堆栈跟踪来看,即使启用了加载时编织,CGLIB 代理仍然在使用。如果我的理解是错误的,那么有没有办法让我知道加载时编织在春季是否正常工作?

spring-boot aspectj spring-aop
1个回答
0
投票

您在项目中犯了两个错误。我在这个 PR 中修复了它们:

  1. 不要使用

    @Import({ DaoExceptionHandler.class })
    ,因为它使 Spring 将本机 AspectJ 方面视为 Spring
    @Configuration
    类,错误地为其创建特殊类型的 CGLIB 代理。该 CGLIB 代理不是常规的 Spring AOP 代理,而是具有不同行为的 Spring 配置的不同类型。请参阅此处了解解释。无论如何,你不需要那样,而且也是错误的。

  2. 确保设置正确的方面编织范围

    com.example.helloworld..*
    ,其中双点符号也包括子包。

© www.soinside.com 2019 - 2024. All rights reserved.