【JavaEE進階】 Spring使用注解存儲對象

文章目錄

  • 🌴序言
  • 🍀前置?作:配置掃描路徑
  • 🎄添加注解存儲 Bean 對象
  • 🌳類注解
    • 🚩為什么要這么多類注解
    • 🚩注解之間的聯系
  • 🎋?法注解 @Bean
    • 🚩?法注解需要配合類注解使?
  • ?總結

🌴序言

在博主前面所寫的《【JavaEE進階】 Spring 的創建和使?》中我們已經可以實現基本的 Spring 讀取和存儲對象的操作了,但在操作的過程中我們發現讀取和存儲對象并沒有想象中的那么“簡單”,所以接下來我們要學習更加簡單的操作 Bean 對象的?法。

在 Spring 中想要更簡單的存儲和讀取對象的核?是使?注解

之前我們存儲 Bean 時,需要在 spring-config 中添加?? bean 注冊內容才?,如下圖所示:
在這里插入圖片描述

?現在我們只需要?個注解就可以替代之前要寫??配置的尷尬了,不過在開始存儲對象之前,我們先要來點準備?作

🍀前置?作:配置掃描路徑

注意:

  • 想要將對象成功的存儲到 Spring 中,我們需要配置?下存儲對象的掃描包路徑,只有被配置的包下的所有類,添加了注解才能被正確的識別并保存到Spring 中

在 spring-config.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:content="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"><content:component-scan base-package="org.example"></content:component-scan>
</beans>

其中標紅的??為注冊掃描的包,如下圖所示

在這里插入圖片描述
注意

  • 如果不是在配置的掃描包下的類對象,即使添加了注解,也是不能被存儲到 Spring 中的

🎄添加注解存儲 Bean 對象

想要將對象存儲在 Spring 中,有兩種注解類型可以實現:

  1. 類注解:@Controller、@Service、@Repository、@Component、@Configuration。

  2. ?法注解:@Bean。

🌳類注解

由于這五種類注解的使用方式基本相同,所以博主在這里只演示一種即可

@Controller // 將對象存儲到 Spring 中
public class UserController {public void sayHi(String name) {System.out.println("Hi," + name);}
}

我們只需要在存儲的對象上面添加相應的注解就好,不同的注解有著不同的含義,不過基本使用相同,后面會進行詳細介紹

使用注意事項:

  • 由于這是類存儲,并不能存儲一個類的多個對象

那么如何進行獲取呢?

后面會講更加簡單的獲取,這里我們還是使用《【JavaEE進階】 Spring 的創建和使?》中所講的獲取方式

public class Application {public static void main(String[] args) {// 1.得到 spring 上下?ApplicationContext context =new ClassPathXmlApplicationContext("spring-config.xml");// 2.得到 beanUserController userController = context.getBean("userController",UserController.class);// 3.調? bean ?法userController.sayHi("遇事問春風乄");}
}

讀取時的注意事項:

  • 由于時類注解,所以我們在獲取對象時,我們所填的 id 處的參數有如下約定
    • 當首字母和第二字母沒有全部大寫時采用:類名首字母小寫作為id
    • 當首字母和第二字母全部大寫時采用:類名首字母和第二個字母全部小寫

🚩為什么要這么多類注解

既然功能是?樣的,為什么需要這么多的類注解呢?

這和為什么每個省/市都有??的?牌號是?樣的??如陜?的?牌號就是:陜X:XXXXXX,北京的?牌號:京X:XXXXXX,?樣。甚??個省不同的縣區也是不同的,?如?安就是,陜A:XXXXX,咸陽:陜B:XXXXXX,寶雞,陜C:XXXXXX,?樣。這樣做的好處除了可以節約號碼之外,更重要的作?是可以直觀的標識?輛?的歸屬地。

那么為什么需要怎么多的類注解也是相同的原因,就是讓程序員看到類注解之后,就能直接了解當前類的?途,?如:

五大類注解用途(重點) :

