最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot框架底層原理解析

 更新時間:2024年03月02日 09:19:17   作者:我不配擁有55kg的你  
這篇文章主要介紹了SpringBoot底層原理,包括配置優(yōu)先級的配置方式給大家講解的非常詳細(xì),需要的朋友可以參考下

SpringBoot底層原理

一 配置優(yōu)先級

1.配置方式

Springboot中支持三種配置方式,分別為:

  • application.properties
  • application.yml
  • application.yaml

2.配置優(yōu)先級

當(dāng)存在多份配置文件時,配置文件會按照它們的優(yōu)先級生效。

優(yōu)先級從高到底分別為:application.peoperties>application.yml>application.yaml

目前 application.yml 是最主流的方式

3.其他配置方式

Springboot除了以上常見的三種配置方式之外,還支持Java系統(tǒng)屬性配置和命令行參數(shù)配置。

1.Java系統(tǒng)屬性配置示例

# 在 java 命令后使用 —D 命令,然后書寫需要配置的屬性即可
# 示例中配置了項目的運行端口為8081,即server.port=8081
java -Dserver.port=8081 -jar [packageName].jar

2.命令行參數(shù)配置示例

# 在jar包名稱之后,使用雙橫杠(--),后面緊跟配置的參數(shù)即可
java -jar [packageName].jar --server.port=8082

二 Bean管理

1.獲取bean對象

默認(rèn)情況下,Springboot項目在啟動時會自動創(chuàng)建bean,并且將這些bean都存放在IOC容器中。

如果想手動獲取這些bean,則可以通過以下幾種示例。

首先需要注入ApplicationContext對象。

Spring框架中,ApplicationContext是一個接口,代表了Spring容器,它負(fù)責(zé)管理Spring應(yīng)用程序中所有的bean,同時提供了一些方法來獲取Bean,注冊Bean,是整個Spring應(yīng)用的核心。

默認(rèn)情況下,一個Bean的名稱是它的類名名稱,然后將首字母小寫。

例如 DeptController,它在IOC容器中的默認(rèn)名稱為 deptController

@Autowired
private ApplicationContext applicationContext;
@Test
void test1(){
    //1.根據(jù)bean的名稱來獲取bean對象
    EmpServiceImpl empServiceImpl1= (EmpServiceImpl) applicationContext.getBean("empServiceImpl");
    System.out.println(empServiceImpl1);
    //2.根據(jù)bean的類型來獲取bean對象
    EmpServiceImpl empServiceImpl2= applicationContext.getBean(EmpServiceImpl.class);
    System.out.println(empServiceImpl2);
    //3.根據(jù)bean的類型和名稱來獲取bean對象
    // 以下方法和示例,在bean的默認(rèn)名稱被修改且有多個同類型的bean時,尤為有用。
    EmpServiceImpl empServiceImpl3= applicationContext.getBean("empServiceImpl",EmpServiceImpl.class);
    System.out.println(empServiceImpl3);
}

運行以上示例,可以看出,bean在IOC容器中,默認(rèn)是單例存在的。

如果想要實現(xiàn)每次使用時都是一個新的bean,則需要通過bean的作用域來進(jìn)行配置。

2.bean的作用域

在Spring中,bean支持五種作用域,后三種在web環(huán)境下才能生效。

默認(rèn)情況下,Bean對象在項目啟動時就會默認(rèn)實例化。如果不希望在項目啟動時就初始化,可以使用@Lazy注解,讓Bean對象延遲初始化,直到第一次使用該Bean時才會進(jìn)行初始化。

@Service
@Lazy
public class EmpServiceImpl extends ServiceImpl<EmpMapper, Emp> implements EmpService{
    //code...
}

設(shè)置Bean的作用域,則需要通過@Scope注解來實現(xiàn)。

以下示例中,我們將Bean的作用域設(shè)置為 prototype,即每次使用該Bean時都會創(chuàng)建新對象。

