欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot2自動裝配原理解析

 更新時(shí)間:2022年03月16日 10:43:40   作者:小超和你  
這篇文章主要介紹了SpringBoot2自動裝配原理解析,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1、SpringBoot特點(diǎn)

1.1 依賴管理

父項(xiàng)目做依賴管理

springboot項(xiàng)目的父項(xiàng)目  
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
</parent>
 
spring-boot-starter-parent的父項(xiàng)目
 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.3.4.RELEASE</version>
  </parent>

父項(xiàng)目整合了所有開發(fā)中常用的依賴的版本號,稱為自動版本仲裁機(jī)制。

注意:這不是說無需導(dǎo)入依賴了,而是指在導(dǎo)入依賴的時(shí)候,會自動仲裁(匹配)版本號,相當(dāng)于模具的功能。

開發(fā)導(dǎo)入starter場景啟動器

場景啟動器的功能是:springboot已經(jīng)幫我們整合了所有應(yīng)用場景常規(guī)的依賴,只要依賴中寫入某場景啟動器,之下的所有依賴也都一一導(dǎo)入了。

  • 官方整合的場景啟動器一般是:spring-boot-starter-*。
  • 只要引入starter,這個(gè)場景的所有常規(guī)需要的依賴都會自動引入。
  • SpringBoot所有支持的場景都在:https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter 這個(gè)地址里。
  • 第三方提供的簡化開發(fā)的場景啟動器一般是:*-spring-boot-starter
  • 所有場景啟動器都有一個(gè)最底層的依賴
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
  <version>2.3.4.RELEASE</version>
  <scope>compile</scope>
</dependency>

自動版本仲裁機(jī)制

意味著無需關(guān)注版本號,即導(dǎo)即用。

注意:

引入父項(xiàng)目中已經(jīng)整合過的依賴,都可以不寫版本號。

但引入沒有版本仲裁的jar,需要寫版本號。

如果對整合過的依賴的版本號不滿意,可以修改默認(rèn)的版本號,方法如下:

1、查看spring-boot-dependencies里面規(guī)定當(dāng)前依賴的版本 用的 key。
2、在當(dāng)前項(xiàng)目里面重寫配置,如:
    <properties>
        <mysql.version>5.1.43</mysql.version>
    </properties>

1.2 自動配置

springboot已經(jīng)配置好了那些繁文縟節(jié)的配置文件,不用我們額外的配置

比如:

1、Tomcat

2、SpringMVC(引入了全套組件、常用的功能)DispathcherServlet等

3、Web常見功能:字節(jié)編碼,內(nèi)部視圖解析器

4、默認(rèn)的掃描包結(jié)構(gòu)

  • 之前我們在方法上加注釋,需要在配置文件中掃描包名等,現(xiàn)在已經(jīng)不需要了。
  • 主程序Application所在包及其子包里面的組件都會被默認(rèn)掃描進(jìn)來
  • 如果想要改變掃描路徑,可以在主程序上的springboot聲明注解中設(shè)置scanBasePackages屬性
@SpringBootApplication(scanBasePackages="com.atguigu")
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class,args);
    }
}

5、各種配置擁有默認(rèn)值

如果需要更改默認(rèn)值,可以在resource文件下創(chuàng)建application.properties,修改其中的默認(rèn)值

默認(rèn)配置的原理:

  • 默認(rèn)配置最終都是映射到某個(gè)類上,如:MultipartProperties
  • 配置文件的值最終會綁定每個(gè)類上,這個(gè)類會在容器中創(chuàng)建對象
  • 引入了哪些場景這個(gè)場景的自動配置才會開啟
  • SpringBoot所有的自動配置功能都在spring-boot-autoconfigure包里面

2、容器功能

2.1 組件添加

1、@Configuration

/**
 *  1、配置類里面使用@Bean標(biāo)注在方法上給容器注冊組件,默認(rèn)也是單實(shí)例的
 *  2、配置類本身也是組件
 *  3、proxyBeanMethods = true 默認(rèn)是true 表示代理bean的方法 (動態(tài)代理)
 *    Full模式(proxyBeanMethods = true)
 *    Lite模式(proxyBeanMethods = false)
 *    組件依賴
 */
@Configuration(proxyBeanMethods = true)  //告訴SpringBoot這是一個(gè)配置類 == xml配置文件
public class MyConfig {
 
