欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于@SpringBootApplication與@SpringBootTest的區(qū)別及用法

 更新時間:2022年01月19日 08:48:03   作者:開心小蝸牛  
這篇文章主要介紹了關(guān)于@SpringBootApplication與@SpringBootTest的區(qū)別及用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

@SpringBootApplication與@SpringBootTest區(qū)別用法

1 @SpringBootApplication 注解的應(yīng)用

一般情況我們使用 @SpringBootApplication 注解來啟動 SpringBoot 項目

它其實只相當(dāng)于 @Configuration、@EnableAutoConfiguration、@ComponentScan(包含了兩個filter)

@SpringBootApplication
public class FrameworkUnitRealTestApp {
? ? public static void main(String[] args) {
? ? ? ? SpringApplication.run(FrameworkUnitRealTestApp.class, args);
? ? }
}

2 @SpringBootTest 注解的應(yīng)用

一般情況我們使用 @SpringBootTest 和 @RunWith(SpringRunner.class) 注解來啟動 SpringBoot 測試項目

@RunWith(SpringRunner.class)?
@SpringBootTest
public class FrameworkUnitRealTestApp {
? ? @Test
? ? public void test() {}
}

3 @SpringBootApplication 和 @SpringBootTest 的區(qū)別

這兩個注解的區(qū)別的核心在于兩個注解:@EnableAutoConfiguration、@ComponentScan(包含了兩個filter)

@EnableAutoConfiguration 啟動了所有的自動配置類

@ComponentScan(包含了兩個filter):在掃描階段過濾掉 @TestComponent 等專屬于測試的類和過濾掉被 @Configuration 注解的自動配置類(使得自動配置類不會在掃描階段就被注冊 beanDefinition,因為 自動配置類的優(yōu)先級應(yīng)該是最低的)

可以看出 @SpringBootTest 并沒有啟用任何自動配置類,所以就不需要加 AutoConfigurationExcludeFilter 了

springboot 通過引入 @Test** 注解來在 測試環(huán)境下 引入不同的自動配置類!

4 @ComponentScan(包含了兩個filter) 解析

詳細的代碼如下:添加了 TypeExcludeFilter 和 AutoConfigurationExcludeFilter 兩個 excludeFilter

作用:掃描包的時候過濾掉被這兩個 Filter 匹配的類!