@Service
@Scope("prototype")
public class EmpServiceImpl extends ServiceImpl<EmpMapper, Emp> implements EmpService{
    //code...
}

現(xiàn)在再次運行前邊獲取Bean對象的代碼示例,可以發(fā)現(xiàn),三次獲取到的Bean對象,已經(jīng)不是同一個。

3.聲明第三方bean

如果要申明的Bean來自第三方,是無法通過@Component及衍生注解來申明的,這個時候就需要使用@Bean注解。

以 SAXReader 類為例,創(chuàng)建一個返回值為SAXReader對象的方法,方法名稱就是以后被ICO管理的Bean對象名稱。

//將方法的返回值交給IOC容器管理,稱為IOC容器的Bean對象
@Bean
public SAXReader saxReader(){
    return new SAXReader();
}

在以后需要用到 SAXReader 對象的時候,直接注入即可,不用去實例化。

@Autowired
private SAXReader saxReader;
@Test
void test2() throws DocumentException {
    Document document = saxReader.read("xxx");
}

注意:一般情況下,我們通常會將所有需要申明的第三方bean對象統(tǒng)一放在一個配置類中,這樣更加方便維護(hù)。

@Configuration
public class BeanAutoConfig {
    // 可以通過@Bean注解的 name /value 屬性來定義bean的名稱
    // 默認(rèn)情況下,bean的名稱就是方法名
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

在聲明第三方bean對象時,如果需要進(jìn)行依賴注入,則只需要指定方法形參即可。Spring會根據(jù)類型進(jìn)行自動裝配。

// EmpServiceImpl對象是要注入的bean對象
@Bean
public RestTemplate restTemplate(EmpServiceImpl empServiceImpl){
    empServiceImpl.[xxx];
    return new RestTemplate();
}

三 Springboot原理

1.Springboot起步依賴

Springboot整合了以前web開發(fā)需要用的一些依賴項,目前使用Springboot開發(fā)web項目,只需要引入 spring-boot-start-web 依賴即可。

歸根結(jié)底,SPringboot起步依賴的原理就是maven的依賴傳遞。

2.自動配置

當(dāng)Springboot項目啟動后,Springboot中的一些配置類,bean對象就會自動存入到IOC容器中,不需要我們手動去申明。從而簡化了開發(fā),省去了繁瑣的配置。

3.管理第三方包中的Bean

1.配置實現(xiàn)方式1:@ComponentScan 組件掃描

在啟動類上使用 @ComponentScan注解,重新配置包掃描路徑。@ComponentScanbasePackages參數(shù)支持?jǐn)?shù)據(jù)格式,當(dāng)有多個第三方包時,可使用數(shù)組形式申明。

@ComponentScan(basePackages = "xxx1")

@ComponentScan(basePackages = {
   "xxx1",
   "xxx2"
})

注意:使用@ComponentScan申明時,當(dāng)前Springboot項目中的包路徑也必須包含在內(nèi),否則當(dāng)前項目中的bean將會被無法識別。

缺點:當(dāng)項目較大時,引入大量的第三方依賴,此時啟動類將會顯得臃腫。

2.配置實現(xiàn)方式2:@Import 組件導(dǎo)入

使用@Import導(dǎo)入的類會被Spring加載到容器中??梢詫?dǎo)入普通類,配置類,以及 ImportSelector 接口的實現(xiàn)類,支持?jǐn)?shù)組。

@Import({xx1.class,xx2.class})

實現(xiàn)ImportSelector 接口,這里最核心的就是 selectImports方法,它返回了需要創(chuàng)建Bean對象的全部類。

public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        //此處的數(shù)組內(nèi)容為需要導(dǎo)入的Bean對象的全類名,有多少寫多少
        return new String[]{"springboot.demo.GoodStudent"};
    }
}

然后在啟動類上使用@Import注解即可。

@Import({MyImportSelector.class})

