Spring Boot是基于Spring開發(fā)的,它就相當(dāng)于maven整合了所有jar包,Spring Boot整合了所有框架。其設(shè)計(jì)目的是用來簡化新 Spring 應(yīng)用的初始搭建以及開發(fā)過程,那springboot自動配置原理是什么?下面來我們就來給大家講解一下。
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方法來掃描具有MEAT-INF/spring.factories文件的jar包(1.5版本以前使用EnableAutoConfigurationimportSelector類,1.5以后這個(gè)類廢棄了使用的是AutoConfigurationimportSelector類),下面是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, \
里面的類都是自動配置類,SpringBoot會根據(jù)這些自動配置類去自動配置環(huán)境。
下面我們就自動動手寫一個(gè)starter。
2自定義Starter
首先先介紹幾個(gè)條件注解。
@ConditionalOnBean:當(dāng)容器里有指定的Bean為true
@ConditionalOnClass:當(dāng)類路徑下有指定的類為true
@ConditionalOnMissingBean:當(dāng)容器里沒有指定的Bean為true
@ConditionalOnProperty:指定的數(shù)據(jù)是否有指定的值
...
了解了條件注解后,我們開始自定義Starter。
1、在自定義Starter之前先要在Maven中填寫依賴。
2、完成TestProperties類,這個(gè)類定義了默認(rèn)的屬性值,如該類中,只有一個(gè)屬性值msg,默認(rèn)為world。@ConfigurationProperties注解會定義一個(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ù)類。服務(wù)類是指主要的功能類,如果沒有SpringBoot,這些服務(wù)類在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、完成自動配置類。自動配置類主要作用是SpringBoot的配置核心,它會寫在MEAT-INF/spring.factories中,告知SpringBoot在啟動時(shí)去讀取該類并根據(jù)該類的規(guī)則進(jìn)行配置。
@EnableConfigurationProperties注解根據(jù)TestProperties類開啟屬性注入,允許在application.properties修改里面的屬性值。
@ConditionOnClass會檢測是否存在TestService類
@ConditionOnProperty類會查看是否開啟該自動配置。默認(rèn)開啟(true)。
@ConditionOnMissingBean會檢測容器中是否有TestService類的對象,如果沒有則生成一個(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)容很簡單,告訴SpringBoot去讀取TestServiceAutoConfiguration類。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ cn.miaolovezhen.TestServiceAutoConfiguration
這就是SpringBoot自動配置的原理,SpringBoot能夠快速創(chuàng)建獨(dú)立運(yùn)行的Spring項(xiàng)目以及主流框架集成,可以簡化開發(fā),是開發(fā)人員更加高效的開發(fā)項(xiàng)目!最后大家如果想要了解更多其他工具教程知識,敬請關(guān)注賦能網(wǎng)。
本文鏈接:
本文章“pringboot自動配置原理是什么?pringboot自動配置原理實(shí)現(xiàn)”已幫助 3864 人
免責(zé)聲明:本信息由用戶發(fā)布,本站不承擔(dān)本信息引起的任何交易及知識產(chǎn)權(quán)侵權(quán)的法律責(zé)任!
本文由賦能網(wǎng) 整理發(fā)布。了解更多培訓(xùn)機(jī)構(gòu)》培訓(xùn)課程》學(xué)習(xí)資訊》課程優(yōu)惠》課程開班》學(xué)校地址等機(jī)構(gòu)信息,可以留下您的聯(lián)系方式,讓課程老師跟你詳細(xì)解答:
咨詢熱線:4008-569-579