【Spring篇】Spring注解式開發

本文根據嗶哩嗶哩課程內容結合自己自學所得,用于自己復習,如有錯誤歡迎指正;


我在想用一句話激勵我自己努力學習,卻想不出來什么驚為天人、精妙絕倫的句子,腦子里全是上課老師想說卻沒想起的四個字? “ 唯手熟爾 ”,是啊!不過唯手熟爾!


目錄

Spring注解式開發

自定義注解

自定義注解的使用

通過反射機制讀取類上的注解

需求,給你一個包名,包中有很多對象,然后將該包下實現了@component注解的類存到一個map集合中,其中注解ID為key,實例化后的對象為value值;

Spring聲明Bean注解

Spring注解使用

選擇實例化Bean

負責注入的注解

@value注解

@autowired注解

使用@autowired注解的方式解決注入非簡單類型的數據,默認是根據類型裝配的;注意點有下面兩點:

如何解決上面的問題

@Resource注解

@Resource VS @autowired

spring.xml也變成注解類


Spring注解式開發

首先回顧注解相關知識點,

  1. 什么是注解?

  2. 注解的定義格式?

  3. 注解屬性值的定義?

  4. 如何使用注解?

自定義注解

自定義注解的使用

通過反射機制讀取類上的注解

需求,給你一個包名,包中有很多對象,然后將該包下實現了@component注解的類存到一個map集合中,其中注解ID為key,實例化后的對象為value值;

Spring聲明Bean注解

這里插入一個知識點,其實注解就是元數據,第一次接觸元數據是在JDBC中,所謂元注解就是修飾數據的數據,這里的注解和xml配置信息也是元注解,他們都是為了修飾數據;

在Spring中聲明容器管理的Bean的注解有四個,

  1. @component

  2. @service

  3. @controller

  4. @repository

    其中只有component注解為原始注解,但是為了提高可讀性,又給他起了下面三個別名;源碼如下:

    ?@Target(value = {ElementType.TYPE})//target是為了指定注解能夠出現的地方;@Retention(value = RetentionPolicy.RUNTIME)public @interface Component {String value();}?@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface Controller {@AliasFor(annotation = Component.class)String value() default "";}??@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface Service {@AliasFor(annotation = Component.class)String value() default "";}?@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface Repository {@AliasFor(annotation = Component.class)String value() default "";}

Spring注解使用

使用注解的前期步驟:

  1. 加入aop依賴(引入Spring-context即可,它里面包含了Spring-aop)

  2. 在配置文件中添加context命名空間

    ?<?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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">?</beans>
  3. 在配置文件中指定掃描的包

     <context:component-scan base-package="com.powernode.spring6.bean"/>//如果出現多個包的情況,可以聲明他們的共同父類,或者通過逗號的方式,同時聲明多個包
  4. 在Bean類上使用注解

    ?在Bean類上使用注解的幾個小細節;1,在注解的使用中,如果添加的是value屬性,其中value可以省略,只需要寫對應的值即可;2,如果我們在使用注解時,不指定value屬性的值時,Spring會給我自動創建一個屬性值(采用默認方式),即Bean類的名字首字母小寫

選擇實例化Bean

有時候我們有這樣的需求,將某個包下添加了@component注解的Bean單獨實例化,其他的Bean都不實例化,如何解決;

Spring為我們提供了兩種方式,use-default-filter屬性值為false或者true

?<context:component-scan base-package="com.powernode.spring6.bean3" use-default-filters="false"><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan>

添加use-default-filter屬性,true時表示采用Spring默認規則,實例化被四個注解標注的Bean;

false表示,不在使用默認的實例化規則,全部都不實例化,如果想要實例化某個注解,就需要配置子標簽context:include-filter,并在其中聲明需要實例化的注解;

負責注入的注解

前面說了實例化Bean的注解@component,現在說替代set注入或者構造函數注入的注解;

@value注解

對于簡單類型,都可以使用value注解,但是這種注解目前是硬編碼;耦合度太高,我也不知道后面會咋弄;直接在添加了@component注解的類屬性上添加@value注解;

@Componentpublic class User {@Value(value = "zhangsan")private String name;@Value("20")private int age;}}

這種注入方式不依賴get\set方法,而且@value注解可以放在屬性上、set方法上、構造方法上、或者構造方法的形參上;

