国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

拆解Spring boot:Springboot為什么如此絲滑而簡(jiǎn)單?源碼剖析解讀自動(dòng)裝配

這篇具有很好參考價(jià)值的文章主要介紹了拆解Spring boot:Springboot為什么如此絲滑而簡(jiǎn)單?源碼剖析解讀自動(dòng)裝配。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

拆解Spring boot:Springboot為什么如此絲滑而簡(jiǎn)單?源碼剖析解讀自動(dòng)裝配,《Spring 狂野之旅:底層原理高級(jí)進(jìn)階》 ??,spring,spring boot,后端

????歡迎光臨,終于等到你啦????

??我是蘇澤,一位對(duì)技術(shù)充滿熱情的探索者和分享者。????

??持續(xù)更新的專欄《Spring 狂野之旅:從入門到入魔》 ??

本專欄帶你從Spring入門到入魔?

這是蘇澤的個(gè)人主頁(yè)可以看到我其他的內(nèi)容哦????

努力的蘇澤http://suzee.blog.csdn.net/

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-842671.html


?

springboot幫我們做了什么

一個(gè)字--自動(dòng)!

通常搭建一個(gè)基于spring的web應(yīng)用,我們需要做以下工作:

1、pom文件中引入相關(guān)jar包,包括spring、springmvc、redis、mybaits、log4j、mysql-connector-java 等等相關(guān)jar ...

2、配置web.xml,Listener配置、Filter配置、Servlet配置、log4j配置、error配置 ...

3、配置數(shù)據(jù)庫(kù)連接、配置spring事務(wù)

4、配置視圖解析器

5、開(kāi)啟注解、自動(dòng)掃描功能

6、配置完成后部署tomcat、啟動(dòng)調(diào)試

......

這些都是Spring boot在背后默默為我們做的工作

那 有沒(méi)有想過(guò)為什么??

本文給大家來(lái)解讀Spring的源碼 拆解他的自動(dòng)配置 一步一步解釋為什么Springboot為何那么強(qiáng)大

?

?

進(jìn)入他的細(xì)節(jié)源碼之前 首先關(guān)注 ---架構(gòu)

拆解Spring boot:Springboot為什么如此絲滑而簡(jiǎn)單?源碼剖析解讀自動(dòng)裝配,《Spring 狂野之旅:底層原理高級(jí)進(jìn)階》 ??,spring,spring boot,后端

解讀SpringBootApplication

