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

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

java進階之了解SpringBoot的配置原理

瀏覽:104日期:2022-08-11 11:00:44
目錄一、Spring Boot的特點二、了解容器的功能三、原配置文件的引入四、自動配置原理五、修改默認配置(約定大于配置)六、總結一、Spring Boot的特點

首先我們要知道 Spring Boot 在底層已經為我們添加好了很多依賴。比如我們常用的Tomcat,Spring,SpringMVC這些,甚至連mysql數據庫的依賴也為我們添加好了

java進階之了解SpringBoot的配置原理

不過 SpringBoot 2.5.0 使用的mysql依賴版本是8.0.25的,如果還在使用 mysql 5 版本的小伙伴們就需要在項目的 pom.xml 文件中再次指定自己所用的依賴版本號。(因為 maven 在引入依賴時采取就近原則,你如果指定了依賴版本號的話,它會加載離它近的,而不會去加載遠的)

java進階之了解SpringBoot的配置原理

例如,我要修改 mysql 依賴的版本為5.1.43

//在當前項目里面重寫配置 <properties><mysql.version>5.1.43</mysql.version> </properties>二、了解容器的功能

添加組件

@Configuration、@Bean注解

首先,這個注解是寫在類上面的,告訴 spring boot 這是一個配置類,等同于 以前的配置文件

配置類里面使用@Bean標注在方法上給容器注冊組件,默認情況下是單例的。以方法名就是組件的 id 。返回類型就是組件類型。返回的值,就是組件在容器中的實例

為什么他會是單例的呢? 原因是在@Configuration注解的源碼中,還定義了一個屬性 proxyBeanMethods ,默認值是 true。

java進階之了解SpringBoot的配置原理

當然我們也可以修改他的值為false,這樣他就會創建多個對象了。

舉個例子:

java進階之了解SpringBoot的配置原理

我現在在配置類里面定義了一個組件,他會返回一個 User 對象,當proxyBeanMethods = true 時,無論調用多少次 user01() 方法,在容器中都只會存在一個實例對象,但我現在把它改為 false ,來測試一下他到底是不是能創建多個實例了。

在主方法中進行測試:

User user=config.user01(); User user1=config.user01(); System.out.println(user==user1);

最后輸出的結果是

false

這就說明現在創建了兩個對象了,在容器中user和user1并不是指向同一塊內存地址

那我們什么時候可以把它改成 false 來使用呢? 這就要設計到兩種編寫Spring Boot的方式了

一種是FULL模式 全模式(單例) 另一種是Lite模式 輕量級模式(非單例)

如果有組件依賴必須使用Full模式(默認)。其他默認是否Lite模式

Import注解

加入 IOC 容器的方式有很多種,上面的@Bean是一種,這里提到的@Import也是用來注冊組件的,@Import注解可以用于導入第三方包 (當然@Bean也可以)

它是寫在類上面的,

java進階之了解SpringBoot的配置原理

它所創建的組件 id 默認是類的全限定名稱

java進階之了解SpringBoot的配置原理

具體用法參考:b站Spring注解驅動教程

Conditional注解

條件裝配:滿足Conditional指定的條件,則進行組件注入

@Conditional注解下面還有許多的子注解

java進階之了解SpringBoot的配置原理

因為它的子注解實在太多了,下面我們具體實現一個例子來說明一下它的功能

先在 User 類中再加入一個 Pet 屬性

java進階之了解SpringBoot的配置原理

現在我希望容器在沒有 Pet 的情況下,我也不要 User 對象

要實現這個需求,可以這樣做,在 User 組件前面添加@ConditionalOnBean注解,并指定條件為 Pet 組件的 id 來進行限制

java進階之了解SpringBoot的配置原理

執行測試方法

java進階之了解SpringBoot的配置原理

運行結果:

容器中是否有tomcat:false容器中是否有user:false

這樣就對組件 User 的注冊加以限制了

也可以把@ConditionalOnBean(name='tom')注解加在配置類上面,當容器中有 tom 組件時,這個類中的其他組件才會生效,否則不生效

三、原配置文件的引入

如果你原有的項目還是使用 beans.xml 等配置文件的方式來注冊組件的話,SpringBoot 是肯定無法自動配置的,那怎么樣才能讓SpringBoot用我這個配置文件去注冊組件呢?

@ImportResource注解

使用@ImportResource注解可以引入以前那種 xml 配置文件的方式寫的組件

使用方法:直接加在現在的配置類上面,例如:

@ImportResource('classpath:beans.xml')

配置綁定

配置綁定是什么意思呢?其實就是使用Java讀取到properties文件中的內容,并且把它封裝到JavaBean中,以供隨時使用

具體做法:使用@ConfigurationProperties注解

這個注解是加在你需要從 properties 屬性配置文件中要導入的屬性的類上面。

比如:我現在寫了一個 Car 類,然后在 properties 文件中寫好了它的屬性

java進階之了解SpringBoot的配置原理java進階之了解SpringBoot的配置原理

( 注意:properties 文件中的所有屬性均要小寫,駝峰命名法也不行,可以用 - 或 _ 來代替 )