@autowired注解

對于簡單類型我們使用@value注解,那么對于復雜類型我們就使用@autowired注解;這種方式是自動裝配,在之前我們接觸過基于xml文件的自動裝配,他是通過給Bean標簽中添加autowire屬性開啟自動裝配功能,然后他的屬性值就會開始自動裝配,底層調用的是set方法,是通過方法名來自動裝配的,演示案例:

  1. ? ? 
    ?<bean id="userService" class="com.powernode.spring6.service.UserService" autowire="byName"/><bean id="aaa" class="com.powernode.spring6.dao.UserDao"/>public class UserService {// 這里沒修改private UserDao aaa;?/*public void setAaa(UserDao aaa) {this.aaa = aaa;}*/?// set方法名變化了,就無法自動裝配了public void setDao(UserDao aaa){this.aaa = aaa;}?public void save(){aaa.insert();}}

    使用autowire屬性為byName這種自動裝配時必須注意set方法名,還有一種是根據類型自動裝配,但是此時需要注意的是符合條件的實現類必須只有一個;

  2. 無論是byName還是byType,在裝配的時候都是基于set方法的。而采用注解方式時就不依賴set方法了;

使用@autowired注解的方式解決注入非簡單類型的數據,默認是根據類型裝配的;注意點有下面兩點:
  • 第一處:該注解可以標注在哪里?

    • 構造方法上

      • 方法上

      • 形參上

      • 屬性上

      • 注解上

  • <span style="color:red">第二處:該注解有一個required屬性,默認值是true,表示在注入的時候要求被注入的Bean必須是存在的,如果不存在則報錯。如果required屬性設置為false,表示注入的Bean存在或者不存在都沒關系,存在的話就注入,不存在的話,也不報錯。</span>

由于@autowired注解采用的是默認的方式也就是byType類型,所以實習類必須只有一個,否則會報錯;

如何解決上面的問題

配合@Qualifier注解同時使用,在@Qualifier注解中指明Bean標簽的名稱即可;

? ?@Autowired@Qualifier("userDaoForOracle") // 這個是bean的名字。public void setUserDao(UserDao userDao) {this.userDao = userDao;}

總結:

  • @Autowired注解可以出現在:屬性上、構造方法上、構造方法的參數上、setter方法上。

  • 當帶參數的構造方法只有一個,@Autowired注解可以省略。多個的話就會報錯

  • @Autowired注解默認根據類型注入。如果要根據名稱注入的話,需要配合@Qualifier注解一起使用。

@Resource注解

這個注解使用的最廣泛,最受歡迎,同樣他的作用也是完成非簡單類型的注入,

@Resource VS @autowired

@Resource注解也可以完成非簡單類型注入。那它和@Autowired注解有什么區別?

  • @Resource注解是JDK擴展包中的,也就是說屬于JDK的一部分。所以該注解是標準注解,更加具有通用性。(JSR-250標準中制定的注解類型。JSR是Java規范提案。)

  • @Autowired注解是Spring框架自己的。

  • @Resource注解默認根據名稱裝配byName,未指定name時,使用屬性名作為name。通過name找不到的話會自動啟動通過類型byType裝配。

  • @Autowired注解默認根據類型裝配byType,如果想根據名稱裝配,需要配合@Qualifier注解一起用。

  • @Resource注解用在屬性上、setter方法上。

  • @Autowired注解用在屬性上、setter方法上、構造方法上、構造方法參數上。

@Resource注解屬于JDK擴展包,所以不在JDK當中,需要額外引入以下依賴:【如果是JDK8的話不需要額外引入依賴。高于JDK11或低于JDK8需要引入以下依賴。

<dependency><groupId>jakarta.annotation</groupId><artifactId>jakarta.annotation-api</artifactId><version>2.1.1</version></dependency>

spring.xml也變成注解類

所謂的全注解開發就是不再使用spring配置文件了。寫一個配置類來代替配置文件。

<?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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="com.powernode.spring6.dao,com.powernode.spring6.service"/></beans>

二者比較

?@Configuration@ComponentScan({"com.powernode.spring6.dao", "com.powernode.spring6.service"})public class Spring6Configuration {}

但是相應的測試程序就需要改變了:

?@Testpublic void testNoXml(){ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Spring6Configuration.class);UserService userService = applicationContext.getBean("userService", UserService.class);userService.save();}

