Spring基于注解開發

@Component的使用

基本Bean注解,主要是使用注解的方式替代原有的xml的<bean>標簽及其標簽屬性的配置,使用@Component注解替代<bean>標簽中的id以及class屬性,而對于是否延遲加載或是Bean的作用域,則是其他注解

xml配置

注解

描述

<bean scope="">

@Scope

在類上或使用了@Bean標注的方法上,標注Bean的作用范圍,取值為singleton或prototype

<bean lazy-init="">

@Lazy

在類上或使用了@Bean標注的方法上,標注Bean是否延遲加載,取值為true或false

<bean init-method="">

@PostConstruct

在方法上使用,標注Bean的實例化后執行的方法

<bean destroy-method="">

@PreDestroy

在方法上使用,標注Bean的銷毀前執行方法

下面就是基于注解的測試案例

首先需要開啟自動掃描注解功能,這個功能還是需要在XML文件配置的

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!--開啟自動掃描--><context:component-scan base-package="com.zmt"/>
</beans>
@Component("userService")
@Lazy(true)//開啟懶加載
@Scope("singleton")//單例模式
public class UserServiceImpl implements UserService {public UserServiceImpl() {System.out.println("UserService被構造");}@PostConstructprivate void init(){System.out.println("執行init方法");}@PreDestroyprivate void destroy(){System.out.println("執行銷毀方法");}
}

測試代碼?

public class Test {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");Object bean = context.getBean("userService");System.out.println(bean);context.close();}
}

執行結果如下

UserService被構造
執行init方法
com.zmt.service.impl.UserServiceImpl@45afc369
執行銷毀方法

為了方便區分不同的業務層,@Component注解又衍生了三個注解

  • @Service:Component的派生注解,多添加在Service的實現類上
  • @Controller:Component的派生注解,多添加在Controller類上
  • @Repository:Component的派生注解,多添加在Dao實現類上

依賴注解的使用

Bean的依賴注入的注解,主要是替代xml中的<property>標簽中的注入操作

<bean id="" class=""><property name="" ref=""/><property name="" value=""/>
</bean>

Spring提供的注解如下,用于Bean內部進行屬性注入的

屬性注入注解

描述

@Value

使用在字段或方法上,用于注入普通數據

@Autowired

使用在字段或方法上,用于根據類型(byType)注入引用數據

@Qualifier

使用在字段或方法上,結合@Autowired使用,根據名稱注入

@Resource

使用在字段或方法上,根據類型或名稱進行注入

這些注解的工作原理實際上是通過暴力反射然后賦值,因此不需要set方法,但是添加了set方法在set方法上添加注解也可以使用。

下面是簡單的使用案例

@Value該注解可以對普通數據類型進行賦值,一種是直接指定需要注入的值,一種是通過占位符讀取需要注入的值信息

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!--開啟自動掃描--><context:component-scan base-package="com.zmt"/><!--將test.txt文件加載到Spring中,供賦值使用--><context:property-placeholder location="classpath:test.txt"/>
</beans>

@Component("userService")
public class UserServiceImpl implements UserService {
//    @Value("zhangsan")@Value("${name}")private String name;@Overridepublic void show() {System.out.println(name);}
}

以上兩種都可以將值賦值給name變量,但通常我們使用用后者。


@Autowired的使用默認是根據類型注入,但如果相同類型存在多個,則根據名稱進行注入,但是如果不存在屬性變量名的Bean對象,那么注入失敗

@Component("userService")
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;@Autowiredpublic void setUserDao(UserDao userDao) {this.userDao = userDao;}//以上兩種寫一個即可@Overridepublic void show() {}
}

@Qualifier需要搭配@Autowired注解使用,特定指定在多個相同類型的Bean對象時,注入哪個名稱的bean對象

@Component("userService")
public class UserServiceImpl implements UserService {@Autowired@Qualifier("userDao")private UserDao userDao2;@Overridepublic void show() {}
}

這里即使屬性變量名為userDao2但是實際上注入的還是名為userDao的bean對象。


@Resource既可以類型注入也可以名稱注入

@Component("userService")
public class UserServiceImpl implements UserService {@Resource(name = "userDao")private UserDao userDao2;//實際上注入的是名稱為userDao的bean對象@Overridepublic void show() {}
}