  1. @Controller (控制器) :歸屬于業務邏輯層,用來控制用戶的行為,它用來檢查用戶參數的有效性(比如檢查用戶輸入的用戶名是否有效)。

  2. @Service (服務) :歸屬于服務層,調用持久化類實現相應的功能。[不直接和數據庫交互的,它類似于控制中心]

  3. @Repository (倉庫) :歸屬于持久層,是直接和數據庫進行交互的。通常每一個表都會對應一個@Repos i tory。

  4. @Configuration (配置) :歸屬于配置層,是用來配置當前項目的一些信息。

  5. @Component (組件) :歸屬于公共工具類,提供某些公共方法。

在這里插入圖片描述

🚩注解之間的聯系

查看 @Controller / @Service / @Repository / @Configuration 等注解的源碼發現:
在這里插入圖片描述

其實這些注解??都有?個注解 @Component,說明它們本身就是屬于 @Component 的“?類”

🎋?法注解 @Bean

類注解是添加到某個類上的,??法注解是放到某個?法上的,如以下代碼的實現:

首先我們準備Student類如下:

public class Student {private String name;private int old;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", old=" + old +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getOld() {return old;}public void setOld(int old) {this.old = old;}
}

然后再創建Students類進行獲取每一個Student的對象

package org.example;import org.springframework.context.annotation.Bean;public class Students {@Beanpublic Student student() {Student stu = new Student();stu.setName("遇事問春風乄");stu.setOld(21);return stu;}
}

然?,當我們寫完以上代碼,嘗試獲取 bean 對象中的 user1 時卻發現,根本獲取不到

package org.example;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");Student student = context.getBean("student",Student.class);student.toString();}
}

以上程序的執?結果如下:

在這里插入圖片描述

🚩?法注解需要配合類注解使?

在 Spring 框架的設計中,?法注解 @Bean 要配合類注解才能將對象正常的存儲到 Spring 容器中(在哪一類中使用了注解方法,該類就得加上類注解),如下代碼所示:

package org.example;import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;@Controller
public class Students {@Beanpublic Student student() {Student stu = new Student();stu.setName("遇事問春風乄");stu.setOld(21);return stu;}
}

注意事項:

  • 添加類注解的類與添加注解方法的返回類一定要不一樣
    在這里插入圖片描述

否則就會出現以下問題:

在這里插入圖片描述
除此之外,在使用時我們還得知道

我們再進行獲取的時候的 id 屬性默認為你的方法名

我們也可以對通過設置 name 屬性給 Bean 對象進?重命名操作。而且可以設置多個,且都能獲取到

  • 注意:一但進行重命名操作后,就不能使用默認方法名了

使用代碼如下:

@Controller
public class Students {@Bean(name = {"st1","st2","st3"})public Student student() {Student stu = new Student();stu.setName("遇事問春風乄");stu.setOld(21);return stu;}
}
public class Main {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");Student student1 = context.getBean("st1",Student.class);System.out.println(student1.toString());Student student2 = context.getBean("st2",Student.class);System.out.println(student2.toString());Student student3 = context.getBean("st3",Student.class);System.out.println(student3.toString());}
}

在這里插入圖片描述

但我們再次使用默認方法名時就會報錯:

在這里插入圖片描述

另外我們在書寫時 name={} 可以省略,如下代碼所示

@Controller
public class Students {@Bean({"st1","st2","st3"})public Student student() {Student stu = new Student();stu.setName("遇事問春風乄");stu.setOld(21);return stu;}
}

?總結

關于《【JavaEE進階】 Spring使用注解存儲對象》就講解到這兒,對于取對象,Spring也有更簡單的寫法,后續博主會給大家一一介紹!感謝大家的支持,歡迎各位留言交流以及批評指正,如果文章對您有幫助或者覺得作者寫的還不錯可以點一下關注,點贊,收藏支持一下!

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

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

相關文章

探索AIGC未來:CPU源碼優化、多GPU編程與中國算力瓶頸與發展