ClassPathXmlApplicationContext?類換成了?AnnotationConfigApplicationContext


他日若遂凌云志,敢笑黃巢不丈夫,加油!!!

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

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

相關文章

自動駕駛術語匯總

目錄 智駕級別芯片相關自動駕駛相關輔助駕駛相關預警相關傳感器相關泊車相關安全相關車燈相關 智駕級別 L0-L2屬于輔助駕駛&#xff0c;L4-L5才算自動駕駛 L0&#xff08;Level 0&#xff09;&#xff1a;無自動化。這是大多數傳統汽車的級別&#xff0c;所有的駕駛任務都需要…

C++每日選擇題—Day1

第一題 以下C代碼會輸出什么? #include <iostream> using namespace std; class A { public:A() {}~A() {} private:static int a; }; int main() {cout << sizeof(A) << endl;return 0; } A&#xff1a;0 B&#xff1a;1 C&#xff1a;4 D&#xff1a;8 答…

2023年最新PyCharm環境搭建教程(含Python下載安裝)

文章目錄 寫在前面PythonPython簡介Python生態圈Python下載安裝 PyCharmPyCharm簡介PyCharm下載安裝PyCharm環境搭建 寫在后面 寫在前面 最近博主收到了好多小伙伴的吐槽稱不會下載安裝python&#xff0c;博主聽到后非常的扎心&#xff0c;經過博主幾天的熬夜加班&#xff0c;…

單鏈表實現【隊列】

目錄 隊列的概念及其結構 隊列的實現 數組隊列 鏈式隊列 隊列的常見接口的實現 主函數Test.c 頭文件&函數聲明Queue.h 頭文件 函數聲明 函數實現Queue.c 初始化QueueInit 創建節點Createnode 空間釋放QueueDestroy 入隊列QueuePush 出隊列QueuePop 隊頭元…

Hyper-V系列:Hyper-V啟動、創建虛擬機、與主機傳輸文件

Hyper-V啟動、創建虛擬機、與主機傳輸文件 一. 簡介二. 啟用Hyper-V的方式也很簡單:一、從“任務管理器”的“性能”查看虛擬化是否啟用,未啟用的需要到BIOS開啟:右下角可以看到“虛擬化:已啟用”二、啟用Hyper-v和虛擬機1.電腦左下角右鍵打開應用界面——可選功能2.在可選…

JavaScript 原始數據類型和對應的對象類型(內置對象)之間的關系

JavaScript 原始數據類型和對應的對象類型&#xff08;內置對象&#xff09;之間的關系 JavaScript 的原始&#xff08;primitive&#xff09;數據類型包括包括數字&#xff08;Number&#xff09;、字符串&#xff08;String&#xff09;、布爾值&#xff08;Boolean&#xf…

【數據結構】E : 貨幣套匯(圖路徑)

E : 貨幣套匯&#xff08;圖路徑&#xff09; Description 套匯是指利用貨幣匯兌率的差異將一個單位的某種貨幣轉換為大于一個單位的同種貨幣。例如&#xff0c;假定1 美元可以買0.7 英鎊&#xff0c;1 英鎊可以買9.5 法郎&#xff0c;1法郎可以買到0.16美元。通過貨幣兌換&a…

ELK企業級日志分析平臺——ES集群監控

啟用xpack認證 官網&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/7.6/configuring-tls.html#node-certificates 在elk1上生成證書 [rootelk1 ~]# cd /usr/share/elasticsearch/[rootelk1 elasticsearch]# bin/elasticsearch-certutil ca[rootelk1 ela…

GB/T 29498-2013 木門窗檢測

木門窗是指以木材、木質復合材料為主要材料制作框和扇的門窗。 GB/T 29498-2013 木門窗檢測項目 測試項目 測試標準 外觀質量 GB/T 29498 尺寸 GB/T 29498 裝配質量 GB/T 29498 含水率 GB/T 17657 附著力 GB/T 4893.4 外門窗耐冷熱循環 GB/T 4893.7 耐劃痕 GB/…

Volcano3D繪制3D火山圖

一邊學習&#xff0c;一邊總結&#xff0c;一邊分享&#xff01; 本期教程內容 **注&#xff1a;**本教程詳細內容 Volcano3D繪制3D火山圖 一、前言 火山圖是做差異分析中最常用到的圖形&#xff0c;在前面的推文中&#xff0c;我們也推出了好幾期火山圖的繪制教程&#xff0…

