【spring】注解版

1.管理bean

之前我們要想管理bean都是在xml文件中將想要添加的bean手動添加進ioc容器中,這樣太過麻煩了,在 Java 開發里,針對一些較為繁瑣的操作,通常會有相應的簡化方式,這個也不例外,就是spring提供的注解。

@Component

只需要把它寫在想要放入ioc容器的bean所屬的類上即可,在后面可以加上(value="")這個value的值就是相當于之前xml文件中bean標簽里的id,可以直接把value去掉直接寫上對應的值,畢竟就這一個值也不需要區分。當然你也可以選擇什么都不加,那么此時默認的值就是改類名但是首部第一個字母一定要是小寫。

還有一個很重要的細節別忘了,就是一定要在xml文件中配置掃描,旨在告訴spring要掃描的包因為ClassPathXmlApplicationContext初始化容器時會把xml文件中聲明的標簽下的類都創建到容器中。但 是因為bean.xml并不知道哪一個類加上注解了,所以無法創建對象。

<context:component-scan base-package="com.xq"></context:component-scan>

base-package的值就是告訴com.xq一下的包都要掃描。?

該注解衍生出三個注解

@Controller:一般用在表現層。

@Service:一般用在業務。

@Repository:一般用在持久層。

其實它們跟@Component是一個用法,之所以這樣分開是因為java寫項目時是需要進行分層開發的

為了區分各個層,就用了這三個注解。

2.依賴注解

@Autowired

有一點要說明,它只能注入引用類型的bean

分三個場景來講

構造函數注入

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;// 定義一個服務接口
interface MessageService {void sendMessage(String message);
}// 實現服務接口
@Component
class EmailService implements MessageService {@Overridepublic void sendMessage(String message) {System.out.println("Sending email: " + message);}
}// 使用 @Autowired 進行構造函數注入
@Component
class UserService {private final MessageService messageService;@Autowiredpublic UserService(MessageService messageService) {this.messageService = messageService;}public void notifyUser(String message) {messageService.sendMessage(message);}
}

在該代碼中,類UserService依賴于MessageService,通過構造函數注入的方式,spring會自動將EmailService的實例注入到UserService中。

setter方法注入

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;// 定義一個服務接口
interface PaymentService {void processPayment(double amount);
}// 實現服務接口
@Component
class CreditCardPaymentService implements PaymentService {@Overridepublic void processPayment(double amount) {System.out.println("Processing credit card payment: " + amount);}
}// 使用 @Autowired 進行 Setter 方法注入
@Component
class OrderService {private PaymentService paymentService;@Autowiredpublic void setPaymentService(PaymentService paymentService) {this.paymentService = paymentService;}public void placeOrder(double amount) {paymentService.processPayment(amount);}
}

這里的OrderService通過setter方法注入了PaymentService實例。

字段注入?

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;// 定義一個服務接口
interface LoggingService {void log(String message);
}// 實現服務接口
@Component
class ConsoleLoggingService implements LoggingService {@Overridepublic void log(String message) {System.out.println("Logging to console: " + message);}
}// 使用 @Autowired 進行字段注入
@Component
class ProductService {@Autowiredprivate LoggingService loggingService;public void addProduct(String productName) {loggingService.log("Adding product: " + productName);}
}

?ProductService類中的loggingService被注入ConsoleLoggingService的實例,但是這里有一點要注意,萬一接口有多個實現類呢,那這樣就會報錯,在識別時ioc容器會先先按照類型進行篩選,如果有多個相同類型的,然后用變量名作為bean的id繼續篩選。

3.其他注入數據的注解

使用注入數據注解的效果跟在xml配置文件中的bean標簽中寫一個標簽的作用是一樣的.

