サーチ…


備考

条件を使用している際の注意点

  • 条件クラスはダイレクトクラス(春のビーンではない )と呼ばれるので、 @Valueプロパティのインジェクションを使用することはできません。つまり、他のスプリングビーンを@Valueすることはできません
  • From java docs - 条件はBeanFactoryPostProcessorと同じ制限に従い、Beanインスタンスと決して相互作用しないように注意する必要がありますBeanFactoryPostProcessorはBean定義と対話して変更することができますが、Beanインスタンスは変更しないことがあります。そうすると、Beanのインスタンス化が早すぎてコンテナに違反し、意図しない副作用を引き起こす可能性があります。

プロパティーまたは値が指定されている場合にのみBeanを登録する

Spring Beanは、特定の値を持つ場合または指定されたプロパティが満たされている場合にのみ登録されるように設定できます。これを行うには、 Condition.matchesを実装してプロパティ/値を確認します。

public class PropertyCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return context.getEnvironment().getProperty("propertyName") != null;
        // optionally check the property value
    }
}

Javaの設定では、Beanを登録するための条件として上記の実装を使用します。 @Conditionalアノテーションの使用に注意してください。

@Configuration
public class MyAppConfig {

    @Bean
    @Conditional(PropertyCondition.class)
    public MyBean myBean() {
      return new MyBean();
    }
}

PropertyConditionでは、任意の数の条件を評価できます。ただし、それぞれの条件を緩やかに結合した状態にするために、実装を分離することをお勧めします。例えば:

@Configuration
public class MyAppConfig {

    @Bean
    @Conditional({PropertyCondition.class, SomeOtherCondition.class})
    public MyBean myBean() {
      return new MyBean();
    }
}

条件注釈

主な@conditional付き注釈を除いて、異なる場合に使用される同様の注釈のセットがあります。

クラス条件

@ConditionalOnClass@ConditionalOnMissingClass注釈構成は特定のクラスの有無に基づいて含まれることを可能にします。

たとえば、 OObjectDatabaseTx.classが依存関係に追加され、 OrientWebConfigurer Beanが存在せず、コンフィギュレーションを作成する場合

@Bean
@ConditionalOnWebApplication
@ConditionalOnClass(OObjectDatabaseTx.class)
@ConditionalOnMissingBean(OrientWebConfigurer.class)
public OrientWebConfigurer orientWebConfigurer() {
    return new OrientWebConfigurer();
}

豆の状態

@ConditionalOnBean@ConditionalOnMissingBean注釈はBeanが特定豆の有無に基づいて含まれることを可能にします。 value属性を使用して、タイプ別にBeanを指定したり、名前でBeanを指定する名前を指定することができます。検索属性を使用すると、Beanの検索時に考慮する必要があるApplicationContext階層を制限できます。

定義済みのBeanがないかどうかをチェックするときは、上記の例を参照してください。

プロパティ条件

@ConditionalOnPropertyアノテーションを使用すると、Spring環境プロパティに基づいてコンフィグレーションを含めることができます。 prefix属性とname属性を使用して、チェックするプロパティを指定します。デフォルトでは、存在し、 falseないプロパティはすべて一致します。また、使用して、より高度なチェックを作成することができますhavingValuematchIfMissing属性を。

@ConditionalOnProperty(value='somebean.enabled', matchIfMissing = true, havingValue="yes")
@Bean 
public SomeBean someBean(){
}

リソース条件

@ConditionalOnResourceアノテーションを使用すると、特定のリソースが存在する場合にのみ設定を含めることができます。

@ConditionalOnResource(resources = "classpath:init-db.sql") 

Webアプリケーションの条件

@ConditionalOnWebApplication@ConditionalOnNotWebApplication注釈は、コンフィギュレーションは、アプリケーションが「Webアプリケーション」であるかどうかに応じて含まれることを可能にします。

@Configuration
@ConditionalOnWebApplication
public class MyWebMvcAutoConfiguration {...}

SpEL発現条件

@ConditionalOnExpressionアノテーションを使用すると、SpEL式の結果に基づいて設定を@ConditionalOnExpressionことができます。

@ConditionalOnExpression("${rest.security.enabled}==false")


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow