javacontinue的用法,SpringBoot教程(6) @Conditional 詳細講解和示例

 2023-12-12 阅读 30 评论 0

摘要:@Conditional 詳細講解和示例一、@Conditional簡介二、示例:加載2個Bean1. 定義Person類2. 利用@Configuration + @Bean加載2個Bean3. 測試是否都加載到Spring容器中三、利用@Conditional根據條件加載Bean1. 創建條件判斷的類2. @Conditi

@Conditional 詳細講解和示例

javacontinue的用法?

一、@Conditional簡介

在開發基于SpringBoot的項目時,經常看到下面的注解:

  • ConditionalOnProperty
  • ConditionalOnResource
  • ConditionalOnBean
  • ConditionalOnClass
  • ConditionalOnMissingBean
  • ConditionalOnMissingClass

雖然能大致上理解它們的用途,并且能簡單使用,但是還是想更加深入的學習下這些條件裝配注解。

看了B站尚硅谷雷豐陽老師的《Spring注解驅動教程》,簡單整理如下筆記。

上面注解在定義時,都有@Conditional\color{red}{@Conditional}@Conditional注解修飾,例如下面:

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnPropertyCondition.class)
public @interface ConditionalOnProperty {//省略其它
}

@Conditional的定義:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {Class<? extends Condition>[] value();
}
  • @Conditional\color{red}{@Conditional}@Conditional的作用是按照一定的條件進行判斷,滿足條件給容器注冊Bean
  • 從代碼中可以看到,需要傳入一個Class數組\color{red}{Class數組}Class,并且需要繼承Condition接口
  • Condition是個接口\color{red}{接口},需要實現matches方法,返回true則注入Bean,false則不注入

二、示例:加載2個Bean

1. 定義Person類

@Data
public class Person {private String name;private int age;public Person(){System.out.println("初始化:Person()");}public Person(String name, int age) {System.out.println("初始化:Person(String name, int age)");this.name = name;this.age = age;}
}

2. 利用@Configuration + @Bean加載2個Bean

利用@Configuration + @Bean加載2個Bean

@Configuration
public class MyBeanConfig {@Beanpublic Person person1(){return new Person("Bill Gates", 66);}@Beanpublic Person person2(){return new Person("Linus", 50);}
}

3. 測試是否都加載到Spring容器中

@SpringBootApplication
public class DictApplication {public static void main(String[] args) {ConfigurableApplicationContext run = SpringApplication.run(DictApplication.class, args);Map<String, Person> personMap = run.getBeansOfType(Person.class);System.out.println(personMap);}
}

結果如下:

{person1=Person(name=Bill Gates, age=66), person2=Person(name=Linus, age=50)}

三、利用@Conditional根據條件加載Bean

1. 創建條件判斷的類

如果是Windows系統則加載Bean

public class WindowsCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {Environment env = context.getEnvironment();String property = env.getProperty("os.name");if (property.contains("Windows")){return true;}return false;}
}

如果是Linux系統則加載Bean

public class LinuxCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {Environment env = context.getEnvironment();String property = env.getProperty("os.name");if (property.contains("Linux")){return true;}return false;}
}

2. @Conditional放在方法上\color{red}{方法上}

@Conditional放在方法上,只能決定該單個方法返回的實例是否加載到容器

@Configuration
public class MyBeanConfig {@Bean@Conditional(WindowsCondition.class)public Person person1(){return new Person("Bill Gates", 66);}@Bean@Conditional(LinuxCondition.class)public Person person2(){return new Person("Linus", 50);}
}

因為我這是Windows 10,所以返回如下:

{person1=Person(name=Bill Gates, age=66)

3. @Conditional放在類上\color{red}{類上}

@Conditional放在類上,則可以判斷該類下一組的Bean是否可以加載到Spring容器

@Configuration
@Conditional(WindowsCondition.class)
public class MyBeanConfig {@Bean//@Conditional(WindowsCondition.class)public Person person1(){return new Person("Bill Gates", 66);}@Bean//@Conditional(LinuxCondition.class)public Person person2(){return new Person("Linus", 50);}
}

因為我這是Windows 10,@Conditional(WindowsCondition.class)生效可用,所以返回如下:

{person1=Person(name=Bill Gates, age=66), person2=Person(name=Linus, age=50)}

4. @Conditional傳多個\color{red}{多個}條件,是且\color{red}{且}關系

@Conditional接受一個Class數組,可以傳多個條件,當所有條件都是true時,才生效
可想項目的代碼是不會加載Person對象的,因為
WindowsCondition.class返回 true,
LinuxCondition.class返回 false,
所以MyBeanConfig整個類失效,不能加載它下面的Bean。

@Configuration
@Conditional({WindowsCondition.class, LinuxCondition.class})
public class MyBeanConfig {@Bean//@Conditional(WindowsCondition.class)public Person person1(){return new Person("Bill Gates", 66);}@Bean//@Conditional(LinuxCondition.class)public Person person2(){return new Person("Linus", 50);}
}

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/196284.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息