SpringIOC第二課,@Bean用法,DI詳解,常見面試題Autowired VS Resource

一、回顧

但是我們之前MVC時候,在頁面上,為什只用Controller,不用其他的呢?

用其他的好使嗎?(我們可以在這里看到,出現404的字樣)

@Service
@ResponseBody
public class TestController {@RequestMapping("/test")public String test(){return "測試Controller和其他注解的區別";}
}

但是Controller就是好使的,事實上Spring對Controller有更屌的權限

二、@Bean用法

五大注解只能加在類上,并且只能加在自己的代碼上

如果我引入一個第三方的jar包,也希望交給Spring管理,是沒有辦法加五大注解

第一個應用場景:可以使用@Bean, @Bean是方法注解

在這里,我們可以看到一個問題,就是兩個引用指向的是一個對象(看后面的那幾位,說明地址相同)

第二個應用場景:那么假如說要求是一個類,定義多個對象,比如說數據庫操作,定義多個數據源使用@Bean

@Bean相當于是一個上交作業的過程,交完了作業,要告訴老師,交完作業了

所以也就是說@Bean要搭配五大注解來使用并且當一個類型存在多個bean中,采用多個Bean的時候,我們就不能使用類型來獲取對象了。

我們上節課學的注釋

是getBean+方法名(小駝峰形式,特殊情況(兩個首字母都是大寫,那么她就會變成小寫)

@Bean需要加的是方法名(方法名不遵守小駝峰形式)

如何進行相應的傳遞參數

那么我們在應用中,一般不會讓寫死

假如對Bean的方法中的內容進行傳參數,則定義一個這種方法,當然現在這個也是死的,但是以后可以用這種方法變成“活的”

@Configuration
public class BeanConfig {@Beanpublic String name(){return "zhangsan";}@Beanpublic UserInfo UserInfo(String string){UserInfo userInfo=new UserInfo();userInfo.setName(string);return  userInfo;}

Spring的掃描文件約定

SpringBoot是屬于我們的開發框架(其實叫做開發框架,更感覺像是打開idea,后呈現的這個結構)

SpringBoot特點:約定大于配置,約定到,放到哪里就掃描當前文件夾里面的所有文件,但是假如說你硬是想在一個小的目錄里面去執行(也有方法,加路徑)(約定的體現之一掃描路徑,默認的掃描路徑是:啟動類所在的目錄及其子孫目錄

放到這個文件夾里面會報錯

解決方式就是

//默認掃描當前類的目錄及子目錄
在前面加上這個注解(路徑自己填)@ComponentScan("com.example")
@ComponentScan("com.example")
@SpringBootApplication
public class IoCtryApplication {public static void main(String[] args) {//啟動類是幫助我們啟動spring,這個命令可以返回一個spring

DI詳解

DI依賴注入,屬性裝配“依賴裝配”,

只要加上這些依賴注入(就跟我們導包一樣,沒導包不能用)

1.屬性注入 @Autowired

(相當于導游,帶著去找這個東西)和上面那個匹配的一致,和那個@Bean傳遞參數一樣。

@Controller
public class UserController {
//??假如沒有下面的這個Autowired注釋,那么就會報空指針異常
@Autowired
private UserService userService;public void prin(){userService.doService();System.out.println("春節快樂");
}
}
UserController userController=context.getBean(UserController.class);userController.prin();

2.構造方法注入

如下圖


@Controller
public class UserController {
//@Autowired
private UserService userService;private UserInfo userInfo;
//??注意此時加完構造函數之后,還要把無參數的也寫一遍,因為無參數的構造函數,有很多東西在用,所以一旦經過修改,就會讓使用無參數的報錯。public UserController(){
}
@Autowired
public  UserController(UserService userService){this.userService=userService;
}public  UserController(UserInfo userInfo,UserService userService){this.userService=userService;this.userInfo=userInfo;}
public void prin(){userService.doService();System.out.println("春節快樂");
}

3.Setter方法注入

三種注入的優缺點

1.屬性注入:

優點:簡潔方便

缺點:只能用于IOC容器,如果非IOC容器無法使用,并且只有在使用的時候才會出現NPE(空指針異常),并且不能修飾Final。

2.構造函數注入:

優點:

(1).可以注入final屬性(通過構造方法的形式)。

(2).注入的對象不會被修改(因為除非你再new,不然構造方法不能被再次調用),依賴對象使用之前一定會被初始化,因為依賴在類的構造方法中執行的,構造方法是類加載階段就會執行的方法

(3).通用型好:構造方法是JDK支持的

缺點:

代碼會比較繁瑣

Setter注入

優點:方便類實例化之后,重新對該對象進行配置或者注入

缺點:不能修飾Final,注入的對象肯會被改變,因為setter方法可能會被多次調用,就有被修改的風險。

當程序同一個類型,多個對象時候,使用@AutoWired會報錯

這里說的情況是這樣的一個代碼

package com.example.IOCtry;import com.example.IOCtry.config.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;@Controller
public class UserController {
@Autowired                //??
private UserService userService;
@Autowired                //??
private UserInfo userInfo;
//注意此時加完構造函數之后,還要把無參數的也寫一遍,因為無參數的構造函數,有很多東西在用,所以一旦經過修改,就會讓使用無參數的報錯。//public UserController(){
//}
//
//public  UserController(UserService userService){
//    this.userService=userService;
//}
//
//    public  UserController(UserInfo userInfo,UserService userService){
//        this.userService=userService;
//        this.userInfo=userInfo;
//    }
//   @Autowired
//    public  void setUserController(UserService userService){
//        this.userService=userService;
//    }
public void prin(){userService.doService();System.out.println(userInfo);System.out.println("春節快樂");
}
}

改法一需要改屬性名字:讓屬性名和方法名字一致

package com.example.IOCtry;import com.example.IOCtry.config.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;@Controller
public class UserController {
@Autowired
private UserService userService;
@Autowired
private UserInfo UserInfo1;       //??這個名字改成和方法名字一摸一樣
//注意此時加完構造函數之后,還要把無參數的也寫一遍,因為無參數的構造函數,有很多東西在用,所以一旦經過修改,就會讓使用無參數的報錯。//public UserController(){
//}
//
//public  UserController(UserService userService){
//    this.userService=userService;
//}
//
//    public  UserController(UserInfo userInfo,UserService userService){
//        this.userService=userService;
//        this.userInfo=userInfo;
//    }
//   @Autowired
//    public  void setUserController(UserService userService){
//        this.userService=userService;
//    }
public void prin(){userService.doService();System.out.println(UserInfo1);System.out.println("春節快樂");
}
}
不想改名的第二種方法:加上@Primary
//這個是在另一個類中搞的方法
package com.example.IOCtry.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;@Configuration
public class BeanConfig {@Beanpublic String name(){return "zhangsan";}@Beanpublic String name2(){return "wangwu";}// ??@Primary這個只有加上,程序才會不發生錯誤,會執行這個Setter方法@Beanpublic UserInfo UserInfo1(String name2){UserInfo userInfo=new UserInfo();userInfo.setName(name2);return  userInfo;}@Beanpublic UserInfo userInfo2(){UserInfo userInfo=new UserInfo();userInfo.setId(2);userInfo.setAge(22);userInfo.setName("lclyr");return  userInfo;}}
改法3(優先):使用@Qualifier
package com.example.IOCtry;import com.example.IOCtry.config.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;@Controller
public class UserController {
@Autowired
private UserService userService;
@Qualifier("userInfo2")            //??
@Autowired
private UserInfo userInfo;
//注意此時加完構造函數之后,還要把無參數的也寫一遍,因為無參數的構造函數,有很多東西在用,所以一旦經過修改,就會讓使用無參數的報錯。//public UserController(){
//}
//
//public  UserController(UserService userService){
//    this.userService=userService;
//}
//
//    public  UserController(UserInfo userInfo,UserService userService){
//        this.userService=userService;
//        this.userInfo=userInfo;
//    }
//   @Autowired
//    public  void setUserController(UserService userService){
//        this.userService=userService;
//    }
public void prin(){userService.doService();System.out.println(userInfo);System.out.println("春節快樂");
}
}

改法4(優先):使用@Resource(name="userInfo2")

package com.example.IOCtry;import com.example.IOCtry.config.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;import javax.annotation.Resource;@Controller
public class UserController {
@Autowired
private UserService userService;
//@Qualifier("userInfo2")@Resource(name="userInfo2")
@Autowired
private UserInfo userInfo;
//注意此時加完構造函數之后,還要把無參數的也寫一遍,因為無參數的構造函數,有很多東西在用,所以一旦經過修改,就會讓使用無參數的報錯。//public UserController(){
//}
//
//public  UserController(UserService userService){
//    this.userService=userService;
//}
//
//    public  UserController(UserInfo userInfo,UserService userService){
//        this.userService=userService;
//        this.userInfo=userInfo;
//    }
//   @Autowired
//    public  void setUserController(UserService userService){
//        this.userService=userService;
//    }
public void prin(){userService.doService();System.out.println(userInfo);System.out.println("春節快樂");
}
}

三、常見面試題Autowired VS? Resource

@Autowired:是Spring開發的框架,@Resource是JDK提供的框架

@Autowired:默認是按照類型來去注入,假如說同一個類型存在多個對象,那么就按名稱匹配,假如名稱匹配不上,那么就會報錯,相對于Autowired來說,@Resource支持更多的參數設置,如name設置,根據名稱獲取Bean???????

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/207004.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207004.shtml
英文地址,請注明出處:http://en.pswp.cn/news/207004.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

kubernetes安裝kubesphere

前置默認都安裝了k8s,且k8s都正常 1、nfs文件系統 1.1、安裝nfs-server # 在每個機器。 yum install -y nfs-utils# 在master 執行以下命令 echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports# 執行以下命令,啟動 …

數字化和數智化一字之差,究竟有何異同點?

在2023杭州云棲大會的一展臺內,桌子上放著一顆番茄和一個蛋糕,一旁的機器人手臂融入“通義千問”大模型技術后,變得會“思考”:不僅能描述“看”到了什么,還能確認抓取的是番茄而不是蛋糕。 “傳統的機械臂通常都只能基…

Post Quantum Fuzzy Stealth Signatures and Applications

目錄 筆記后續的研究方向摘要引言貢獻模塊化框架模糊構造實施適用于FIDO Post Quantum Fuzzy Stealth Signatures and Applications CCS 2023 筆記 后續的研究方向 摘要 自比特幣問世以來,基于區塊鏈的加密貨幣中的私人支付一直是學術和工業研究的主題。隱形地址…

cmd命令 常用的命令

網絡工作為常年公司里的背鍋俠,不得不集齊十八般武藝很難甩鍋。像cmd命令這種好用又好上手的技術,就是網絡工程師上班常備技能。 只要按下快捷鍵 winR,輸入cmd回車,然后輸入cmd命令。 像我自己,我就經常用cmd命令檢測…

在UBUNTU上使用Qemu和systemd-nspawn搭建RISC-V輕量級用戶模式開發環境

參考鏈接 使用Qemu和systemd-nspawn搭建RISC-V輕量級用戶模式開發環境 - 知乎 安裝Qemu sudo apt updatesudo apt -y install qemu-user-binfmt qemu-user-static systemd-container sudo apt -y install zstd 配置環境 RISCV_FILEarchriscv-2023-10-09.tar.zstwget -c ht…

浪潮信息KeyarchOS——保衛數字未來的安全防御利器

浪潮信息KeyarchOS——保衛數字未來的安全防御利器 前言 眾所周知,目前流行的操作系統有10余種,每一款操作系統都有自己的特點。作為使用者,我們該如何選擇操作系統。如果你偏重操作系統的安全可信和穩定高效,我推薦你使用浪潮信…

openEuler JDK21 部署 Zookeeper 集群

zookeeper-jdk21 操作系統:openEuler JDK:21 主機名IP地址spark01192.168.171.101spark02192.168.171.102spark03192.168.171.103 安裝 1. 升級內核和軟件 yum -y update2. 安裝常用軟件 yum -y install gcc gcc-c autoconf automake cmake make \zl…

E: 無法獲得鎖 /var/lib/dpkg/lock-frontend。鎖正由進程 6253(apt-get)持有

問題 解決方案 sudo rm /var/lib/dpkg/lock-frontend接著,繼續安裝。

el-from表單實現lable字體大小改變

<el-form-item label"活動名稱" class"my-form"> <el-input v-model"form.name" style"width: 80%;" ></el-input> </el-form-item> <style scoped lang"less"> //給當前頁面所以的lable都字…

Fiddler抓包測試

模擬弱網測試 操作&#xff1a;一、Rules - Customize Rules &#xff08;快捷鍵CtrlR&#xff09;彈出編輯器 二、接著CtrlF查找m_SimulateModem標志位 三、默認上傳300ms&#xff0c;下載150ms 四、更改后&#xff0c;繼續Rules - Performances - Simulate Modem Speeds勾上 …

【復雜網絡建模】——基于Graph Convolutional Networks (GCN)進行鏈接預測

目錄 一、復雜網絡建模 二、圖嵌入方法&#xff08;Graph Convolutional Networks (GCN) &#xff09; 1. 圖表示&#xff1a; 2. 鄰接矩陣&#xff08;Adjacency Matrix&#xff09;&#xff1a; 3. 圖卷積層&#xff08;Graph Convolutional Layer&#xff09;&#xff…

【C語言】7-32 刮刮彩票 分數 20

7-32 刮刮彩票 分數 20 全屏瀏覽題目 切換布局 作者 DAI, Longao 單位 杭州百騰教育科技有限公司 “刮刮彩票”是一款網絡游戲里面的一個小游戲。如圖所示&#xff1a; 每次游戲玩家會拿到一張彩票&#xff0c;上面會有 9 個數字&#xff0c;分別為數字 1 到數字 9&#xf…

Python 中 Thread 線程的用法

使用thread一直沒記錄過&#xff0c;最近又忘記具體用法了&#xff0c;記錄下 Thread()是Python標準庫中threading模塊的一個類&#xff0c;它可以用來創建和管理線程。線程是一種并發執行的方式&#xff0c;可以讓你的程序在等待某些事件的同時&#xff0c;執行其他的任務。例…

排序-插入排序與希爾排序

文章目錄 一、插入排序二、希爾排序 一、插入排序 思路&#xff1a; 當插入第i(i>1)個元素時&#xff0c;前面的array[0],array[1],…,array[i-1]已經排好序&#xff0c;此時用array[i]的排序碼與array[i-1],array[i-2],…的排序碼順序進行比較&#xff0c;找到插入位置即將…

Qt Rsa 加解密方法使用(pkcs1, pkcs8, 以及文件存儲和內存存儲密鑰)

Qt RSA 加解密 完整使用 密鑰格式&#xff1a; pkcs#1pkcs#8 如何區分密鑰對是PKCS1還是PKCS8&#xff1f; 通常PKCS1密鑰對的開始部分為&#xff1a;-----BEGIN RSA PRIVATE KEY-----或 -----BEGIN RSA PUBLIC KEY-----。而PKCS8密鑰對的開始部分為&#xff1a;-----BEGIN…

基于Springboot+mybatis+mysql+jsp招聘網站

基于Springbootmybatismysqljsp招聘網站 一、系統介紹二、功能展示四、其他系統實現五、獲取源碼 一、系統介紹 項目類型&#xff1a;Java EE項目 項目名稱&#xff1a;基于SPringBoot的照片網站 項目架構&#xff1a;B/S架構 開發語言&#xff1a;Java語言 前端技術&…

Swagger Array 逐步解密:帶你簡化開發工作

Swagger 允許開發者定義 API 的路徑、請求參數、響應和其他相關信息&#xff0c;以便生成可讀性較高的文檔和自動生成客戶端代碼。而 Array &#xff08;數組&#xff09;是一種常見的數據結構&#xff0c;用于存儲和組織多個相同類型的數據元素。數組可以有不同的維度和大小&a…

C++初學教程三

目錄 一、運算符 一、自增自減運算符 二、位運算符 三、關系運算符

情緒管理法則

感受情緒&#xff0c;聆聽情緒&#xff0c;接納情緒&#xff0c;管理情緒&#xff0c;將自己從黑暗中拯救出來 感受情緒的價值&#xff0c;了解情緒產生的原因 其實情緒沒有好壞之分&#xff0c;負面情緒是人體自我保護的產物 改變認知方式&#xff0c;做情緒的主人 典型案例…

軌道電流檢測IC——FP355,助力蓄電池充電器、SPS(適配器)、電池管理系統、多口快充充電器的優雅升級

目錄 一、FP355概述 二、FP355特點 三、FP355應用 隨著移動設備的普及和人們對電力需求的不斷增長&#xff0c;充電器的安全性和充電效率成為了重要的關注點。 作為一種能夠精確檢測電流的集成電路&#xff0c;軌道電流檢測IC——FP355是個不錯的選擇。它不僅廣泛應用于蓄電…