本文主要介紹spring和springboot提供的幾個annotation和interface實現(xiàn)符合幾種既定條件或自定義條件下的autoconfigure
一畏浆、spring實現(xiàn)自定義條件下的autoconfigure
spring為我們提供了@Conditional
和Condition.class
搭配使用的方式實現(xiàn)自定義條件下的autoconfigure悄蕾,源碼如下:
編寫一個class姆涩,繼承Condition
這個接口息裸,重寫matches()
方法顶滩,當該方法返回true時auto-configure生效铃诬,反之不生效贿肩,代碼如下
public class MyCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
//what.is.you.name的value寫在application.properties中
String name = conditionContext.getEnvironment().getProperty("what.is.you.name");
return "bamu".equals(name);
}
}
matches
方法提供了ConditionContext
和AnnotatedTypeMetadata
兩個參數(shù),我們可以通過ConditionContext
獲取到編寫在application-xxx.properties中的配置信息聂使。
application.properties配置文件內容如下:注意我們現(xiàn)在定義的value和Mycondition
中定義的不同
what.is.you.name=heiheihei
編寫一個Config類壁拉,其中runnableBean1拐叉、runnableBean3需要滿足我們以上自定義的條件才允許被自動注入。
@SpringBootConfiguration
public class ConditionBeanConfig {
@Bean
@Conditional(MyCondition.class)
public Runnable runnableBean1() {
return () ->{};
}
@Bean
public Runnable runnableBean2() {
return () ->{};
}
@Bean
@Conditional(MyCondition.class)
public Runnable runnableBean3() {
return () ->{};
}
}
執(zhí)行main方法結果如下:
@SpringBootApplication
public class BlogApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(BlogApplication.class, args);
String[] beans = context.getBeanNamesForType(Runnable.class);
System.out.println(Arrays.toString(beans));
context.close();
}
}
修改application.properties扇商,將value改為
MyCondition.class
中定義的值后執(zhí)行結果如下:
我們發(fā)現(xiàn)凤瘦,自定義的MyCondition已經生效。細心的讀者可能發(fā)現(xiàn)案铺,@Conditional注解源碼中傳入的value是一個數(shù)組
Class<? extends Condition>[] value();
蔬芥,所以我們可以傳入多個自定義Condition,例如@Condition({MyCondition.class, YourCondition.class})
另外控汉,@Conditianal
不僅可以寫在方法上笔诵,還可以寫在configuration.class上,這樣該類中的所有bean都需要滿足自定義的Condition才能被自動加載姑子。
二乎婿、spring-boot提供的幾個autoconfigure annotation
springboot為我們提供了一批實用的XxxCondition,查看了他們的源碼后發(fā)現(xiàn)街佑,他們都實現(xiàn)了spring提供的Condition接口谢翎,然后編寫對應的annotation。我們在使用他們的時候沐旨,只需要在需要的地方寫上這些annotation就好了森逮。這些注解都在springboot提供的jar包中
package org.springframework.boot.autoconfigure.condition
通過這幾個annotation的命名,我們已經能夠大概的猜測到他們能夠實現(xiàn)哪些功能磁携。以下舉出其中幾個比較常用的注解用法褒侧,讀者可以查看源碼,知曉具體的使用方式谊迄。
1)@ConditionalOnBean
/@ConditionalOnMissingBean
當容器中存在/不存在某個bean時闷供,加上此注解的bean被自動注入
@Bean
@ConditionalOnBean(name="com.springboot.condition.User")
public Runnable runnableBean2() {
return () ->{};
}
@Bean
@ConditionalOnBean(value=User.class)
public Runnable runnableBean2() {
return () ->{};
}
2)@ConditionalOnJava
根據(jù)當前使用的JDK版本,判斷是否自動注入
//使用jdk8才注入此bean
@Bean
@ConditionalOnJava(ConditionalOnJava.JavaVersion.EIGHT)
public Runnable runnableBean2() {
return () ->{};
}
3)@ConditionalOnWebApplication
/@ConditionalOnWebApplication
web環(huán)境下加載/不加載此bean
@Bean
@ConditionalOnWebApplication
public Runnable runnableBean2() {
return () ->{};
}
好了统诺,Spring-Boot autoconfigure之Condition就到這里歪脏,有興趣的讀者可以自己去試驗一下。接下來會持續(xù)推出一系列Java干貨篙议,敬請期待唾糯。如果有不正確或是不完整的地方怠硼,還望讀者不吝賜教鬼贱,直接評論!