@Target(ElementType.TYPE)            // 注解的適用范圍,其中TYPE用于描述類、接口(包括包注解類型)或enum聲明
@Retention(RetentionPolicy.RUNTIME)  // 注解的生命周期,保留到class文件中(三個(gè)生命周期)
@Documented                          // 表明這個(gè)注解應(yīng)該被javadoc記錄
@Inherited                           // 子類可以繼承該注解
@SpringBootConfiguration             // 繼承了Configuration,表示當(dāng)前是注解類
@EnableAutoConfiguration             // 開(kāi)啟springboot的注解功能,springboot的四大神器之一,其借助@import的幫助
@ComponentScan(excludeFilters = {    // 掃描路徑設(shè)置(具體使用待確認(rèn))
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
...
}

@Configuration

這里的@Configuration 對(duì)我們來(lái)說(shuō)不陌生,它就是 JavaConfig 形式的 Spring Ioc 容器的配置類使用的那個(gè)@Configuration,SpringBoot?社區(qū)推薦使用基于 JavaConfig 的配置形式,所以,這里的啟動(dòng)類標(biāo)注了@Configuration 之后,本身其實(shí)也是一個(gè) IoC 容器的配置類。 舉幾個(gè)簡(jiǎn)單例子回顧下,XML 跟 config 配置方式的區(qū)別:

表達(dá)形式層面 基于 XML 配置的方式是這樣:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
       default-lazy-init="true">
    <!--bean定義-->
</beans>

而基于 JavaConfig 的配置方式是這樣:

@Configuration
public class MockConfiguration{
    //bean定義
}

任何一個(gè)標(biāo)注了@Configuration 的 Java 類定義都是一個(gè) JavaConfig 配置類。

注冊(cè) bean 定義層面 基于 XML 的配置形式是這樣:

<bean id="mockService" class="..MockServiceImpl">
    ...
</bean>

而基于 JavaConfig 的配置形式是這樣的:

@Configuration
public class MockConfiguration{
    @Bean
    public MockService mockService(){
        return new MockServiceImpl();
    }
}

任何一個(gè)標(biāo)注了@Bean 的方法,其返回值將作為一個(gè) bean 定義注冊(cè)到 Spring 的 IoC 容器,方法名將默認(rèn)成該 bean 定義的 id。

表達(dá)依賴注入關(guān)系層面 為了表達(dá) bean 與 bean 之間的依賴關(guān)系,在 XML 形式中一般是這樣:

<bean id="mockService" class="..MockServiceImpl">
    <propery name ="dependencyService" ref="dependencyService" />
</bean>

<bean id="dependencyService" class="DependencyServiceImpl"></bean>

而基于 JavaConfig 的配置形式是這樣的:

@Configuration
public class MockConfiguration{
    @Bean
    public MockService mockService(){
        return new MockServiceImpl(dependencyService());
    }

    @Bean
    public DependencyService dependencyService(){
        return new DependencyServiceImpl();
    }
}

@ComponentScan:


@ComponentScan注解用于指定Spring容器掃描組件的基礎(chǔ)包路徑。它會(huì)自動(dòng)掃描指定包及其子包下的類,并將被@Component及其派生注解標(biāo)注的類識(shí)別為Spring的組件,將其實(shí)例化并納入容器管理。

// 在包c(diǎn)om.example中定義了兩個(gè)被@Component注解標(biāo)記的類:UserService和UserRepository

// UserService.java
package com.example;

import org.springframework.stereotype.Component;

@Component
public class UserService {
    // ...
}

// UserRepository.java
package com.example;

import org.springframework.stereotype.Component;

@Component
public class UserRepository {
    // ...
}

// AppConfig.java
package com.example;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.example") // 指定掃描的基礎(chǔ)包路徑
public class AppConfig {
    // 配置其他的Bean
}

@ComponentScan的原理可以從源代碼的角度來(lái)解釋。在Spring的源代碼中,@ComponentScan注解被解析為一個(gè)Bean掃描器。當(dāng)Spring容器啟動(dòng)時(shí),掃描器會(huì)根據(jù)指定的包路徑,將帶有@Component及其派生注解的類解析為BeanDefinition對(duì)象,并注冊(cè)到BeanFactory中。這樣,Spring容器就知道這些類是組件,并可以對(duì)其進(jìn)行實(shí)例化和管理。

?

@EnableAutoConfiguration:


@EnableAutoConfiguration注解用于啟用Spring Boot的自動(dòng)配置功能。它會(huì)根據(jù)項(xiàng)目的依賴和配置,自動(dòng)加載和配置一系列的Spring Bean,簡(jiǎn)化了項(xiàng)目的配置過(guò)程。

@EnableAutoConfiguration的原理可以從源代碼的角度來(lái)解釋。在Spring Boot的源代碼中,@EnableAutoConfiguration注解被解析為一個(gè)自動(dòng)配置處理器。當(dāng)Spring Boot應(yīng)用啟動(dòng)時(shí),處理器會(huì)根據(jù)classpath下的META-INF/spring.factories文件中的配置,加載并執(zhí)行一系列的自動(dòng)配置類。這些自動(dòng)配置類根據(jù)約定和條件,自動(dòng)創(chuàng)建和配置相應(yīng)的Bean對(duì)象,完成項(xiàng)目的自動(dòng)化配置。

Import(AutoConfigurationImportSelector.class)注解:

拆解Spring boot:Springboot為什么如此絲滑而簡(jiǎn)單?源碼剖析解讀自動(dòng)裝配,《Spring 狂野之旅:底層原理高級(jí)進(jìn)階》 ??,spring,spring boot,后端

圖中看出 AutoConfigurationImportSelector 繼承了 DeferredImportSelector 繼承了 ImportSelector

ImportSelector有一個(gè)方法為:selectImports。

@Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        if (!isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        }
        AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
                .loadMetadata(this.beanClassLoader);
        AnnotationAttributes attributes = getAttributes(annotationMetadata);
        List<String> configurations = getCandidateConfigurations(annotationMetadata,
                attributes);
        configurations = removeDuplicates(configurations);
        Set<String> exclusions = getExclusions(annotationMetadata, attributes);
        checkExcludedClasses(configurations, exclusions);
        configurations.removeAll(exclusions);
        configurations = filter(configurations, autoConfigurationMetadata);
        fireAutoConfigurationImportEvents(configurations, exclusions);
        return StringUtils.toStringArray(configurations);
    }

AutoConfigurationImportSelector是Spring Boot內(nèi)部的一個(gè)選擇器類,它會(huì)根據(jù)項(xiàng)目的依賴和配置,選擇要自動(dòng)配置的類。該選擇過(guò)程是基于條件注解(如@ConditionalOnClass、@ConditionalOnProperty等)進(jìn)行的,只有滿足條件的自動(dòng)配置類才會(huì)被選擇。

?

@AutoConfigurationPackage

