javacontinue的用法?
在開發基于SpringBoot的項目時,經常看到下面的注解:
雖然能大致上理解它們的用途,并且能簡單使用,但是還是想更加深入的學習下這些條件裝配注解。
看了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();
}
@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;}
}
利用@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);}
}
@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)}
如果是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;}
}
@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)
@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)}
@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);}
}
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态