【代數學習題4.2】從零理解范數與跡 —— 求數域元素的范數與跡

從零理解范數與跡 —— 求數域元素的范數與跡 寫在最前面題目解答 2. 范數 N N N思路求解過程python求解 3. 數域 K K K 的范數 N K N_K NK?思路求解過程Python求解分析解題步驟 4. 跡 T T T求解過程共軛元素計算跡 python求解分析解題步驟 5. 數域 K K K 的跡 T K T_K …

讀書筆記——《黑猩猩的政治》

前言 弗朗斯德瓦爾&#xff08;Frans de Waal)的代表作《黑猩猩政治》成書于1982年&#xff0c;是它的首部書籍作品&#xff0c;也是美國國會新任議員的被推薦讀物。之前看的他另一部作品的《萬智有靈》是2016年的作品&#xff0c;時間跨度居然這么大。《萬智有靈》介紹了許多…

代碼隨想錄 135. 分發糖果

題目 n 個孩子站成一排。給你一個整數數組 ratings 表示每個孩子的評分。 你需要按照以下要求&#xff0c;給這些孩子分發糖果&#xff1a; 每個孩子至少分配到 1 個糖果。 相鄰兩個孩子評分更高的孩子會獲得更多的糖果。 請你給每個孩子分發糖果&#xff0c;計算并返回需要準…

SDK廣告類型及其作用與收益分析

在移動應用開發領域&#xff0c;軟件開發工具包&#xff08;SDK&#xff09;廣告已經成為應用開發者們獲取收益的一種重要途徑。不同類型的SDK廣告提供了多樣化的選擇&#xff0c;以滿足開發者的需求。本文將介紹幾種常見的SDK廣告類型&#xff0c;并深入探討它們的作用及對開發…

SPASS-信度分析

信度分析概述 效度 效度指的是量表是否真正反映了我們希望測量的東西。一般來說&#xff0c;有4種類型的效度&#xff1a;內容效度、標準效度、結構效度和區分效度。內容效度是一種基于概念的評價指標&#xff0c;其他三種效度是基于經驗的評價指標。如果一個量表實際上是有效…

【亞太杯前兩問論文】2023年第十三屆APMCM亞太地區大學生數學建模競賽——(文末領取方式)

2023年第十三屆APMCM亞太地區大學生數學建模競賽——論文無償分享&#xff01;&#xff01;&#xff01; C題前兩問論文代碼已出&#xff0c;其他賽題及后續論文代碼會持續更新。 祝各位小伙伴都能在比賽中發揮出色&#xff0c;取得心儀的成績呦&#xff01;一起加油&#xff…

vscode在運行c語言時,無法scanf輸入

問題&#xff1a; 在學習c語言中&#xff0c;我在使用scanf和cin時無法在終端進行輸入(運行了但是無法輸入)&#xff0c;在網上尋找答案&#xff0c;并寫下筆記 解決方法 選擇左上角 文件->首選項&#xff08;preferences&#xff09;->設置&#xff08;settings&#xf…

網關和鏈路追蹤

Spring Cloud的網關 在Spring Cloud中&#xff0c;網關&#xff08;Gateway&#xff09;是一種用于管理和路由微服務請求的中間層服務。它充當了整個微服務架構的入口點&#xff0c;負責將來自外部的請求轉發到相應的微服務上。常見的網關包括Spring Cloud Gateway和Netflix Zu…

Java類加載那些事

Java源文件&#xff08;.java文件&#xff09;被編譯器編譯后變為字節碼形式的類文件&#xff08;.class文件&#xff09;&#xff0c;Java類加載的過程就是JVM加載.class的二進制文件并且放到內存中&#xff0c;將數據放到方法區&#xff0c;并且在堆區構造一個java.lang.clas…

動態規劃從入門到精通

目錄 動態規劃的詳解 動態規劃的應用 機器人到達指定位置數 換錢的最少貨幣數 排成一條線的紙牌博弈問題 象棋中馬的跳法 Bob的生存概率 換錢的方法數 動態規劃的總結 動態規劃的詳解 暴力嘗試遞歸操作中有很多重復計算的操作&#xff0c;浪費時間。動態規劃就是減少暴力…