我們想要將配置文件中定義好的屬性綁定到實例對象上的話,就可以在 Car 這個類上面加上@ConfigurationProperties(prefix = 'mycar'),prefix 代表前綴的意思。

java進階之了解SpringBoot的配置原理

單加上這一個注解還不行,因為此時容器中還沒有這個對象,可以采用兩種方式來把 Car 這個對象加入容器中:

1.使用@Component注解

2.使用@EnableConfigurationProperties注解

@Component+@ConfigurationProperties

在@ConfigurationProperties注解上方加上@Component注解,即可將 Car 加入到容器中

測試方法:

java進階之了解SpringBoot的配置原理

運行,訪問 “/car” 查看結果

java進階之了解SpringBoot的配置原理

@EnableConfigurationProperties+@ConfigurationProperties

使用@EnableConfigurationProperties注解則需要在配置類上面添加,而不是 Car 上面

java進階之了解SpringBoot的配置原理

這個注解的作用就是

1.開啟Car的屬性配置功能

2.把這個Car這個組件自動注冊到容器中

再次運行程序,可以得到相同的結果

java進階之了解SpringBoot的配置原理

四、自動配置原理

說完上面這些,我們來看一下,Spring Boot是如何實現自動裝配的

引導加載自動配置類

我們先點進@SpringBootApplication的源碼中去,發現它其實是3個注解的合成注解:

@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan

java進階之了解SpringBoot的配置原理

@SpringBootConfiguration

其中,@SpringBootConfiguration的源碼底層使用了@Configuration注解,說明它其實也是一個配置類,只不過它相當于是一個主配置。

@ComponentScan

根據我們之前的學習,這個注解其實就是一個組件掃描器的作用,是Spring的注解

@EnableAutoConfiguration(核心)

最關鍵最核心的注解就是這個,@EnableAutoConfiguration

@AutoConfigurationPackage

我們點進它的源碼里面去,發現它底層調用了一個叫@AutoConfigurationPackage的注解,翻譯過來就是自動配置包,它指定了默認的包規則

java進階之了解SpringBoot的配置原理

再繼續查看它的底層源碼,發現它導入了一個叫Register的組件

java進階之了解SpringBoot的配置原理

點進去,給它打上一個斷點,來看一下到底是如何運作的

java進階之了解SpringBoot的配置原理

代碼現在在這里停住了,讓我們來看一下這一行代碼里面,發現它能夠找到我們所在的包名,由此我們也就能知道為什么 Spring Boot 能夠將指定的一個包下的所有組件導入進來了,

java進階之了解SpringBoot的配置原理

@Import({AutoConfigurationImportSelector.class})

@EnableAutoConfiguration注解下還有一個注解,它是干什么的呢?讓我們看一下源碼就知道了

java進階之了解SpringBoot的配置原理

在AutoConfigurationImportSelector類下面我們找到了一個方法getAutoConfigurationEntry(annotationMetadata),它是用來給容器中批量導入一些組件的

java進階之了解SpringBoot的配置原理

給他打一個斷點,看看到底加入了些什么組件進容器里

java進階之了解SpringBoot的配置原理

說明這 131 個對象都是要加入到容器中的,并且都存儲在了一個List集合當中 List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes)

java進階之了解SpringBoot的配置原理

為什么會是131個呢? 其實是Spring Boot 里面寫死了,一啟動就要給容器中加載的所有配置類

打開spring-boot-autoconfigure-2.5.0.RELEASE.jar下META-INF/spring.factories位置的文件,讓我們來看一下源碼是怎么寫的

java進階之了解SpringBoot的配置原理

這里寫了一大堆 xxxxAutoConfiguration 的配置類,從26行開始,到156行結束,剛好是 131 個。

java進階之了解SpringBoot的配置原理java進階之了解SpringBoot的配置原理

雖然我們 131 個場景的所有自動配置啟動的時候默認全部加載,但并不是都會生效的,比如 AOP 的部分功能就需要你導入 aspectj 相關的包才能生效。它是按照條件裝配規則(@Conditional),最終會按需配置。

如圖, aspectj 是爆紅的

java進階之了解SpringBoot的配置原理

除了AOP之外,還有一些類也是沒有生效的(比如CacheAutoConfiguration),這里就不再贅述了,感興趣的同學可以去看源碼了解一下。

五、修改默認配置(約定大于配置)

SpringBoot 默認會在底層配好所有的組件。但是如果用戶自己配置了以用戶的優先

以 SpringMVC 中的文件上傳解析器為例,他在容器中的默認名字是multipartResolver,但是我們寫代碼的時候可能不知道底層源碼里面給他的默認名字是這個,我們給他起了另外一個名字,這個時候 SpringBoot 就會去容器中找到你所配置的那個組件,并且返回那個組件,也就是下面這段代碼:

java進階之了解SpringBoot的配置原理

這是為了防止有些用戶配置的文件上傳解析器不符合規范。