@Qualifier:它可以在按照類中注入的基礎之上再按照名稱注入,但是它給類成員注入時不能單獨使用,但是在給方法參數注入式可以。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;// 定義一個接口
interface Animal {void sound();
}// 實現接口
@Component("dog")
class Dog implements Animal {@Overridepublic void sound() {System.out.println("Woof!");}
}@Component("cat")
class Cat implements Animal {@Overridepublic void sound() {System.out.println("Meow!");}
}// 使用 @Autowired 和 @Qualifier 注入指定的 Bean
@Component
class AnimalService {private final Animal animal;@Autowired@Qualifier("dog")public AnimalService(Animal animal) {this.animal = animal;}public void makeSound() {animal.sound();}
}

將@Autowired和@Qualifier組合在一起,spring會根據類型和@Qualifier指定的名稱從ioc容器中查找對應的bean并注入到AnimalService中。

@resource

它與@Autowired的注入策略相反,它是先看bean的id來篩選,因為它后面可以加(name=“”),再來看類型。

import javax.annotation.Resource;
import org.springframework.stereotype.Component;// 定義一個接口
interface Printer {void print();
}// 實現接口,并使用 @Component 指定 Bean 的名稱為 "colorPrinter"
@Component("colorPrinter")
class ColorPrinter implements Printer {@Overridepublic void print() {System.out.println("Printing in color...");}
}// 使用 @Resource 按名稱注入
@Component
class PrintingService {@Resource(name = "colorPrinter")private Printer printer;public void doPrinting() {printer.print();}
}

這里的@Resource直接指明了bean的id為colorPrinter,spring直接在ioc容器中尋找對應的bean,再將其注入到printer字段中。

@Value

用于注入基本數據類型和String類型,因為前面提到的那些只能注入引用數據類型。可以用在字段、構造函數參數或者方法參數上,用于注入值。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class MyComponent {@Value("Hello, Spring!")private String message;@Value("123")private int number;public String getMessage() {return message;}public int getNumber() {return number;}
}

通過該注解,可以很方便的將各種外部值注入到spring管理的bean中。

4.改變作用域范圍的注解

@Scope

類似于xml文件中的scope屬性,它是用來注解一個類的

分別是

@Scope(value="singleton")單例bean

@Scope(value="prototype")多例bean

@Service("accountService")
@Scope(value = "prototype")
public class AccountServiceImpl implements AccountService {@Resource(name = "accountDao1")AccountDao accountDao1;public void addAccount() {accountDao1.addAccount();}
}public class TestAccount {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");AccountService accountService1 = (AccountService) context.getBean("accountService");AccountService accountService2 = (AccountService) context.getBean("accountService");System.out.println(accountService1==accountService2);}
}

根據注解顯示創建的是多例bean,所以輸出為false。、

5.生命周期相關的注解

使用與生命周期相關的注解的作用跟在bean標簽中使用init-method和destroy-method的作用是一樣 的。

@PreDestroy 作用:用于指定銷毀方法。

@PostConstruct 作用:用于指定初始化方法。

代碼就不寫了,沒啥寫的,無非就是在相應的方法上加上相應的注解。

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

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

相關文章

RV1126+FFMPEG多路碼流監控項目

一.項目介紹&#xff1a; 本項目采用的是易百納RV1126開發板和CMOS攝像頭&#xff0c;使用的推流框架是FFMPEG開源項目。這個項目的工作流程如下(如上圖)&#xff1a;通過采集攝像頭的VI模塊&#xff0c;再通過硬件編碼VENC模塊進行H264/H265的編碼壓縮&#xff0c;并把壓縮后的…

13.IIC-EEPROM(AT24C02)

1.為什么需要EEPROM? 在單片機開發中&#xff0c;斷電數據保存是常見的需求。例如&#xff0c;智能家居設備的用戶設置、電子秤的校準參數等都需要在斷電后仍能保留。AT24C02作為一款IIC接口的EEPROM芯片&#xff0c;具備以下優勢&#xff1a; 非易失性存儲&#xff1a;斷電后…

ubuntu22.04安裝P104-100一些經驗(非教程)

