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

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

詳解SpringBoot簡化配置分析總結

瀏覽:24日期:2023-04-18 11:29:39

在SpringBoot啟動類中,該主類被@SpringBootApplication所修飾,跟蹤該注解類,除元注解外,該注解類被如下自定注解修飾。

@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan

讓我們簡單敘述下它們各自的功能:

@ComponentScan:掃描需要被IoC容器管理下需要管理的Bean,默認當前根目錄下的 @EnableAutoConfiguration:裝載所有第三方的Bean @SpringBootConfiguration 作用等同于@Configuration

我們來看下@SpringBootConfiguration

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Configurationpublic @interface SpringBootConfiguration { @AliasFor( annotation = Configuration.class ) boolean proxyBeanMethods() default true;}

可以看到該注解類內包含與@Configuration,其作用與@Configuration并無太大區別,只是多了層屬性嵌套。

故: @SpringBootConfiguration + @ComponentScan

將根目錄下所有被**@Controller、@Service、@Repository、@Component**等所修飾的類交給IoC容器管理。

那么重點來了,@EnableAutoConfiguration是如何裝載第三方Bean的呢?讓我們跟蹤下它的源碼。

首先我們可以看到該類被如下注解修飾:

@AutoConfigurationPackage@Import({AutoConfigurationImportSelector.class})

我們先關注下AutoConfigurationImportSelector這個組件。

// 批量導入第三方的一些Bean@Import({AutoConfigurationImportSelector.class})

其中該組件的selectImports(AnnotationMetadata annotationMetadata)方法,我們先簡述下它的作用:掃描所有需要被管理的第三方Bean并交給IoC容器進行管理。然后我們接著往下追蹤。

