Spring Boot是基于Spring開(kāi)發(fā)的,它就相當(dāng)于maven整合了所有jar包,Spring Boot整合了所有框架。其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化新 Spring 應(yīng)用的初始搭建以及開(kāi)發(fā)過(guò)程,那springboot自動(dòng)配置原理是什么?下面來(lái)我們就來(lái)給大家講解一下。
1運(yùn)行原理
Spring Boot的運(yùn)行是由注解@EnableAutoConfiguration提供的。
@Target( { ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) @documented @Inherited @AutoConfigurationPackage @import( { EnableAutoConfigurationimportSelector.class }) public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; Class < ? > [] exclude() default {}; String[] excludeName() default {}; }
這里的關(guān)鍵功能是@import注解。EnableAutoConfigurationimportSelector使用SpringFactoriesLoader.loadFactoryNames方法來(lái)掃描具有MEAT-INF/spring.factories文件的jar包(1.5版本以前使用EnableAutoConfigurationimportSelector類(lèi),1.5以后這個(gè)類(lèi)廢棄了使用的是AutoConfigurationimportSelector類(lèi)),下面是spring-boot-autoconfigure-1.5.4.RELEASE.jar下的MEAT-INF中的spring.factories文件的部分內(nèi)容。
# Initializers org.springframework.context.ApplicationContextInitializer = \ org.springframework.boot.autoconfigure.SharedmetadataReaderFactoryContextInitializer, \ org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer# Application Listeners org.springframework.context.ApplicationListener = \ org.springframework.boot.autoconfigure.BackgroundPreinitializer# Auto Configuration import Listeners org.springframework.boot.autoconfigure.AutoConfigurationimportListener = \ org.springframework.boot.autoconfigure.condition.ConditionevaluationReportAutoConfigurationimportListener# Auto Configuration import Filters org.springframework.boot.autoconfigure.AutoConfigurationimportFilter = \ org.springframework.boot.autoconfigure.condition.OnClassCondition# 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.context.ConfigurationPropertiesAutoConfiguration, \
里面的類(lèi)都是自動(dòng)配置類(lèi),SpringBoot會(huì)根據(jù)這些自動(dòng)配置類(lèi)去自動(dòng)配置環(huán)境。
下面我們就自動(dòng)動(dòng)手寫(xiě)一個(gè)starter。
2自定義Starter
首先先介紹幾個(gè)條件注解。
@ConditionalOnBean:當(dāng)容器里有指定的Bean為true
@ConditionalOnClass:當(dāng)類(lèi)路徑下有指定的類(lèi)為true
@ConditionalOnMissingBean:當(dāng)容器里沒(méi)有指定的Bean為true
@ConditionalOnProperty:指定的數(shù)據(jù)是否有指定的值
...
了解了條件注解后,我們開(kāi)始自定義Starter。
1、在自定義Starter之前先要在Maven中填寫(xiě)依賴。
2、完成TestProperties類(lèi),這個(gè)類(lèi)定義了默認(rèn)的屬性值,如該類(lèi)中,只有一個(gè)屬性值msg,默認(rèn)為world。@ConfigurationProperties注解會(huì)定義一個(gè)匹配,如果想修改屬性值,可以在application.properties中使用“匹配.屬性=修改的值”進(jìn)行修改。如test.msg = tan
@ConfigurationProperties(prefix = "test") public class TestProperties { private static final String MSG = "springboot"; private String msg = MSG; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
3、完成服務(wù)類(lèi)。服務(wù)類(lèi)是指主要的功能類(lèi),如果沒(méi)有SpringBoot,這些服務(wù)類(lèi)在Spring中都是需要自己去配置生成的。如SpringMVC中的DispatcherServlet、Mybatis的DataSource等。
public class TestService { private String msg; public String sayHello() { return "Hello " + msg; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
4、完成自動(dòng)配置類(lèi)。自動(dòng)配置類(lèi)主要作用是SpringBoot的配置核心,它會(huì)寫(xiě)在MEAT-INF/spring.factories中,告知SpringBoot在啟動(dòng)時(shí)去讀取該類(lèi)并根據(jù)該類(lèi)的規(guī)則進(jìn)行配置。
@EnableConfigurationProperties注解根據(jù)TestProperties類(lèi)開(kāi)啟屬性注入,允許在application.properties修改里面的屬性值。
@ConditionOnClass會(huì)檢測(cè)是否存在TestService類(lèi)
@ConditionOnProperty類(lèi)會(huì)查看是否開(kāi)啟該自動(dòng)配置。默認(rèn)開(kāi)啟(true)。
@ConditionOnMissingBean會(huì)檢測(cè)容器中是否有TestService類(lèi)的對(duì)象,如果沒(méi)有則生成一個(gè)。
@Configuration @EnableConfigurationProperties(TestProperties.class) @ConditionalOnClass(TestService.class) @ConditionalOnProperty(prefix = "test", value = "enabled", matchIfMissing = true) public class TestServiceAutoConfiguration { @Autowired TestProperties testProperties; @Bean @ConditionalOnMissingBean(TestService.class) public TestService testService() { TestService testService = new TestService(); testService.setMsg(testProperties.getMsg()); return testService; } }
5、最后一步,不要忘記在在MEAT-INF文件夾中創(chuàng)建spring.factories文件。內(nèi)容很簡(jiǎn)單,告訴SpringBoot去讀取TestServiceAutoConfiguration類(lèi)。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ cn.miaolovezhen.TestServiceAutoConfiguration
這就是SpringBoot自動(dòng)配置的原理,SpringBoot能夠快速創(chuàng)建獨(dú)立運(yùn)行的Spring項(xiàng)目以及主流框架集成,可以簡(jiǎn)化開(kāi)發(fā),是開(kāi)發(fā)人員更加高效的開(kāi)發(fā)項(xiàng)目!最后大家如果想要了解更多其他工具教程知識(shí),敬請(qǐng)關(guān)注賦能網(wǎng)。
本文鏈接:
本文章“pringboot自動(dòng)配置原理是什么?pringboot自動(dòng)配置原理實(shí)現(xiàn)”已幫助 3864 人
免責(zé)聲明:本信息由用戶發(fā)布,本站不承擔(dān)本信息引起的任何交易及知識(shí)產(chǎn)權(quán)侵權(quán)的法律責(zé)任!
本文由賦能網(wǎng) 整理發(fā)布。了解更多培訓(xùn)機(jī)構(gòu)》培訓(xùn)課程》學(xué)習(xí)資訊》課程優(yōu)惠》課程開(kāi)班》學(xué)校地址等機(jī)構(gòu)信息,可以留下您的聯(lián)系方式,讓課程老師跟你詳細(xì)解答:
咨詢熱線:4008-569-579