Spring註解之@Conditional
Spring註解之@Conditional
前言
Spring4推出了@Conditional註解,方便程式根據當前環境或者容器情況來動態注入bean,SpingBoot在@Conditional的基礎上派生出許多註解,如@ConditionalOnMissingBean、@ConditionalOnExpression、@ConditionalOnClass等,這樣使得我們動態注入Bean更加簡潔方便,所以我覺得我們有必須來好好的學習一下@Conditional註解。
原始碼解析
- @Conditional註解原始碼
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
Class<? extends Condition>[] value();
}
從這個註解的原始碼我們可以看出這個註解是作用在類上或者方法上的,並且@Conditional保留在執行時期,@Conditional註解只有一個value屬性,它是Condition的子類。
- Condition原始碼
public interface Condition {
/**
* Determine if the condition matches.
* @param context the condition context
* @param metadata metadata of the {@link org.springframework.core.type.AnnotationMetadata class}
* or {@link org.springframework.core.type.MethodMetadata method} being checked.
* @return {@code true} if the condition matches and the component can be registered
* or {@code false} to veto registration.
*/
boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}
- 這是一個函式介面,因此可以用作lambda表示式或方法引用的賦值目標
- 此介面是配合@Conditional註解使用
- 這個Condition介面只有matches一個方法,從matches方法的註釋中,得知這個介面的作用就是判斷條件是否匹配返回true或false,如果返回成功就註冊Bean,否則就不註冊
- matches方法的兩個引數
- context :環境條件(根據環境判斷是否需要註冊Bean)
- metadata:被檢查的類或方法的後設資料(被@Conditional標註的方法或類的後設資料)
@Conditional工作流程
它的作用就是在需要註冊Bean的時候,就會檢查自身是否標註了@Conditional註解,如果標註@Conditional註解就會通過它的value屬性,進行判斷是否需要註冊Bean
@Conditaional實戰
我們來做個案例,開酒店需要營業執照,如果有營業執照就將Hotel注入Spring容器,如果沒有就拒絕注入。
- 酒店實體類
/**
* @author shiKui
*/
public class Hotel {
}
我們需要注入Spring容器中的實體類
- 實現Condition
public class HotelCondition implements Condition {
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String has = context.getEnvironment().getProperty("businessLicense");
return "true".equals(has);
}
}
實現Condition介面配合@Conditional一起使用,如果環境中的businessLicense(營業執照)為true則可以進行注入,否則反之。
- 配置類
/**
* @author shiKui
*/
@Configuration
public class HotelConditionConfig {
@Conditional(value = HotelCondition.class)
@Bean
public Hotel hotel(){
return new Hotel();
}
}
注入Hotel物件到Spring容器中,但是使用了@Conditional,那麼會根據HotelConditionConfig中的matches的返回值是否注入Hotel物件
- 測試類
public class ConditionTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.getEnvironment().getSystemProperties().put("businessLicense",true);
applicationContext.register(HotelConditionConfig.class);
applicationContext.refresh();
String[] beanNamesForType = applicationContext.getBeanNamesForType(Hotel.class);
for (String s : beanNamesForType) {
System.out.println(s);
}
}
}
通過無參構造方法建立AnnotationConfigApplicationContext 物件,並在Spring的上下文環境中新增businessLicense(營業執照)為true,然後載入容器,檢視Hotel是否注入容器中
- 執行結果
我們可以看到hotel成功注入了。@Condition也可以作用於方法之上,但是使用方法還是一樣的。
至此相信大家對@Conditional註解也有一定的瞭解了。
相關文章
- Spring條件註解@ConditionalSpring
- 【spring 註解】第3篇:@Scope、@Lazy和@Conditional註解Spring
- Spring @Conditional註解 詳細講解及示例Spring
- 【譯】Spring 4.0帶來的@Conditional註解Spring
- SpringBoot(15)—@Conditional註解Spring Boot
- Spring5原始碼深度分析(二)之理解@Conditional,@Import註解Spring原始碼Import
- Spring註解之@ImportSpringImport
- Spring 註解程式設計之模式註解Spring程式設計模式
- Spring Framework 條件裝配 之 @ConditionalSpringFramework
- Spring Boot註解 之 @RequestXSpring Boot
- Spring系列之新註解配置+Spring整合junit+註解注入Spring
- spring-boot學習筆記之ConditionalSpringboot筆記
- Spring 註解面面通 之 @MatrixVariableSpring
- Spring原始碼學習之:spring註解@TransactionalSpring原始碼
- TypeScript 之 Conditional TypesTypeScript
- Spring註解Spring
- 【Spring註解】事務註解@TransactionalSpring
- Spring註解詳解Spring
- Spring進階案例之註解和IoC案例Spring
- Spring學習之05使用註解開發Spring
- Spring框架系列(二)之Bean的註解管理Spring框架Bean
- Spring5:@Autowired註解、@Resource註解和@Service註解Spring
- Spring常用註解Spring
- Spring註解大全Spring
- Spring boot註解Spring Boot
- Spring新註解Spring
- spring註解2Spring
- Spring 各種註解備註Spring
- SPRING-spring註解整理Spring
- Spring Boot系列十八 Spring AOP + 註解實現統一註解Spring Boot
- Spring註解?啥玩意?Spring
- spring 框架常用註解Spring框架
- Spring : @SessionAttributes註解SpringSession
- Spring(使用註解配置)Spring
- Spring 註解開發Spring
- Spring註解簡析Spring
- Spring註解系列——@PropertySourceSpring
- Spring-註解注入Spring