單純使用 @Import接口聲明第三方Bean,缺點很明顯。

3.配置實現(xiàn)方式3:第三方依賴提供注解

實際項目中,具體第三方依賴需要導(dǎo)入哪些Bean,只有第三方依賴自己知道。所以可以由第三方依賴提供注解,然后在項目中引入即可。

此類型注解一般均由 Enable 開頭,原理是在自定義注解中封裝 @Import 注解。

示例:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import({
        MybatisPlusConfig.class,
        CorsConfig.class,
        SpringWebConfig.class,
        BeanAutoConfig.class,
        RedisConfig.class
})
public @interface EnableShawnConfig {
}

在第三方依賴包中定義一個EnableShawnConfig注解,然后使用 @Import將需要配置的Bean對象都引入進(jìn)來。最后再在項目中使用該注解即可。

@EnableShawnConfig
@SpringBootApplication
public class ShawnServerSystemApplication {
    public static void main(String[] args) {
        SpringApplication.run(ShawnServerSystemApplication.class, args);
    }
}

4.自動配置原理分析

Springboot核心注解:@SpringBootApplication

@SpringBootApplication下的重要注解:

  • @SpringBootConfiguration:申明當(dāng)前注解也是一個配置類,因為@SpringBootConfiguration中也申明了@Configuration注解。所以可以直接在啟動類中申明第三方的bean對象。
  • @EnableAutoConfiguration:Springboot自動配置的核心注解,它聲明了@Import(AutoConfigurationImportSelector.class),AutoConfigurationImportSelector是ImportSelector接口的實現(xiàn)類,實現(xiàn)了 selectImports 方法。selectImports 方法返回了需要創(chuàng)建Bean對象的全部信息。
  • @ComponentScan:組件掃描,默認(rèn)掃描當(dāng)前引導(dǎo)類及其所在的子包。

自動配置最核心的注解就是@EnableAutoConfiguration,由源碼可知,selectImports 方法會讀取一個固定目錄下后綴名為.imports的文件。

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    List<String> configurations = ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader())
            .getCandidates();
    Assert.notEmpty(configurations,
            "No auto configuration classes found in "
                    + "META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you "
                    + "are using a custom packaging, make sure that file is correct.");
    return configurations;
}

springboot3.x中,META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中,配置了需要創(chuàng)建Bean對象的全類名

在Springboot2.x中,是通過兩個關(guān)鍵文件來讀取配置好的全類名的。

spring.factories 是早起Springboot版本中自動配置的文件,在后續(xù)版本中已經(jīng)逐漸不再使用。

5.@Conditinal注解

@Conditinal注解的作用:按照一定的條件判斷,在滿足條件后才會注冊對應(yīng)的Bean對象到IOC容器中

它可以作用在方法上。

@Conditinal本身是一個父級注解,它衍生除了很多子級注解

  • @ConditionalOnClass:判斷環(huán)境中是否存在字節(jié)碼文件,有則注冊bean對象到IOC容器
  • @ConditionalOnMissingBean:判斷環(huán)境中有沒有對應(yīng)的Bean(根據(jù)類型和名稱),沒有則注冊Bean對象到IOC容器
  • @ConditionalOnProperty:判斷配置文件中是否有對應(yīng)屬性和值,有則注冊bean對象到IOC容器