@ComponentScan(excludeFilters = {
?? ??? ?@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
?? ??? ?@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

4.1 TypeExcludeFilter 解析

主要移除測試相關(guān)的類

public class TypeExcludeFilter implements TypeFilter, BeanFactoryAware {
? ?@Override
? ?public boolean match(MetadataReader metadataReader,
? ? ? ? ?MetadataReaderFactory metadataReaderFactory) throws IOException {
? ? ? if (this.beanFactory instanceof ListableBeanFactory
? ? ? ? ? ? && getClass() == TypeExcludeFilter.class) {
? ? ? ? ?Collection<TypeExcludeFilter> delegates = ((ListableBeanFactory) this.beanFactory)
? ? ? ? ? ? ? ?.getBeansOfType(TypeExcludeFilter.class).values();
? ? ? ? ?for (TypeExcludeFilter delegate : delegates) {
? ? ? ? ? ? if (delegate.match(metadataReader, metadataReaderFactory)) {
? ? ? ? ? ? ? ?return true;
? ? ? ? ? ? }
? ? ? ? ?}
? ? ? }
? ? ? return false;
? ?}
}
//delegate.match 走這個類的 match 方法
class TestTypeExcludeFilter extends TypeExcludeFilter {
?? ?private static final String[] CLASS_ANNOTATIONS = { "org.junit.runner.RunWith",
?? ??? ??? ?"org.junit.jupiter.api.extension.ExtendWith" };
?? ?private static final String[] METHOD_ANNOTATIONS = { "org.junit.Test",
?? ??? ??? ?"org.junit.platform.commons.annotation.Testable" };

?? ?@Override
?? ?public boolean match(MetadataReader metadataReader,
?? ??? ??? ?MetadataReaderFactory metadataReaderFactory) throws IOException {
? ? ? ? //是否被 @TestComponent 及其父注解注釋
?? ??? ?if (isTestConfiguration(metadataReader)) {return true;}
? ? ? ? //類上或類中方法上有沒有 CLASS_ANNOTATIONS、METHOD_ANNOTATIONS 中的注解
?? ??? ?if (isTestClass(metadataReader)) {return true;}
?? ??? ?String enclosing = metadataReader.getClassMetadata().getEnclosingClassName();
?? ??? ?if (enclosing != null) {
? ? ? ? ? ? //遞歸內(nèi)部類、父類
? ? ? ? ? ? if (match(metadataReaderFactory.getMetadataReader(enclosing),
? ? ? ? ? ? ? ? ? ? ? metadataReaderFactory)) {
? ? ? ? ? ? ? ? return true;
? ? ? ? ? ? }
?? ??? ?}
?? ??? ?return false;
?? ?}
}

4.2 AutoConfigurationExcludeFilter 解析

主要移除被 @Configuration 修飾的 自動配置類

public class AutoConfigurationExcludeFilter implements TypeFilter, BeanClassLoaderAware {
?? ?@Override
?? ?public boolean match(MetadataReader metadataReader,
?? ??? ??? ?MetadataReaderFactory metadataReaderFactory) throws IOException {
? ? ? ? //如果被 @Configuration 注解,并且是 自動配置類就返回 true,即匹配成功?
? ? ? ? //注:被 @Component 等注解并不匹配
?? ??? ?return isConfiguration(metadataReader) && isAutoConfiguration(metadataReader);
?? ?}
}

5 @EnableAutoConfiguration 注解解析

作用:啟用自動配置類

@AutoConfigurationPackage
//啟用 AutoConfigurationImportSelector 配置類:掃描得到所有自動配置類
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
? ?String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
? ?//定義不啟用的 自動配置類
? ?Class<?>[] exclude() default {};
? ?//同上
? ?String[] excludeName() default {};
}
//這個注解主要是向容器中注冊 AutoConfigurationPackages.Registrar 類用來存儲自動配置包
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {}
//關(guān)鍵:這個類繼承了 DeferredImportSelector 接口,所以是到最后才解析的?。?
public class AutoConfigurationImportSelector implements DeferredImportSelector{
? ? @Override
? ? public String[] selectImports(AnnotationMetadata annotationMetadata) {
? ? ? ? if (!isEnabled(annotationMetadata)) {
? ? ? ? ? ? return NO_IMPORTS;
? ? ? ? }
? ? ? ? AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
? ? ? ? ? ? .loadMetadata(this.beanClassLoader);
? ? ? ? AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(
? ? ? ? ? ? autoConfigurationMetadata, annotationMetadata);
? ? ? ? return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
? ? }
}

6 @…Test 注解

Spring Boot 中文文檔 對每個 @…Test 注解導(dǎo)入的自動配置類做了詳細的說明

SpringBootTest對比SpringBootApplication

SpringBootTest 是測試使用類的注解,標(biāo)志這個類是測試用例。

具體看下源碼分析

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@BootstrapWith(SpringBootTestContextBootstrapper.class)
@ExtendWith({SpringExtension.class})
public @interface SpringBootTest {
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {

對比顯示都是復(fù)合注解,并且前四個注解是一樣的,后面區(qū)分BootstrapWith和ExtendWith這兩個是測試中包含的

BootstrapWith這個注解中有一個參數(shù)為SpringBootTestContextBootstrapper

具體可以看下里面是什么

在這里插入圖片描述

這里面申明了一些程序運行所在包的路徑,在去查看繼承的頂級類可以追溯到TestContextBootstrapper 這個接口 :

在這里插入圖片描述

從里面的方法可以看到是在運行的時候設(shè)置上下文 以及如何獲取上下文,來提供測試啟動的必須值。

接下來看下 ExtendWith 這個注解類

在這里插入圖片描述

這個主要看里面的SpringExtension這個參數(shù)

在這里插入圖片描述

可以看出這個實現(xiàn)了很多接口,來處理測試需要的各種通知處理,以及在測試接口時可以提前處理請求參數(shù)。

SpringBootApplication中的復(fù)合注解則是掃描一些包和配置。雖然測試也是項目啟動的一種,可以看到里面實現(xiàn)還是有些區(qū)別的。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Netty中最簡單的粘包解析方法分享

    Netty中最簡單的粘包解析方法分享

    黏包 是指網(wǎng)絡(luò)上有多條數(shù)據(jù)發(fā)送給服務(wù)端, 但是由于某種原因這些數(shù)據(jù)在被接受的時候進行了重新組合,本文分享了一種最簡單的黏包解析方法, 非常適用于初初初級選手
    2023-05-05
  • java實現(xiàn)簡單的猜數(shù)字小游戲

    java實現(xiàn)簡單的猜數(shù)字小游戲

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單猜數(shù)字小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Spring?Cloud?Gateway中netty線程池優(yōu)化示例詳解

    Spring?Cloud?Gateway中netty線程池優(yōu)化示例詳解

    這篇文章主要介紹了Spring?Cloud?Gateway中netty線程池優(yōu)化示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 在SpringBoot項目中實現(xiàn)讀寫分離的流程步驟

    在SpringBoot項目中實現(xiàn)讀寫分離的流程步驟

    SpringBoot作為一種快速開發(fā)框架,廣泛應(yīng)用于Java項目中,在一些大型應(yīng)用中,數(shù)據(jù)庫的讀寫分離是提升性能和擴展性的一種重要手段,本文將介紹如何在SpringBoot項目中優(yōu)雅地實現(xiàn)讀寫分離,并通過適當(dāng)?shù)拇a插入,詳細展開實現(xiàn)步驟,同時進行拓展和分析
    2023-11-11
  • Java集合教程之Collection實例詳解

    Java集合教程之Collection實例詳解

    集合,或者叫容器,是一個包含多個元素的對象,下面這篇文章主要給大家介紹了關(guān)于Java集合教程之Collection的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-08-08
  • Java實現(xiàn)經(jīng)典游戲飛機大戰(zhàn)-I的示例代碼

    Java實現(xiàn)經(jīng)典游戲飛機大戰(zhàn)-I的示例代碼

    《飛機大戰(zhàn)-I》是一款融合了街機、競技等多種元素的經(jīng)典射擊手游。本文將利用java語言實現(xiàn)這游戲,文中采用了swing技術(shù)進行了界面化處理,感興趣的可以了解一下
    2022-02-02
  • Maven的pom.xml文件結(jié)構(gòu)中的build

    Maven的pom.xml文件結(jié)構(gòu)中的build

    本文主要介紹了Maven的pom.xml文件結(jié)構(gòu)中的build,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • FastJson時間格式化問題避坑經(jīng)驗分享

    FastJson時間格式化問題避坑經(jīng)驗分享

    這篇文章主要為大家介紹了FastJson時間格式化問題避坑經(jīng)驗分享,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 淺析Java方法傳值和傳引用問題

    淺析Java方法傳值和傳引用問題

    這篇文章主要是對Java方法傳值和傳引用問題進行了詳細的介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • 分享Java常用開發(fā)編輯器工具

    分享Java常用開發(fā)編輯器工具

    這篇文章主要給大家分享了分享Java常用開發(fā)編輯器工具,文章內(nèi)容介紹非常詳細,具有很大的參考價值,需要的小伙伴可以參考一下,希望對你的工作或?qū)W習(xí)有一定的幫助
    2022-03-03

最新評論