IoC / DI 實操

1. 建三層類

包結構:

com.lib  ├─ config  ├─ controller  ├─ service  ├─ repository  ├─ model  └─ annotation   // 自定義限定符
① 實體 Book
package com.lib.model;
public class Book {private Integer id;private String title;// 全參構造 + getter/setter/toString 省略
}
② Repository 接口
package com.lib.repository;
public interface BookRepository {Book findById(int id);
}
③ Repository 實現
package com.lib.repository;
@Repository
public class InMemoryBookRepository implements BookRepository {private Map<Integer, Book> store = new ConcurrentHashMap<>();public InMemoryBookRepository() {store.put(1, new Book(1, "Spring in Action"));}@Overridepublic Book findById(int id) {return store.get(id);}
}
④ Service
package com.lib.service;
@Service
public class BookService {private final BookRepository repo;   // ① 構造器注入@Autowiredpublic BookService(BookRepository repo) {this.repo = repo;}public Book query(int id) {return repo.findById(id);}
}
⑤ Controller
package com.lib.controller;
@Controller
@RequestMapping("/book")
public class BookController {private BookService bookService;   // ② 字段注入(演示用)@Autowiredpublic void setBookService(BookService bookService) {this.bookService = bookService; // ③ Setter 注入}@GetMapping("/{id}")@ResponseBodypublic Book get(@PathVariable int id) {return bookService.query(id);}
}

2. 三種注入方式對比

方式寫法備注
構造器@Autowired?全參構造不可變、易測試
Setter@Autowired?setXxx允許后期重配置
字段直接?@Autowired單元測試需反射

驗證
瀏覽器訪問 http://localhost:8080/library/book/1 → 返回 JSON
{"id":1,"title":"Spring in Action"} 即注入成功。


3. Bean 作用域實驗

InMemoryBookRepository 類上加:

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

寫測試控制器:

@GetMapping("/repo")
@ResponseBody
public String repoScope() {return "repo hash=" + bookService.getRepoHash(); // 在 Service 里返回 repo.toString()
}

連續刷新頁面:

  • singleton(默認)→ hash 不變

  • prototype → 每次 hash 變化


4. 生命周期回調(30 min)

① 讓 Repository 實現 2 個接口
@Repository
public class InMemoryBookRepository implements BookRepository,InitializingBean, DisposableBean {@PostConstructpublic void init() {System.out.println("[@PostConstruct] repo init, store size=" + store.size());}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("[InitializingBean] afterPropertiesSet");}@PreDestroypublic void preDestroy() {System.out.println("[@PreDestroy] repo will destroy");}@Overridepublic void destroy() throws Exception {System.out.println("[DisposableBean] destroy");}
}
② 啟動/關閉 Tomcat,觀察控制臺順序:
[@PostConstruct] repo init...
[InitializingBean] afterPropertiesSet...
...
[@PreDestroy] repo will destroy...
[DisposableBean] destroy...

截圖保存,生命周期七連擊完成。


5. Environment & 外部化配置

① 新建?app.properties?放 classpath
library.default.book.id=99
library.default.book.title=Default Book
② 配置類
@Configuration
@PropertySource("classpath:app.properties")
public class AppConfig {@Beanpublic Book defaultBook(Environment env) {return new Book(env.getProperty("library.default.book.id", Integer.class),env.getProperty("library.default.book.title"));}
}
③ 驗證
@Autowired
private Book defaultBook;   // 字段注入,僅演示
@GetMapping("/default")
@ResponseBody
public Book def() {return defaultBook;  // {"id":99,"title":"Default Book"}
}

8. 常見錯誤速查

異常原因解決
No qualifying bean of type 'BookRepository'忘記?@Repository加注解或?@ComponentScan
Bean instantiation failed: No default constructor自己寫了帶參構造卻未?@Autowired補上構造器?@Autowired
@PreDestroy not called外部 Tomcat 強殺用?catalina stop?溫和關閉

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

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

相關文章

AdsPower RPA 從excel中依次讀取多個TikTok賬號對多個TikTok賬號目標發送信息