public String[] selectImports(AnnotationMetadata annotationMetadata) { if (!this.isEnabled(annotationMetadata)) { return NO_IMPORTS; } else { // 讓我們跟蹤到這個方法 AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata); return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations()); }}

protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) { if (!this.isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } else { AnnotationAttributes attributes = this.getAttributes(annotationMetadata); // 獲取所有AutoConfiguration的配置類 List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes); // 下面就是對AutoConfiguration的去重、排除和過濾等操作 configurations = this.removeDuplicates(configurations); Set<String> exclusions = this.getExclusions(annotationMetadata, attributes); this.checkExcludedClasses(configurations, exclusions); configurations.removeAll(exclusions); configurations = this.getConfigurationClassFilter().filter(configurations); // 我們繼續追蹤這里 this.fireAutoConfigurationImportEvents(configurations, exclusions); return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions); }}

private void fireAutoConfigurationImportEvents(List<String> configurations, Set<String> exclusions) { List<AutoConfigurationImportListener> listeners = this.getAutoConfigurationImportListeners(); if (!listeners.isEmpty()) { // 加了層包裝 AutoConfigurationImportEvent event = new AutoConfigurationImportEvent(this, configurations, exclusions); Iterator var5 = listeners.iterator(); while(var5.hasNext()) { AutoConfigurationImportListener listener = (AutoConfigurationImportListener)var5.next(); this.invokeAwareMethods(listener); // 向ConditionEvaluationReport中導入所有AutoConfiguration listener.onAutoConfigurationImportEvent(event); } }}

可以猜想IoC容器在啟動時會將這里的AutoConfiguration中的每個Bean都注入到容器中。這里的源碼我們先跟蹤到這里,大致了解了下該方法的作用。

那么SpringBoot又是如何取感知第三方的Bean文件呢?

SpringBoot和第三方Bean之間存在一定的規定。即通過對于相應依賴的Jar包中可能存在一個spring.factories文件,在該文件中就記錄了需要被IoC容器管理的Bean文件路徑,SpringBoot通過該文件確定需要IoC管理的Bean文件位置。對于spring-boot-autoconfiguration的spring.factories文件中,記錄著大量xxxAutoConfiguration的類文件位置,這些類都被@Configuration注解標識,即這些配置類會配置多個Bean從而解決spring.factories可能產生的臃腫問題。

Tomcat的加載時機

對于SpringBoot來說它特點不僅是簡化配置,還有內嵌容器等特點。那么就有必要探討Tomcat容器的加載時機。在spring-boot-autoconfiguration的spring.factories文件中存在ServletWebServerFactoryAutoConfiguration配置類的路徑,該類會在項目啟動時將默認的Tomcat容器已@Bean的方式加載入IoC容器內部。

SpringBoot是如何集中配置呢?

談論這個問題前我們不妨先按照之前yml或properties的文件配置下

server: port: 8080

通過IDE,跟蹤到port所配置的成員變量所在類,發現該類被@ConfigurationProperties所修飾,該注解就是將yml或properties中配置按照對應前綴注入到指定類的成員變量。該注解具體實現感興趣的小伙伴們可以去如下鏈接學習。 @ConfigurationProperties實現原理與實戰

@ConfigurationProperties(prefix = 'server', ignoreUnknownFields = true)public class ServerProperties { private Integer port;*******}

下面兩個代碼和前述作用大致相同

environment.getProperty('xxx');@Value('${xxx}')

我們在使用SpringBoot時只需要做哪些事情?

通常我們再使用SpringBoot時只需要在Maven中引入類似如下的starter依賴。

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>

最多再需要配置一些類似mybatis這類框架的一些屬性參數。而這些starter按照我們之前的邏輯其內部應該存有spring.factories文件,我們先去對應jar包查找下。

如果有些starter的jar包沒有找到我們想要的spring.factories文件。我們可以去spring-boot-test-autoconfiguretion中的spring.factories查看下,SpringBoot內部其實已經定義好相當一定數量的AutoConfiguration。

詳解SpringBoot簡化配置分析總結

果然該jar包內確實存在spring.factories文件,代碼如下。

org.springframework.data.repository.core.support.RepositoryFactorySupport=org.springframework.data.redis.repository.support.RedisRepositoryFactory

這意味著我們已經簡單地了解了SpringBoot如何簡化配置,那么我們也應該可以自己來實現一個starter依賴交給SpringBoot來使用,只要在對應Jar包中添加spring.factories文件,在其中添加如下代碼。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=xxxAutoConfiguration

大家若有時間還請實現下自己的starter依賴,對加深這部分理解還是很有幫助的。感興趣的小伙伴可以看下我做的一個簡單的實現。 [自定義starter實現]

最后我們在說下最后@SpringBootApplication中@AutoConfigurationPackage這個注解類,發現其中導入了Registrar組件。

@Import({Registrar.class})

讓我們重點關注registerBeanDefinitions這個方法,該方法最終會來到DefaultListableBeanFactory中registerBeanDefinition(String beanName, BeanDefinition beanDefinition)方法,將AutoConfigurationPackages.class注冊到IoC容器中,然后將主配置類所在包下所有組件導入到SpringIoC容器中

public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { // 里面就這一個方法我們跟蹤下 AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));}

public static void register(BeanDefinitionRegistry registry, String... packageNames) { // 判斷beanDefinitionMap是否存在AutoConfigurationPackages if (registry.containsBeanDefinition(BEAN)) { BeanDefinition beanDefinition = registry.getBeanDefinition(BEAN); ConstructorArgumentValues constructorArguments = beanDefinition.getConstructorArgumentValues(); constructorArguments.addIndexedArgumentValue(0, addBasePackages(constructorArguments, packageNames)); } else { GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); beanDefinition.setBeanClass(AutoConfigurationPackages.BasePackages.class); beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(0, packageNames); beanDefinition.setRole(2); // 將設置好的AutoConfigurationPackages注冊到beanDefinitionMap(是不是很熟悉這一步) registry.registerBeanDefinition(BEAN, beanDefinition); }}

怎么樣,在為我們簡化了配置的同時,SpringBoot居然幫我們做了如此多的事情,而我們只需要簡單地集中配置其中一部分的屬性。關于SpirngBoot我們就探討到這里,這些內容是閱讀一些文章,觀看部分講解和源碼的總結,若有錯誤還請接納與指教。這是本人的第一篇文章,最后感謝各位的閱讀。

到此這篇關于詳解SpringBoot簡化配置分析總結的文章就介紹到這了,更多相關SpringBoot 簡化配置內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩电影免费网址| 综合国产精品| 亚洲一区免费| 99re国产精品| 欧美日韩视频免费观看| 国产精品嫩模av在线| 日韩中文欧美在线| 日韩午夜电影| 久久在线免费| 黄色精品网站| 黄色亚洲在线| 日韩一区二区三区四区五区| 久热re这里精品视频在线6| 久久久久国产精品一区三寸| 国产精品毛片久久| 亚洲爱爱视频| 老鸭窝亚洲一区二区三区| 亚洲精品伦理| 国产精品一卡| 日本久久成人网| 午夜精品影院| 日韩av网站在线免费观看| 精品欠久久久中文字幕加勒比| 91亚洲国产| 天堂成人免费av电影一区| 91精品啪在线观看国产爱臀| 免费在线成人| 国产精品毛片| 久久一区国产| 日韩一区二区三区精品| 欧美日韩夜夜| 99久久久久| 久久香蕉精品香蕉| 影院欧美亚洲| 精品中文在线| 少妇精品导航| 香蕉久久久久久| 六月婷婷综合| 欧美日韩1区2区3区| 日韩不卡在线| 国产精品2023| 男人操女人的视频在线观看欧美| 粉嫩av一区二区三区四区五区 | 亚洲一区国产一区| 精品久久精品| 亚洲一二av| 久久久久免费av| 国产情侣久久| 日韩一区欧美二区| 五月婷婷亚洲| 精品视频自拍| 国产精品久久久久久久久久齐齐| 国产伦精品一区二区三区千人斩| 中文字幕成人| 激情久久中文字幕| 精品91福利视频| 久久精品伊人| 伊人久久亚洲| 亚洲欧洲一区二区天堂久久| 久久青草久久| 成人影视亚洲图片在线| 欧美精品观看| 婷婷五月色综合香五月| 亚洲综合三区| 不卡av一区二区| 欧美特黄一级大片| 久久黄色影院| 亚洲高清av| 午夜久久一区| 亚洲免费播放| 成人羞羞在线观看网站| 免费在线亚洲| 韩国久久久久久| 欧美日韩国产一区二区三区不卡 | 麻豆一区在线| 综合干狼人综合首页| 少妇高潮一区二区三区99| 蜜桃视频一区二区三区| 国产精品香蕉| 欧美精品99| 国产成人精品福利| 国产精品久久久久久久久久久久久久久 | 国产成人77亚洲精品www| 久久国产精品免费一区二区三区 | 国产精品传媒麻豆hd| 日韩av二区在线播放| 日本a口亚洲| 美女精品视频在线| 久久国产影院| 99国产精品99久久久久久粉嫩| 国产美女一区| 久久精品五月| 在线一区二区三区视频| 日韩中文字幕一区二区高清99| 日韩欧乱色一区二区三区在线| 欧美成人精品午夜一区二区| 桃色一区二区| 日韩精品福利一区二区三区| 国产精品15p| 日本精品不卡| 视频一区二区中文字幕| 日本一区中文字幕| 日本一二区不卡| 日韩在线卡一卡二| 日韩高清不卡| 国产精品美女久久久久久不卡| 亚洲一级高清| 国产日产精品一区二区三区四区的观看方式| 国产色播av在线| 国产精品一在线观看| 午夜久久影院| 日韩中文首页| 蜜桃久久久久| 亚洲影视一区二区三区| 电影亚洲精品噜噜在线观看| 99国产精品99久久久久久粉嫩| 欧美日韩1区2区3区| 国产美女一区| 99久久夜色精品国产亚洲狼 | 国产成人精品三级高清久久91| 午夜在线视频观看日韩17c| 久久精品国产一区二区| 五月国产精品| 亚洲一卡久久| 狠狠爱www人成狠狠爱综合网| 欧美黄色精品| 日韩三级一区| 日韩激情中文字幕| 欧美日韩激情在线一区二区三区| 久久精品三级| 国产极品久久久久久久久波多结野| 中文在线不卡| 一本色道精品久久一区二区三区| 日韩精品久久久久久久电影99爱| 黄色精品视频| 国产经典一区| 国产精品国码视频| 久久国产尿小便嘘嘘| 日韩在线黄色| 日韩av网站在线观看| 国产午夜精品一区在线观看| 一本一道久久a久久| 午夜在线精品偷拍| 久久亚洲国产| 国精品一区二区| 宅男噜噜噜66国产日韩在线观看| 亚洲神马久久| 日本va欧美va精品| 国产精品亚洲产品| 日韩一区二区中文| 91tv亚洲精品香蕉国产一区| 欧美手机在线| 蜜臀久久99精品久久久久久9 | 日韩精品1区2区3区| 日本中文字幕一区二区| 亚洲免费专区| 国产一级成人av| 日本不卡免费高清视频在线| 亚洲综合在线电影| 免费一区二区视频| 欧美在线精品一区| 精品欧美一区二区三区在线观看| 今天的高清视频免费播放成人| 免费在线观看视频一区| 91成人精品观看| 97精品国产一区二区三区| 欧美一区二区三区激情视频| 亚洲深夜福利在线观看| 久久不见久久见中文字幕免费| 四虎影视精品| 欧美在线亚洲综合一区| 国产精品免费精品自在线观看| 国产亚洲一区二区手机在线观看 | 韩日一区二区| 91久久久精品国产| 国产精品香蕉| 亚久久调教视频| 欧美日韩激情在线一区二区三区| 欧美专区一区二区三区| 欧美a级一区二区| 亚洲黄页一区| 群体交乱之放荡娇妻一区二区| 欧美影院精品| 少妇久久久久| 欧美成人aaa| 亚洲精品高潮| 久久91导航| 国产精品2023| 欧美一级二区| 一区二区三区国产在线| 亚洲最新无码中文字幕久久| 日韩精品视频一区二区三区| 国产主播一区| 国产精品乱战久久久| 午夜精品网站| 自拍日韩欧美| 国产精品专区免费| 精品欧美日韩精品| 青青国产91久久久久久| 99在线精品免费视频九九视|