【问题标题】:How to enable/disable load time weaving based on a config property如何基于配置属性启用/禁用加载时间编织
【发布时间】:2022-01-02 18:22:30
【问题描述】:

通过使用@EnableLoadTimeWeaving 注释配置类并添加aop.xml,我已在我的Spring 项目中成功启用AspectJ 的LoadTimeWeaving。

但是,我想让它由配置驱动,默认情况下它是关闭的,并且仅在设置了某些配置属性时才启用。为此,我看到@EnableLoadTimeWeaving 采用属性aspectjWeaving,它可以是ENABLEDDISABLEDAUTODETECT(也是默认值)。

我们可以通过从属性文件中读取一些配置来以某种方式设置aspectjWeaving 属性的值吗?或者,有没有其他方法可以使其有条件地启用/禁用?

这不是 Spring Boot 应用程序。

【问题讨论】:

  • 注释值是静态的,所以你不能这样做。使用 Spring Boot 时,很容易有条件地包含该配置。
  • 这个问题仍然被列为未回答,尽管有两个人写了一个答案。请检查答案,然后接受并投票,如果您不理解,请对其发表评论。谢谢。

标签: java spring aspectj java-annotations load-time-weaving


【解决方案1】:

免责声明:此答案独立于 Spring。这只是关于 ApsectJ。但也可以在 Spring 或 SpringBoot 项目中执行此操作。

如果你想控制的是编织本身而不是通知内部发生的事情,那么有以下几种可能的方式:

1。不要传递 Java 代理参数

虽然这作为一个答案听起来微不足道,但它安全而强大。这将关闭所有加载时间编织,这是我们有时想要的。

(仅供参考,当我们要编织时,我们将-javaagent:<path-to-aspectjweaver-1.9.6.jar>作为JVM参数传递。)

2。在aop.xml 中添加排除项

如果您想从编织中排除特定的类集,请在 <weaver> 标记中排除它们。您可以参考这里的确切语法:Eclipse AspectJ docs

<aspectj>
    <weaver>
        <exclude within="test..*" />
    </weaver>
    <aspects>
        ...
    </aspects>
</aspectj>

3。切入点级别的控制

您还可以将if() 添加到您的切入点并使用某些条件(例如Java 系统属性)跳过编织。这是一个示例,如果系统属性 skip.tests 设置为 yY,则跳过所有测试代码。

@Pointcut( "execution( * test..*(..) ) && if()" )
public static boolean allTestCode(){
    String instr = System.getProperty( "skip.tests", "n" );
    return instr.equalsIgnoreCase( "Y" );
}

4。控制里面的通知

(这不是您要的,但我在这里添加只是为了完成;它可能会帮助有类似需求的其他人。)

在此方法中,允许所有编织发生,但仅有条件地执行建议的代码(例如,基于配置)。

@Around( "allTestCode()" )
public Object aroundAllTestCode( ProceedingJoinPoint thisJoinPoint ){
    /* Config controlled execution */
    if( System.getProperty( "advice.enabled" ).equalsIgnoreCase( "Y" ) ) applyAdvice();
    
    return thisJoinPoint.proceed();
}

【讨论】:

  • @kriegaex 抱歉,今天才看到。我猜你想解决提问者(@saharsh-jain)而不是我。您可能希望针对该问题重新发布此内容。
【解决方案2】:

使用经典的XML配置而不是注解,那么它是“配置驱动的”,如果你所说的这个术语是一个你不需要编译的文件。

根据Spring manual,只需使用

<beans>
    <context:load-time-weaver/>
</beans>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多