Spring5學習隨筆-基礎註解編程

来源:https://www.cnblogs.com/eyewink/archive/2023/11/22/17848718.html
-Advertisement-
Play Games

主要介紹了Java的Spring框架中的註解編程。第一章首先介紹了註解編程的概念,即在類或方法上添加特定的註解來完成特定功能的開發。然後解釋了為什麼要學習註解編程,主要原因是註解開發方便且與Spring框架的發展潮流相符合。接著介紹了註解的作用,包括替換XML配置和替換介面實現調用雙方的契約性。第四... ...


學習視頻:【孫哥說Spring5:從設計模式到基本應用到應用級底層分析,一次深入淺出的Spring全探索。學不會Spring?只因你未遇見孫哥】

註解編程-第一章、註解基礎概念

1.什麼是註解編程

指的是在類或方法上加入特定的註解(@XXX),完成特定功能的開發.

2.為什麼要講解註解編程

  1. 註解開發方便

    代碼簡介 開發速度大大提高

  2. Spring開發潮流

    Spring2.x引入註解 Spring3.x完善註解 SpringBoot普及 推廣註解編程

3.註解的作用

  • 替換XML這種配置形式,簡化配置

    @Component 代替/等效配置中的bean對象

  • 替換介面,實現調用雙方的契約性

通過註解的方式,在調用者和功能提供者之間達成約定,進而進行功能的調用,因為註解應用更為方便靈活,所以在現在的開發中,更推薦通過註解的形式完成

4.Spring註解的發展歷程

  1. Spring2.x開始支持註解編程 @Component @Service @Scope

    目的:提供這些註解只是為了在某些情況簡化XML的配置,作為XML開發的有益補充

  2. Spring3.x @Configuration @Bean

    目的:徹底替換XML,基於純註解編程

  3. Spring4.x SpringBoot

    提倡使用註解常見開發

5.Spring註解開發的一個問題

Spring基於註解進行配置後,還能否解耦合呢?

在Spring框架應用註解時,如果對註解配置的內容不滿意,可以通過Spring配置文件進行覆蓋。

第二章、Spring的基礎註解(Spring2.x)

這個階段的註解,僅僅是簡化XML的配置,並不能完全代替XML

1.對象創建相關註解

  • 搭建開發環境
