spring - Spring 应用程序中非 Spring bean 的加载时间编织

标签 spring aspectj spring-aop load-time-weaving spring-aspects

我有一个带有一些 REST Controller 、服务类和帮助器类的 Spring Boot 应用程序。 Controller 和服务类是 spring 管理的,而助手类不是 spring 管理的,主要包含静态方法。

AspectJ 配置存在于 java 配置中,如下所示

@Configuration
@EnableLoadTimeWeaving(aspectjWeaving = AspectJWeaving.ENABLED)
public class AspectConfig {

    @Bean
    public LoggingAspect loggingAspect() {
        return new LoggingAspect();
    }
}

对应的LoggingAspect类如下,
@Aspect
public class LoggingAspect {

    @Before("allMethodsPointcut()")
    public void logBeforeMethod(JoinPoint joinPoint) {
        System.out.println("Entering Method - " + joinPoint.getSignature().getDeclaringType() + "::" + joinPoint.getSignature().getName());
    }

    @After("allMethodsPointcut()")
    public void logAfterMethod(JoinPoint joinPoint) {
        System.out.println("Exiting Method - " + joinPoint.getSignature().getDeclaringType() + "::" + joinPoint.getSignature().getName());
    }

    @Pointcut("execution(* com.test.controller..*(..)) || execution(* com.test.service..*(..)) || execution(* com.test.helper..*(..))")
    public void allMethodsPointcut() {
    }
}
  • 调用 Controller 时,启用 Aspect 的日志记录适用于 Controller 和服务功能,但不适用于辅助功能。
  • 如果我们在 Controller 中 Autowiring helper 类,非静态 helper 方法开始显示 aspectj 日志。但是,静态辅助方法仍然不显示 aspectj 日志

  • 问题,
    1. 我们如何为非 spring 管理的类配置 aspectj 建议,即没有 @Bean、@Autowired、@Component 等。
    2. 我们如何为静态方法配置 aspectj 建议(我正在使用 @EnableLoadTimeWeaving 但也许我遗漏了一些东西)
    3. 如果可能,AspectJ 配置应该是基于 Java 的

    如果需要更多详细信息,请告诉我

    最佳答案

    使用 -javaagent:/path/to/aspectjweaver-<version>.jar作为 JVM 的启动参数以启用加载时编织。删除 @EnableAspectJAutoProxy来自您的 spring 配置,以便 spring 不会尝试使用它自己的 Spring AOP 框架而不是纯 AspectJ。或者,创建 META-INF/aop.xml .添加 @EnableSpringConfigured如果要将 spring 配置应用于不受 spring 管理的 bean(@Configurable POJO)。

    关于spring - Spring 应用程序中非 Spring bean 的加载时间编织,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41383941/

    相关文章:

    java - Introductions in Introductions in Aspect Oriented Programming中的@DeclareParents注解

    java - 如何获取我的 war 文件的某个文件夹中的文件列表?

    spring - 如何在没有接口(interface)的情况下使用加载时间编织配置 AspectJ

    aop - Spring AOP : How exclude an unnecessary @Pointcut (@Around advice) execution due the execution from others @Pointcuts/advices

    java - 使用 Spring AOP 处理异常时获取传递给方法的参数值

    java - AspectJ @DeclareMixin,未由接口(interface)声明的方法不会被编织

    java - 在 Spring 和 Angular 应用程序中更改 JSON 结构的位置和方式

    java - Spring Authentication,如何为错误的凭证自定义responeText

    java - 使用 Java 代表用户在 Facebook 上发帖

    java - 如何向类中添加方法,其中方法名称基于 AspectJ 中现有的带注释的方法?