日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

2.SpringBoot-Condition

發布時間:2024/1/18 javascript 69 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。