    /**
     * 外部無論對配置類中的這個(gè)組件注冊方法調(diào)用多少次獲取的都是之前注冊容器中的單實(shí)例對象
     * @return
     */
    //給容器中添加組件,相當(dāng)于bean標(biāo)簽,以方法名作為組件的id。 返回類型是組件類型,返回值就是組件在容器中的實(shí)例。
    @Bean
    public User user01(){
        return new User("zhangsan",18);
    }
    // 如果不想用方法名作為組件的id 可以修改Bean中的value屬性,自定義組件id
    @Bean("tom") //此時(shí)組件id就不再是tomcatPet,而是tom
    public Pet tomcatPet(){
        return new Pet("tomcat");
}

Full模式和Lite模式(新版本增加)

配置 類組件之間無依賴關(guān)系用Lite模式加速容器啟動過程,減少判斷

配置類組件之間有依賴關(guān)系,方法會被調(diào)用得到之前單實(shí)例組件,用Full模式

2、@Bean、@Component、@Controller、@Service、@Repository

這些注解與Spring中學(xué)習(xí)的作用一致,不再解釋。

3、@ComponentScan、@Import

ComponentScan是組件掃描的意思。

@Import()

Import注解后面填的是類的數(shù)組,作用是給容器中自動創(chuàng)建出這兩個(gè)類型的組件、且默認(rèn)組件的名字是全包名。

(可以與@Bean方法創(chuàng)建出的組件是方法名相對比)。

4、@Conditional

條件裝配

@ConditionalOnBean(name = "tom")

此注釋表示:只有在IOC容器中有tom名稱的類才將這個(gè)注釋掛載的類/方法注冊。

2.2、原生配置引入@ImportResource

在一些老的項(xiàng)目或者第三方包引入的時(shí)候,很可能還是采用老版的xml方式注冊組件,可以在任一配置類上加上此注解,導(dǎo)入xml的地址就可以引入。

使用方式:

1、首先創(chuàng)建xml配置文件,寫入一個(gè)bean

<bean id="user02" class="com.atguigu.boot.bean.User">
        <property name="age" value="20"/>
        <property name="name" value="xcc"/>
 </bean>

2、在任意一個(gè)配置類上加上@ImportResource注解

@ImportResource("classpath:beans.xml")
public class MyConfig {
}

2.3 配置綁定

1、@ConfigurationProperties

一些需要抽離的會改變的配置,之前會以properties文件的形式存儲,然后通過讀取文件,來放入javabean中,但是該注解不必如此麻煩。

只要將需要配置的類加入容器中,再使用@ConfigurationProperties注解,就能夠自動將applicaton.properties文件中的屬性注入該類。

使用步驟:

1、創(chuàng)建實(shí)體類,然后加上@Component注解,將該類注冊進(jìn)容器中。

2、使用@ConfigurationProperties注解,prefix的含義是,所有mycar開頭的屬性就是要注入的配置內(nèi)容。

/**
 * 只有在容器中的組件,才會擁有springboot的強(qiáng)大功能
 */
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {
    //一些屬性get、set方法云云       
}

3、在application.properties中配置需要注入的屬性

mycar.brand = BYD
mycar.price = 100000

注意:如果該類是引入包里的類,不方便直接在要注入的類上加注釋

可以在配置文件中如此聲明

@EnableConfigurationProperties(Car.class)

該注釋的作用有2個(gè):

1、開啟配置綁定功能。

2、把組件自動注冊到容器中。

3、自動配置原理入門

3.1 引導(dǎo)加載自動配置類

 為什么springboot可以不用我們使用xml文件(僅使用Bean)就可以向容器中注冊組件?

原因在于springboot主程序下的聲明注解:

  @SpringBootApplication

該注解由3個(gè)注解復(fù)合而成:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

@SpringBootConfiguration:

這個(gè)注解其實(shí)就是一個(gè)Configuration注解,聲明主程序也是一個(gè)特殊的配置類。

@ComponentScan

這個(gè)注解起到了掃描包的作用,指定掃描包的路徑

@EnableAutoConfiguration

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}

1、@AutoConfigurationPackage

自動配置包,點(diǎn)進(jìn)去可以看到:

