一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - @Autowired自動裝配,@Bean注入@Primary,@Qualifier優(yōu)先級講解

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

2022-01-20 01:05灰太猿 Java教程

這篇文章主要介紹了@Autowired自動裝配,@Bean注入@Primary,@Qualifier優(yōu)先級,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Autowired自動裝配

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

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

第一種情況

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

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

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

1.新建maven工程

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

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

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

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é)果:

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

第二種情況

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

當(dāng)然,也可以設(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

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

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

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

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

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

第三種情況

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

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

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

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

第四種情況

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

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

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

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

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

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

證明:

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

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

 

總結(jié)

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

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

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

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

@Autowired 取值

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

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

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

app.getBean()

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

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

@Primary 優(yōu)先

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

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

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

原文鏈接:https://blog.csdn.net/qq_21202769/article/details/86773809

延伸 · 閱讀

精彩推薦
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程20個非常實(shí)用的Java程序代碼片段

    20個非常實(shí)用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實(shí)用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java實(shí)現(xiàn)搶紅包功能

    Java實(shí)現(xiàn)搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點(diǎn),所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
主站蜘蛛池模板: 操碰人人| 四神集团1涨奶是第几章 | 欧美成人v视频免费看 | 亚洲欧美成人综合在线 | 国产成人精品免费大全 | 99久久成人| 国产精品成人亚洲 | 别停好爽好深好大好舒服视频 | 5x社区发源地最新地址 | 4399h漫画 | 白丝出水| ady@ady9.映画网| 99福利视频导航 | 四虎永久免费地址ww417 | 亚洲国产精品二区久久 | 99精品全国免费7观看视频 | 99久久免费国产香蕉麻豆 | 四虎永久在线精品国产 | 国产a不卡片精品免费观看 国产aaa伦理片 | 黄绝一级 | 成人免费福利网站在线看 | 日韩小视频在线观看 | 国内精品免费一区二区三区 | 女同xx美女放 | 亚洲久草| 亚洲天堂一区二区在线观看 | 91精品国产91久久 | 无码乱人伦一区二区亚洲 | 校草太大了h | 校园情射 | 日本高清免费不卡在线 | 国产精品视频一区二区三区经 | 3x3x3x短视频在线看 | 美女露全身永久免费网站 | 国内精品 大秀视频 日韩精品 | 国产成人综合亚洲亚洲欧美 | 午夜影院网站 | 紧身短裙女教师波多野 | 四虎永久在线精品国产馆v视影院 | 香蕉久草 | 国产三级精品三级男人的天堂 |