电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

詳解SpringBoot簡化配置分析總結

瀏覽:6日期: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
相關文章:
主站蜘蛛池模板: PCB接线端子_栅板式端子_线路板连接器_端子排生产厂家-置恒电气 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 不锈钢列管式冷凝器,换热器厂家-无锡飞尔诺环境工程有限公司 | 大学食堂装修设计_公司餐厅效果图_工厂食堂改造_迈普装饰 | 诸城网站建设-网络推广-网站优化-阿里巴巴托管-诸城恒泰互联 | SPC工作站-连杆综合检具-表盘气动量仪-内孔缺陷检测仪-杭州朗多检测仪器有限公司 | 科昊仪器超纯水机系统-可成气相液氮罐-美菱超低温冰箱-西安昊兴生物科技有限公司 | 扒渣机,铁水扒渣机,钢水扒渣机,铁水捞渣机,钢水捞渣机-烟台盛利达工程技术有限公司 | 工业PH计|工业ph酸度计|在线PH计价格-合肥卓尔仪器仪表有限公司 济南画室培训-美术高考培训-山东艺霖艺术培训画室 | 成都离婚律师|成都结婚律师|成都离婚财产分割律师|成都律师-成都离婚律师网 | 厂厂乐-汇聚海量采购信息的B2B微营销平台-厂厂乐官网 | 地源热泵一体机,地源热泵厂家-淄博汇能环保设备有限公司 | 开业庆典_舞龙舞狮_乔迁奠基仪式_开工仪式-神挚龙狮鼓乐文化传媒 | 没斑啦-专业的祛斑美白嫩肤知识网站-去斑经验分享 | 餐饮小吃技术培训-火锅串串香培训「何小胖培训」_成都点石成金[官网] | 煤矿人员精确定位系统_矿用无线通信系统_煤矿广播系统 | 天津散热器_天津暖气片_天津安尼威尔散热器制造有限公司 | 南京欧陆电气股份有限公司-风力发电机官网| 汽车整车综合环境舱_军标砂尘_盐雾试验室试验箱-无锡苏南试验设备有限公司 | 南溪在线-南溪招聘找工作、找房子、找对象,南溪综合生活信息门户! | 煤机配件厂家_刮板机配件_链轮轴组_河南双志机械设备有限公司 | 中原网视台| 高清视频编码器,4K音视频编解码器,直播编码器,流媒体服务器,深圳海威视讯技术有限公司 | 杜康白酒加盟_杜康酒代理_杜康酒招商加盟官网_杜康酒厂加盟总代理—杜康酒神全国运营中心 | lcd条形屏-液晶长条屏-户外广告屏-条形智能显示屏-深圳市条形智能电子有限公司 | LED灯杆屏_LED广告机_户外LED广告机_智慧灯杆_智慧路灯-太龙智显科技(深圳)有限公司 | 江苏大隆凯科技有限公司 | 涡轮流量计_LWGY智能气体液体电池供电计量表-金湖凯铭仪表有限公司 | 高温热泵烘干机,高温烘干热泵,热水设备机组_正旭热泵 | 骨灰存放架|骨灰盒寄存架|骨灰架厂家|智慧殡葬|公墓陵园管理系统|网上祭奠|告别厅智能化-厦门慈愿科技 | 不锈钢螺丝 - 六角螺丝厂家 - 不锈钢紧固件 - 万千紧固件--紧固件一站式采购 | 螺杆泵_中成泵业 | 粉末包装机-给袋式包装机-全自动包装机-颗粒-液体-食品-酱腌菜包装机生产线【润立机械】 | 中细软知识产权_专业知识产权解决方案提供商 | 控显科技 - 工控一体机、工业显示器、工业平板电脑源头厂家 | 成都竞价托管_抖音代运营_网站建设_成都SEM外包-成都智网创联网络科技有限公司 | 仓储笼_金属箱租赁_循环包装_铁网箱_蝴蝶笼租赁_酷龙仓储笼租赁 测试治具|过炉治具|过锡炉治具|工装夹具|测试夹具|允睿自动化设备 | 大立教育官网-一级建造师培训-二级建造师培训-造价工程师-安全工程师-监理工程师考试培训 | 耐酸泵,耐腐蚀真空泵,耐酸真空泵-淄博华舜耐腐蚀真空泵有限公司 精密模具-双色注塑模具加工-深圳铭洋宇通 | 广域铭岛Geega(际嘉)工业互联网平台-以数字科技引领行业跃迁 | 帽子厂家_帽子工厂_帽子定做_义乌帽厂_帽厂_制帽厂_帽子厂_浙江高普制帽厂 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-沼河浸过滤器 |