到此這篇關(guān)于SpringBoot框架底層原理解析的文章就介紹到這了,更多相關(guān)SpringBoot底層原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring中的@ControllerAdvice三種用法詳解

    Spring中的@ControllerAdvice三種用法詳解

    這篇文章主要介紹了Spring中的@ControllerAdvice三種用法詳解,加了@ControllerAdvice的類為那些聲明了(@ExceptionHandler、@InitBinder或@ModelAttribute注解修飾的)方法的類而提供的<BR>專業(yè)化的@Component,以供多個Controller類所共享,需要的朋友可以參考下
    2024-01-01
  • Java面試之高級特性基礎(chǔ)總結(jié)

    Java面試之高級特性基礎(chǔ)總結(jié)

    這篇文章主要為大家詳細(xì)介紹了10個Java高級特性基礎(chǔ)相關(guān)的問題,也是大家面試中常常會遇到的問題。文中的示例代講解詳細(xì),感興趣的可以了解一下
    2023-01-01
  • rabbitmq basicReject/basicNack/basicRecover的區(qū)別及說明

    rabbitmq basicReject/basicNack/basicRecover的區(qū)別及說明

    這篇文章主要介紹了rabbitmq basicReject/basicNack/basicRecover的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • java Date實現(xiàn)轉(zhuǎn)成LocalDate和LocalTime,LocalDateTime

    java Date實現(xiàn)轉(zhuǎn)成LocalDate和LocalTime,LocalDateTime

    本文介紹了Java中的Date與LocalDate、LocalTime、LocalDateTime之間的轉(zhuǎn)換方法,使用Instant作為中間橋梁,并強(qiáng)調(diào)了時區(qū)的重要性,文中提供了示例代碼,幫助讀者更好地理解和應(yīng)用這些API
    2026-05-05
  • java數(shù)據(jù)庫連接、查詢、更新等

    java數(shù)據(jù)庫連接、查詢、更新等

    這篇文章主要介紹了java數(shù)據(jù)庫連接、查詢、更新等,需要的朋友可以參考下
    2018-05-05
  • Java Lock接口實現(xiàn)原理及實例解析

    Java Lock接口實現(xiàn)原理及實例解析

    這篇文章主要介紹了Java Lock接口實現(xiàn)原理及實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • 深入理解Java基礎(chǔ)之try-with-resource語法糖

    深入理解Java基礎(chǔ)之try-with-resource語法糖

    這篇文章主要介紹了深入理解Java基礎(chǔ)之try-with-resource語法糖,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • Java開發(fā)中最讓人頭疼的十個bug

    Java開發(fā)中最讓人頭疼的十個bug

    這篇文章主要給大家總結(jié)介紹了關(guān)于Java開發(fā)中最讓人頭疼的十個bug,同樣的bug信息,可能背后有千萬種原因,而我,永遠(yuǎn)都不知道到底是哪一個,努力通過代碼積累盡可能多的bug,并將它們進(jìn)行分類,可以幫你debug節(jié)省了時間,需要的朋友可以參考下
    2021-10-10
  • java讀取csv文件內(nèi)容示例代碼

    java讀取csv文件內(nèi)容示例代碼

    這篇文章主要介紹了java讀取csv文件內(nèi)容的示例,大家參考使用
    2013-12-12
  • java.sql.SQLRecoverableException關(guān)閉的連接異常問題及解決辦法

    java.sql.SQLRecoverableException關(guān)閉的連接異常問題及解決辦法

    當(dāng)數(shù)據(jù)庫連接池中的連接被創(chuàng)建而長時間不使用的情況下,該連接會自動回收并失效,就導(dǎo)致客戶端程序報“ java.sql.SQLException: Io 異常: Connection reset” 或“java.sql.SQLException 關(guān)閉的連接”異常問題,下面給大家分享解決方案,一起看看吧
    2024-03-03

最新評論

滦南县| 辽阳市| 肥西县| 祥云县| 双城市| 延寿县| 吉林市| 敦化市| 临沂市| 高陵县| 定南县| 永兴县| 修文县| 临澧县| 拜城县| 曲靖市| 六枝特区| 大荔县| 东方市| 巩义市| 北碚区| 离岛区| 榆社县| 岢岚县| 奉节县| 屯留县| 陇南市| 都匀市| 屏东市| 宁陵县| 阿城市| 肥乡县| 思茅市| 蒙山县| 友谊县| 宜川县| 北辰区| 屯留县| 龙游县| 读书| 固始县|