<context:component-scan base-package="com.baizhi"/>
作用:讓Spring框架在設置的包下掃描對應的註解,使其生效
  • 對象創建相關註解

    • @Component

    作用:替換原有Spring配置文件中的bean標簽

    註意:id屬性 cmponent註解 提供了預設的設置方式 首單詞首字母小寫

    class屬性 通過反射獲得class內容

    @Component 代替/等效配置中的bean對象

    • @Component細節

      如何顯示指定工廠創建對象的id值

      @Component("u”) 參數可以設置id值

      • Spring配置文件覆蓋註解配置內容

        applicationContext.xml
        <bean id="u" class="com.baizhi.bean.User"/>
        
    • @Component的衍生註解

      @Repository 應用在DAO類型
      @Service    應用在Service類
      @Controller 應用在Controller類
      **註意:本質上這些衍生註解就是@Component 作用、細節、用法都是完全一致
      目的:更加準確的表達一個類型的作用
      註意:Spring整合Mybatis開發過程中 不使用@Repository @Component**
      
  • @Scope註解

    作用:控制簡單對象創建次數 等同於scope屬性

    註意:不添加@Scope,Spring還是會提供預設值singleton

    <bean id="" class="" scope="singleton|prototype"/>
    
  • @Lazy註解

    作用:延遲創建單實例對象

    註意:一旦使用了@Lazy註解後,Spring會在使用這個對象的時候,才進行對象的創建

    <bean id="" class="" lazy="false"/>
    
  • 生命周期方法相關註解

    1. 初始化相關方法 @PostConstruct

    2. 銷毀方法 @PreDestroy

    註意:1.上述的2個註解並不是Spring提供的,是JSR(JavaEE規範)520提供的

    **2.再一次的驗證,通過註解實現了介面的契約性**
    

2.註入相關註解

  • 用戶自定義類型註入 @Autowired

    @AutoWired細節

    1. Autowired註解基於類型進行註入[推薦]

      基於類型的註入:註入對象的類型,必須與目標成員變數類型相同或者是其子類(實現類)

    2. Autowired加上Qualifier 可以基於名字進行註入[瞭解即可]

      註入對象id值,必須與Qualifier註解中設置的名字相同

    3. Autowired註解放置位置

      1. 放置在對應成員變數的set方法上
      2. 直接把這個註解放置在成員變數之上,Spring通過反射直接對成員變數進行註入(賦值)[推薦]
    4. JavaEE規範中提供類似功能的註解

      JSR250 @Resouce(name=”userDAOImpl”) 基於名字進行註入

      註意:應用Resource註解時,名字沒有配置成功,那麼他會繼續按照類型進行註入

      JSR330 @Inject 作用 @Autowired完全一致 基於類型進入註入 —→EJB3.0

  • JDK類型

    @Value註解完成

    1. 設置xxx.properties

      id = 10

      name = suns

    2. Spring的工廠讀取這個配置文件

      <context:property-placeholder location=””/>

    3. 代碼

      屬性 @Value("${key}”)

    • @PropertySource
      1. 作用:用於替換Spring配置文件中的<context:property-placeholder location=””/>標簽
      2. 開發步驟
        1. 設置xxx.properties

          id=10

          name=suns

        2. 應用@PropertySource

        3. 代碼

          屬性@Value()

@Component
@PropertySource("classpath:/init.properties")
public class Category {
    @Value("${id}")
    private Integer id;
    @Value("${name}")
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • @Value註解細節
    • @Value註解不能給靜態成員變數賦值
    • @Value註解+Properties這種方式,不能註入集合類型
      • Spring提供新的配置形式 YAML YML(SpringBoot)

3.註解掃描詳解

<context:component-scan base-package="com.baizhi"/>
當前包 及其 子包

1.排除方式

<context:component-scan base-package="com.baizhi">
		<context:exclude-filter **type**="" expression=""/>
		**type參數講解**:assignable:排除特定的類型 不進行掃描
									annotation:排除特定的註解  不進行掃描
									aspectj:切入點表達式 
														包切入點:com.baizhi.bean..*
														類切入點:*.User
									regex:正則表達式來進行排除
									custom:自定義排除策略
</context:component>

排除策略可以疊加使用
<context:component-scan base-package="com.baizhi">
        <context:exclude-filter type="assignable" expression="com.baizhi.bean.User"/>
        <context:exclude-filter type="aspectj" expression="com.baizhi.injection..*"/>
</context:component-scan>

實際開發中常用assignable、annotation、 aspectj(用的最多,切入點表達式)更方便

2.包含方式

和排除方式是相反的,它決定了哪些類的註解被Spring掃描

<context:component-scan base-package="com.baizhi" use-default-filters="false">
      <context:include-filter type="" expression=""/>
</context:component-scan>

1. use-default-filters="false"
	作用:讓Spring預設的註解掃描方式 失效
2. <context:include-filter type="" expression=""/>
	作用:指定掃描那些註解
	type:assignable:指定特定的類型 不進行掃描
				annotation:指定特定的註解  不進行掃描
				aspectj:切入點表達式 
									包切入點:com.baizhi.bean..*
									類切入點:*.User
				regex:正則表達式來進行排除
				custom:

包含的方式支持疊加
<context:component-scan base-package="com.baizhi" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    </context:component-scan>

4.對於註解開發的思考

  • 配置互通

    Spring註解配置 配置文件的配置 互通

    @Repository
    public class UserDAOImpl{
    
    }
    
    public class UserServiceImpl{
    		private UserDAO userDAO;
    		set get..
    }
    
    <bean id="userService class="com.baizhi.UserServiceImpl">
    		<property name="userDAO" ref=""/>ref會提示userDAO的選項
    </bean>
    
  • 什麼情況下使用註解 什麼情況下使用配置文件

    @Component 替換 <bean

    基礎註解(@Component @Autowired @Value) 程式員開發類型的配置

    1. 在程式員開發的類型上 可以加入對應註解 進行對象的創建

      User UserService UserDAO UserAction

    2. 應用其他非程式員開發的類型時,還是需要<bean 進行配置的

      SqlSessionFactoryBean MapperScannerConfigure

作者:揚眉劍出鞘
出處: https://www.cnblogs.com/eyewink/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Zlib是一個開源的數據壓縮庫,提供了一種通用的數據壓縮和解壓縮演算法。它最初由`Jean-Loup Gailly`和`Mark Adler`開發,旨在成為一個高效、輕量級的壓縮庫,其被廣泛應用於許多領域,包括網路通信、文件壓縮、資料庫系統等。其壓縮演算法是基於`DEFLATE`演算法,這是一種無損數據壓... ...
  • SSL 連接簡介 SSL(Secure Sockets Layer)是一種用於確保網路通信安全性的加密協議,廣泛應用於互聯網上的數據傳輸。在數據爬取過程中,爬蟲需要與使用 HTTPS 協議的網站進行通信,這就牽涉到了 SSL 連接。本文將深入研究 Request 爬蟲中的 SSL 連接問題,並提供解 ...
  • Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介紹Calendar日曆類型的幾種常見方法以及部分理論知識 🍉歡迎點贊 👍 收藏 ⭐留言評論 📝私信必回喲😁 🍉博主收將持續更新學習記錄獲,友友們有任何問題可以在評論區留言 ⭐什麼是Calendar日曆類型? Calendar類是一 ...
  • filter, reduce, 和 map 是Python中用於對集合數據進行處理和轉換的內置函數。它們分別用於篩選、歸約和映射集合中的元素。 filter 函數: filter(function, iterable) 用於篩選集合中的元素。它接受一個函數 function 和一個可迭代的對象 it ...
  • 在數據科學計算、機器學習、以及深度學習領域,Python 是最受歡迎的語言。Python 在數據科學領域,有非常豐富的包可以選擇,numpy、scipy、pandas、scikit-learn、matplotlib。 但這些庫都僅僅受限於單機運算,當數據量很大時,比如50GB甚至500GB的數據集, ...
  • 創建資料庫 (xxl-job) 導入相關表 Sql SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- -- Table structure for xxl_job_group -- DROP TABLE IF EXISTS `xxl_job_grou ...
  • 原文鏈接:https://openaigptguide.com/grok-ai/ Grok AI是由馬斯克推出的一款高級別的人工智慧大語言模型,旨在幫助軟體開發者以不同的口頭語言交流和表達。它是基於多種深度學習大規模固定模型架構,如ELMo、BERT和GPT,以及更多新的模式,使軟體開發者能夠快速設 ...
  • 公眾號「架構成長指南」,專註於生產實踐、雲原生、分散式系統、大數據技術分享。 在本教程中,您將通過大量示例來學習 Java 8 Stream API。 Java 在 Java 8 中提供了一個新的附加包,稱為 java.util.stream。該包由類、介面和枚舉組成,允許對元素進行函數式操作。 您 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...