在spring项目中使用AOP注释@Flip时,FF4J不会翻转

时间:2017-10-02 12:38:57

标签: java spring ff4j

我在example之后注射了ff4jFf4jConfiguration.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 正确注入并具有相应的属性:

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

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

我希望永远不会调用方法log2,但它是(所有使用的方法都被调用,没有被忽略)。有人可以帮我解决我在这里做错了吗?

1 个答案:

答案 0 :(得分:3)

注释Flip应位于接口上,而不是位于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 Context中添加位于包org.ff4j.aop中的Autoproxy。但它已经通过添加autoconfigure依赖来完成。

  2. 在界面上添加@Flip注释并创建不同的实现:

  3. 以下是代码示例:

    @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,这里提供了两种可行的解决方案: https://github.com/clun/ff4j-samples/tree/master/ff4j-sample-sergii

    你会考虑使用'FF4J在使用AOP注释@Flip时不翻转'更新标题,我的眼睛在流血