一、版本&#xff1a; 系統&#xff1a;ubuntu-22.04.5-desktop-amd64.iso Nvidia 驅動&#xff1a;NVIDIA-Linux-x86_64-570.124.04.run。官網下載即可 二、經驗 1、通用教程? 直接關鍵詞搜“ubuntu p104”會有一些教程&#xff0c;比如禁用nouveau等 安裝參考&#xff1a…

TCP7680端口是什么服務

WAF上看到有好多tcp7680端口的訪問信息 于是上網搜索了一下&#xff0c;確認TCP7680端口是Windows系統更新“傳遞優化”功能的服務端口&#xff0c;個人理解應該是Windows利用這個TCP7680端口&#xff0c;直接從內網已經具備更新包的主機上共享下載該升級包&#xff0c;無需從微…

OSI七大模型 --- 發送郵件

我想通過電子郵件發送一張照片給我的朋友。從我開始寫郵件到發送成功&#xff0c;按照這個順序講一下我都經歷了OSI模型的哪一層&#xff0c;對應的層使用了什么樣的協議&#xff1f; 完整流程示例&#xff08;補充物理層細節&#xff09; 假設你通過Wi-Fi發送郵件&#xff1a…

LINUX網絡基礎 [一] - 初識網絡,理解網絡協議

目錄 前言 一. 計算機網絡背景 1.1 發展歷程 1.1.1 獨立模式 1.1.2 網絡互聯 1.1.3 局域網LAN 1.1.4 廣域網WAN 1.2 總結 二. "協議" 2.1 什么是協議 2.2 網絡協議的理解 2.3 網絡協議的分層結構 三. OSI七層模型&#xff08;理論標準&#xff09; …

【LLms】關鍵詞提取

1. 停用詞 在文本處理和信息檢索領域&#xff0c;停用詞&#xff08;Stop Words&#xff09;是指在文本中出現頻率較高&#xff0c;但通常不包含實際語義信息或對語義理解貢獻較小的詞匯。這些詞匯通常是一些常見的功能詞&#xff0c;如冠詞、介詞、連詞、代詞、感嘆詞、助動詞…

1998-2022年各地級市三次產業占比/地級市國內生產總值構成/地級市第一產業占比、第二產業占比、第三產業占比數據(全市)

1998-2022年各地級市三次產業占比/地級市國內生產總值構成/地級市第一產業占比、第二產業占比、第三產業占比數據&#xff08;全市&#xff09; 1、時間&#xff1a;1998-2022年 2、指標&#xff1a;第一產業占比、第二產業占比、第三產業占比 3、來源&#xff1a;城市統計年…

基于STM32的簡易出租車計費設計(Proteus仿真+程序+設計報告+原理圖PCB+講解視頻)

這里寫目錄標題 1.主要功能資料下載鏈接&#xff1a;2.仿真3. 程序4. 原理圖PCB5. 實物圖6. 設計報告7. 下載鏈接 基于STM32的簡易出租車計費設計(Proteus仿真程序設計報告原理圖PCB講解視頻&#xff09; 仿真圖proteus 8.9 程序編譯器&#xff1a;keil 5 編程語言&#xff1…

HAL庫啟動ADC的三個函數的區別

HAL_ADC_Start 應該是啟動ADC轉換的最基本函數。只是啟動一次轉換&#xff0c;然后需要用戶自己去查詢轉換是否完成&#xff0c;或者可能只是單次轉換。比如&#xff0c;當調用這個函數后&#xff0c;ADC開始轉換&#xff0c;但程序需要不斷檢查某個標志位來看轉換是否完成&am…

EXIT原理和使用

要用到的控制器NVIC(中斷總控制器)、EXIT&#xff08;外部中斷控制器&#xff09; (EXIT是NVIC是下屬) GPIO外部中斷簡圖 EXIT的基本概念 EXIT主要特性 EXTI工作原理框圖&#xff08;從輸入線開始看&#xff09; 6個寄存器 EXTI和IO的映射關系 AFIO簡介 EXTI與IO對應關系 如…

經典核密度估計(Kernel Density Estimation):從直覺到數學

