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

@Autowired自動裝配,@Bean注入@Primary,@Qualifier優(yōu)先級講解

 更新時間:2021年09月27日 12:04:10   作者:灰太猿  
這篇文章主要介紹了@Autowired自動裝配,@Bean注入@Primary,@Qualifier優(yōu)先級,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Autowired自動裝配

spring利用依賴注入(DI),完成對IOC容器中的各個組件的依賴關(guān)系賦值

對同一個Dao類,既有 @Bean 注解聲明,又有Autowired 自動裝配,分析一下幾種情況:

第一種情況

1、如果Dao類中聲明了@Repository,且@ComponentScan 添加了dao掃描,則默認會創(chuàng)建一個testDao在IOC容器中。

2、如果在config中指定了Bean注解,此時:

a、如果Bean注解的方法名也是testDao ,則會覆蓋默認對象

1.新建maven工程

<groupId>com.MySpring</groupId> <artifactId>demo</artifactId> 

新建TestController.java TestService.java TestDao; 分別建在指定的包內(nèi)

在這里插入圖片描述

pom.xml 文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.MySpring</groupId>
    <artifactId>demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

1.TestController 類:

package com.MySpring.demo.controller;
import com.MySpring.demo.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class TestController {
    @Autowired
    private TestService testService;
}

2.TestDao 類:

package com.MySpring.demo.dao;
import org.springframework.stereotype.Repository;
@Repository
public class TestDao {
    public String getMessage( ) {
        return message;
    }
    public void setMessage( String message ) {
        this.message = message;
    }
    private  String message ="1";
    @Override
    public String toString( ) {
        return "TestDao{" +
                "message='" + message + '\'' +
                '}';
    }
}

3.TestService

package com.MySpring.demo.service;
import com.MySpring.demo.dao.TestDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class TestService {
    @Autowired
    private TestDao testDao;
    public void print(){
        System.out.printf( "[%s] from testService.\n" ,testDao);
    }
}

4.AppConfig

package com.MySpring.demo;
import com.MySpring.demo.dao.TestDao;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan({"com.MySpring.demo.controller","com.MySpring.demo.service","com.MySpring.demo.dao",})
public class AppConfig {
    @Bean
    public TestDao testDao(){
        TestDao dao = new TestDao();
        dao.setMessage( "2" );
        return dao;
    }
}

5.新建測試類:

package com.MySpring.demo;
import com.MySpring.demo.dao.TestDao;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan({"com.MySpring.demo.controller","com.MySpring.demo.service","com.MySpring.demo.dao",})
public class AppConfig {
    @Bean
    public TestDao testDao(){
        TestDao dao = new TestDao();
        dao.setMessage( "2" );
        return dao;
    }
}

輸出結(jié)果:

雖然在Dao中聲明了@Respository ,但因為在IOC容器裝載bean的時候,由于IOC是個大的hashmap且默認為singleton, 他們的key都是testDao,所以被 @Bean的方法名稱覆蓋,所以在IOC容器中,只有一個testDao 存在,所取到的值都是'2'

第二種情況

如果IOC容器中有兩個Dao實例,則@Autowired 自動裝配會根據(jù)變量名稱去IOC容器中尋找,對應(yīng)的實例裝載,若找不到則報錯,默認是必須存在,Autowired 源碼如下:

當然,也可以設(shè)置required為false

public @interface Autowired {
	/**
	 * Declares whether the annotated dependency is required.
	 * <p>Defaults to {@code true}.
	 */
	boolean required() default true;
}

1. 更改AppConfig類中 Bean注解的方法名為testDao2

在這里插入圖片描述

2. 同時更改TestService中的 testDao變量名為 testDao2,其他保持不變:

在這里插入圖片描述

