日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

SpringBoot Application注解原理及代碼詳解

瀏覽:21日期:2023-05-12 10:51:23

1、SpringBoot 啟動main()

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

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

SpringBoot Application注解原理及代碼詳解

@ComponentScan 注解:

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

可以通過設置@ComponentScan basePackages,includeFilters,excludeFilters屬性來動態確定自動掃描范圍,類型已經不掃描的類型.

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

@SpringBootConfiguration 注解:

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

demo 說明:

(1) 注入spring ioc bean

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

(2)調用:

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注解,應用bean // @Autowired// Map createMap}

@EnableAutoConfiguration 注解

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

SpringBoot Application注解原理及代碼詳解

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

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

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

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

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

具體工作流程圖:

SpringBoot Application注解原理及代碼詳解

@EnableAutoConfiguration加載過程

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

源碼分析:  

AutoConfigurationImportSelector.java

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

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

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

3.獲取所有的配置列表

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

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; }

總結:

springboot底層實現自動配置的步驟:

1.springboot應用啟動

2.@SpringBootApplication起作用

3.@EnableAutoConfiguration

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美国产91| 激情偷拍久久| 欧美日韩四区| 精品精品99| 在线观看一区| 亚洲综合丁香| 午夜欧美精品| 99视频精品免费观看| 98精品视频| 中文字幕亚洲精品乱码| 亚洲制服少妇| 亚洲综合福利| 久久精品99久久久| 国产午夜久久av| 国产欧美88| 91亚洲无吗| 蜜桃久久久久| 日韩视频网站在线观看| 亚洲深夜视频| 99精品国产一区二区三区| 999久久久亚洲| 亚洲我射av| 国产精品欧美日韩一区| 老司机免费视频一区二区三区| 日本午夜精品视频在线观看| 日韩av网站在线免费观看| 荡女精品导航| 亚洲精品一二三区区别| 综合欧美精品| 精品视频国内| 亚洲一级黄色| 日韩精品视频中文字幕| 久久麻豆视频| 国产精品日本欧美一区二区三区| 视频一区二区不卡| 久久精品国产免费| 亚洲成人免费| 国产精品嫩模av在线| 色天使综合视频| 在线亚洲成人| 国内在线观看一区二区三区| 丝袜美腿亚洲色图| 久久字幕精品一区| 玖玖精品视频| 成人一区而且| 影音先锋久久精品| 日韩国产在线| 日韩高清国产一区在线| 99精品美女| 国产一区二区精品久| 蜜臀va亚洲va欧美va天堂| 天堂√8在线中文| 日产欧产美韩系列久久99| 中文字幕在线视频网站| 国产一区清纯| 国产在线日韩精品| 亚洲精品欧美| 99亚洲精品| 亚洲成a人片| 久久精品二区亚洲w码| 亚洲天堂免费| 99国产精品| 中文日韩欧美| 精品一区欧美| 成人在线观看免费视频| 国产日本久久| 日韩激情视频网站| 日韩精品第一| 亚洲精品福利| 亚洲国内精品| 亚洲先锋成人| 夜夜嗨av一区二区三区网站四季av| 狠狠躁少妇一区二区三区| 国产精品jk白丝蜜臀av小说| 久久精品人人| 国产精品一区二区中文字幕| 日韩不卡免费视频| 日本成人在线视频网站| 国产精品久久国产愉拍| 美女精品视频在线| 国产乱子精品一区二区在线观看 | 91精品高清| 99久久精品费精品国产| 99久久精品费精品国产| 99久久夜色精品国产亚洲狼 | 亚洲ww精品| 日韩av在线播放中文字幕| 国产一区一一区高清不卡| 97欧美在线视频| 欧美日韩在线二区| 视频一区欧美日韩| 手机精品视频在线观看| 欧美午夜网站| 国产成人精品福利| 欧美成人日韩| 日韩精品视频网站| 91免费精品| 天堂成人免费av电影一区| 综合五月婷婷| 国产一区日韩| 亚洲一区亚洲| 国产一区福利| 蜜臀av一区二区在线免费观看| 国产精品中文字幕亚洲欧美 | 日韩深夜视频| 午夜亚洲精品| 色综合五月天| 亚洲欧美日本日韩| 国产乱码精品一区二区三区四区| 亚洲综合电影| 国产色噜噜噜91在线精品| 久久精品青草| 国产美女撒尿一区二区| 国产美女精品| 中文一区一区三区高中清不卡免费| 一级成人国产| 久久精品播放| 精品久久精品| 中文精品在线| 久久久久久夜| 国产日产精品_国产精品毛片| 亚洲欧洲av| 性一交一乱一区二区洋洋av| 久久天堂影院| 欧美性www| 亚洲一区日本| 亚洲黄页一区| 亚洲综合电影| 久久精品三级| 欧美视频久久| 午夜在线精品偷拍| 99久久夜色精品国产亚洲狼 | 一区二区三区网站| 久久亚洲国产精品一区二区| 亚洲网站视频| 欧美成人国产| 激情久久婷婷| 免费国产自久久久久三四区久久| 精品免费av一区二区三区| 蜜桃av一区二区| 午夜欧美在线| 免费看日韩精品| 久久成人亚洲| 丝袜诱惑制服诱惑色一区在线观看 | 国产在线|日韩| 日韩欧美1区| 999国产精品视频| 婷婷国产精品| 免费在线看一区| 久色成人在线| 欧美日韩一区二区三区不卡视频| 99pao成人国产永久免费视频| 国产在线欧美| 影音先锋久久精品| 一区二区亚洲视频| 日韩三级一区| 欧美日韩亚洲一区三区| 欧美激情网址| 中文字幕在线视频久| 免费视频亚洲| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲精品精选| 国产欧美三级| 免费精品国产的网站免费观看| 亚洲一区二区免费在线观看| 国产探花一区| 国产资源在线观看入口av| 亚洲欧美视频| 婷婷综合国产| 久久精品系列| 亚洲不卡av不卡一区二区| 美女久久一区| 日韩高清三区| 五月天av在线| 国产精品视频一区二区三区综合 | 视频精品一区二区| 欧美一区=区三区| 久久精选视频| 日韩福利视频网| 欧美日韩国产免费观看视频| 亚洲3区在线| 国产精品99免费看| 蜜桃久久av一区| 日本黄色精品| 亚洲天堂免费| 国产综合精品| 美女视频网站久久| 国产视频一区在线观看一区免费| 日本精品在线播放| 亚洲精品在线影院| 91免费精品国偷自产在线在线| 群体交乱之放荡娇妻一区二区| 日韩一区二区三区精品| 亚洲天堂黄色| 国产欧美一区二区三区精品酒店| 国产乱人伦丫前精品视频| 手机精品视频在线观看| 亚洲四虎影院| 欧美在线首页| 日韩精品视频网站|