中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot自動裝配的優點有哪些

發布時間:2021-11-17 14:24:43 來源:億速云 閱讀:342 作者:iii 欄目:開發技術

本篇內容介紹了“SpringBoot自動裝配的優點有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

一、 springBoot自動配置的好處

1、 回想一下當你在使用spring來搭建一個項目的時候

你需要編寫很多的有關spring的xml。例如讀取屬性配置的bean、數據源bean、事務管理工廠bean、mybatis與spring整個的bean等等。再次利用該框架搭建項目的時候,又是周而復始的操作。

但是現在當你使用springBoot搭建項目的時候,你會發現所有的配置你都不用去編寫就可以幫你去實現(僅僅需要在連接外部數據庫的時候需要進行配置,其實如果使用內嵌數據庫h3 則你完全不必需要application.properties配置文件)。

你可以在你的具體的業務代碼中使用@AutoWried @Resource注解將數據源,事務工廠等注入到業務層,像是你自己配置那樣。

2、這時我們會有一個疑問

springBoot到底做了什么讓我們可以不用配置,而使用那些功能對象。

其實springBoot使用基于條件的自動注入原理,即為當滿足某個條件的時候,spring會實例化該注解對應的bean,將其放入到Srping上下文中,讓你可以輕松的使用。SpringBoot實現條件配置離不開它的核心組件@Conditional。

下面我們慢慢的來揭開springBoot自動配置的神秘面紗。

二、@Conditional注解相關介紹

1、@Conditional小demo

@Conditional 是個什么鬼,不解釋來個小的demo大致了解一下

描述一下demo場景 :Life實體bean在特定條件(@Conditional)下,被springBoot初始化,并放置到spring上下文環境中。

1.1、 Life 實體類

/**
 * 夢想存在,生命才有意義
 */
public class Life {
    //工作 
    private String work;
    //學習
    private String study
    //愛
    private String love;
 
  //省略seter /geter
 
}

1.2、 編寫我們自己的條件匹配規則

/**
 * 實現ConfigurationCondition(該接口繼承了Condition)
 */
public class MyTestConditional implements ConfigurationCondition {
    /**
     * 設置使用該類進行解析的時機
     * 1、REGISTER_BEAN:會在注冊Bean的時候進行condition的解析
     *  即為在對應的@Bean注解和@condition注解組合使用的時候 進行條件的判斷
     *  @Bean注解對應spring 的xml的<bean/>標簽
     * 2、PARSE_CONFIGURATION:會在解析@Configuration時進行condition的解析
     *    即為在對應的@Configuration注解和@condition注解組合使用的時候 進行條件的判斷
     *    @Configuration注解對應spring 的xml的<beans/>標簽
     * @return
     */
    @Override
    public ConfigurationPhase getConfigurationPhase() {
        return ConfigurationPhase.REGISTER_BEAN;
    }
    /**
     * 該方法為條件判斷的核心 只有該方法返回為true 則表示其條件成立 ,執行相應的配置
     * @param conditionContext
     * @param annotatedTypeMetadata
     * @return
     */
    @Override
    public boolean matches(ConditionContext conditionContext, 
    AnnotatedTypeMetadata annotatedTypeMetadata) {
              return false;  //表示驗證不通過
    }

該類實現了ConfigurationCondition 有如下兩個方法

1、 getConfigurationPhase() 該條件規則起作用的時候

2、 matches()條件匹配規則 這里為了演示不做具體的邏輯條件的處理

返回一個布爾值,如果為ture 則表示條件成立 配置生效

反之不生效。

1.3、編寫我們的java實例bean自動配置

@Configuration
//@Configuration標注在類上,相當于把該類作為spring的xml配置文件中的<beans>,
// 作用為:配置spring容器(應用上下文)
public class ServerAutoConfiguration {
 
    @Configuration  //spring的xml配置文件中的<beans>
    //使用該注解表明,在springBoot啟動的時候只有滿足MyTestConditional.class 才生成對應的Life 對象
    //即 MyTestConditional中的match()返回true @Bean生效
    @Conditional(MyTestConditional.class)
    public static class StudentAutoConfiguration {
        @Bean
        public Life create() {
            System.out.println("life start....");
            return new Life("努力工作","不斷的學習","敢愛敢恨");
        }
    }
}

1.4、 springBoot的單元測試