@Import(AutoConfigurationPackages.Registrar.class)  //給容器中導(dǎo)入一個(gè)組件
public @interface AutoConfigurationPackage {}
 
//利用Registrar給容器中導(dǎo)入一系列組件
//將指定的一個(gè)包下的所有組件導(dǎo)入進(jìn)來?MainApplication 所在包下。

首先Import導(dǎo)入了一個(gè)組件,然后這個(gè)組件的功能是用來注冊掃描的包下所有的組件。

2、@Import(AutoConfigurationImportSelector.class)

有選擇的自動配置一些組件。

1、利用getAutoConfigurationEntry(annotationMetadata);給容器中批量導(dǎo)入一些組件
2、調(diào)用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)獲取到所有需要導(dǎo)入到容器中的配置類
3、利用工廠加載 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的組件
4、從META-INF/spring.factories位置來加載一個(gè)文件。
默認(rèn)掃描我們當(dāng)前系統(tǒng)里面所有META-INF/spring.factories位置的文件
spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories

總的來說:springboot將所有環(huán)境的配置全部寫在了一個(gè)一個(gè)工廠的配置文件里。

3.2 按需開啟自動匹配項(xiàng)

127個(gè)場景的所有自動配置啟動的時(shí)候默認(rèn)全部加載。xxxxAutoConfiguration
原理:按照條件裝配規(guī)則(@Conditional),將選擇的配置加載。

3.3 修改默認(rèn)配置

@Bean
@ConditionalOnBean(MultipartResolver.class) //容器中有這個(gè)類型組件
@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) //容器中沒有這個(gè)名字 multipartResolver 的組件
public MultipartResolver multipartResolver(MultipartResolver resolver) {
//給@Bean標(biāo)注的方法傳入了對象參數(shù),這個(gè)參數(shù)的值就會從容器中找。
//SpringMVC multipartResolver。防止有些用戶配置的文件上傳解析器不符合規(guī)范
// Detect if the user has created a MultipartResolver but named it incorrectly
return resolver;
}

給容器中加入了文件上傳解析器;

springboot幫我們底層封裝了一個(gè)注解方法,將不符合規(guī)范的命名也更正了。

SpringBoot默認(rèn)會在底層配好所有的組件。但是如果用戶自己配置了以用戶的優(yōu)先。

*******總結(jié)********:

  • SpringBoot先加載所有的自動配置類 xxxxxAutoConfiguration
  • 每個(gè)自動配置類按照條件進(jìn)行生效,默認(rèn)都會綁定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件進(jìn)行了綁定
  • 生效的配置類就會給容器中裝配很多組件
  • 只要容器中有這些組件,相當(dāng)于這些功能就有了
  • 定制化配置  
  • 用戶直接自己@Bean替換底層的組件
  • 用戶去看這個(gè)組件是獲取的配置文件什么值就去修改。

xxxxxAutoConfiguration ---> 組件 ---> xxxxProperties里面拿值 ----> application.properties  

3.4 配置流程

4、開發(fā)工具

4.1 lombok

lombok可以簡化javabean的編寫。

當(dāng)我們創(chuàng)建javabean類的時(shí)候,總要編寫其getset方法,toString方法、有參無參構(gòu)造器,很煩而且代碼很多不清晰。

可以加lombok注解簡化編寫。

使用前提:

1、添加lombok的依賴。

<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

2、在插件市場安裝lombok插件。

使用說明:

@ToString
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Pet {
    private String name;
 
}

@Data:自動編寫其get/set方法。

@ToString:自動重寫其toString方法。

@NoArgsConstructor:編寫無參構(gòu)造器。

@AllArgsConstructor:編寫有參構(gòu)造器。需要注意的是,有參構(gòu)造器默認(rèn)是將所有的參數(shù)都構(gòu)造,如果要想限定個(gè)數(shù)個(gè)參數(shù)構(gòu)造,還是需要自己寫。

@Slf4j:日志注解??梢酝ㄟ^log.info在控制臺打印消息。

4.2 dev-tools

熱更新,在修改了方法或頁面時(shí),只需要用dev-tools(Ctrl+F9)就行重新編譯,速度要比重啟項(xiàng)目快一些

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

4.3 Spring Initailizr(項(xiàng)目初始化向?qū)В?/h3>

