最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot Application注解原理及代碼詳解

 更新時間:2020年06月11日 15:37:44   作者:北方有魚  
這篇文章主要介紹了SpringBoot Application注解原理及代碼詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

1、SpringBoot 啟動main()

@SpringBootApplication
public class TomcatdebugApplication {

  public static void main(String[] args) {
    SpringApplication.run(TomcatdebugApplication.class, args);
  }

}

1.1 @SpringBootApplication 注解,其實主要是@ComponentScan,@EnableAutoConfiguration,@SpringBootConfiguration三個注解

@ComponentScan 注解:

spring里有四大注解:@Service,@Repository,@Component,@Controller用來定義一個bean.@ComponentScan注解就是用來自動掃描被這些注解標(biāo)識的類,最終生成ioc容器里的bean.

可以通過設(shè)置@ComponentScan basePackages,includeFilters,excludeFilters屬性來動態(tài)確定自動掃描范圍,類型已經(jīng)不掃描的類型.

 默認(rèn)情況下:它掃描所有類型,并且掃描范圍是@ComponentScan注解所在配置類包及子包的類

@SpringBootConfiguration 注解:

@SpringBootConfiguration繼承自@Configuration,二者功能也一致,標(biāo)注當(dāng)前類是配置類,
并會將當(dāng)前類內(nèi)聲明的一個或多個以@Bean注解標(biāo)記的方法的實例納入到spring容器中,并且實例名就是方法名。

demo 說明:

(1) 注入spring ioc bean

@SpringBootConfiguration
public class Config {
  @Bean
  public Map createMap(){
    Map map = new HashMap();
    map.put("username","gxz");
    map.put("age",27);
    return map;
  }
}

(2)調(diào)用:

public static void main( String[] args )
  {
    //方式1 獲取context
    ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
    context.getBean(Runnable.class).run();
    context.getBean("createMap");  //注意這里直接獲取到這個方法bean
    int age = (int) map.get("age");
    System.out.println("age=="+age);
//方式2. 使用@Autowired注解,應(yīng)用bean 
// @Autowired// Map createMap
}

@EnableAutoConfiguration 注解

@EnableAutoConfiguration作用:從classpath中搜索所有的META-INF/spring.factories配置文件,然后將其中key為org.springframework.boot.autoconfigure.EnableAutoConfiguration的value加載到spring容器中。

上圖分析源碼可知: @EnableAutoConfiguration = @Import + @AutoConfigurationPackage

@AutoConfigurationPackage:主要作用是自動配置包

@Import: Spring底層注解@Import,給容器中導(dǎo)入一個組件;導(dǎo)入的組件由AutoConfigurationPackages.Registrar.class將主配置類(@SpringBootApplication標(biāo)注的類)的所在包以及下面所有子包里面的所有組件掃描到Spring容器。

AutoConfigurationImportSelector的作用是導(dǎo)入哪些組件的選擇器。將所有需要導(dǎo)入的組件以全類名的方式返回,這些組件就會被添加到容器中;也會給容器導(dǎo)入非常多的自動配置類(xxxAutoConfiguration),就是給容器中導(dǎo)入這個場景需要的所有組件,并配置好這些組件。

  有了自動配置類,免去了我們手動編寫配置注入功能組件等的工作

具體工作流程圖:

@EnableAutoConfiguration加載過程

 自動配置主要由AutoConfigurationImportSelector實現(xiàn)的,我們主要從這個類開始講起。AutoConfigurationImportSelector是@EnableAutoConfiguration“@Import”的DeferredImportSelector實現(xiàn)類,由于DeferredImportSelector作為ImportSelector的子接口,所以組件自動配置邏輯均在selectImports(AnnotationMetadata)方法中實現(xiàn)

源碼分析:  

AutoConfigurationImportSelector.java

根據(jù)以上代碼分析自動配置加載過程主要分為以下幾個步驟:

1.判斷是否開啟自動配置