多個賬號對多個目標發送子場景 B&#xff1a;多個賬號向“不同的”目標循環發送&#xff08;最復雜的群發邏輯&#xff09;流程&#xff1a;Excel表中有一個“目標用戶”列表。RPA流程會進行嵌套循環&#xff1a;外層循環&#xff1a;遍歷Excel中的每一行數據&#xff08;即每一…

擴散模型進化史

一幅精美的圖片&#xff0c;一段精彩的視頻&#xff0c;可能始于一片純粹的噪聲。 2024年的計算機視覺頂會CVPR上&#xff0c;擴散模型成為絕對主角。從圖像生成到視頻理解&#xff0c;從超分辨率到3D建模&#xff0c;擴散模型正以驚人的速度重塑著AIGC&#xff08;AI生成內容&…

一次 Linux 高負載 (Load) 異常問題排查實錄

一次 Linux 高負載&#xff08;Load&#xff09;異常排查實錄一、背景及排查過程材料二、排查分析2.1Load 的真正含義2.2&#xff1a;確認異常進程2.3&#xff1a;線程卡在哪&#xff08;wchan&#xff09;2.4&#xff1a;perf 采樣&#xff08;用戶態/內核態熱點&#xff09;2…

淺析Linux進程信號處理機制:基本原理及應用

文章目錄概述信號類型可靠信號與不可靠信號Fatal信號與Non Fatal信號不可捕獲/忽略信號信號工作機制信號處理方式信號嵌套處理信號使用信號發送kill命令注冊信號處理函數信號安全與函數可重入性可重入函數線程安全與可重入性相關參考概述 Linux信號機制是進程間通信的一種方式…

【學習K230-例程19】GT6700-TCP-Client

B站視頻 TCP TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;傳輸控制協議/網際協議&#xff09;是指能夠在多個不同網絡間實現信息傳輸的協議簇。TCP/IP 協議不僅僅指的是 TCP和 IP 兩個協議&#xff0c;而是指一個由 FTP、SMTP、TCP、UDP、I…

o2oa待辦流程和已辦流程表

在o2oa系統中每個用戶有兩種唯一標識&#xff1a;第一種是姓名個人釘釘ID&#xff08;或者o2oa創建該用戶時設置的id&#xff09;ORG_PERSON.xdistinguishedName劉準3013692136672430P第二種是姓名所在部門的釘釘id個人釘釘idORG_IDENTITY.xdistinguishedName劉準966488616_301…

QT零基礎入門教程

基礎篇第一章 QT 基礎認知1.1 什么是 QT&#xff08;What&#xff09;?定義&#xff1a;跨平臺 C 應用開發框架&#xff0c;不僅用于 UI 設計&#xff0c;還包含核心功能&#xff08;如事件、網絡、數據庫&#xff09;。?核心特性&#xff1a;?跨平臺&#xff1a;一套代碼支…

遠程依賴管理新范式:cpolar賦能Nexus全球協作

文章目錄 前言一. Docker安裝Nexus二. 本地訪問Nexus三. Linux安裝Cpolar四. 配置Nexus界面公網地址五. 遠程訪問 Nexus界面六. 固定Nexus公網地址七. 固定地址訪問Nexus 前言 Nexus作為一款企業級倉庫管理工具&#xff0c;其核心功能在于集中管理各類軟件依賴&#xff0c;提供…

Prompt技術深度解析:從基礎原理到前沿應用的全面指南

引言 在人工智能技術飛速發展的今天&#xff0c;Prompt技術&#xff08;提示詞工程&#xff09;已成為連接人類智慧與機器智能的重要橋梁。隨著GPT-4、Claude、Gemini等大型語言模型的廣泛應用&#xff0c;如何有效地與這些AI系統進行交互&#xff0c;已成為決定AI應用成功與否…

性能測試工具Jmeter之java.net.BindException: Address already in use

首先請參考連接&#xff1a;https://blog.csdn.net/weixin_46190208/article/details/115229733 。配置完注冊表后一般就能解決問題。但并未解決我的問題 注冊表的MaxUserPort&#xff0c;TcpTimedWaitDelay兩個參數我只能配置MaxUserPort&#xff0c;設置TcpTimedWaitDelay后&…

JDK 新特性

JDK 新特性引入模塊Java 9 開始引入了模塊&#xff08;Module&#xff09;&#xff0c;目的是為了管理依賴。使用模塊可以按需打包 JRE 和進一步限制類的訪問權限。接口支持私有方法JAVA 9 開始&#xff0c;接口里可以添加私有方法&#xff0c;JAVA 8 對接口增加了默認方法的支…