在創(chuàng)建項(xiàng)目的時(shí)候,只需要勾選環(huán)境,就會自動幫我們搭建項(xiàng)目所需要的環(huán)境。

所以我們只需要關(guān)注項(xiàng)目本身的代碼。

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

相關(guān)文章

  • SpringBoot配置綁定方法詳解

    SpringBoot配置綁定方法詳解

    配置綁定是SpringBoot其中一個(gè)底層功能,SpringBoot把配置綁定的過程變得更加簡單,傳統(tǒng)java將常用的配置放到配置文件properties中,之后將這些配置綁定到j(luò)avabean中
    2022-10-10
  • Springboot視頻接口報(bào)大量的ClientAbortException找不到原因的解決

    Springboot視頻接口報(bào)大量的ClientAbortException找不到原因的解決

    本文主要介紹了Springboot視頻接口報(bào)大量的ClientAbortException找不到原因的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • MyBatis簡介與配置MyBatis+Spring+MySql的方法

    MyBatis簡介與配置MyBatis+Spring+MySql的方法

    MyBatis 是一個(gè)可以自定義SQL、存儲過程和高級映射的持久層框架。這篇文章主要介紹了MyBatis簡介與配置MyBatis+Spring+MySql的方法,需要的朋友可以參考下
    2017-04-04
  • Java實(shí)現(xiàn)CORS跨域請求的實(shí)現(xiàn)方法

    Java實(shí)現(xiàn)CORS跨域請求的實(shí)現(xiàn)方法

    本篇文章主要介紹了Java實(shí)現(xiàn)CORS跨域請求的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • Java字符編碼原理(動力節(jié)點(diǎn)Java學(xué)院整理)

    Java字符編碼原理(動力節(jié)點(diǎn)Java學(xué)院整理)

    Java開發(fā)中,常常會遇到亂碼的問題,一旦遇到這種問題,常常比較煩惱,大家都不想承認(rèn)是自己的代碼問題,其實(shí)搞明白編碼的本質(zhì)過程就簡單多了,接下來小編給大家?guī)韏ava字符編碼原理,要求看看吧
    2017-04-04
  • Java listener簡介_動力節(jié)點(diǎn)Java學(xué)院整理

    Java listener簡介_動力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了Java listener簡介,可以用于統(tǒng)計(jì)用戶在線人數(shù)等,有興趣的可以了解一下
    2017-07-07
  • SpringBoot萬字爆肝高級配置

    SpringBoot萬字爆肝高級配置

    SpringBoot不僅支持常規(guī)的properties配置文件,還支持yaml語言的配置文件,yaml是以數(shù)據(jù)為中心的語言,在配置數(shù)據(jù)的時(shí)候具有面向?qū)ο蟮奶卣?。application.properties是比較常見的配置文件,SpringBoot的全局配置文件的作用是對一些默認(rèn)配置的配置值進(jìn)行修改
    2022-07-07
  • java的異常與處理機(jī)制分析【附面試題】

    java的異常與處理機(jī)制分析【附面試題】

    這篇文章主要介紹了java的異常與處理機(jī)制,結(jié)合實(shí)例形式分析了Java異常與處理機(jī)制的概念、原理、相關(guān)操作技巧與注意事項(xiàng),并附帶面試題分析供大家參考,需要的朋友可以參考下
    2019-05-05
  • java static塊和構(gòu)造函數(shù)的實(shí)例詳解

    java static塊和構(gòu)造函數(shù)的實(shí)例詳解

    這篇文章主要介紹了java static塊和構(gòu)造函數(shù)的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握J(rèn)ava static關(guān)鍵字的函數(shù)方法,需要的朋友可以參考下
    2017-09-09
  • Java中JSON字符串進(jìn)行各種轉(zhuǎn)換的方法小結(jié)

    Java中JSON字符串進(jìn)行各種轉(zhuǎn)換的方法小結(jié)

    Gson和Hutool的JSONUtil都是常用的用于處理JSON數(shù)據(jù)的工具庫,它們提供了簡單易用的API來進(jìn)行JSON字符串的解析、轉(zhuǎn)換和操作,下面就跟隨小編一起學(xué)習(xí)一下如果使用他們實(shí)現(xiàn)JSON字符串的各種轉(zhuǎn)換吧
    2024-01-01

最新評論