經典核密度估計&#xff08;Kernel Density Estimation&#xff09;&#xff1a;從直覺到數學 作為一名在大模型時代進入深度學習領域的研究者&#xff0c;你可能對 Transformer、擴散模型等現代技術駕輕就熟。然而&#xff0c;在閱讀一些生成模型的文獻&#xff08;如 Explic…

Halcon 算子 一維碼檢測識別、項目案例

首先我們要明白碼的識別思路 把窗口全部關閉讀取新的圖片圖像預處理創建條碼模型設置模型參數搜索模型獲取條碼結果顯示條碼結果 圖像預處理和條碼增強 對比度太低&#xff1a; scale_image&#xff08;或使用外部程序scale_image_range&#xff09;,增強圖像的對比度圖像模糊…

vue-cli3+vue2+elementUI+avue升級到vite+vue3+elementPlus+avue總結

上一個新公司接手了一個vue-cli3vue2vue-router3.0elementUI2.15avue2.6的后臺管理項目&#xff0c;因為vue2在2023年底已經不更新維護了&#xff0c;elementUI也只支持到vue2&#xff0c;然后總結了一下vue3的優勢&#xff0c;最后批準升級成為了vitevue3vue-router4.5element…

SpringBoot實戰(三十五)微服務集成OAuth2.0(UAA)

目錄 一、知識回顧1.1 什么是 OAuth2 協議&#xff1f;1.2 OAuth2 的4個角色1.3 OAuth2 的3種令牌1.4 OAuth2 的5種認證方式1.5 OAuth2 內置接口地址 二、UAA介紹2.1 概述2.2 UAA的主要功能2.3 UAA 的應用場景 三、微服務集成3.1 集成示例介紹3.2 集成測試 一、知識回顧 在進行…

紅果短劇安卓+IOS雙端源碼,專業短劇開發公司

給大家拆解一下紅果短劇/河馬短劇&#xff0c;這種看光解鎖視頻&#xff0c;可以掙金幣的短劇APP。給大家分享一個相似的短劇APP源碼&#xff0c;這個系統已接入穿山甲廣告、百度廣告、快手廣告、騰訊廣告等&#xff0c;類似紅果短劇的玩法&#xff0c;可以看劇賺錢&#xff0c…

從0開始的操作系統手搓教程23:構建輸入子系統——實現鍵盤驅動1——熱身驅動

目錄 所以&#xff0c;鍵盤是如何工作的 說一說我們的8042 輸出緩沖區寄存器 狀態寄存器 控制寄存器 動手&#xff01; 注冊中斷 簡單整個鍵盤驅動 Reference ScanCode Table 我們下一步就是準備進一步完善我們系統的交互性。基于這個&#xff0c;我們想到的第一個可以…

百度SEO關鍵詞布局從堆砌到場景化的轉型指南

百度SEO關鍵詞布局&#xff1a;從“堆砌”到“場景化”的轉型指南 引言 在搜索引擎優化&#xff08;SEO&#xff09;領域&#xff0c;關鍵詞布局一直是核心策略之一。然而&#xff0c;隨著搜索引擎算法的不斷升級和用戶需求的多樣化&#xff0c;傳統的“關鍵詞堆砌”策略已經…

Python ? Unix時間戳轉日期或日期轉時間戳工具分享

設計一款Unix時間戳和日期轉換工具&#xff0c;其代碼如下&#xff1a; from datetime import datetimeclass Change_Date_Time(object):def __init__(self, date_strNone, date_numNone):self.date_str date_strself.date_num date_num# 轉時間戳def datetime2timestamp(s…

【目標檢測】【NeuralPS 2023】Gold-YOLO:通過收集與分發機制實現的高效目標檢測器

Gold-YOLO&#xff1a; Efficient Object Detector via Gather-and-Distribute Mechanism Gold-YOLO&#xff1a;通過收集與分發機制實現的高效目標檢測器 0.論文摘要 在過去的幾年中&#xff0c;YOLO系列模型已成為實時目標檢測領域的領先方法。許多研究通過修改架構、增強數…