// 在包c(diǎn)om.example中定義了一個(gè)主配置類ApplicationConfig

// ApplicationConfig.java
package com.example;

import org.springframework.boot.autoconfigure.AutoConfigurationPackage;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@AutoConfigurationPackage // 標(biāo)注了@AutoConfigurationPackage注解
public class ApplicationConfig {
    // 主配置類的內(nèi)容
    // ...
}

當(dāng)Spring Boot啟動(dòng)時(shí),它會(huì)掃描并解析主配置類ApplicationConfig。在解析過(guò)程中,Spring Boot會(huì)檢測(cè)到@AutoConfigurationPackage注解,并執(zhí)行相應(yīng)的處理。

@AutoConfigurationPackage注解被解析為一個(gè)特殊的Bean定義處理器。處理器會(huì)讀取主配置類ApplicationConfig的包路徑(com.example),并將該包路徑注冊(cè)到Spring的BeanFactory中。

注冊(cè)完成后,Spring容器會(huì)將com.example包及其子包作為組件掃描的范圍。這意味著Spring會(huì)掃描該包下的所有類,并根據(jù)條件注解(如@ConditionalOnClass、@ConditionalOnMissingBean等)來(lái)決定是否自動(dòng)配置相應(yīng)的Bean。

通過(guò)將主配置類所在的包及其子包作為自動(dòng)配置的包,我們可以確保自動(dòng)配置類能夠正確地掃描和應(yīng)用到我們的應(yīng)用程序中。

?

?

?

