国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如何使用Spring Boot的自動配置

開發(fā) 開發(fā)工具
隨著Ruby、Groovy等動態(tài)語言的流行,相比較之下Java的開發(fā)顯得格外笨重。繁多的配置、低下的開發(fā)效率、復(fù)雜的部署流程以及第三方技術(shù)集成難度大等問題一直被人們所詬病。隨著Spring家族中的新星Spring Boot的誕生,這些問題都在逐漸被解決。

[[186266]]

隨著Ruby、Groovy等動態(tài)語言的流行,相比較之下Java的開發(fā)顯得格外笨重。繁多的配置、低下的開發(fā)效率、復(fù)雜的部署流程以及第三方技術(shù)集成難度大等問題一直被人們所詬病。隨著Spring家族中的新星Spring Boot的誕生,這些問題都在逐漸被解決。

個人覺得Spring Boot中最重要的兩個優(yōu)勢就是可以使用starter簡化依賴配置和Spring的自動配置。

使用starter簡化依賴配置

Spring提供了一系列starter來簡化Maven配置。其核心原理也就是Maven和Gradle的依賴傳遞方案。當我們在我們的pom文件中增加對某個starter的依賴時,該starter的依賴也會自動的傳遞性被依賴進來。而且,很多starter也依賴了其他的starter。例如web starter就依賴了tomcat starter,并且大多數(shù)starter基本都依賴了spring-boot-starter。

Spring自動配置

Spring Boot會根據(jù)類路徑中的jar包、類,為jar包里的類自動配置,這樣可以極大的減少配置的數(shù)量。簡單點說就是它會根據(jù)定義在classpath下的類,自動的給你生成一些Bean,并加載到Spring的Context中。自動配置充分的利用了spring 4.0的條件化配置特性,能夠自動配置特定的Spring bean,用來啟動某項特性。

條件化配置

