色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

初學(xué)者必看的SpringBoo自動(dòng)裝配原理1

jf_78858299 ? 來源:CSDN ? 作者:CC_且聽風(fēng)吟 ? 2023-04-07 11:03 ? 次閱讀

前言

學(xué)習(xí)SpringBoot,絕對(duì)避不開自動(dòng)裝配這個(gè)概念,這也是SpringBoot的關(guān)鍵之一

本人也是SpringBoot的初學(xué)者,下面的一些總結(jié)都是結(jié)合個(gè)人理解和實(shí)踐得出的,如果有錯(cuò)誤或者疏漏,請(qǐng)一定一定一定(不是歡迎,是一定)幫我指出,在評(píng)論區(qū)回復(fù)即可,一起學(xué)習(xí)!

篇幅較長(zhǎng)分四篇了,希望你可以有耐心.

如果只關(guān)心SpringBoot裝配過程,可以直接跳到第7部分

想要理解spring自動(dòng)裝配,需要明確兩個(gè)含義:

  • 裝配,裝配什么?
  • 自動(dòng),怎么自動(dòng)?

1. Warm up

在開始之前,讓我們先來看點(diǎn)簡(jiǎn)單的開胃菜:spring中bean注入的三種形式

首先我們先來一個(gè)Person類,這里為了篇幅長(zhǎng)度考慮使用了lombok

如果你不知道lombok是什么,那就最好不要知道,加了幾個(gè)注解之后我的pojo類Person就完成了

/**
 * @author dzzhyk
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private String name;
    private Integer age;
    private Boolean sex;
}

在Spring中(不是Spring Boot),要實(shí)現(xiàn)bean的注入,我們有3種注入方式:

1.1 setter注入

這是最基本的注入方式

首先我們創(chuàng)建applicationContext.xml文件,在里面加入:

<bean id="person" class="pojo.Person">
    <property name="name" value="dzzhyk"/>
    <property name="age" value="20"/>
    <property name="sex" value="true"/>
<span class="hljs-name"bean>

這里使用property為bean對(duì)象賦值

緊接著我們會(huì)在test包下寫一個(gè)version1.TestVersion1類

/**
 * 第一種bean注入實(shí)現(xiàn)方式 - 在xml文件中直接配置屬性
 */
public class TestVersion1 {
    @Test
    public void test(){
        ApplicationContext ca = new   ClassPathXmlApplicationContext("applicationContext.xml");
        Person person = ca.getBean("person", Person.class);
        System.out.println(person);
    }
}

這里我使用了ClassPathXmlApplicationContext來加載spring配置文件并且讀取其中定義的bean,然后使用getBean方法使用id和類來獲取這個(gè)Person的Bean對(duì)象,結(jié)果成功輸出:

Person(name=dzzhyk, age=20, sex=true)

1.2 構(gòu)造器注入

接下來是使用構(gòu)造器注入,我們需要更改applicationContext.xml文件中的property為construct-arg

class="pojo.Person">
    index="0" type="java.lang.String" value="dzzhyk" />
    index="1" type="java.lang.Integer" value="20"/>
    index="2" type="java.lang.Boolean" value="true"/>
class="hljs-name"bean>

version2.TestVersion2內(nèi)容不變:

public class TestVersion2 {
    @Test
    public void test(){
        ApplicationContext ca = new ClassPathXmlApplicationContext("applicationContext.xml");
        Person person = ca.getBean("person", Person.class);
        System.out.println(person);
    }
}

依然正常輸出結(jié)果:

Person(name=dzzhyk, age=20, sex=true)

1.3 屬性注入

使用注解方式的屬性注入Bean是比較優(yōu)雅的做法

首先我們需要在applicationContext.xml中開啟注解支持和自動(dòng)包掃描:

<context:annotation-config />
<context:component-scan base-package="pojo"/>

在pojo類中對(duì)Person類加上@Component注解,將其標(biāo)記為組件,并且使用@Value注解為各屬性賦初值

@Component
public class Person {
    
    @Value("dzzhyk")
    private String name;
    @Value("20")
    private Integer age;
    @Value("true")
    private Boolean sex;
}

