【问题标题】:Load time weaving for non-spring beans in a spring application春季应用程序中非弹簧豆的加载时间编织
【发布时间】:2016-12-29 16:53:23
【问题描述】:

我有一个带有一些 REST 控制器、服务类和助手类的 Spring Boot 应用程序。控制器和服务类是 spring 管理的,而 helper 类不是 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() {
    }
}
  • 调用控制器时,启用 Aspect 的日志记录适用于控制器和服务功能,但不适用于辅助功能。
  • 如果我们在控制器中自动装配辅助类,非静态辅助方法开始显示 aspectj 日志。但是,静态辅助方法仍然不显示 aspectj 日志

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我读过类似的关于堆栈溢出的 cmets,但我想知道为什么它不适用于配置中包含的 EnableLoadTimeWeaving。我没有包括 EnableAspectJAutoProxy 所以 spring 不应该干扰编织过程。此外,部署服务器可能不在我的控制之下,因此对添加命令行 VM 参数持怀疑态度。对于最后一部分,你的意思是每个不是 spring 管理的类都应该用“Configurable”注释吗?
    • @EnableLoadTimeWeaving 通过类加载器魔法工作。通过类加载做这种事情总是有风险的,所以我尽量避免它。这就是为什么我从不使用 Spring 的@EnableLoadTimeWeaving。查看LoadTimeWeaver 类的层次结构以了解支持哪些环境。然后,选择您的环境并查看特定实现类的文档以了解您可能必须提供的任何其他配置。当然,最好的办法是摆脱所有这些东西,只使用编译时编织。或者只是控制您的服务器并使用代理
    • 例如,如果您使用的是 Tomcat 版本 [6..8),则需要在您的战争中的 META-INF/context.xml 文件中明确指定类加载器:<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
    • @Configurable 注释是必需的,如果你希望你的非 Spring 托管 bean 在春季之前在构建时进行配置。您不需要它来将编织应用于课程。如果这些非 Spring 托管类具有 @Autowired 字段或需要对其应用任何其他 Spring bean 后处理,则您将需要它。
    猜你喜欢
    • 1970-01-01
    • 2016-02-22
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多