Springの@Conditional条件付きアセンブリBean

序文

Springが条件に従ってBeanをアセンブルする方法を理解することは、開発のためのSpringbootの使用とソースコードの理解に役立ちます。

オープンソースの精神を受け継ぎ、技術知識を広める。

2つの@Conditional Assembly Bean

アイデアは次のとおりです

  1. Springは@Conditional、条件に応じてBeanをアセンブルするかどうかを実装するアノテーションを提供し、条件に従ってBeanを動的にアセンブルできるようにします。
  2. @Conditionalアノテーションを条件Beanと一致させる必要があるかどうかを判断するには、条件インターフェースを実装して、matchesメソッドを書き換えるだけです。
  3. @ConditionalBeanをアセンブルする必要があるかどうかを判断するために、matchesメソッドによって返されたブール値に応じて

実装プロセスは次のとおりです

2.1ユーザークラス

ユーザークラスは、クラスにBeanが装備されているかどうかを構成するために使用されます

/**
 * @Author lsc
 * <p> </p>
 */
public class User {

    private String userName;

	// 省略 set get
}
复制代码

2.2条件実装クラス

RuntimeExistは、conditionContextを使用して条件を実装し、jvm環境変数を取得します(存在する場合はtrueを返し、それ以外の場合はfalseを返します)conditionContextには次のメソッドもあります

  • getRegistry():BeanDefinitionRegistryを使用してBean定義を確認します。
  • getBeanFactory():ConfigurableListableBeanFactoryを使用して、Beanが存在するかどうかを確認します。
  • getEnvironment():環境環境変数
  • getResourceLoader():ResourceLoaderによってロードされたリソース。
  • getClassLoader():ClassLoaderによってロードされたクラス。
public class RuntimeExist  implements Condition {
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        // 获取jvm 运行时环境
        Environment environment = conditionContext.getEnvironment();
        // 检查 jvm 运行时环境是否存在属性
        return environment.containsProperty("java.runtime.name");
    }
}
复制代码

2.3ユーザー設定

RuntimeExistのmatchesメソッドの戻り値がBeanのアセンブルであるかどうかに応じて、プロパティ名zszxzがここに設定され、テストが容易になります。

/**
 * @Author lsc
 * <p> </p>
 */
@Configuration
public class UserConfig {

    @Bean
    // 根据 RuntimeExist的 matches 方法的返回值 是否装配bean
    @Conditional(RuntimeExist.class)
    public User user(){
        User user = new User();
        user.setUserName("zszxz");
        return user;
    }
}
复制代码

2.4テスト

java.runtime.name属性がjvmランタイム環境に存在するため、アセンブリは成功し、zszxzが出力されます。

java.runtime.nameをjvm実行時に存在しない属性に変更すると、テストは例外を報告します。

@RunWith(SpringJUnit4ClassRunner.class)//创建spring应用上下文
@ContextConfiguration(classes= UserConfig.class)//加载配置类
public class ConditionTest {

    @Autowired
    User user;

    @Test
    public void test(){
        // zszxz
        System.out.println(user.getUserName());
    }
}
复制代码

送信元アドレス:公開アカウントの要約記事

おすすめ

転載: juejin.im/post/5e970169518825738b421d75