2.從META-INF/spring-autoconfigure-metadata.properties文件中載入屬性配置

3.獲取所有的配置列表

public String[] selectImports(AnnotationMetadata annotationMetadata) {
    //1.是否開啟自動配置,默認(rèn)開啟
  if (!this.isEnabled(annotationMetadata)) {
    return NO_IMPORTS;
  } else {
    try {
        //2.從META-INF/spring-autoconfigure-metadata.properties文件中載入屬性配置(有一些有默認(rèn)值),獲取注解信息

      AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
       
       //3.獲取所有的配置列表
      AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
      List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
      configurations = this.removeDuplicates(configurations);
      configurations = this.sort(configurations, autoConfigurationMetadata);
      Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
      this.checkExcludedClasses(configurations, exclusions);
      configurations.removeAll(exclusions);
      configurations = this.filter(configurations, autoConfigurationMetadata);
      this.fireAutoConfigurationImportEvents(configurations, exclusions);
      return (String[])configurations.toArray(new String[configurations.size()]);
    } catch (IOException var6) {
      throw new IllegalStateException(var6);
    }
  }
}

1.是否開啟自動配置,默認(rèn)開啟

 protected boolean isEnabled(AnnotationMetadata metadata) {
    return true;
  }

2.從META-INF/spring-autoconfigure-metadata.properties文件中載入屬性配置

protected static final String PATH = "META-INF/spring-autoconfigure-metadata.properties";

  private AutoConfigurationMetadataLoader() {
  }

  public static AutoConfigurationMetadata loadMetadata(ClassLoader classLoader) {
    return loadMetadata(classLoader, "META-INF/spring-autoconfigure-metadata.properties");
  }
  static AutoConfigurationMetadata loadMetadata(ClassLoader classLoader, String path) {
    try {
      Enumeration<URL> urls = classLoader != null ? classLoader.getResources(path) : ClassLoader.getSystemResources(path);
      Properties properties = new Properties();
      while(urls.hasMoreElements()) {
        properties.putAll(PropertiesLoaderUtils.loadProperties(new UrlResource((URL)urls.nextElement())));
      }
      return loadMetadata(properties);
    } catch (IOException var4) {
      throw new IllegalArgumentException("Unable to load @ConditionalOnClass location [" + path + "]", var4);
    }
  }

3、獲取所有的配置列表

protected AnnotationAttributes getAttributes(AnnotationMetadata metadata) {
    String name = this.getAnnotationClass().getName();
    AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(name, true));
    Assert.notNull(attributes, "No auto-configuration attributes found. Is " + metadata.getClassName() + " annotated with " + ClassUtils.getShortName(name) + "?");
    return attributes;
  }

總結(jié):

springboot底層實現(xiàn)自動配置的步驟:

1.springboot應(yīng)用啟動

2.@SpringBootApplication起作用

3.@EnableAutoConfiguration

4.@AutoConfigurationPackage:這個組合注解主要是@Import(AutoConfigurationPackages.Registrar.class),它通過將Registrar類導(dǎo)入到容器中,而Registrar類作用是掃描主配置類同級目錄以及子包,并將相應(yīng)的組件導(dǎo)入到springboot創(chuàng)建管理的容器中

