gpt4 book ai didi

java - FF4J在spring项目中使用AOP注解@Flip时不会翻转

转载 作者:行者123 更新时间:2023-11-29 04:25:36 33 4
gpt4 key购买 nike

我在 example 之后注入(inject)了 ff4j . Ff4jConfiguration.class:

@Bean
@ConditionalOnMissingBean
public FF4j getFF4j() {
return new FF4j("ff4j.xml");
}

应用程序加载器也发生了变化:

@Import( {..., Ff4jConfiguration.class})
@AutoConfigureAfter(Ff4jConfiguration.class)

我的ff4j.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<ff4j xmlns="http://www.ff4j.org/schema/ff4j"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.ff4j.org/schema/ff4j http://ff4j.org/schema/ff4j-1.4.0.xsd">
<features>
<feature uid="occurrence-logging" enable="false"/>
<feature uid="check-no-logging" enable="false"/>
<feature uid="check-logging" enable="true"/>
</features>
</ff4j>

我要验证的 bean ff4j

@Component
public class JustToCheck {
@Autowired
private FF4j ff4j;

@Flip(name="occurrence-logging")
public void log() {
System.out.println("hello");
}

@Flip(name="check-no-logging")
public void log2() {
System.out.println("hello2");
}

@Flip(name="check-logging")
public void log3() {
System.out.println("hello3");
}
}

在运行时,我看到 ff4j bean 正确注入(inject)并具有相应的属性:

 ff4j.check("check-no-logging")
> result=false

ff4j.check("check-logging")
> result=true

我希望方法 log2 永远不会被调用,但它确实是(调用了所有使用的方法,没有一个被忽略)。有人可以帮我看看我在这里做错了什么吗?

最佳答案

注解 Flip 意味着定位在 Interface 而不是 bean 上。原因是强制人们在使用 AOP 时为相同的方法创建不同的实现。 (稍后需要清洁时更简单)。

我可以提出 2 个解决方案。第一个似乎很明显,但如果您没有多个实现...

@Component
public class JustToCheck {

@Autowired
private FF4j ff4j;

public void log2() {
if (ff4j.check("check-no-logging")) {
System.out.println("hello2");
} else {
System.out.println("As check-no-logging is disable... do nothin");
}
}
}

第二个是确实使用 AOP,你必须:

  1. 在您的 Spring 上下文中添加位于 org.ff4j.aop 包中的 Autoproxy。但它已经通过添加自动配置依赖项完成了。

  2. 在接口(interface)上放置@Flip注解并创建不同的实现:

这是一个代码示例:

@Component
public interface JustToCheck {
@Flip(name="check-no-logging", alterBean="just-to-check")
void log2();
}

@Component("just-to-check")
public class JustToCheckImpl implements JustToCheck {
public void log2() {
System.out.println("hello2");
}
}

@Component("just-to-check-mock")
public class JustToCheckMock implements JustToCheck {

public void log2() {
System.out.println("As check-no-logging is disable... do nothing");
}
}

Bug 已被重现,此处提供了 2 个可行的解决方案: https://github.com/clun/ff4j-samples/tree/master/ff4j-sample-sergii

关于java - FF4J在spring项目中使用AOP注解@Flip时不会翻转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46525622/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com