Spring Boot 中使用 Lombok 進行依賴注入的示例

Spring Boot 中使用 Lombok 進行依賴注入的示例

下面我將展示 Spring Boot 中使用 Lombok 進行依賴注入的不同方式,包括構造器注入、屬性注入和 setter 方法注入,以及相應的測試用例。

1. 構造器注入(推薦方式)

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;@Service
@RequiredArgsConstructor
public class UserService {private final UserRepository userRepository;private final PasswordEncoder passwordEncoder;// Lombok 會自動生成包含所有 final 字段的構造器// 相當于:// public UserService(UserRepository userRepository, PasswordEncoder passwordEncoder) {//     this.userRepository = userRepository;//     this.passwordEncoder = passwordEncoder;// }
}

2. 屬性注入(不推薦,僅作演示)

import lombok.Setter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class OrderService {@Autowired@Setterprivate PaymentService paymentService;@Autowired@Setterprivate InventoryService inventoryService;
}

3. Setter 方法注入

import lombok.Setter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class ProductService {private ProductRepository productRepository;private DiscountService discountService;@Autowiredpublic void setProductRepository(ProductRepository productRepository) {this.productRepository = productRepository;}@Autowired@Setter // 也可以使用 Lombok 的 @Setter 注解public void setDiscountService(DiscountService discountService) {this.discountService = discountService;}
}

4. 測試用例示例