★人工智能&#xff1b;大數據技術;AIGC;Turbo;DALLE 3;多模態大模型&#xff1b;MLLM&#xff1b;LLM&#xff1b;Agent&#xff1b;Llama2&#xff1b;國產GPU芯片&#xff1b;GPU;CPU&#xff1b;高性能計算機&#xff1b;邊緣計算&#xff1b;大模型顯存占用&#xff1b;5G…

如何夸張孩子

你剛才很努力啊&#xff01;——表揚努力盡管艱難&#xff0c;但你一直沒有放棄——表揚耐心和堅持你做事情的態度非常不錯——表揚態度你在_____上進步了很多&#xff01;——表揚細節這個方法真有新意&#xff01;——表揚創意你和小伙伴合作得真棒&#xff01;——表揚合作精…

中國特供閹割版 RTX 4090 曝光,老黃這操作絕了

到了現在大伙兒應該發現&#xff1a;國內禁售 NVIDIA RTX 4090 顯卡這事兒基本實錘了。 實際上根據老美規定&#xff0c;從上個月 17 號開始&#xff0c;凡是公司主體在中國的顯卡品牌&#xff0c;就已經不能生產和銷售 RTX 4090。 以后廠商想要賣 4090 只能以整機形式出售&am…

藝術畫廊展廳網站制作的效果如何

藝術展廳往往有很多人前往&#xff0c;在主要城市有不少畫廊&#xff0c;對經營者來說&#xff0c;不同于銷售行業&#xff0c;其更多的是打造品牌吸引用戶前來或合作等形式&#xff0c;而由于行業特殊性&#xff0c;需要準屬性用戶才會前往。 因此在品牌打造及信息承載宣傳方…

防止企業敏感數據泄露

敏感數據泄露是指意外或故意泄露關鍵信息&#xff0c;例如個人身份信息&#xff08;PII&#xff09;、支付卡信息&#xff08;PCI&#xff09;、受保護的電子健康信息&#xff08;ePHI&#xff09;和知識產權&#xff08;IP&#xff09;&#xff0c;數據保護措施不足的組織會在…

10-Hadoop組件開發技術

單選題 題目1&#xff1a;下列選項描述錯誤的是&#xff1f; 選項: A Hadoop HA即集群中包含Secondary NameNode作為備份節點存在。 B ResourceManager負責的是整個Yarn集群資源的監控、分配和管理工作 C NodeManager負責定時的向ResourceManager匯報所在節點的資源使用情況…

Spark---DataFrame存儲、Spark UDF函數、UDAF函數

四、DataFrame存儲Spark UDF函數 1、儲存DataFrame 1&#xff09;、將DataFrame存儲為parquet文件 2&#xff09;、將DataFrame存儲到JDBC數據庫 3&#xff09;、將DataFrame存儲到Hive表 2、UDF&#xff1a;用戶自定義函數 可以自定義類實現UDFX接口 java&#xff1a; …

案例062:基于微信小程序的健身房私教預約系統

文末獲取源碼 開發語言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 數據庫&#xff1a;mysql 5.7 開發軟件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序開發軟件&#xff1a;HBuilder X 小程序…

模塊式雨水調蓄池施工簡單,無需大型機械,可實現當天開挖當天回填

模塊式雨水調蓄池的施工過程非常簡單&#xff0c;無需大型機械和繁瑣的施工工藝。在施工過程中&#xff0c;只需要進行簡單的開挖和回填即可&#xff0c;而且可以在當天完成。這種施工方式不僅節省了施工時間和成本&#xff0c;還可以避免因大型機械和繁瑣工藝引起的安全隱患。…

MIT_線性代數筆記: 復習一

目錄 問題一問題二問題三問題四 本講為考前復習課&#xff0c;考試范圍就是 Axb 這個單元&#xff0c;重點是長方形矩陣&#xff0c;與此相關的概念包括零空間、左零空間、秩、向量空間、子空間&#xff0c;特別是四個基本子空間。當矩陣為可逆的方陣時&#xff0c;很多性質是一…

二叉樹的層次遍歷