5.@Import(AutoConfigurationImportSelector.class):它通過將AutoConfigurationImportSelector類導(dǎo)入到容器中,AutoConfigurationImportSelector類作用是通過selectImports方法實現(xiàn)將配置類信息交給SpringFactory加載器進(jìn)行一系列的容器創(chuàng)建過程,具體實現(xiàn)可查看上面的源碼

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 關(guān)于Spring的@Transaction導(dǎo)致數(shù)據(jù)庫回滾全部生效問題(又刪庫跑路)

    關(guān)于Spring的@Transaction導(dǎo)致數(shù)據(jù)庫回滾全部生效問題(又刪庫跑路)

    使用@Transactional一鍵開啟聲明式事務(wù), 這就真的事務(wù)生效了?過于信任框架總有“意外驚喜”。本文通過案例給大家詳解關(guān)于Spring的@Transaction導(dǎo)致數(shù)據(jù)庫回滾全部生效問題,感興趣的朋友一起看看吧
    2021-05-05
  • 完美解決idea沒有tomcat server選項的問題

    完美解決idea沒有tomcat server選項的問題

    這篇文章主要介紹了完美解決idea沒有tomcat server選項的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Spring MVC Controller傳遞枚舉值的實例

    Spring MVC Controller傳遞枚舉值的實例

    這篇文章主要介紹了Spring MVC Controller傳遞枚舉值的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java實現(xiàn)發(fā)送HTML內(nèi)容并帶附件的電子郵件

    Java實現(xiàn)發(fā)送HTML內(nèi)容并帶附件的電子郵件

    這篇文章主要為大家詳細(xì)介紹了如何使用Java實現(xiàn)發(fā)送HTML內(nèi)容并帶附件的電子郵件,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下
    2025-01-01
  • Java并發(fā)編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖

    Java并發(fā)編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖

    這篇文章主要介紹了Java并發(fā)編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖,本文講解了ReentrantLock概況、Lock接口、Lock使用、輪詢鎖的和定時鎖、公平性、可中斷獲鎖獲取操作等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Java中的@Conditional條件注解詳細(xì)解析

    Java中的@Conditional條件注解詳細(xì)解析

    這篇文章主要介紹了Java中的@Conditional條件注解詳細(xì)解析,@Conditional是Spring4新提供的注解,它的作用是按照一定的條件進(jìn)行判斷,滿足條件給容器注冊bean,需要的朋友可以參考下
    2023-11-11
  • 新版idea創(chuàng)建spring boot項目的詳細(xì)教程

    新版idea創(chuàng)建spring boot項目的詳細(xì)教程

    這篇文章給大家介紹了新版idea創(chuàng)建spring boot項目的詳細(xì)教程,本教程對新手小白友好,若根據(jù)教程創(chuàng)建出現(xiàn)問題導(dǎo)致失敗可下載我提供的源碼,在文章最后,本教程較新,文中通過圖文給大家介紹的非常詳細(xì),感興趣的朋友可以參考下
    2024-01-01
  • Spring WebFlux使用函數(shù)式編程模型構(gòu)建異步非阻塞服務(wù)

    Spring WebFlux使用函數(shù)式編程模型構(gòu)建異步非阻塞服務(wù)

    這篇文章主要介紹了Spring WebFlux使用函數(shù)式編程模型構(gòu)建異步非阻塞服務(wù),重點介紹如何使用函數(shù)式編程模型創(chuàng)建響應(yīng)式 RESTful 服務(wù),這種編程模型與傳統(tǒng)的基于 Spring MVC 構(gòu)建 RESTful 服務(wù)的方法有較大差別,感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • SpringBoot在RequestBody中使用枚舉參數(shù)案例詳解

    SpringBoot在RequestBody中使用枚舉參數(shù)案例詳解

    這篇文章主要介紹了SpringBoot在RequestBody中使用枚舉參數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 實例講解Java中的synchronized

    實例講解Java中的synchronized

    這篇文章主要介紹了Java中synchronized的使用方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07

最新評論

东山县| 定远县| 竹山县| 礼泉县| 宜宾县| 时尚| 汉源县| 陆川县| 墨玉县| 团风县| 博兴县| 思茅市| 永嘉县| 荣昌县| 石屏县| 永川市| 武穴市| 新乡县| 淄博市| 普安县| 北碚区| 清苑县| 眉山市| 清河县| 胶州市| 玉溪市| 马公市| 延川县| 桑植县| 柘荣县| 教育| 旬阳县| 南丹县| 梅河口市| 玉林市| 台州市| 奉节县| 柞水县| 岚皋县| 马关县| 昂仁县|