然后添加新的測(cè)試類version3.TestVersion3

public class TestVersion3 {
    @Test
    public void test(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        Person person = ac.getBean("person", Person.class);
        System.out.println(person);
    }
}

運(yùn)行也可以得到如下結(jié)果:

Person(name=dzzhyk, age=20, sex=true)

2. Warm up again

什么?還有什么?接下來我們來聊聊Spring的兩種配置方式:基于XML的配置和基于JavaConfig類的配置方式,這對(duì)于理解SpringBoot的自動(dòng)裝配原理是非常重要的。

首先我們?cè)赑erson的基礎(chǔ)上再創(chuàng)建幾個(gè)pojo類:這個(gè)Person有Car、有Dog

public class Car {
    private String brand;
    private Integer price;
}

public class Dog {
    private String name;
    private Integer age;
}

public class Person {
    private String name;
    private Integer age;
    private Boolean sex;
    private Dog dog;
    private Car car;
}

2.1 基于XML的配置

接下來讓我們嘗試使用XML的配置方式來為一個(gè)Person注入

class="pojo.Person">
    name="name" value="dzzhyk"/>
    name="age" value="20"/>
    name="sex" value="true"/>
    name="dog" ref="dog"/>
    name="car" ref="car"/>
class="hljs-name"bean>

class="pojo.Dog">
    name="name" value="旺財(cái)"/>
    name="age" value="5" />
class="hljs-name"bean>

class="pojo.Car">
    name="brand" value="奧迪雙鉆"/>
    name="price" value="100000"/>
class="hljs-name"bean>

然后跟普通的Bean注入一樣,使用ClassPathXmlApplicationContext來加載配置文件,然后獲取Bean

/**
 * 使用XML配置
 */
public class TestVersion1 {
    @Test
    public void test(){
        ClassPathXmlApplicationContext ca = new ClassPathXmlApplicationContext("applicationContext.xml");
        Person person = ca.getBean("person", Person.class);
        System.out.println(person);
    }
}

輸出結(jié)果如下:

Person(name=dzzhyk, age=20, sex=true, dog=Dog(name=旺財(cái), age=5), car=Car(brand=奧迪雙鉆, price=100000))

2.2 基于JavaConfig類的配置

想要成為JavaConfig類,需要使用@Configuration注解

我們新建一個(gè)包命名為config,在config中新增一個(gè)PersonConfig類

@Configuration
@ComponentScan
public class PersonConfig {

    @Bean
    public Person person(Dog dog, Car car){
        return new Person("dzzhyk", 20, true, dog, car);
    }

    @Bean
    public Dog dog(){
        return new Dog("旺財(cái)", 5);
    }

    @Bean
    public Car car(){
        return new Car("奧迪雙鉆", 100000);
    }
}

此時(shí)我們的XML配置文件可以完全為空了,此時(shí)應(yīng)該使用AnnotationConfigApplicationContext來獲取注解配置

/**
 * 使用JavaConfig配置
 */
public class TestVersion2 {
    @Test
    public void test(){
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PersonConfig.class);
        Person person = ac.getBean("person", Person.class);
        System.out.println(person);
    }
}

仍然正常輸出了結(jié)果:

Person(name=dzzhyk, age=20, sex=true, dog=Dog(name=旺財(cái), age=5), car=Car(brand=奧迪雙鉆, price=100000))

3. BeanDefinition

AbstractBeanDefinition

是spring中所有bean的抽象定義對(duì)象,我把他叫做bean定義

當(dāng)bean.class被JVM類加載到內(nèi)存中時(shí),會(huì)被spring掃描到一個(gè)map容器中:

BeanDefinitionMap

這個(gè)容器存儲(chǔ)了bean定義,但是bean此時(shí)還沒有進(jìn)行實(shí)例化,在進(jìn)行實(shí)例化之前,還有一個(gè)

BeanFactoryPostProcessor

可以對(duì)bean對(duì)象進(jìn)行一些自定義處理

我們打開BeanFactoryProcessor這個(gè)接口的源碼可以發(fā)現(xiàn)如下內(nèi)容:

/*
* Modify the application context's internal bean factory after its standard
* initialization. All bean definitions will have been loaded, but no beans
* will have been instantiated yet. This allows for overriding or adding
* properties even to eager-initializing beans.
*/

在spring完成標(biāo)準(zhǔn)的初始化過程后,實(shí)現(xiàn)BeanFactoryPostProcessor接口的對(duì)象可以用于定制bean factory,所有的bean definition都會(huì)被加載,但是此時(shí)還沒有被實(shí)例化。這個(gè)接口允許對(duì)一些bean定義做出屬性上的改動(dòng)。

簡(jiǎn)言之就是實(shí)現(xiàn)了BeanFactoryPostProcessor這個(gè)接口的類,可以在bean實(shí)例化之前完成一些對(duì)bean的改動(dòng)。

大致流程我畫了個(gè)圖:

至此我們能總結(jié)出springIOC容器的本質(zhì):(我的理解)

由BeanDefinitionMap、BeanFactoryPostProcessor、BeanPostProcessor、BeanMap等等容器共同組成、共同完成、提供依賴注入和控制反轉(zhuǎn)功能的一組集合,叫IOC容器。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14579
  • 源碼分析
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    5594
  • 自動(dòng)裝配
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    687
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    protel技術(shù)大全--初學(xué)者必看

    protel技術(shù)大全--初學(xué)者必看
    發(fā)表于 08-04 10:36

    PSOC1初學(xué)者必看的10個(gè)實(shí)例

    PSOC1初學(xué)者必看的10個(gè)實(shí)例
    發(fā)表于 11-19 16:33

    MATLAB入門教程-初學(xué)者必看

    MATLAB入門教程-初學(xué)者必看
    發(fā)表于 06-28 15:39

    Linux初學(xué)者必看!!!

    Linux初學(xué)者必看!!!
    發(fā)表于 01-07 21:35

    單片機(jī)入門秘籍,初學(xué)者必看

    初學(xué)者必看的單片機(jī)秘籍
    發(fā)表于 04-29 16:10

    PCB LAYOUT初學(xué)者必看

    PCBLAYOUT技術(shù)大全---初學(xué)者必看! PROTEL相關(guān)疑問 1.原理圖常見錯(cuò)誤: (1)ERC報(bào)告管腳沒有接入信號(hào): a.創(chuàng)建封裝時(shí)給管腳定義了I/O屬性; b.創(chuàng)建元件或放置
    發(fā)表于 09-13 15:23 ?0次下載

    PSOC1初學(xué)者5個(gè)實(shí)驗(yàn),針對(duì)初學(xué)者的實(shí)驗(yàn)

    PSOC1初學(xué)者5個(gè)實(shí)驗(yàn),針對(duì)初學(xué)者的實(shí)驗(yàn)
    發(fā)表于 10-16 09:33 ?14次下載
    PSOC<b class='flag-5'>1</b><b class='flag-5'>初學(xué)者</b>5個(gè)實(shí)驗(yàn),針對(duì)<b class='flag-5'>初學(xué)者</b>的實(shí)驗(yàn)

    初學(xué)者必看的基本電子技術(shù)概念

    初學(xué)者必看的基本電子技術(shù)概念
    發(fā)表于 05-17 11:41 ?0次下載

    初學(xué)者必看的電源測(cè)試項(xiàng)目要點(diǎn)及教程

    初學(xué)者必看的電源測(cè)試項(xiàng)目要點(diǎn)及教程
    發(fā)表于 07-01 14:09 ?31次下載

    初學(xué)者必看的LABVIEW工程師編程經(jīng)驗(yàn)

    初學(xué)者必看的LABVIEW工程師編程經(jīng)驗(yàn)
    發(fā)表于 07-12 14:24 ?29次下載

    ARM與嵌入式linux入門的建議(初學(xué)者必看)

    ARM與嵌入式linux入門的建議(初學(xué)者必看)(嵌入式開發(fā)培訓(xùn)怎么樣)-該文檔為ARM與嵌入式linux入門的建議(初學(xué)者必看)總結(jié)文檔,是一份很不錯(cuò)的參考資料,具有較高參考價(jià)值,感
    發(fā)表于 08-04 10:02 ?15次下載
    ARM與嵌入式linux入門的建議(<b class='flag-5'>初學(xué)者</b><b class='flag-5'>必看</b>)

    初學(xué)者必看的單片機(jī)程序匯總

    初學(xué)者必看的單片機(jī)程序匯總
    發(fā)表于 09-15 14:33 ?49次下載

    初學(xué)者必看SpringBoo自動(dòng)裝配原理2

    學(xué)習(xí)SpringBoot,絕對(duì)避不開自動(dòng)裝配這個(gè)概念,這也是SpringBoot的關(guān)鍵之一 本人也是SpringBoot的初學(xué)者,下面的一些總結(jié)都是結(jié)合個(gè)人理解和實(shí)踐得出的,如果有錯(cuò)誤或者疏漏,請(qǐng)一定一定一定(不是歡迎,是
    的頭像 發(fā)表于 04-07 11:03 ?653次閱讀

    初學(xué)者必看SpringBoo自動(dòng)裝配原理3

    學(xué)習(xí)SpringBoot,絕對(duì)避不開自動(dòng)裝配這個(gè)概念,這也是SpringBoot的關(guān)鍵之一 本人也是SpringBoot的初學(xué)者,下面的一些總結(jié)都是結(jié)合個(gè)人理解和實(shí)踐得出的,如果有錯(cuò)誤或者疏漏,請(qǐng)一定一定一定(不是歡迎,是
    的頭像 發(fā)表于 04-07 11:03 ?645次閱讀
    <b class='flag-5'>初學(xué)者</b><b class='flag-5'>必看</b>的<b class='flag-5'>SpringBoo</b><b class='flag-5'>自動(dòng)</b><b class='flag-5'>裝配</b>原理3

    初學(xué)者必看SpringBoo自動(dòng)裝配原理4

    學(xué)習(xí)SpringBoot,絕對(duì)避不開自動(dòng)裝配這個(gè)概念,這也是SpringBoot的關(guān)鍵之一 本人也是SpringBoot的初學(xué)者,下面的一些總結(jié)都是結(jié)合個(gè)人理解和實(shí)踐得出的,如果有錯(cuò)誤或者疏漏,請(qǐng)一定一定一定(不是歡迎,是
    的頭像 發(fā)表于 04-07 11:03 ?741次閱讀
    <b class='flag-5'>初學(xué)者</b><b class='flag-5'>必看</b>的<b class='flag-5'>SpringBoo</b><b class='flag-5'>自動(dòng)</b><b class='flag-5'>裝配</b>原理4
    主站蜘蛛池模板: 在线免费观看毛片网站 | 国产免费怕怕免费视频观看 | 九九免费精品视频 | bl撅高扒开臀缝哦 | 青青草偷拍国产亚洲欧洲 | 伊人精品影院 | 农民下乡在线观看3 | 91精品乱码一区二区三区 | 一线高清视频在线播放 | 国内2018年午夜福利5678 | 亚洲欧美日韩精品久久奇米色影视 | 日日夜夜操操操 | 国产精品久久久久精品A片软件 | 3d在线看小舞被躁视频 | 日本精品无码久久久久APP | 亚洲男人97色综合久久久 | 色噜噜狠狠色综合中文字幕 | 国产精品丰满人妻AV麻豆 | 美女尿口羞羞视频 | 99热婷婷国产精品综合 | 成人免费毛片观看 | 欧美美女性生活 | 无码爽死成人777在线观看网站 | 性做久久久久免费观看 | 蜜桃成熟时33D在线嘟嘟网 | 久久这里的只有是精品23 | 久艾草在线精品视频在线观看 | 草草久久久亚洲AV成人片 | 美美哒高清在线播放8 | 久草视频在线观看免费4 | 国内精品乱码卡一卡2卡三卡 | 这里只有精品在线视频 | 果冻传媒 在线播放观看 | 久久天天婷婷五月俺也去 | 成年视频xxxxxx在线 | 国产亚洲人成网站在线观看播放 | 国产三级影院 | 王晶三级作品 | 成人免费在线观看视频 | 考试考90就可以晚上和老师C | 高清国产免费观看视频在线 |