到了這里,關(guān)于拆解Spring boot:Springboot為什么如此絲滑而簡(jiǎn)單?源碼剖析解讀自動(dòng)裝配的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Redis為什么能如此之快

    Redis,一個(gè)以超高的性能和強(qiáng)大 的數(shù)據(jù)結(jié)構(gòu)功能著稱的內(nèi)存數(shù)據(jù)庫(kù),在處理各種復(fù)雜數(shù)據(jù)操作時(shí),速度卻能達(dá)到驚人的水平。那么,Redis為什么能如此之快呢?今天,我們就來(lái)深入解析一下Redis的線程模型,揭開(kāi)這個(gè)問(wèn)題的神秘面紗。 在探討Redis的線程模型之前,我們首先需要

    2024年02月12日
    瀏覽(19)
  • 面試官問(wèn):kafka為什么如此之快?

    面試官問(wèn):kafka為什么如此之快?

    天下武功,唯快不破。同樣的,kafka在消息隊(duì)列領(lǐng)域,也是非??斓?,這里的塊指的是kafka在單位時(shí)間搬運(yùn)的數(shù)據(jù)量大小,也就是吞吐量,下圖是搬運(yùn)網(wǎng)上的一個(gè)性能測(cè)試結(jié)果,在同步發(fā)送場(chǎng)景下,單機(jī)Kafka的吞吐量高達(dá)17.3w/s,不愧是高吞吐量消息中間件的行業(yè)老大。 那究竟

    2024年02月07日
    瀏覽(27)
  • Hadoop為什么如此流行——史上最詳解

    作者:禪與計(jì)算機(jī)程序設(shè)計(jì)藝術(shù) Hadoop是一個(gè)開(kāi)源的分布式計(jì)算框架,其出現(xiàn)主要是為了解決海量數(shù)據(jù)的存儲(chǔ)、計(jì)算、分析、和處理問(wèn)題。隨著互聯(lián)網(wǎng)的數(shù)據(jù)量不斷增加,分布式系統(tǒng)越來(lái)越普及,Hadoop也越來(lái)越受到青睞。它具備高容錯(cuò)性、高可靠性、彈性擴(kuò)展等特性,能夠適應(yīng)

    2024年02月08日
    瀏覽(19)
  • 有了Spring為什么還需要SpringBoot呢

    有了Spring為什么還需要SpringBoot呢

    目錄 一、Spring缺點(diǎn)分析 二、什么是Spring Boot 三、Spring Boot的核心功能 3.1 起步依賴 3.2 自動(dòng)裝配 1. 配置文件和依賴太多了?。。?spring是一個(gè)非常優(yōu)秀的輕量級(jí)框架,以IOC(控制反轉(zhuǎn))和AOP(面向切面)為思想內(nèi)核,極大簡(jiǎn)化了JAVA企業(yè)級(jí)項(xiàng)目的開(kāi)發(fā)。雖然Spring的組件代碼是輕

    2024年02月08日
    瀏覽(24)
  • 僵尸進(jìn)程?孤兒進(jìn)程?為什么他有如此慘烈的身世...

    僵尸進(jìn)程?孤兒進(jìn)程?為什么他有如此慘烈的身世...

    ??作者簡(jiǎn)介: 花想云 ,在讀本科生一枚,C/C++領(lǐng)域新星創(chuàng)作者,新星計(jì)劃導(dǎo)師,阿里云專家博主,CSDN內(nèi)容合伙人…致力于 C/C++、Linux 學(xué)習(xí)。 ?? 專欄簡(jiǎn)介:本文收錄于 Linux從入門到精通 ,本專欄主要內(nèi)容為本專欄主要內(nèi)容為L(zhǎng)inux的系統(tǒng)性學(xué)習(xí),專為小白打造的文章專欄。

    2024年02月05日
    瀏覽(96)
  • 為什么如此安全的https協(xié)議卻仍然可以被抓包呢?(1)

    為什么如此安全的https協(xié)議卻仍然可以被抓包呢?(1)

    好了,閱讀到了這里,說(shuō)明你對(duì)https已經(jīng)非常熟悉了,那么你一定知道,https協(xié)議是結(jié)合了非對(duì)稱加密和對(duì)稱加密一起工作,從而保證數(shù)據(jù)傳輸?shù)陌踩缘摹?非對(duì)稱加密用于確??蛻舳丝梢园踩孬@取到服務(wù)器的真實(shí)公鑰。對(duì)稱加密用于確??蛻舳撕头?wù)器之間的數(shù)據(jù)傳輸不

    2024年04月26日
    瀏覽(25)
  • 『Linux從入門到精通』第 ? 期 - 僵尸進(jìn)程?孤兒進(jìn)程?為什么他有如此慘烈的身世...

    『Linux從入門到精通』第 ? 期 - 僵尸進(jìn)程?孤兒進(jìn)程?為什么他有如此慘烈的身世...

    ??作者簡(jiǎn)介: 花想云 ,在讀本科生一枚,C/C++領(lǐng)域新星創(chuàng)作者,新星計(jì)劃導(dǎo)師,阿里云專家博主,CSDN內(nèi)容合伙人…致力于 C/C++、Linux 學(xué)習(xí)。 ?? 專欄簡(jiǎn)介:本文收錄于 Linux從入門到精通 ,本專欄主要內(nèi)容為本專欄主要內(nèi)容為L(zhǎng)inux的系統(tǒng)性學(xué)習(xí),專為小白打造的文章專欄。

    2024年02月16日
    瀏覽(20)
  • A Beginner‘s Guide to Apache Kafka: 什么是Kafka、它為什么如此受歡迎、它在哪些場(chǎng)景下可以應(yīng)用、以及一些基本概念和術(shù)語(yǔ)

    作者:禪與計(jì)算機(jī)程序設(shè)計(jì)藝術(shù) Apache Kafka(以下簡(jiǎn)稱Kafka)是一個(gè)開(kāi)源分布式流處理平臺(tái),它被設(shè)計(jì)用來(lái)實(shí)時(shí)傳輸大量的數(shù)據(jù),從而能夠?qū)崟r(shí)的對(duì)數(shù)據(jù)進(jìn)行處理并提取價(jià)值。本文通過(guò)梳理,引導(dǎo)讀者了解什么是Kafka、它為什么如此受歡迎、它在哪些場(chǎng)景下可以應(yīng)用、以

    2024年02月09日
    瀏覽(23)
  • 什么是 Spring?為什么學(xué)它?

    歡迎來(lái)到本篇文章!在這里,我將帶領(lǐng)大家快速學(xué)習(xí) Spring 的基本概念,并解答兩個(gè)關(guān)鍵問(wèn)題:什么是 Spring,以及為什么學(xué)習(xí) Spring。 廢話少說(shuō),下面,我們開(kāi)始吧! Spring 官方文檔:https://docs.spring.io/spring-framework/docs/5.2.24.RELEASE/spring-framework-reference/ 簡(jiǎn)化我們的企業(yè)級(jí)應(yīng)用程

    2024年02月06日
    瀏覽(25)
  • stm32下載代碼到單片機(jī)上需要調(diào)節(jié)BOOT為什么模式

    stm32下載代碼到單片機(jī)上需要調(diào)節(jié)BOOT為什么模式

    一、BOOT模式選擇圖解 ? 二、BOOT模式介紹 所謂啟動(dòng),一般來(lái)說(shuō)就是指下好程序后,重啟芯片時(shí),SYSCLK的第4個(gè)上升沿,BOOT引腳的值將被鎖存。用戶可以通過(guò)設(shè)置BOOT1和BOOT0引腳的狀態(tài),來(lái)選擇在復(fù)位后的啟動(dòng)模式。 A.? ?Main Flash memory 是STM32內(nèi)置的Flash,一般我們使用JTAG或者S

    2023年04月15日
    瀏覽(57)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包