如何使用@Conditional批注指定多个条件

时间:2015-11-24 10:28:12

标签: java spring annotations

我是第一次做一个Spring项目而且遇到了问题。

我有一个java类:

@Component
@Conditional(AppA.class)
public class AppDeploy {...}

现在我需要修改它:

@Component
@Conditional(AppA.class or AppB.class)
public class AppDeploy {...}

有人可以帮我解决这个问题吗? 感谢您的期待。

3 个答案:

答案 0 :(得分:1)

您可以创建自己的条件注释,使您可以提供参数,然后根据提供的参数值应用测试条件:

有关详细信息,请参阅此帖子:http://www.javacodegeeks.com/2013/10/spring-4-conditional.html

答案 1 :(得分:0)

这很简单,在发布问题之前应该花一点时间。 我就是这样做的。

创建了一个新类:

public class AppAOrB implements Condition {
    public AppAOrB() {
        super();
    }

    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        Environment env = conditionContext.getEnvironment();
        return env.containsProperty("APP_A")||env.containsProperty("APP_B");
    }
}

然后用它:

@Component
@Conditional(AppAOrB.class)
public class AppDeploy {...}

答案 2 :(得分:0)

我的方法略有不同。 从您的代码中,我可以得出结论(也许我错了),您已经实现了条件AppA.classAppB.class,并且您想知道如何以一种优雅的方式实现AppAOrB.class条件。当您考虑到AppA.classAppB.class只是常规的Java类时,那么实现很明显:

public class AppAOrB implements Condition {

    @Override
    public boolean matches(@NonNull ConditionContext context, @NonNull AnnotatedTypeMetadata metadata) {
        return new AppA().matches(context, metadata) || new AppB().matches(context, metadata);
    }
}

这种方法的优点是它没有DRY规则。