《注解的江湖:一場元數據的“宮斗劇”》

一、你真的懂注解嗎

你是否使用過@Autowired卻不知道是如何生效的?
這幾個注解你一定很熟悉:

  • @Override
  • @Deprecated
  • @Transactional
    那么你有進一步思考過怎么生效的嗎?注解到底是什么?注解,到底是信息?還是指令?是標簽?還是注釋?

二、注解是一封寫給反射器的“情書”

  • 注解 = 元數據
    舉個例子,你在緬甸被嘎腰子了,這時你想了一個辦法,偷偷張貼一張小紙條,上面寫著“救我”。那么,路過的人看到這個紙條就會想著替你做點什么。

再來講講注解的生命周期:

  • source寫完就撕掉(例如override)只作用在源碼時期。
  • class 打包了但是JVM不看,作用在class期間(小紙條被翻譯成class,但是JVM不看)。
  • runtime這個小紙條可以在程序運行時期被讀取。

三、實戰一:自定義一個注解,實現“自動字段注入”

“太監宣旨”→ 注解寫在類上,反射器執行“圣旨”。

  • 創建一個圣旨
import java.lang.annotation.*;@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface ShannonAnnotation {int age() default 1 ;String name() default "";
}
  • 宣讀圣旨(放在類上)
    @ShannonAnnotation(name = "shannon",age = 18)public static class People{int age;String name;public void sayHello(){System.out.println("hello i am shannon");}}
  • 執行圣旨(反射器調用)
    public static void main(String[] args) {Class<People> peopleClass = People.class;Annotation[] annotations = peopleClass.getAnnotations();// 遍歷類上所有的注解,找到我們的圣旨!for (Annotation annotation : annotations) {if (annotation instanceof ShannonAnnotation){ShannonAnnotation annotation1 = (ShannonAnnotation) annotation;System.out.println("age:"+annotation1.age());System.out.println("name:"+annotation1.name());}}
//        invoketry {peopleClass.getMethod("sayHello").invoke(new People());} catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {throw new RuntimeException(e);}}
  • 結果:
    在這里插入圖片描述

四、實戰二:解析 Spring 是如何將“尊貴妃”變“寵妃”

  • 搭建Spring Debug環境
    – 搭建方法見編譯Spring
  • 創建一個項目如下:
    在這里插入圖片描述
@Service
public class HelloService {public void sayHi(){System.out.println("hello world");}
}
@Service
public class MyService {@Autowiredpublic HelloService helloService;
}

由上可知,在MyService中使用@Autowired注解,將HelloService注入。

  1. 進入方法打斷點
    這里解釋一下方法的作用,scan方法主要是掃描basePackage的所有bean,注冊到BeanDefinitions當中,refresh是真正啟動整個容器。
    在這里插入圖片描述
    在這個方法打斷點org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean,這個方法是注入bean屬性的方法。
    ![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/a29bf11cde1243c5a7f96b947d12be9c.png

可以看到,上圖,有一個AutoWiredAnnontationBeanPostProcessor類,這個就是@AutoWired的處理方法,點進去看看!
在這里插入圖片描述
可以看到上圖中,metadata中包含一個injectedElements 包含了HelloService。spring 調用metadatainject方法完成屬性的注入!

總結

  1. 注解只是一段信息
  2. 注解不是具體的處理邏輯
  3. 處理邏輯由其他代碼實現

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

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

相關文章

智能土木通 - 土木工程專業知識問答系統02-RAG檢索模塊搭建

一、項目目錄 civil_qa_system/ ├── docs/ # 項目文檔 ├── config/ # 配置文件 ├── core/ # 核心功能代碼 ├── knowledge_base/ # 知識庫相關 ├── web/ # Web應用部分 ├…

進程和線程區別、管道和套接字、共享變量、TCP三次握手,是否可以少一次握手、子進程和主進程區別和API——Nodejs

首先講了進程和線程區別 然后講解 管道和套接字&#xff0c;它是進程間通信的方式 接著講解共享變量 &#xff0c;它是線程間通信 最后講解TCP三次握手&#xff0c;因為套接字使用了TCP協議 一、線程和進程的區別 線程&#xff08;Thread&#xff09;和進程&#xff08;Pr…

docker(學習筆記第一課) 使用nginx +https + wordpress

文章目錄 docker(學習筆記第一課) 使用nginx https wordpress學習內容&#xff1a;1. 整體架構1.1 在aws ec2的整體架構1.2 不懂都可以問AI 2. 構建詳細2.1 構建ec22.2 安裝docker2.3 創建一個docker的內部network2.4 創建wordpress使用的mysql數據庫2.5 創建兩個wordpress的d…

Leetcode 刷題記錄 15 —— 二分查找

本系列為筆者的 Leetcode 刷題記錄&#xff0c;順序為 Hot 100 題官方順序&#xff0c;根據標簽命名&#xff0c;記錄筆者總結的做題思路&#xff0c;附部分代碼解釋和疑問解答&#xff0c;01~07為C語言&#xff0c;08及以后為Java語言。 01 搜索插入位置 class Solution {pub…

C++核心編程(動態類型轉換,STL,Lanmda)

一. 類型轉換 二. STL 1. 容器 1.1 Vector&#xff08;常用&#xff09; 1.1.1 概述 特性&#xff1a; 動態數組&#xff1a; 想象成一個會自動變長變短的數組。起始在內存中是連續存儲的。 隨機訪問&#xff1a; 通過[]運算符或at()方法&#xff0c;可以瞬間&#xff08;…

【圖像處理入門】8. 數學基礎與優化:線性代數、概率與算法調優實戰

摘要 圖像處理的核心離不開數學工具的支撐。本文將深入解析線性代數、概率論在圖像領域的應用,包括矩陣變換與圖像幾何操作的關系、噪聲模型的數學描述,以及遺傳算法、粒子群優化等智能算法在參數調優中的實踐。通過理論結合代碼案例,幫助讀者掌握從數學原理到工程優化的完…

操作系統八股文

一.進程和線程的區別 1.本質區別和所屬關系是什么&#xff1f; 進程是資源調度以及分配的基本單位。 線程是CPU調度的基本單位。 一個線程屬于一個進程&#xff0c;一個進程可以擁有多個線程。 2.地址空間和內存 進程擁有獨立的虛擬地址空間。 線程沒有獨立的地址空間&#xf…

【uniapp】小程序中input輸入框的placeholder-class不生效

解決方法 1.去掉scoped <style></style> 2.額外寫一組style </style lang"scss" scoped> </style> <style> ::v-deep .textarea-placeholder { font-size: 24rpx; font-weight: 400; …

大模型訓練與推理顯卡全指南:從硬件選型到性能優化

在人工智能技術飛速發展的今天&#xff0c;大型語言模型(LLM)已成為推動行業進步的核心動力。然而&#xff0c;訓練和部署這些“數字巨人”需要強大的計算基礎設施作為支撐&#xff0c;其中GPU的選擇直接決定了模型開發的效率與成本。本文將全面剖析當前主流GPU型號在大模型訓練…

Linux Docker的環境配置與簡單使用

參考資料 Windows Docker Desktop設置中文【Docker 】Docker Desktop for Windows&#xff08;WSL 2&#xff09;安裝WSL 2 上的 Docker 遠程容器入門 目錄 一. 環境配置1.1 安裝WSL1.2 安裝配置 Docker Desktop1.3 VS Code 插件安裝1.4 下載項目&#xff0c;配置Dockerfile 二…

函數指針與指針函數:本質區別與高級應用

目錄 一、概念本質解析 1. 函數指針&#xff08;Function Pointer&#xff09; 2. 指針函數&#xff08;Pointer Function&#xff09; 二、函數指針深度剖析 1. 基礎用法示例 2. 高級應用&#xff1a;回調函數 3. 函數指針數組 三、指針函數深入探討 1. 基礎實現模式 …

【python】基于pycharm的海康相機SDK二次開發

海康威視二次開發相機管理 這段代碼基于python開發的&#xff0c;用了opencv的一些庫函數。實現了一個完整的海康機器人相機管理工具&#xff0c;支持多相機連接、參數配置、圖像采集和實時顯示功能。目前USB相機測試無誤&#xff0c;除了丟一些包。 1. 主要類結構 HKCameraM…

HTTP 協議各個主要版本的功能特點、核心原理、使用場景總結

我們來系統總結一下 HTTP 協議各個主要版本的功能特點、核心原理&#xff08;用圖示輔助說明&#xff09;以及典型使用場景。 核心演進目標&#xff1a; 提升性能、安全性、效率和靈活性。 1. HTTP/0.9 (1991) - 遠古雛形 功能特點: 極其簡單&#xff1a; 只支持 GET 方法。無…

Linux編程:3、進程通信-信號

一、進程通信概述 &#xff08;一&#xff09;進程通信的目的 在企業開發中&#xff0c;一個項目常常需要多個進程共同協作&#xff0c;而這些進程之間需要進行通信&#xff08;交換信息&#xff09;以便協作。本章內容主要圍繞信號講解&#xff0c;其它進程通信的常用方式請…

深度解析Vue.js組件開發與實戰案例

一、Vue.js組件化思想 Vue.js的核心思想之一就是組件化開發。組件系統是Vue的一個重要概念,它允許我們使用小型、獨立和通常可復用的組件構建大型應用。在Vue中,組件本質上是一個擁有預定義選項的Vue實例。 1.1 為什么需要組件化 代碼復用:避免重復造輪子,提高開發效率可…

TensorFlow 2.0 與 Python 3.11 兼容性

TensorFlow 2.0 與 Python 3.11 兼容性 TensorFlow 2.0 官方版本對 Python 3.11 的支持有限&#xff0c;可能出現兼容性問題。建議使用 TensorFlow 2.10 或更高版本&#xff0c;這些版本已適配 Python 3.11。若需強制運行&#xff0c;可通過以下方式解決依賴沖突&#xff1a; …

MyBatisPlus 全面學習路徑

MyBatisPlus 全面學習路徑 學習目錄 第一部分&#xff1a;MyBatisPlus 基礎 MyBatisPlus 簡介與核心特性快速入門與環境搭建核心功能&#xff1a;BaseMapper 與 CRUD 接口條件構造器&#xff08;Wrapper&#xff09;詳解ActiveRecord 模式主鍵策略與通用枚舉 第二部分&…

React16,17,18,19更新對比

文章目錄 前言一、16更新二、17更新三、18更新四、19更新總結 前言 總結react 16&#xff0c;17&#xff0c;18&#xff0c;19所更新的內容&#xff0c;并且部分會涉及到原理講解。 一、16更新 1、在16.8之前更新&#xff0c;還是基于class組件的升級和維護更新。并且更新了一…

【git】有兩個遠程倉庫時的推送、覆蓋、合并問題

當你執行 git pull origin develop(或默認的 git pull)時,Git 會把遠端 origin/develop 的提交合并到你本地的 develop,如果遠端已經丟掉(或從未包含)你之前在私庫(priv)里提交過的改動,那這些改動就會被「覆蓋」,看起來就像「本地修改沒了」。 要解決這個問題,分…

Spring Boot 集成國內AI,包含文心一言、通義千問和訊飛星火平臺實戰教程

Spring Boot 集成國內AI&#xff0c;包含文心一言、通義千問和訊飛星火平臺實戰教程 一、項目結構二、添加Maven依賴三、配置API密鑰 (application.yml)四、配置類1. AI配置類 (AiProperties.java)2. 啟用配置類 (AiConfig.java) 五、服務層實現1. 文心一言服務 (WenxinService…