執(zhí)行測試用例AppTest,得到結(jié)果,我們可以發(fā)現(xiàn)IOC容器中,有兩個實例名稱,Service中Autowired 自動裝配的對象變成了2, 而通過getBean(“testDao") 得到的結(jié)果是Dao原始的結(jié)果1:

在這里插入圖片描述 在這里插入圖片描述

第三種情況

在第二中情況下,如果在@Autowired 注解的變量中聲明@Qualifier(“testDao”),則會優(yōu)先根據(jù)Qualifier指定的名稱去裝載Bean對象, 修改TestService代碼如下:

在這里插入圖片描述

運行AppTest測試用例,結(jié)果如下:

在這里插入圖片描述

第四種情況

@Qualifier與@Primary注解同時存在 在第三種情況基礎(chǔ)上,@Bean注解中追加 @Primary注解

在這里插入圖片描述 

更改 AppTest 中獲取 TestDao的方式為 app.getBean(TestDao.class) 如下:

在這里插入圖片描述

運行AppTest 測試用例,結(jié)果如下:

在這里插入圖片描述

證明:

@Qualifier是根據(jù)bean id指定獲取testDao, 不受@Primary影響. 但是在沒有Qualifier 的地方,通過@Primary標記的Bean優(yōu)先被使用。

通過TestDao{message=‘2'} 可以證明,如果不標記Primary Bean,則此處會報錯,因為有兩個相同實例,Spring不知道該選擇哪個。

總結(jié)

1、如果Dao類中聲明了@Repository,且@ComponentScan 添加了dao掃描,則默認會創(chuàng)建一個testDao在IOC容器中。

2、如果在config中指定了Bean注解,此時:

a、如果Bean注解的方法名也是testDao ,則會覆蓋默認對象

b、如果Bean注解的方法名或者聲明的別名不是testDao ,則會新創(chuàng)建一個對象在IOC容器中。

@Autowired 取值

如果聲明的變量是testDao ,則默認會去IOC容器中獲取testDao對象。

如果聲明的變量是Bean注解指定的別名或者方法名,則會去容器中獲取Bean注解別名或者方法名。

如果聲明 的變量不是以上兩者,則會報錯

app.getBean()

如果在IOC容器中存在兩個TestDao實例,則只能通過字符串名稱來獲取bean實例,如:app.getBean("testDao"),否則無法獲取到對象, 有指定@Primary聲明除外。

如果在IOC容器中只存在一個TestDao實例,則可以通過app.getBean(TestDao.class)獲取bean對象。

@Primary 優(yōu)先

只要Primary出現(xiàn),不管是Autowired 還是getBean取值,都會優(yōu)先取到 @Primary 聲明的那個容器對象實例,但是,

如果在Autowired中聲明了@Qualifier("testDao"),則在Autowired 上的取值會優(yōu)先Qualifiler對象,其他地方還是會去取Primary對象

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java多線程中ThreadLocal解讀

    Java多線程中ThreadLocal解讀

    這篇文章主要介紹了Java多線程中ThreadLocal解讀,??多線程訪問同一個共享變量的時候容易出現(xiàn)并發(fā)問題,因此為了保證線程安全性,我們都會采用加鎖的方式,而ThreadLocal是除加鎖方式之外的另一種保證線程安全性的方法,需要的朋友可以參考下
    2023-09-09
  • Java 邏輯控制詳解分析

    Java 邏輯控制詳解分析

    在程序開發(fā)的過程之中一共會存在有三種程序邏輯:順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu),對于之前所編寫的代碼大部分都是順序結(jié)構(gòu)的定義,即:所有的程序?qū)凑斩x的代碼順序依次執(zhí)行
    2021-11-11
  • 關(guān)于idea引入spring boot <parent></parent>父依賴標紅問題

    關(guān)于idea引入spring boot <parent></parent>父依賴標紅問題

    這篇文章主要介紹了idea引入spring boot <parent></parent>父依賴標紅問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • 淺談hibernate之映射文件VS映射注解

    淺談hibernate之映射文件VS映射注解

    下面小編就為大家?guī)硪黄獪\談hibernate之映射文件VS映射注解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • SpringBoot+Redis隊列實現(xiàn)Java版秒殺的示例代碼

    SpringBoot+Redis隊列實現(xiàn)Java版秒殺的示例代碼

    本文主要介紹了SpringBoot+Redis隊列實現(xiàn)Java版秒殺的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java中的排序與內(nèi)部比較器Compareable解析

    Java中的排序與內(nèi)部比較器Compareable解析

    這篇文章主要介紹了Java中的排序與內(nèi)部比較器Compareable解析,一般沒有特殊要求時,直接調(diào)用(底層默認的升序排列)就可以得到想要的結(jié)果,所謂的 sort 方法排序底層都是基于這兩種排序,故如果需要設(shè)計成所想要的排序就需要了解底層排序原理,需要的朋友可以參考下
    2023-11-11
  • Java實現(xiàn)簡單客戶信息管理系統(tǒng)

    Java實現(xiàn)簡單客戶信息管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單客戶信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • springboot配置允許跨域訪問代碼實例

    springboot配置允許跨域訪問代碼實例

    這篇文章主要介紹了springboot配置允許跨域訪問代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • SpringCloud?Feign?傳輸Date類型參數(shù)存在誤差的問題

    SpringCloud?Feign?傳輸Date類型參數(shù)存在誤差的問題

    這篇文章主要介紹了SpringCloud?Feign?傳輸Date類型參數(shù)存在誤差的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Mybatis模糊查詢和動態(tài)sql語句的用法

    Mybatis模糊查詢和動態(tài)sql語句的用法

    今天小編就為大家分享一篇關(guān)于Mybatis模糊查詢和動態(tài)sql語句的用法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03

最新評論

武定县| 固阳县| 正阳县| 大荔县| 许昌市| 阳信县| 梧州市| 申扎县| 北辰区| 长汀县| 昌黎县| 体育| 清河县| 赤壁市| 曲松县| 措勤县| 平陆县| 嘉义市| 巢湖市| 克山县| 库车县| 都匀市| 大埔县| 襄樊市| 册亨县| 宝清县| 靖江市| 保山市| 德钦县| 耿马| 南投县| 峡江县| 肃宁县| 星座| 南京市| 广汉市| 武汉市| 陵川县| 碌曲县| 北安市| 施秉县|