@Autowired的擴展使用,實際上該注解不僅僅可以添加在set方法上,可以添加在任何方法上,下面是一個測試案例

@Component("userService")
public class UserServiceImpl implements UserService {@Overridepublic void show() {}@Autowiredpublic void xxx(UserDao userDao){System.out.println("xxx:"+userDao);}@Autowiredpublic void yyy(List<UserDao> userDaoList){System.out.println("yyy:"+userDaoList);}
}

運行結果如下

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

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

相關文章

IntelliJ IDEA 的 HTTP 客戶端的高級用法

本心、輸入輸出、結果 文章目錄 IntelliJ IDEA 的 HTTP 客戶端的高級用法前言HTTP 請求對 gRPC 請求的支持對 GraphQL 和 WebSocket 請求的支持環境文件OpenAPI 補全用于持續集成的 HTTP 客戶端 CLI花有重開日,人無再少年實踐是檢驗真理的唯一標準IntelliJ IDEA 的 HTTP 客戶端…

keepalived 高可用主備

實驗采用兩臺centos9 nginxkeepalived 一共兩臺&#xff0c;進行主備切換 主服務器 192.168.100.105 備用 192.168.100.106 虛擬ip 192.168.100.200 安裝 dnf install vim wget curl vim net-tools nginx keepalivedUndefined nginx 配置需要更改為虛擬ip server {listen …

四招打造完美分層自動化測試框架,讓測試更高效!

寫在前面 我們剛開始做自動化測試&#xff0c;可能寫的代碼都是基于原生寫的代碼&#xff0c;看起來特別不美觀&#xff0c;而且感覺特別生硬。 來看下面一段代碼&#xff1a; 具體表現如下&#xff1a; driver對象在測試類中顯示 定位元素的value值在測試類中顯示 定位元素…

Navicat 技術指引 | 適用于 GaussDB 分布式的用戶/權限功能

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式數據庫。GaussDB 分布式模式更適合對系統可用性和數據處理能力要求較高的場景。Navicat 工具不僅提供可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結…

干貨:軟文推廣中的關鍵詞類別有哪些?

軟文推廣如果想要增加文案曝光率&#xff0c;seo是其主要的傳播方式之一&#xff0c;因而好的關鍵詞十分重要&#xff0c;這里的關鍵詞指得是針對搜索引擎而言&#xff0c;由用戶輸入搜索引擎框中的提示性文字&#xff0c;只要關鍵詞設置得好&#xff0c;軟文就能通過搜索引擎精…

因為 postman環境變量全局變量設置好兄弟被公司優化了!

postman環境變量、全局變量設置 在公司中&#xff0c;一般會存在開發環境、測試環境、線上環境等&#xff0c;如果需要在不 同的環境下切換做接口測試&#xff0c;顯然我們需要把所有接口的域名進行修改&#xff0c;如果接 口測試用例較多&#xff0c;那么修改會非常費力&…