如何高效應對網站反爬蟲策略?

現在大型網站的反爬策略越來越高明了&#xff0c;不僅是對IP訪問頻率、User-Agent請求頭進行異常識別&#xff0c;還會分析IP地址、瀏覽器指紋、JS動態加載、API逆向、行為模式等方式各種設卡&#xff0c;動不動跳出五花八門的驗證碼&#xff0c;非常難搞。 怎么應對反爬是個系…

c++ shared_ptr理解

不是一個智能指針對于一個計數器嗎&#xff1f;怎么變成共有資源的計數器了&#xff1f;你的意思是多個對象共用一個計數器&#xff1f;你問到了 std::shared_ptr 最核心、最精妙的設計機制&#xff01;你的問題非常深刻&#xff1a;“不是一個智能指針對應一個計數器嗎&#x…

002 Rust環境搭建

Rust環境搭建 現在很多集成開發環境(IDE)基本上都支持Rust開發。官方公布的支持工具&#xff1a;https://www.rust-lang.org/zh-CN/tools 這里以Windows 10 64位系統 Visual Studio Code為例來搭建Rust開發環境。 Rust安裝 Rust 的編譯工具依賴 C 語言的編譯工具&#xff0…

【Unity進階】Unity發布PC端,隱藏并自定義默認標題欄

開發環境&#xff1a; Unity2019.3.16f1c1 - 個人版 Visual Studio Community 2019 Windows10 專業版 x64嘿&#xff0c;各位朋友們&#xff01;當咱們歡歡喜喜地把項目打包成PC平臺的exe窗口程序&#xff0c;準備在電腦上一展游戲風采時&#xff0c;卻發現冒出來個Windows風格…

國產延時芯片EH3B05上電延時3秒開關機芯片方案超低功耗

EH3B05-4941-24A1延時開關芯片是一款專為低功耗電子產品設計的高效時序控制器件&#xff0c;其核心功能在于提供精確的多通道延時信號輸出。該芯片采用SOT23-6超小封裝&#xff0c;體積僅為2.9mm2.8mm1.3mm&#xff0c;特別適合空間受限的便攜式設備。其工作電壓范圍覆蓋2.0V至…

大數據與財務管理專業如何轉型做金融科技?

在數字經濟加速演進的今天&#xff0c;金融行業的邊界正在被數據與技術重新定義。傳統金融崗位正經歷深刻變革&#xff0c;而"金融科技"&#xff08;FinTech&#xff09;作為技術與金融深度融合的產物&#xff0c;已成為行業轉型升級的核心引擎。越來越多具備數據背景…

Windows、Linux 系統 nodejs 和 npm 版本更新及錯誤修復

一、推薦使用 nvm 工具&#xff0c;直接通過命令行安轉和切換各個版本 無論是 Windows 平臺&#xff0c;還是 Linux 平臺&#xff0c;都推薦使用 nvm 工具。 nvm&#xff08;Node.js Version Management&#xff09;&#xff0c;是一個 nodejs 的版本管理工具。它是專門為解決…

【系列文章】Linux中的并發與競爭[03]-自旋鎖

【系列文章】Linux中的并發與競爭[03]-自旋鎖 該文章為系列文章&#xff1a;Linux中的并發與競爭中的第3篇 該系列的導航頁連接&#xff1a; 【系列文章】Linux中的并發與競爭-導航頁 文章目錄【系列文章】Linux中的并發與競爭[03]-自旋鎖一、自旋鎖二、實驗程序的編寫2.1驅動…

開始 ComfyUI 的 AI 繪圖之旅-Cosmos Predict2世界模型文生圖(全網首發,官網都沒有更新)(十三)

文章標題一、Cosmos-Predict21.Cosmos Predict2 Text2Image 工作流1.1 下載工作流文件1.2 手動模型安裝1.3 按步驟完成工作流運行本文介紹了如何在 ComfyUI 中完成 Cosmos-Predict2 文生圖的工作流 一、Cosmos-Predict2 Cosmos-Predict2 是由 NVIDIA 推出的新一代物理世界基礎模…