六、總結 SpringBoot先加載所有的自動配置類 xxxxxAutoConfiguration 每個自動配置類按照條件進行生效,默認都會綁定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件進行了綁定 生效的配置類就會給容器中裝配很多組件 只要容器中有這些組件,相當于這些功能就有了 定制化配置 用戶直接自己@Bean替換底層的組件 用戶去看這個組件是獲取的配置文件什么值就去修改。

整個的流程:xxxxxAutoConfiguration —> 組件 —> xxxxProperties里面拿值 ----> application.properties

所以,當我們需要修改組件的配置的時候,只需要在application.properties里面進行配置即可

到此這篇關于java進階之了解SpringBoot的配置原理的文章就介紹到這了,更多相關SpringBoot的配置原理內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 成都软件开发_OA|ERP|CRM|管理系统定制开发_成都码邻蜀科技 | 炭黑吸油计_测试仪,单颗粒子硬度仪_ASTM标准炭黑自销-上海贺纳斯仪器仪表有限公司(HITEC中国办事处) | 济南玻璃安装_济南玻璃门_济南感应门_济南玻璃隔断_济南玻璃门维修_济南镜片安装_济南肯德基门_济南高隔间-济南凯轩鹏宇玻璃有限公司 | 合肥废气治理设备_安徽除尘设备_工业废气处理设备厂家-盈凯环保 合肥防火门窗/隔断_合肥防火卷帘门厂家_安徽耐火窗_良万消防设备有限公司 | 成都治疗尖锐湿疣比较好的医院-成都治疗尖锐湿疣那家医院好-成都西南皮肤病医院 | 防伪溯源|防窜货|微信二维码营销|兆信_行业内领先的防伪防窜货数字化营销解决方案供应商 | 切铝机-数控切割机-型材切割机-铝型材切割机-【昆山邓氏精密机械有限公司】 | 液压升降平台_剪叉式液压/导轨式升降机_传菜机定做「宁波日腾升降机厂家」 | 正压送风机-多叶送风口-板式排烟口-德州志诺通风设备 | 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 美能达分光测色仪_爱色丽分光测色仪-苏州方特电子科技有限公司 | 小程序开发公司-小程序制作-微信小程序开发-小程序定制-咏熠软件 | 「银杏树」银杏树行情价格_银杏树种植_山东程锦园林 | 紫外可见光分光度计-紫外分光度计-分光光度仪-屹谱仪器制造(上海)有限公司 | 珠海网站建设_响应网站建设_珠海建站公司_珠海网站设计与制作_珠海网讯互联 | 拉力机-万能试验机-材料拉伸试验机-电子拉力机-拉力试验机厂家-冲击试验机-苏州皖仪实验仪器有限公司 | 塑料薄膜_PP薄膜_聚乙烯薄膜-常州市鑫美新材料包装厂 | 真石漆,山东真石漆,真石漆厂家,真石漆价格-山东新佳涂料有限公司 | 2025黄道吉日查询、吉时查询、老黄历查询平台- 黄道吉日查询网 | 注塑模具_塑料模具_塑胶模具_范仕达【官网】_东莞模具设计与制造加工厂家 | 大倾角皮带机-皮带输送机-螺旋输送机-矿用皮带输送机价格厂家-河南坤威机械 | 硅胶管挤出机厂家_硅胶挤出机生产线_硅胶条挤出机_臣泽智能装备 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 光照全温振荡器(智能型)-恒隆仪器| 智能交通网_智能交通系统_ITS_交通监控_卫星导航_智能交通行业 | 烟气换热器_GGH烟气换热器_空气预热器_高温气气换热器-青岛康景辉 | 制丸机,小型中药制丸机,全自动制丸机价格-甘肃恒跃制药设备有限公司 | 紫外可见光分光度计-紫外分光度计-分光光度仪-屹谱仪器制造(上海)有限公司 | 全温度恒温培养摇床-大容量-立式-远红外二氧化碳培养箱|南荣百科 | 手术室净化厂家_成都实验室装修公司_无尘车间施工单位_洁净室工程建设团队-四川华锐16年行业经验 | 不锈钢搅拌罐_高速搅拌罐厂家-无锡市凡格德化工装备科技有限公司 | 北京包装设计_标志设计公司_包装设计公司-北京思逸品牌设计 | 山东集装箱活动房|济南集装箱活动房-济南利森集装箱有限公司 | 运动木地板_体育木地板_篮球馆木地板_舞台木地板-实木运动地板厂家 | 上海风淋室_上海风淋室厂家_上海风淋室价格_上海伯淋 | 赛尔特智能移动阳光房-阳光房厂家-赛尔特建筑科技(广东)有限公司 | 阜阳成人高考_阜阳成考报名时间_安徽省成人高考网 | LED投光灯-工矿灯-led路灯头-工业灯具 - 山东普瑞斯照明科技有限公司 | 影像测量仪_三坐标测量机_一键式二次元_全自动影像测量仪-广东妙机精密科技股份有限公司 | 国资灵活用工平台_全国灵活用工平台前十名-灵活用工结算小帮手 | 江西自考网| 整车VOC采样环境舱-甲醛VOC预处理舱-多舱法VOC检测环境仓-上海科绿特科技仪器有限公司 |