 //使用Spring的單元測試環境
@RunWith(SpringRunner.class)
//將SpringBoot的上下文環境加載進入單元測試中
@SpringBootTest(classes = AutoApplication.class)
public class AutoApplicationTests {
   //注入springBoot 基于條件的實例化bean
   @Autowired
   private Life life;
   @Test
   public void showlife() {
      System.out.println("生命的全部:"+life.toString());
   }
}

啟動springBoot項目,在控制臺中沒有發現Life對象被創建 且單元測試中無法注入Life

在修改了MyTestConditional中的match() 返回true 再次啟動則Life對象被創建

SpringBoot自動裝配的優點有哪些

同時使用SpringBoot的單元測試來使用springBoot為我們設置的Life實體

該實體創建流程如下:當springBoot項目啟動的時候,會加載@Configuration(srping的xml配置)下的所有bean,當遇到@Conditional(MyTestConditional.class) 會調用該方法的Match,并根據其返回值來判斷是否實例化該注解下的所有使用@Bean @Import 注解下的類

三、自定義一個條件配置類/springBoot自定義注解

1、簡單解釋@Condition注解家族

(1)、@Conditional

官方文檔定義:

“Indicates that a component is only eligible for registration when all specified conditions match”

意思是只有滿足一些列條件之后創建一個bean。 并注冊到spring的上下文環境中

(2)、SpringBoot提供的

  • @ConditionalOnWebApplication 該應用必須為web應用

  • @ConditionalOnMissingBean 該應用上下文中如果沒有指定的bean

  • @ConditionalOnBean 該應用上下文中如果有指定的bean

  • @ConditionalOnProperty(name,value) 只有存在對應name的value的配置文件才加載該注解下的bean

  • @ConditionalOnCloudPlatform 匹配當處于云平臺環境中時后

  • @ConditionalOnClass 該classpath中如果有指定的bean @ConditionalOnExpression 如果對應的表達式成立 成功

  • @ConditionalOnJava 根據應用程序運行的JVM版本進行匹配 成功

  • @ConditionalOnRepositoryType 當特定類型的spring Data JPA啟用的時候 成功

  • @ConditionalOnSingleCandidate 當特定的class對應的bean存在且唯一確定的時候

  • @ConditionalOnJndi 通過JNDI查找制定的條件

  • @Profile 通過特定的條件觸發 (生產環境使用該配置,非生產環境則不是使用)

  • @ConditionalOnResource 從資源文件中查詢

  • @ConditionalOnEnabledResourceChain 從資源鏈中中查詢

  • @ConditionalOnNotWebApplication 如果改應用不是web應用,則該條件起作用

  • @ConditionalOnMissingClass 如果不存在對應的class則創建該對應的bean

滿足條件后則加載該注解作用下的類起作用

(3)、所謂該注解作用下的類起作用是指

這些注解都有如下兩種使用方式

1、作用在類上,則該類下的所有@Bean注解起作用 (條件成立,加載該注解下的所有@Bean的實體類 存放在spring上下文中)

2、作用在方法上 則該方法下對應的@bean注解起作用 (條件成立,加載該注解下使用@Bean的實體類 存放在spring上下文中)

與@Configuration或者@Bean配合使用,當和@Configuration配合使用時,

那么該類下所有@Bean方法 或者@Import 或者 @ComponentScan都會受到其配置條件的影響

  • @Configuration 相當于spring的xml配置文件的<beans>標簽

  • @Bean 注解相當于spring的xml配置文件的<bean>標簽

  • @Import(Xxx.class)將指定的class 實例注入到spring的上下文中

  • @Configuration標注在類上,相當于把該類作為spring的xml配置文件中的<beans>,作用為:配置spring容器(應用上下文)

2、自定義條件注解

結合demo 來設置一個自定義注解

(1)、 自定義注解

/*
  自定義的Conditional 條件注解
 */
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(MyTestConditional.class)
public @interface ConditionalOnLife {
    Class<?>[] value() default {};
    String[] name() default {};}

(2)、進行配置使用

@Configuration  //spring的xml配置文件中的<beans>
//使用該注解表明,在springBoot啟動的時候只有滿足MyTestConditional.class 才生成對應的Life 對象
//自定義的條件注解
@ConditionalOnLife
//@Conditional(MyTestConditional.class)
public static class DreamAutoConfiguration {
    @Bean
    public Dream createDream() {
        //life.toString();
        System.out.println("dream start....");
        return new Dream();
    }
}

后臺調用成功創建了Dream實體 并放入spring上下文環境中

“SpringBoot自動裝配的優點有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

台中市| 红河县| 商洛市| 行唐县| 宣武区| 崇仁县| 和林格尔县| 阿拉善盟| 射阳县| 西乡县| 霍邱县| 龙陵县| 灵璧县| 大悟县| 资中县| 前郭尔| 渝北区| 正定县| 资阳市| 永登县| 乌拉特中旗| 曲阜市| 合江县| 贵定县| 胶南市| 河东区| 西丰县| 高碑店市| 尼木县| 龙泉市| 湘潭县| 海阳市| 化隆| 涿鹿县| 东乡| 浦城县| 隆林| 许昌县| 沛县| 武功县| 山西省|