国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring Boot實戰教程之自動配置詳解

Spring Boot實戰教程之自動配置詳解

2020-12-08 14:50HollisChuang Java教程

Spring Boot的自動配置給開發者帶來了很大的便利,當開發人員在pom文件中添加starter依賴后,maven或者gradle會自動下載很多jar包到classpath中。下面這篇文章主要給大家介紹了關于Spring Boot自動配置的相關資料,需要的朋友可以參考借鑒

前言

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

個人覺得Spring Boot中最重要的兩個優勢就是可以使用starter簡化依賴配置和Spring的自動配置。下面這篇文章將給大家詳細介紹Spring Boot自動配置的相關內容,話不多說,來一起看看詳細的介紹。

使用starter簡化依賴配置

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

Spring自動配置

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

條件化配置

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

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

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

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

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

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

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

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

Spring Boot應用的啟動入口

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

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

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

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

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

EnableAutoConfiguration

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

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

下面是EnableAutoConfiguration注解的源碼:

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

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

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

EnableAutoConfigurationImportSelector

EnableAutoConfigurationImportSelector的源碼在這里就不貼了,感興趣的可以直接去看一下,其實實現也比較簡單,主要就是使用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文件包含以下內容:

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

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

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

Configuation

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

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

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

總結

至此,我們可以總結一下Spring Boot的自動化配置的實現:

Spring Boot實戰教程之自動配置詳解

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

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

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持

原文鏈接:http://www.hollischuang.com/archives/1791

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日本精品在线观看视频 | 国产日产久久高清欧美一区 | 中文字幕在线观看第一页 | 噜噜噜噜狠狠狠7777视频 | 国产人成精品一区二区三 | 亚洲国产精品一区二区久久 | 国产成人久久精品一区二区三区 | 黄色片网站在线看 | 日韩在线一区二区三区免费视频 | 国产精品第一区 | 亚洲欧美在线一区 | 欧美在线免费 | 视频一区在线播放 | 久久91久久久久麻豆精品 | 91国内视频 | 国产精品久久久久久久久久久久 | 天堂av2020 | 视频一区二区中文字幕 | 自拍偷拍第一页 | 欧美第一页 | 国产美女一区二区 | 日本高清无卡码一区二区久久 | 亚洲区欧美区 | 在线中文视频 | 91视频进入 | 天天射影院 | 黄色国产免费看 | 国产片在线观看 | av一区在线 | 国产资源在线免费观看 | 日韩免费在线观看视频 | 精品久久久久久久久久久 | 狠狠躁夜夜躁人人爽天天高潮 | 亚洲国产精品成人 | 91免费观看视频 | 一区二区在线视频 | 九色在线 | a级片在线观看 | 中文字幕www.| 国产精品久久久久久亚洲调教 | 色在线视频播放 |