import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.api.extension.ExtendWith;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;@ExtendWith(MockitoExtension.class)
public class UserServiceTest {@Mockprivate UserRepository userRepository;@Mockprivate PasswordEncoder passwordEncoder;@InjectMocksprivate UserService userService;@Testpublic void testCreateUser() {// 準備測試數據String username = "testUser";String password = "password123";String encodedPassword = "encodedPassword123";// 定義 mock 行為when(passwordEncoder.encode(password)).thenReturn(encodedPassword);when(userRepository.save(any(User.class))).thenAnswer(invocation -> invocation.getArgument(0));// 執行測試User result = userService.createUser(username, password);// 驗證結果assertNotNull(result);assertEquals(username, result.getUsername());assertEquals(encodedPassword, result.getPassword());// 驗證交互verify(passwordEncoder).encode(password);verify(userRepository).save(any(User.class));}
}

5. 綜合示例(使用 Lombok 和 Spring)

import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.stereotype.Controller;@Controller
@RequiredArgsConstructor
@RequestMapping("/api/users")
public class UserController {private final UserService userService;private final AuditService auditService;@PostMappingpublic ResponseEntity<User> createUser(@RequestBody UserDto userDto) {User user = userService.createUser(userDto);auditService.logUserCreation(user);return ResponseEntity.ok(user);}
}

springboot 測試代碼中使用構造方法

@SpringBootTest
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class Test1RepositoryTest {protected final CcProcessRepository ccProcessRepository;

其他參考: lombok.config,lombok1.8.30 測試類未生效,只生成了 @ConstructorProperties

# 阻止配置向上冒泡
#config.stopBubbling = true
# 全局同時配置兩種注解(需要Lombok 1.18.16+)
# 為所有生成的構造器自動添加 @ConstructorProperties
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Autowired
lombok.anyConstructor.addConstructorProperties = true
#lombok.copyableAnnotations += org.springframework.context.annotation.Lazy

注意事項

  1. 推薦使用構造器注入(使用 @RequiredArgsConstructor),因為:

    • 明確依賴關系
    • 方便測試
    • 不可變(final)字段
    • 符合單一職責原則
  2. 屬性注入雖然簡潔,但有以下缺點:

    • 隱藏依賴關系
    • 難以測試
    • 可能導致循環依賴
  3. 在測試中,使用 @Mock 創建 mock 對象,使用 @InjectMocks 讓 Mockito 自動注入這些 mock 到被測試對象中。

  4. 確保項目中已正確配置 Lombok 插件(IDE 和構建工具都需要)。

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

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

相關文章

vue3+vit+vue-router路由,側邊欄菜單,面包屑導航設置層級結構

文章目錄注意效果圖目錄結構代碼vite.config.ts需要配置路徑別名符號main.tsApp.vueBreadcrumb.vue面包屑組件menus.ts// src/router/index.ts其他文件注意 目錄結構僅供參考DefaultLayout.vue 沒有用到&#xff0c;我直接寫在APP文件中vux-store我也沒有用到&#xff0c;單獨…

使用Selenium自動化獲取抖音創作者平臺視頻數據

前言 在當今短視頻盛行的時代&#xff0c;抖音作為國內領先的短視頻平臺&#xff0c;吸引了大量內容創作者。對于創作者而言&#xff0c;了解自己發布的視頻表現&#xff08;如播放量、發布時間等&#xff09;至關重要。本文將介紹如何使用Python的Selenium庫來自動化獲取抖音…

SpringCloud之Eureka

SpringCloud之Eureka 推薦參考&#xff1a;https://www.springcloud.cc/spring-cloud-dalston.html#_service_discovery_eureka_clients 1. 什么是Eureka Eureka 用于簡化分布式系統的服務治理&#xff0c;基于REST的服務&#xff0c;用于服務的注冊與發現。通過注冊發現、客戶…

squash壓縮合并

要將test分支的多次提交合并到dev分支并壓縮為一個commit&#xff0c;核心是使用 git merge --squash 命令&#xff08;壓縮合并&#xff09;&#xff0c;具體步驟如下&#xff1a; 詳細步驟&#xff1a; 1. 切換到dev分支并拉取最新代碼先確保本地dev分支是最新的&#xff0c;…

飛書CEO謝欣:挑戰巨頭,打造AI新時代的Office

引言&#xff1a;飛書要做AI時代辦公協作的逐夢者與破局者。文 | 大力財經在AI浪潮席卷的當下&#xff0c;企業對AI既滿懷期待又充滿焦慮。“AI到底能不能用&#xff1f;AI到底怎么用&#xff1f;”成為縈繞在眾多企業心頭的難題。7月9日召開的飛書未來無限大會&#xff0c;飛書…

React 組件中怎么做事件代理?它的原理是什么?

在 React 組件中&#xff0c;**事件代理&#xff08;Event Delegation&#xff09;**其實是 React 內部實現的一部分&#xff0c;開發者通常無需手動實現事件代理&#xff0c;但理解它的原理和使用方式對于優化性能和掌握底層機制非常重要。一、React 中事件代理的原理React 使…

Vue 2現代模式打包:雙包架構下的性能突圍戰

文章目錄一、場景痛點&#xff1a;兼容性與性能的撕裂二、技術解析&#xff1a;Modern Mode的雙引擎驅動1. 基礎認知&#xff1a;什么是Modern Mode&#xff1f;2. 原理深入&#xff1a;HTML智能分發與Safari 10修復3. 性能收益對比表三、Vue 2項目實戰&#xff1a;啟用Modern模…

UniHttp中HttpApiProcessor生命周期鉤子介紹以及公共參數填充-以百度天氣接口為例

目錄 引言 一、UniHttp與HttpApiProcessor簡介 1、生命周期鉤子的重要性 2、公共參數填充的需求 3、生命周期鉤子相關介紹 二、HttpApiProcessor的實際應用 1、在Yml中定義相關參數 2、自定義HttpAPI注解 3、對接接口的定義 4、HttpApiProcessor的具體實現 5、實際調…

pytorch深度學習—RNN-循環神經網絡

結合生活實例&#xff0c;先簡單認識一下什么是循環神經網絡先想個問題&#xff1a;為什么需要 “循環”&#xff1f;你平時看句子、聽語音、看視頻&#xff0c;都是 “按順序” 來的吧&#xff1f;比如 “我吃蘋果” 和 “蘋果吃我”&#xff0c;字一樣但順序不同&#xff0c;…

深度學習常見名詞解釋、評價指標

目錄 一、魯棒性(robustness) 二、泛化能力&#xff08;Generalization Ability&#xff09; 核心含義&#xff1a; 如何衡量泛化能力&#xff1f; 三、先驗信息&#xff08;Prior Information&#xff09; 四、mIoU &#xff08;Mean Intersection over Union&#xff0…

docker-compose安裝常用中間件

分為3大部分&#xff1a;數據庫&#xff1a;mysql&#xff0c;redis&#xff0c;mongodb&#xff0c;elasticsearch&#xff0c;neo4j&#xff0c;minio&#xff0c;influxdb&#xff0c;canal-server應用中間件&#xff1a;nacos&#xff0c;apollo&#xff0c;zookeeper&…

基于無人機 RTK 和 yolov8 的目標定位算法

目錄 背景 算法思路 代碼實現 驗證 背景 在城市交通巡檢中如何進行車輛違停判斷很重要&#xff0c;一個方法是通過精確坐標判斷車輛中心是否位于違停框中&#xff0c;我們假設無人機坐標已知&#xff0c;并且無人機云臺鏡頭垂直地面朝下&#xff0c;可根據圖像分辨率、無人機參…

go入門 - day1 - 環境搭建

0. 介紹 go語言可以做什么&#xff1f; a. 區塊鏈 b. 分布式/微服務/云原生 c. 服務器/游戲軟件go的優勢 a. 代碼量比C和Java少 b. 編譯速度比Java或者C快上5到6倍&#xff0c;比Scale塊10被 c. 性能比C慢20%&#xff0c;但是比Java、python等快上5到10倍 d. 內存管理和C媲美&a…

【華為OD】MVP爭奪戰(C++、Java、Python)

文章目錄題目描述輸入描述輸出描述示例解題思路算法思路核心步驟代碼實現C實現Java實現Python實現算法要點復雜度分析解題總結題目描述 在星球爭霸籃球賽對抗賽中&#xff0c;最大的宇宙戰隊希望每個人都能拿到MVP&#xff0c;MVP的條件是單場最高分得分獲得者。可以并列所以宇…

Datawhale 2025 AI夏令營 MCP Server Task2

魔搭MCP &Agent賽事&#xff08;MCP Server開發&#xff09;/夏令營&#xff1a;動手開發MCP Server學習鏈接&#xff1a;魔搭MCP &Agent賽事&#xff08;MCP Server開發&#xff09; - Datawhale Task1回顧 1.task1應用功能 luner_info每日黃歷 這是一個可以獲取某天…

敏捷開發方法全景解析

核心理念:敏捷開發是以快速響應變化為核心的項目管理方法論,通過迭代式交付、自組織團隊和持續反饋,實現高質量軟件的高效交付。其本質是擁抱變化優于遵循計劃,強調"可工作的軟件高于詳盡的文檔"。 一、敏捷核心思想體系 #mermaid-svg-y7iyWsQGVWn3IpEi {font-fa…

Socket到底是什么(簡單來說)

簡單來說&#xff1a; Socket 抽象了網絡通信的復雜底層細節&#xff0c;讓應用程序開發者可以專注于發送和接收數據&#xff0c;而不用去操心數據在網絡上是如何傳輸的。 它就像一個“黑盒子”&#xff0c;你只需要把數據扔進去&#xff0c;或者從里面取數據&#xff0c;至于數…

linux系統mysql性能優化

1、系統最大打開文件描述符數查看限制 ulimit -n更改配置 # 第一步 sudo vim /etc/security/limits.conf* soft nofile 1048576 * hard nofile 1048576# 第二步 sudo vim /etc/sysctl.conffs.file-max 1048576# 第三步&#xff08;重啟系統&#xff09; sudo reboot驗證生效 u…

免費的需要嘗試claude code的API安利,截至今天可用(7月13號)

安裝方法放最后&#xff08;很簡單&#xff0c;但是你得搞定網絡&#xff09; 注冊如下&#xff1a; 鏈接如下&#xff08;有詳細說明&#xff09;&#xff1a; &#x1f680; AnyRouter&#xff5c;Claude Code 免費共享平臺 安裝&#xff08;windows用戶特殊點&#xff0…

Java 屬性配置文件讀取方法詳解

Java 屬性配置文件讀取方法詳解 一、配置文件基礎概念 1. 配置文件類型對比類型格式優點缺點適用場景Propertieskeyvalue簡單易讀&#xff0c;Java原生支持不支持層級結構簡單配置&#xff0c;JDBC參數XML標簽層級結構結構化強&#xff0c;支持復雜數據類型冗余&#xff0c;解析…