亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot2自動(dòng)裝配原理解析

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

1、SpringBoot特點(diǎn)

1.1 依賴(lài)管理

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

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)目整合了所有開(kāi)發(fā)中常用的依賴(lài)的版本號(hào),稱(chēng)為自動(dòng)版本仲裁機(jī)制。

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

開(kāi)發(fā)導(dǎo)入starter場(chǎng)景啟動(dòng)器

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

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

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

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

注意:

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

但引入沒(méi)有版本仲裁的jar,需要寫(xiě)版本號(hào)。

如果對(duì)整合過(guò)的依賴(lài)的版本號(hào)不滿(mǎn)意,可以修改默認(rèn)的版本號(hào),方法如下:

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

1.2 自動(dòng)配置

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

比如:

1、Tomcat

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

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

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

  • 之前我們?cè)诜椒ㄉ霞幼⑨專(zhuān)枰谂渲梦募袙呙璋?,現(xiàn)在已經(jīng)不需要了。
  • 主程序Application所在包及其子包里面的組件都會(huì)被默認(rèn)掃描進(jìn)來(lái)
  • 如果想要改變掃描路徑,可以在主程序上的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è)類(lèi)上,如:MultipartProperties
  • 配置文件的值最終會(huì)綁定每個(gè)類(lèi)上,這個(gè)類(lèi)會(huì)在容器中創(chuàng)建對(duì)象
  • 引入了哪些場(chǎng)景這個(gè)場(chǎng)景的自動(dòng)配置才會(huì)開(kāi)啟
  • SpringBoot所有的自動(dòng)配置功能都在spring-boot-autoconfigure包里面

2、容器功能

2.1 組件添加

1、@Configuration

/**
 *  1、配置類(lèi)里面使用@Bean標(biāo)注在方法上給容器注冊(cè)組件,默認(rèn)也是單實(shí)例的
 *  2、配置類(lèi)本身也是組件
 *  3、proxyBeanMethods = true 默認(rèn)是true 表示代理bean的方法 (動(dòng)態(tài)代理)
 *    Full模式(proxyBeanMethods = true)
 *    Lite模式(proxyBeanMethods = false)
 *    組件依賴(lài)
 */
@Configuration(proxyBeanMethods = true)  //告訴SpringBoot這是一個(gè)配置類(lèi) == xml配置文件
public class MyConfig {
 
    /**
     * 外部無(wú)論對(duì)配置類(lèi)中的這個(gè)組件注冊(cè)方法調(diào)用多少次獲取的都是之前注冊(cè)容器中的單實(shí)例對(duì)象
     * @return
     */
    //給容器中添加組件,相當(dāng)于bean標(biāo)簽,以方法名作為組件的id。 返回類(lèi)型是組件類(lèi)型,返回值就是組件在容器中的實(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模式(新版本增加)

配置 類(lèi)組件之間無(wú)依賴(lài)關(guān)系用Lite模式加速容器啟動(dòng)過(guò)程,減少判斷

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

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

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

3、@ComponentScan、@Import

ComponentScan是組件掃描的意思。

@Import()

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

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

4、@Conditional

條件裝配

@ConditionalOnBean(name = "tom")

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

2.2、原生配置引入@ImportResource

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

使用方式:

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

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

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

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

2.3 配置綁定

1、@ConfigurationProperties

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

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

使用步驟:

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

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

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

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

mycar.brand = BYD
mycar.price = 100000

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

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

@EnableConfigurationProperties(Car.class)

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

1、開(kāi)啟配置綁定功能。

2、把組件自動(dòng)注冊(cè)到容器中。

3、自動(dòng)配置原理入門(mén)

3.1 引導(dǎo)加載自動(dòng)配置類(lèi)

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

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

  @SpringBootApplication

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

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

@SpringBootConfiguration:

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

@ComponentScan

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

@EnableAutoConfiguration

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

1、@AutoConfigurationPackage

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

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

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

2、@Import(AutoConfigurationImportSelector.class)

有選擇的自動(dòng)配置一些組件。

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

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

3.2 按需開(kāi)啟自動(dòng)匹配項(xiàng)

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

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

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

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

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

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

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

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

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

3.4 配置流程

4、開(kāi)發(fā)工具

4.1 lombok

lombok可以簡(jiǎn)化javabean的編寫(xiě)。

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

可以加lombok注解簡(jiǎn)化編寫(xiě)。

使用前提:

1、添加lombok的依賴(lài)。

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

2、在插件市場(chǎng)安裝lombok插件。

使用說(shuō)明:

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

@Data:自動(dòng)編寫(xiě)其get/set方法。

@ToString:自動(dòng)重寫(xiě)其toString方法。

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

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

@Slf4j:日志注解。可以通過(guò)log.info在控制臺(tái)打印消息。

4.2 dev-tools

熱更新,在修改了方法或頁(yè)面時(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)境,就會(huì)自動(dòng)幫我們搭建項(xiàng)目所需要的環(huán)境。

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

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

相關(guān)文章

  • SpringBoot配置綁定方法詳解

    SpringBoot配置綁定方法詳解

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

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

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

    MyBatis簡(jiǎn)介與配置MyBatis+Spring+MySql的方法

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

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

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

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

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

    Java listener簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

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

    SpringBoot萬(wàn)字爆肝高級(jí)配置

    SpringBoot不僅支持常規(guī)的properties配置文件,還支持yaml語(yǔ)言的配置文件,yaml是以數(shù)據(jù)為中心的語(yǔ)言,在配置數(shù)據(jù)的時(shí)候具有面向?qū)ο蟮奶卣?。application.properties是比較常見(jiàn)的配置文件,SpringBoot的全局配置文件的作用是對(duì)一些默認(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)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握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ù)的工具庫(kù),它們提供了簡(jiǎn)單易用的API來(lái)進(jìn)行JSON字符串的解析、轉(zhuǎn)換和操作,下面就跟隨小編一起學(xué)習(xí)一下如果使用他們實(shí)現(xiàn)JSON字符串的各種轉(zhuǎn)換吧
    2024-01-01

最新評(píng)論