102. 二叉樹的層序遍歷 - 力扣&#xff08;LeetCode&#xff09; 題目描述 給你二叉樹的根節點 root &#xff0c;返回其節點值的 層序遍歷 。 &#xff08;即逐層地&#xff0c;從左到右訪問所有節點&#xff09;。 樣例輸入 示例 1&#xff1a; 輸入&#xff1a;root [3…

php研究課題

對于PHP這門語言而言&#xff0c;可以研究的課題有很多&#xff0c;以下是可能的課題方向和對應的內容&#xff1a; PHP語言基礎研究 PHP語言特性和基本語法PHP的數據類型、變量、運算符和表達式PHP的流程控制語句PHP的函數和引用PHP的面向對象編程和設計模式 PHP與Web開發 …

harmony開發之Text組件的使用

TextInput、TextArea是輸入框組件&#xff0c;通常用于響應用戶的輸入操作&#xff0c;比如評論區的輸入、聊天框的輸入、表格的輸入等&#xff0c;也可以結合其它組件構建功能頁面&#xff0c;例如登錄注冊頁面。 圖片來源黑馬程序員 Text組件的使用&#xff1a; 文本顯示組…

flutter學習-day1-環境搭建和啟動第一個項目

&#x1f4da; 目錄 SDK 下載配置環境變量安裝 flutter搭建 Android 環境SDK 和依賴升級IDE 配置與使用 Android Studio 配置與使用VS Code 配置與使用 真機調試 本文學習和引用自《Flutter實戰第二版》&#xff1a;作者&#xff1a;杜文 1. SDK下載 前置需要操作系統 window …

Spring Cloud + Vue前后端分離-第4章 使用Vue cli 4搭建管理控臺

Spring Cloud Vue前后端分離-第4章 使用Vue cli 4搭建管理控臺 4-1 使用vue cli創建admin項目 Vue 簡介 Vue作者尤雨溪在google工作時&#xff0c;最早只想研究angular的數據綁定功能&#xff0c;后面覺得這個小功能很好用&#xff0c;有前景&#xff0c;就再擴展&#xff…

[MySQL] MySQL復合查詢(多表查詢、子查詢)

前面我們學習了MySQL簡單的單表查詢。但是我們發現&#xff0c;在很多情況下單表查詢并不能很好的滿足我們的查詢需求。本篇文章會重點講解MySQL中的多表查詢、子查詢和一些復雜查詢。希望本篇文章會對你有所幫助。 文章目錄 一、基本查詢回顧 二、多表查詢 2、1 笛卡爾積 2、2…

機器學習筆記 - 基于深度學習計算視頻中演員的出鏡時間

一、基本步驟 這里是使用動畫片貓和老鼠進行計算,基本流程如下: 1、導入并讀取視頻,從中提取幀,并將其另存為圖像 2、標記一些圖像以訓練模型(別擔心,我已經為你做好了) 3、根據訓練數據構建我們的模型 4、對剩余圖像進行預測 5、計算湯姆和杰瑞的屏幕時間 二、基礎環境…

教師未來發展前景如何

作為一名教師&#xff0c;我對未來發展的前景也感到有些迷茫。 不過教育行業仍然是一個穩定的職業&#xff0c;但是隨著社會的變化和科技的發展&#xff0c;傳統的教學模式已經逐漸被在線教育、人工智能等新型教學方式所取代。這使得教師的角色和職責也在發生變化&#xff0c;需…

matplot繪圖時圖像太大報錯但能保存

matplot繪圖時&#xff0c;圖像太大&#xff0c;可能在jupyter里面報錯&#xff0c;但是圖像可以保存。 報錯&#xff1a;Image size of 12237479x675 pixels is too large. It must be less than 2^16 in each direction. 在這里插入圖片描述

Linux中用bash寫腳本

本章主要介紹如何使用bash 了解通配符了解變量了解返回值和數值運算判斷語句 grep的用法是“grep 關鍵字 file”&#xff0c;意思是從file中過濾出含有關鍵字的行 例如&#xff0c;grep root /var/log/messages&#xff0c;意思是從/var/log/messages 中過濾出含有root 的行…