網站首頁 編程語言 正文
1.五大類注解
@Controller(控制器存儲)
@Service(服務儲存)
@Repository(倉庫儲存)
@Component(組件儲存)
@Configuration(配置儲存)
用法
首先要建立一Spring的項目,再創建一個相應的Controller類.
?然后在resources目錄下的xml文件加入這句,其中引號中的路徑要包函你想要存儲的Bean對象.
?@Controller:
?我們平常想在main方法中獲取這個UserController對象都是用new關鍵字創建一個的,但Spring就不一樣了,它是在程序運行加載好的基礎上去取到加載好的對象的.
?在獲取上下文之后就可以通過getBean()方法從IoC容器中獲取到Bean對象了.
?其他的注解的用法也是一樣的:
@Service:
代碼:
讀取Bean代碼:
?@Repository:
代碼:
讀取Bean代碼:
?@Component:
代碼:
讀取Bean代碼:
?@Configuration:
代碼:
讀取Bean代碼:
?2.方法注解:@Bean
首先我們要有一個類,例如
然后在另一個 類中創建一個對象并存儲到Spring容器中
?
?注意:@Bean標簽必須配合類標簽使用.
為什么@Bean必須配合類標簽使用呢?
這是程序員在設計的時候考慮到搜索的效率而設計的,只有通過注解標識了哪些路徑,Spring才認為被標記的路徑中有可能有要存到容器中的Bean對象,Spring才會去搜索那些被標記的路徑,不必全部路徑都搜索一遍,這樣就提高了效率,所以如果只標記方法注解,而沒有類注解,Spring是不會來搜索這個類的,就更別提搜索它里面的方法了.
獲取Bean對象代碼:
?但是假如在其他類下面也有一個方法名一樣的方法那就有問題了.
?你會發現在main方法中只能取到一個固定的對象,無法取到另一個.
不管運行多少次,你取到的都是"李四"這個對象,無法拿到"張三".
這時候就要用到Bean的重命名方法了
?
?
?這樣我們就能隨心所欲的取到想要的對象了
除了上面的命名方式,我們還有另外兩種方式
?但是Bean還有個問題,就是不能存儲帶參數的方法,因為在存儲Bean對象的時候,我們沒辦法手動給它傳參,所以無法存儲進去,如果要傳參可能得配合其他標簽讓他在存儲的時候自動傳參.
3獲取Bean對象的三種方法
1.屬性注入
2.setter方法注入
3.構造方法注入
1.屬性注入
獲取注入對象的代碼:
結果:
?2.setter注入
?獲取注入對象的代碼:
結果:
?也能成功調用.
3.構造方法調用
??獲取注入對象的代碼:
結果也是正常的:
當當前類只有一個構造方法的時候@Autowired標簽也能省略
但是當當前類有多個構造方法的時候?必須加一個,不然Spring就會報錯
?獲取注入對象的代碼:
?
?結果:
?
?所以有多個構造方法至少要加一個:
?修改之后得到正確結果
:
?雖然三個都能注入,但都有不同的優缺點:
屬性注入:
優點: 編碼方便快捷,代碼量少.
缺點:?1.可能只有Spring支持這種寫法,把代碼在別的框架上使用同樣的代碼可能會出錯.代碼通用性差.因為代碼簡短,濫用的成本低,被濫用的概率高.
2.不能注入不可變的對象,也就是被Java中被final修飾的對象.
Setter方法注入:
優點: 符合單一原則,一個Setter只針對一個對象.
缺點: 1.不能注入不可變的對象,也就是被Java中被final修飾的對象.
2.由于可以多次調用setter方法,所以注入的對象可能被改變.
構造方法注入:
優點:1.符合單一原則,因為一個構造方法只會調用一次,所以相同對象只會存儲一次.
2.注入的對象會被完全初始化,因為構造方法是對象在建立之初就執行的,所以在執行的時候能將對象完全初始化.
3.通用性會更好,因為構造方法是屬于JDK所支持的,其他兩種注入方式IoC容器才支持的.
4.可以注入不可變對象,對final修飾的對象有兩種初始化的方法,一種是在創建的時候直接毒賦值,一種是在構造方法里賦值,所以構造方法注入剛好滿足這種情況.
??3.1@Resource注解
@Resource和@Autowried的使用方法都差不多,但是@Resource提供的方法更多
@Resource是可以直接替換@Autowried的
?
但是只能屬性注入的方式和setter注入的方式能用,因為構造方法的執行時機與@Resource不同,構造方法在創建對象時就執行,但是@Resource注解的執行時機在構造方法之后.
與@Autowried的區別
?@Resource比@Autowried多了很多參數設置
除此之外@Resource是JDK自帶的注解,而@Autowried來自Spring.
3.2同類型有多個@Bean報錯
?在另一個類中獲取User對象
?運行之后:
?多個同類型@Bean解決辦法
1.@Resource(name = "XXX")定義
2.@Qualifier注解定義名稱
?
?或者
?
原文鏈接:https://blog.csdn.net/qq_62592809/article/details/127832405
- 上一篇:python中的運算符
- 下一篇:JVM中的垃圾回收
相關推薦
- 2023-10-11 MP、MybatisPlus、聯表查詢、自定義sql、Constants.WRAPPER、ew (一
- 2023-02-05 scipy.interpolate插值方法實例講解_python
- 2022-04-26 C#新特性之可空引用類型_C#教程
- 2022-07-07 C++?opencv實現幾何圖形繪制_C 語言
- 2022-09-30 Docker容器搭建本地私有倉庫詳情_docker
- 2023-03-28 Python中用append()連接后多出一列Unnamed的解決_python
- 2022-07-18 linux引導和服務過程
- 2022-07-09 python?監控某個進程內存的情況問題_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支