javascript
2.SpringBoot-Condition
一、 參考
04-SpringBoot自動配置-切換內置web服務器_嗶哩嗶哩_bilibili
二、 Condition
顧名思義:條件。有點類似于if語句,只不過是通過注解的形式來實現。
?????????以一個實際需求來學習該原理:有一個實體類User,想要創建該實例化對象,必須導入某第三方包(這個第三方包名必須可以自己設定),否則無法創建User的實例化對象。
?先看Project的結構,
? ? ? ? - ClassCondition.java :@ConditionOnClass注解的實現類,他人不可調用。
? ? ? ? - ConditionOnClass.java :注解,供他人調用的注解。
? ? ? ? - UserConfig.java :起控制作用,根據程序員設定的Conditioal判斷是否新建User對象并返回。
? ? ? ? - User.java :實體類,bean類。
? ? ? ? -?SpringbootConditionApplication.java:在此文件中獲取User這個bean對象
舉個例子:
? ? ? ? 相當于一個水龍頭流水的案例,User這個bean就是我們想接的水,UserConfig就是出水的那個管子,ClassCondition和@ConditionOnClass注解就是控制水流的水龍頭,只不過ClassCondition是@ConditionOnClass注解的實際實現,外面的人使用@ConditionOnClass注解即可,不用關心水龍頭里面的構造。
?
2.1?ClassCondition.java
????????實現Condition接口,需要重寫一個boolean matches()方法,該方法返回true/false,返回的真值就類似于if判斷的結果。
package com.itheima.springbootcondition.condtion;import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.env.Environment; import org.springframework.core.type.AnnotatedTypeMetadata;import java.util.Map;public class ClassCondition implements Condition {/**** @param context 上下文對象。用于獲取環境,IOC容器,ClassLoader對象* @param metadata 注解元對象。 可以用于獲取注解定義的屬性值* @return*/@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {/*//1.需求: 導入Jedis坐標后創建Bean//思路:判斷redis.clients.jedis.Jedis.class文件是否存在boolean flag = true;try {Class<?> cls = Class.forName("redis.clients.jedis.Jedis");} catch (ClassNotFoundException e) {flag = false;}return flag;*///2.需求: 導入通過注解屬性值value指定坐標后創建Bean//獲取注解屬性值 valueMap<String, Object> map = metadata.getAnnotationAttributes(ConditionOnClass.class.getName());//System.out.println(map);String[] value = (String[]) map.get("value");boolean flag = true;try {for (String className : value) {Class<?> cls = Class.forName(className);}} catch (ClassNotFoundException e) {flag = false;}return flag;} }?2.2?ConditionOnClass.java
????????這是一個注解類,右鍵Annotation即可新建。
????????里面通過@Conditional(ClassCondition.class)來和他的實現類ClassCondition.java完成綁定,外面的人直接使用@ConditionOnClass注解即可,不用關系它的實現類ClassCondition是怎么實現的,相當于一層封裝。
? ? ? ? 里面有一個String數組value,這個就是用來將外面的人傳遞給注解的參數傳遞給實現類ClassCondition.java。
package com.itheima.springbootcondition.condtion;import org.springframework.context.annotation.Conditional;import java.lang.annotation.*;@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) //運行時指定 @Documented//下面這個注解需要特別關注,就是考這個注解將ConditionOnClass和ClassCondition綁定到一起的 @Conditional(ClassCondition.class) public @interface ConditionOnClass {String[] value(); }?2.3?UserConfig.java
????????@configuration注解對象,會自動加載其中的config,下面的config主要完成的功能就是根據程序員設定的conditional條件判斷是否新建對象并返回給調用者。
? ? ? ? 在這里面使用剛才新建的注解。
package com.itheima.springbootcondition.config;import com.itheima.springbootcondition.condtion.ClassCondition; import com.itheima.springbootcondition.condtion.ConditionOnClass; import com.itheima.springbootcondition.domain.User; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration;@Configuration public class UserConfig {@Bean@ConditionOnClass("com.alibaba.fastjson.JSON")public User user(){return new User();}/*** 下面這個Case是調用現成的,不用我們自己寫* @return*/@Bean@ConditionalOnProperty(name = "itcast",havingValue = "itheima")public User user2(){return new User();}}2.4 User.java
實體對象類,自由添加即可。
package com.itheima.springbootcondition.domain;public class User { }2.5?SpringbootConditionApplication.java
在此函數中調用UserConfig中的函數獲取User這個bean的實例化對象。
package com.itheima.springbootcondition;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication public class SpringbootConditionApplication {public static void main(String[] args) {//啟動SpringBoot的應用,返回Spring的IOC容器ConfigurableApplicationContext context = SpringApplication.run(SpringbootConditionApplication.class, args); /*//獲取Bean,redisTemplateObject redisTemplate = context.getBean("redisTemplate");System.out.println(redisTemplate);*/Object user = context.getBean("user2");System.out.println(user);}}三、小結
大部分情況下不需要我們自己寫。
?
總結
以上是生活随笔為你收集整理的2.SpringBoot-Condition的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Excel - 学习 - 笔记4: Ex
- 下一篇: 计算机现代教育技术工作计划,现代教育技术