假設(shè)你希望一個或多個bean只有在某種特殊的情況下才需要被創(chuàng)建,比如,一個應(yīng)用同時服務(wù)于中美用戶,要在中美部署,有的服務(wù)在美國集群中需要提供,在中國集群中就不需要提供。在Spring 4之前,要實現(xiàn)這種級別的條件化配置是比較復(fù)雜的,但是,Spring 4引入了一個新的@Conditional注解可以有效的解決這類問題。

  1. @Bean 
  2. @Conditional(ChinaEnvironmentCondition.class) 
  3. public ServiceBean serviceBean(){ 
  4.     return new ServiceBean(); 

當@Conditional(ChinaEnvironmentCondition.class)條件的值為true的時候,該ServiceBean才會被創(chuàng)建,否則該bean就會被忽略。

@Conditional指定了一個條件。他的條件的實現(xiàn)是一個Java類——ChinaEnvironmentCondition,要實現(xiàn)以上功能就要定義ChinaEnvironmentCondition類,并繼承Condition接口并重寫其中的matches方法。

  1. class ChinaEnvironmentCondition implements Condition{ 
  2.     public final boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { 
  3.  
  4.         Environment env = context.getEnvironment(); 
  5.         return env.containProperty("ENV_CN"); 
  6.     } 

在上面的代碼中,matches方法的內(nèi)容比較簡單,他通過給定的ConditionContext對象進而獲取Environment對象,然后使用該對象檢查環(huán)境中是否存在ENV_CN屬性。如果存在該方法則直接返回true,反之返回false。當該方法返回true的時候,就符合了@Conditional指定的條件,那么ServiceBean就會被創(chuàng)建。反之,如果環(huán)境中沒有這個屬性,那么這個ServiceBean就不會被創(chuàng)建。

除了可以自定義一些條件之外,Spring 4本身提供了很多已有的條件供直接使用,如:

  1. @ConditionalOnBean 
  2. @ConditionalOnClass 
  3. @ConditionalOnExpression 
  4. @ConditionalOnMissingBean 
  5. @ConditionalOnMissingClass 
  6. @ConditionalOnNotWebApplication 

Spring Boot應(yīng)用的啟動入口

自動配置充分的利用了spring 4.0的條件化配置特性,那么,Spring Boot是如何實現(xiàn)自動配置的?Spring 4中的條件化配置又是怎么運用到Spring Boot中的呢?這要從Spring Boot的啟動類說起。Spring Boot應(yīng)用通常有一個名為*Application的入口類,入口類中有一個main方法,這個方法其實就是一個標準的Java應(yīng)用的入口方法。一般在main方法中使用SpringApplication.run()來啟動整個應(yīng)用。值得注意的是,這個入口類要使用@SpringBootApplication注解聲明。@SpringBootApplication是Spring Boot的核心注解,他是一個組合注解。

  1. @Target({ElementType.TYPE}) 
  2. @Retention(RetentionPolicy.RUNTIME) 
  3. @Documented 
  4. @Inherited 
  5. @SpringBootConfiguration 
  6. @EnableAutoConfiguration 
  7. @ComponentScan( 
  8.     excludeFilters = {@Filter( 
  9.     type = FilterType.CUSTOM, 
  10.     classes = {TypeExcludeFilter.class} 
  11. ), @Filter( 
  12.     type = FilterType.CUSTOM, 
  13.     classes = {AutoConfigurationExcludeFilter.class} 
  14. )} 
  15. public @interface SpringBootApplication { 
  16.     // 略 

@SpringBootApplication是一個組合注解,它主要包含@SpringBootConfiguration、@EnableAutoConfiguration等幾個注解。也就是說可以直接在啟動類中使用這些注解來代替@ SpringBootApplication注解。 關(guān)于Spring Boot中的Spring自動化配置主要是@EnableAutoConfiguration的功勞。該注解可以讓Spring Boot根據(jù)類路徑中的jar包依賴為當前項目進行自動配置。

至此,我們知道,Spring Boot的自動化配置主要是通過@EnableAutoConfiguration來實現(xiàn)的,因為我們在程序的啟動入口使用了@SpringBootApplication注解,而該注解中組合了@EnableAutoConfiguration注解。所以,在啟動類上使用@EnableAutoConfiguration注解,就會開啟自動配置。

那么,本著刨根問底的原則,當然要知道@EnableAutoConfiguration又是如何實現(xiàn)自動化配置的,因為目前為止,我們還沒有發(fā)現(xiàn)Spring 4中條件化配置的影子。

EnableAutoConfiguration

其實Spring框架本身也提供了幾個名字為@Enable開頭的Annotation定義。比如@EnableScheduling、@EnableCaching、@EnableMBeanExport等,@EnableAutoConfiguration的理念和這些注解其實是一脈相承的。

  • @EnableScheduling是通過@Import將Spring調(diào)度框架相關(guān)的bean定義都加載到IoC容器。
  • @EnableMBeanExport是通過@Import將JMX相關(guān)的bean定義加載到IoC容器。
  • @EnableAutoConfiguration也是借助@Import的幫助,將所有符合自動配置條件的bean定義加載到IoC容器。

下面是EnableAutoConfiguration注解的源碼:

  1. @Target({ElementType.TYPE}) 
  2. @Retention(RetentionPolicy.RUNTIME) 
  3. @Documented 
  4. @Inherited 
  5. @AutoConfigurationPackage 
  6. @Import({EnableAutoConfigurationImportSelector.class}) 
  7. public @interface EnableAutoConfiguration { 
  8.     //略 

觀察@EnableAutoConfiguration可以發(fā)現(xiàn),這里Import了@EnableAutoConfigurationImportSelector,這就是Spring Boot自動化配置的“始作俑者”。

至此,我們知道,至此,我們知道,由于我們在Spring Boot的啟動類上使用了@SpringBootApplication注解,而該注解組合了@EnableAutoConfiguration注解,@EnableAutoConfiguration是自動化配置的“始作俑者”,而@EnableAutoConfiguration中Import了@EnableAutoConfigurationImportSelector注解,該注解的內(nèi)部實現(xiàn)已經(jīng)很接近我們要找的“真相”了。

EnableAutoConfigurationImportSelector

EnableAutoConfigurationImportSelector的源碼在這里就不貼了,感興趣的可以直接去看一下,其實實現(xiàn)也比較簡單,主要就是使用Spring 4 提供的的SpringFactoriesLoader工具類。通過SpringFactoriesLoader.loadFactoryNames()讀取了ClassPath下面的META-INF/spring.factories文件。

這里要簡單提一下spring.factories文件,它是一個典型的java properties文件,配置的格式為Key = Value形式。

EnableAutoConfigurationImportSelector通過讀取spring.factories中的key為org.springframework.boot.autoconfigure.EnableAutoConfiguration的值。如spring-boot-autoconfigure-1.5.1.RELEASE.jar中的spring.factories文件包含以下內(nèi)容:

  1. # Auto Configure 
  2. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 
  3. org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ 
  4. org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ 
  5. org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\ 
  6. org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\ 
  7. org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\ 
  8. org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\ 
  9. org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\ 
  10. ...... 
  11. org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration 

上面的EnableAutoConfiguration配置了多個類,這些都是Spring Boot中的自動配置相關(guān)類;在啟動過程中會解析對應(yīng)類配置信息。每個Configuation都定義了相關(guān)bean的實例化配置。都說明了哪些bean可以被自動配置,什么條件下可以自動配置,并把這些bean實例化出來。

如果我們新定義了一個starter的話,也要在該starter的jar包中提供 spring.factories文件,并且為其配置org.springframework.boot.autoconfigure.EnableAutoConfiguration對應(yīng)的配置類。

Configuation

我們從spring-boot-autoconfigure-1.5.1.RELEASE.jar中的spring.factories文件隨便找一個Configuration,看看他是如何自動加載bean的。

  1. @Configuration 
  2. @AutoConfigureAfter({JmxAutoConfiguration.class}) 
  3. @ConditionalOnProperty( 
  4.     prefix = "spring.application.admin"
  5.     value = {"enabled"}, 
  6.     havingValue = "true"
  7.     matchIfMissing = false 
  8. public class SpringApplicationAdminJmxAutoConfiguration { 
  9.     @Bean 
  10.     @ConditionalOnMissingBean 
  11.     public SpringApplicationAdminMXBeanRegistrar springApplicationAdminRegistrar() throws MalformedObjectNameException { 
  12.         String jmxName = this.environment.getProperty("spring.application.admin.jmx-name""org.springframework.boot:type=Admin,name=SpringApplication"); 
  13.         if(this.mbeanExporter != null) { 
  14.             this.mbeanExporter.addExcludedBean(jmxName); 
  15.         } 
  16.  
  17.         return new SpringApplicationAdminMXBeanRegistrar(jmxName); 
  18.     } 

看到上面的代碼,終于找到了我們要找的東西——Spring 4的條件化配置。上面SpringApplicationAdminJmxAutoConfiguration在決定對哪些bean進行自動化配置的時候,使用了兩個條件注解:ConditionalOnProperty和ConditionalOnMissingBean。只有滿足這種條件的時候,對應(yīng)的bean才會被創(chuàng)建。這樣做的好處是什么?這樣可以保證某些bean在沒滿足特定條件的情況下就可以不必初始化,避免在bean初始化過程中由于條件不足,導(dǎo)致應(yīng)用啟動失敗。

總結(jié)

至此,我們可以總結(jié)一下Spring Boot的自動化配置的實現(xiàn):

通過Spring 4的條件配置決定哪些bean可以被配置,將這些條件定義成具體的Configuation,然后將這些Configuation配置到spring.factories文件中,作為key: org.springframework.boot.autoconfigure.EnableAutoConfiguration的值,這時候,容器在啟動的時候,由于使用了EnableAutoConfiguration注解,該注解Import的EnableAutoConfigurationImportSelector會去掃描classpath下的所有spring.factories文件,然后進行bean的自動化配置。

所以,如果我們想要自定義一個starter的話,可以通過以上方式將自定義的starter中的bean自動化配置到Spring的上下文中,從而避免大量的配置。

【本文是51CTO專欄作者Hollis的原創(chuàng)文章,作者微信公眾號Hollis(ID:hollischuang)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2021-08-06 08:04:14

Spring Boot自動配置

2023-10-18 08:12:34

Spring自動配置

2025-02-27 00:10:19

2024-04-18 09:34:28

Reactor項目異步編程

2022-04-27 08:55:01

Spring外部化配置

2017-06-26 08:47:05

Spring Boot自動化配置

2021-02-11 08:08:09

Spring Boot配置架構(gòu)

2023-11-01 15:07:51

環(huán)境配置方式

2022-07-26 16:54:08

QuartzJava

2024-12-03 08:00:00

2017-05-09 10:34:21

Spring BootDubbo Activ擴展

2017-04-28 08:32:40

Spring BootDubbo Activ使用

2021-09-15 16:20:02

Spring BootFilterJava

2021-09-30 06:31:12

Spring Boot配置密碼

2024-09-11 08:22:44

2025-02-05 12:28:44

2025-07-08 07:15:00

Spring配置多種方式

2024-12-25 16:01:01

2021-02-03 09:04:11

解密Spring配置

2022-11-08 07:46:28

record類聲明代碼
點贊
收藏

51CTO技術(shù)棧公眾號

国产成人精品av| 亚洲一区二区三区乱码aⅴ| 午夜国产视频| 性8sex亚洲区入口| 久久不射电影网| 国产在线更新| 香蕉久久一区二区不卡无毒影院| 大地资源网在线观看免费官网| 日本精品三区| 久久成人精品一区二区三区| 日本天码aⅴ片在线电影网站| 亚洲精品国产成人久久av盗摄| 麻豆传媒网站在线观看| 欧美日本在线| 国产精品精品久久久久久| 成人国产激情| 欧美mv日韩mv亚洲| 尤物视频网站在线观看| 久久久精品国产99久久精品芒果| 亚洲一区影院| 视频一区二区三区中文字幕| 国产在线观看不卡| 一本久久青青| 欧美精品福利视频| 欧美黄色网络| 日韩亚洲成人av在线| 美女日韩欧美| 91福利视频网站| 精品女厕厕露p撒尿| 综合自拍亚洲综合图不卡区| 免费av观看网址| 成人性视频免费网站| 日韩中文字幕一区| 久久狠狠一本精品综合网| 99在线国产| 欧美精品国产| 国产精品久久国产三级国电话系列| 欧美3p视频| 91传媒视频在线观看| 性xxxx欧美老肥妇牲乱| 国产欧美精品xxxx另类| 精品久久久久久久| 国产日韩在线亚洲字幕中文| 欧美一区三区| 国产精品99久久久久久白浆小说| 国产精品调教视频| 国外成人免费在线播放| jizz国产精品| 91wwwcom在线观看| 激情五月综合| 亚洲一区二区三区成人在线视频精品 | 色成年激情久久综合| 美女的诞生在线观看高清免费完整版中文 | 久久综合伊人77777| 精品一区二区三区中文字幕| 久久久精品久久久| 国产精品xxxav免费视频| 欧美亚洲国产视频小说| 久久精品播放| 美女黄毛**国产精品啪啪| 免费的国产精品| 精品国产av无码一区二区三区| 国产偷国产偷精品高清尤物| 裸体av在线| 在线视频中文字幕一区二区| 午夜小视频在线观看| 国产亚洲精品美女久久久久| 亚洲专区**| 国产精品极品在线| 色成人在线视频| 黄色特一级视频| 91香蕉国产在线观看软件| 91福利免费| 欧美三级资源在线| av免费在线一区| 国产精品扒开腿做爽爽爽视频| 欧美另类亚洲| 91视频 - 88av| 亚洲欧美国产77777| 国产在线观看91| 欧美成人在线影院| 一二三四中文字幕| 成人视屏在线观看| 国产精品夫妻激情| 日韩不卡一区二区| 免费在线观看毛片网站| 亚洲高清久久久| 美女av在线免费看| 青青在线视频一区二区三区| 亚洲每日更新| 国产h视频在线播放| 精品毛片三在线观看| 亚洲美女尤物影院| 国产精品视频999| 九九视频精品免费| 绯色av一区二区| 亚洲国产精品久久91精品| 精品视频高潮| 午夜老司机精品| 一区二区三区在线免费| yellow在线观看网址| 日韩av片电影专区| 国产一区二区导航在线播放| 在线视频三级| 色小说视频一区| 色天使综合视频| 日本大胆人体视频| 亚洲第一av网| 国产欧美日韩视频一区二区| 久久夜色精品国产噜噜av| 亚洲欧美日韩成人高清在线一区| 一区二区三区不卡视频| 国产精品久久久久久一区二区三区| 国产一区二区女| 国产精品免费视频观看| 色婷婷色综合| 888av在线视频| 99re国产视频| 亚洲人成精品久久久久| 男男gaygays亚洲| 久久夜色精品国产欧美乱| 在线国产日韩| 18+视频在线观看| 一区二区三区|亚洲午夜| 伦伦影院午夜日韩欧美限制| 色综合视频在线观看| 国产精品久久久一区麻豆最新章节| 亚洲成人基地| 欧美午夜精品久久久久久蜜| 国产精品激情av电影在线观看| 国产精品天天狠天天看| 久久免费福利视频| 视频在线观看99| 深夜成人在线观看| 欧美日本亚洲视频| 日本一区二区在线免费播放| 日本道色综合久久| 色欲综合视频天天天| 国内精品国产成人国产三级粉色| 精品美女视频在线观看免费软件| 欧美超级乱淫片喷水| 1000部国产精品成人观看| 午夜日韩视频| 91麻豆精品国产综合久久久 | 做爰高潮hd色即是空| 欧美精品在线观看播放| 国产精品成人网| 亚洲三级电影全部在线观看高清| 亚洲猫色日本管| 国产视频一区三区| 日韩精品影视| 福利影院在线看| 欧美精品少妇| 九九99九九精彩| 久久久久久久国产精品视频| 亚洲精品九九| 加勒比日本影视| 精品人妻大屁股白浆无码| 久热99视频在线观看| 国产欧美日韩视频在线观看| 久久久久观看| 久久久精品麻豆| 中文字幕欧美精品在线| 国产精品2024| 日韩视频中文| av免费在线观看网站| 成人午夜精品久久久久久久蜜臀| 精品免费视频.| 91网站在线播放| 欧美一区二区三区另类| 国产www视频在线观看| 九9re精品视频在线观看re6| 欧美人成在线观看| 忘忧草在线www成人影院| 国产精品一区二区三区网站| 国产亚洲精品91在线| 另类天堂视频在线观看| 日韩精品高清视频| 亚洲成人久久久| 4438全国亚洲精品在线观看视频| 一区二区在线中文字幕电影视频 | 免费在线观看亚洲视频| 日产精品久久久一区二区| 三年中国中文在线观看免费播放| 亚洲国产成人不卡| 亚洲va电影大全| 亚洲最大av网| 日韩精品久久久| www.成人av.com| 日本精品免费视频| 成人性做爰片免费视频| 91国产在线免费观看| 北条麻妃99精品青青久久| 亚洲国产日韩欧美在线99| 欧美日韩亚洲综合一区| 在线免费观看不卡av| 国产女人18水真多18精品一级做| 欧美精品一卡| 激情六月综合| 人人精品人人爱|