springboot(ssm大學生志愿者管理系統 志愿者管理平臺 Java系統

springboot(ssm大學生志愿者管理系統 志愿者管理平臺 Java系統 開發語言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服務器&#xff1a;tomcat 數據庫&#xff1a;mysql 5.7&#xff08;或8.0&#xff…

Python與ArcGIS系列(十五)根據距離抓取字段

目錄 0 簡述1 實例需求2 arcpy開發腳本0 簡述 在處理gis數據的時候,會遇到這種需求:將一個圖層與另一個圖層中相近的要素進行字段賦值。本篇將介紹如何利用arcpy及arcgis的工具箱實現這個功能。 1 實例需求 為了介紹這個功能的實現,我們需要有一個特定的功能需求。在這里選…

視頻號小店怎么選品?選品技巧及思維,教程如下!

我是電商珠珠 開通視頻號小店后&#xff0c;除了定類目之外&#xff0c;最終的就是選品了。 很多人不知道怎么選品&#xff0c;特別是新手小白&#xff0c;做起來比較難一些。店鋪也會很少有流量進入&#xff0c;沒有流量曝光的話&#xff0c;店鋪的銷量就更不用提了。 我做…

L1-019:誰先倒

題目描述 劃拳是古老中國酒文化的一個有趣的組成部分。酒桌上兩人劃拳的方法為&#xff1a;每人口中喊出一個數字&#xff0c;同時用手比劃出一個數字。如果誰比劃出的數字正好等于兩人喊出的數字之和&#xff0c;誰就輸了&#xff0c;輸家罰一杯酒。兩人同贏或兩人同輸則繼續下…

【Android】Java NIO(New I/O)的`Selector`類來實現非阻塞的Socket監聽

如果你不想使用循環來監聽客戶端的連接和數據&#xff0c;你可以使用Java NIO&#xff08;New I/O&#xff09;的Selector類來實現非阻塞的Socket監聽。Selector類提供了一種選擇一組已經就緒的通道的機制&#xff0c;這樣你就不需要使用循環來等待連接和數據。 以下是使用Sel…

Axure網頁端高復用組件庫, 下拉菜單文件上傳穿梭框日期城市選擇器

作品說明 組件數量&#xff1a;共 11 套 兼容軟件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 應用領域&#xff1a;web端原型設計、桌面端原型設計 作品特色 本作品為「web端組件庫」&#xff0c;高保真高交互 (帶仿真功能效果)&#xff1b;運用了動態面板、中繼…

使用pytorch查看中間層特征矩陣以及卷積核參數

這篇是我對嗶哩嗶哩up主 霹靂吧啦Wz 的視頻的文字版學習筆記 感謝他對知識的分享 1和4是之前講過的alexnet和resnet模型 2是分析中間層特征矩陣的腳本 3是查看卷積核參數的腳本 1設置預處理方法 和圖像訓練的時候用的預處理方法保持一致 2實例化模型 3載入之前的模型參數 4載入…

小白理解GPT的“微調“(fine-tuning)

對于GPT-3.5&#xff0c;我們實際上并不能在OpenAI的服務器上直接訓練它。OpenAI的模型通常是預訓練好的&#xff0c;也就是說&#xff0c;它們已經在大量的語料上進行過訓練&#xff0c;學習到了語言的基本規則和模式。 然而&#xff0c;OpenAI提供了一種叫做"微調"…

Pandas操作數據庫

一&#xff1a;Pandas讀取數據庫數據 二&#xff1a;Pandas讀取海量數據 三&#xff1a;Pandas向數據庫存數據 四&#xff1a;Pandas寫入海量數據

理想中的PC端剪切板工具,應該有哪些功能?

在日常工作中&#xff0c;我們經常需要復制和粘貼文本、圖片和鏈接。 首先&#xff0c;這款剪切板功能應該在不使用時不顯示窗口&#xff0c;以避免干擾我們的工作。它應該在后臺靜默記錄剪切板歷史&#xff0c;以便我們可以隨時查看之前的記錄。 其次&#xff0c;當我們需要…

A類中創建posix線程,線程間如何通信

如果你在類A中使用pthread_create創建了線程B&#xff0c;而線程B需要與類A進行通信&#xff0c;你可以考慮以下兩種方法&#xff1a; 使用回調函數&#xff1a; 在創建線程B時&#xff0c;通過參數傳遞一個回調函數&#xff0c;該回調函數可以在線程B中執行&#xff0c;并在完…

上海寶山區12月8日發生一起火災 火勢已撲滅 揭秘AI如何“救援”

在這個冬日的早晨&#xff0c;上海寶山區的居民經歷了一場驚心動魄的火災。幸運的是&#xff0c;火勢很快就被撲滅了。但這起事件不禁讓我們思考&#xff1a;如何更有效地預防和應對這樣的緊急情況&#xff1f; 這時候&#xff0c;就不得不提到北京富維圖像公司的一項創新技術—…

我的隱私計算學習——國密SM2和國密SM4算法

此篇是我筆記目錄里的安全保護技術&#xff08;七&#xff09;&#xff0c;前篇可見&#xff1a; 隱私計算安全保護技術&#xff08;一&#xff09;&#xff1a;我的隱私計算學習——混淆電路-CSDN博客 隱私計算安全保護技術&#xff08;二&#xff09;&#xff1a;我的隱私計…

【JavaWeb】獲取WebServlet注解的對象

import javax.servlet.annotation.WebServlet; public class ReflectAnnotation {public static void main(String[] args) throws Exception{//獲取servlet類的webServlet的注解內容Class<?>welcomeServletClassClass.forName("SubmitScoreServlet");//判斷有…