您好,歡迎來(lái)到賦能網(wǎng)!

pringboot自動(dòng)配置原理是什么?pringboot自動(dòng)配置原理實(shí)現(xiàn)

賦能網(wǎng) 2023-05-09 3864

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)給大家講解一下。

springboot自動(dòng)配置工作原理

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

如果本頁(yè)不是您要找的課程,您也可以百度查找一下: