0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

對Spring中常用注解的原理進行剖析

冬至子 ? 來源:good7ob ? 作者:good7ob ? 2023-06-06 16:11 ? 次閱讀

Spring 框架作為 Java 領(lǐng)域廣泛使用的企業(yè)級框架,憑借其簡潔優(yōu)雅的編程方式,以及豐富的功能和生態(tài),一直備受開發(fā)者們的喜愛。

在 Spring 框架中,注解是實現(xiàn)代碼簡潔、模塊化、可配置的關(guān)鍵技術(shù)之一。

本文將對 Spring 中常用注解的原理進行剖析,并通過實際案例展示如何使用這些注解。

一、注解原理簡介

  • 在 Java 編程中,注解是一種元數(shù)據(jù),用于向編譯器和運行時環(huán)境提供額外的信息
  • Spring 框架利用 Java 的注解機制,實現(xiàn)了依賴注入(DI)、面向切面編程(AOP)、聲明式事務(wù)管理等功能,大大簡化了 Java 企業(yè)級應用的開發(fā)。
  • 在 Spring 中,注解的原理主要涉及到三個方面:
  1. 注解定義:通過 Java 提供的 @interface 語法定義注解。
  2. 注解使用:將定義好的注解應用到類、方法、字段等地方。
  3. 注解解析:通過反射機制,在運行時讀取注解的信息,并根據(jù)注解的定義來執(zhí)行相應的邏輯。

接下來,我們將針對 Spring 中常用的幾個注解,詳細剖析其原理。

二、常用注解剖析

1,@Component

@Component 注解是 Spring 中用于標識一個類作為組件的注解,這意味著 Spring 容器會自動掃描到這個類,并將其實例化為一個 Bean。

@Component 注解是 @Service、@Controller@Repository 注解的基礎(chǔ)注解。

原理剖析

  • 當 Spring 容器啟動時,會通過 ClassPathScanningCandidateComponentProvider 類掃描類路徑下的所有類,然后檢查這些類上是否有 @Component 注解。
  • 如果有,Spring 容器會將這個類實例化為一個 Bean,并加入到 IoC 容器中。

實際案例

@Component
public class UserService {
   //...
}

上述代碼中,UserService 類被標記為一個組件,Spring 容器會自動創(chuàng)建并管理一個 UserService 的實例。

2,@Autowired

@Autowired 注解用于自動裝配 Bean 之間的依賴關(guān)系。它可以應用在字段、構(gòu)造方法和普通方法上。

原理剖析

  • Spring 容器在創(chuàng)建 Bean 實例后,會通過 AutowiredAnnotationBeanPostProcessor 類處理 @Autowired 注解。
  • 具體而言,它會查找與被注解字段或方法參數(shù)類型匹配的 Bean,并自動注入相應的依賴。

實際案例

@Component
public class UserController {
   private UserService userService;
   @Autowired
   public UserController(UserService userService) {
       this.userService = userService;
  }
}

上述代碼中,UserController 中的 userService 字段被 @Autowired 注解修飾,Spring 容器會自動注入一個 UserService 的實例。

3,@RequestMapping

@RequestMapping 注解用于將 HTTP 請求映射到控制器的處理方法上。它可以應用在類和方法上,用于處理不同的 URL 請求。

原理剖析

  • Spring 容器在啟動時,會掃描所有標注有 @Controller 注解的類,并解析其中所有的 @RequestMapping 注解。
  • 當接收到一個 HTTP 請求時,Spring 容器會根據(jù)請求的 URL 和請求方法,找到對應的處理方法,并執(zhí)行相應的業(yè)務(wù)邏輯。

實際案例

@Controller
@RequestMapping("/user")
public class UserController {
   @RequestMapping("/login")
   public String login() {
       //...
  }
}

上述代碼中,UserController 類被標注為一個控制器,@RequestMapping 注解指定了 /user 路徑。login() 方法被 @RequestMapping 注解修飾,用于處理 /user/login 的請求。

4,@Transactional

@Transactional 注解用于聲明式事務(wù)管理,它可以應用在類和方法上。

當一個方法被標記為 @Transactional 注解時,Spring 容器會在方法執(zhí)行前開啟一個事務(wù),并在方法執(zhí)行后根據(jù)執(zhí)行結(jié)果提交或回滾事務(wù)。

原理剖析

Spring 的事務(wù)管理是基于 AOP 技術(shù)實現(xiàn)的。當一個類或方法被標記為 @Transactional 注解時,Spring 容器會通過 TransactionInterceptor 類生成一個代理對象,將事務(wù)邏輯織入到代理對象的方法中。

實際案例

@Service
public class UserService {
   @Autowired
   private UserDao userDao;
   @Transactional
   public void updateUser(User user) {
       userDao.updateUser(user);
  }
}

上述代碼中,UserService 類中的 updateUser() 方法被 @Transactional 注解修飾,Spring 容器會在方法執(zhí)行前開啟一個事務(wù),并在方法執(zhí)行后根據(jù)執(zhí)行結(jié)果提交或回滾事務(wù)。

三、注解的優(yōu)點

注解作為一種元數(shù)據(jù),具有以下優(yōu)點:

  1. 簡化配置:注解可以將配置信息直接寫在代碼中,而不需要繁瑣的 XML 配置或?qū)傩晕募渲谩?/li>
  2. 可讀性強:注解將元數(shù)據(jù)直接寫在代碼中,使得代碼更加易讀、易懂。
  3. 可重用性強:通過注解,可以將相同的元數(shù)據(jù)應用于不同的類、方法或字段,提高了代碼的可重用性。
  4. 面向切面編程:注解在 AOP 中發(fā)揮了重要作用,可以方便地將切面邏輯織入到方法中,從而實現(xiàn)面向切面編程。

四、總結(jié)

  • 本文針對 Spring 框架中常用的幾個注解進行了原理剖析,并通過實際案例展示了如何使用這些注解。
  • 注解作為一種元數(shù)據(jù),具有簡化配置、可讀性強、可重用性強、面向切面編程等優(yōu)點,是 Java 開發(fā)中不可或缺的一部分。
  • 在實際開發(fā)中,合理使用注解可以讓代碼更加簡潔、易讀、易維護。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 控制器
    +關(guān)注

    關(guān)注

    112

    文章

    16042

    瀏覽量

    176780
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2948

    瀏覽量

    104391
  • URL
    URL
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    15275
  • AOP
    AOP
    +關(guān)注

    關(guān)注

    0

    文章

    40

    瀏覽量

    11083
  • XML技術(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    6006
收藏 人收藏

    評論

    相關(guān)推薦

    Spring Boot如何實現(xiàn)異步任務(wù)

    ,用來告訴 Spring 這個方法是一個異步方法,Spring 會將這個方法的執(zhí)行放在異步線程中進行。使用 @Async 注解需要滿足以下條件: 需要在
    的頭像 發(fā)表于 09-30 10:32 ?1337次閱讀

    使用Spring自定義注解的實現(xiàn)

    執(zhí)行器。其本質(zhì)就是通過外部參數(shù)進行一次路由和Spring mvc做的事情類似。簡單看了Spring mvc的實現(xiàn)原理之后,決定使用自定義注解的方式來實現(xiàn)以上功能。 自定義TaskHan
    發(fā)表于 09-28 11:55 ?0次下載

    Spring應用 1 springXML配置說明

    開發(fā)過程。會使用注解形式的開發(fā)模式。但使用相應的注解需要spring.xml中定義相應的BeanProcessor,這樣顯得很笨重。 使用@Autowired注解,必須事先在
    發(fā)表于 01-13 12:20 ?376次閱讀

    Spring Boot常用注解與使用方式

    企業(yè)開發(fā)項目SpringBoot已經(jīng)是必備框架了,其中注解是開發(fā)中的小工具(誰處可見哦),用好了開發(fā)效率大大提升,當然用錯了也會引入缺陷。
    的頭像 發(fā)表于 07-08 10:57 ?1301次閱讀

    淺談Spring事務(wù)底層原理

    開啟Spring事務(wù)本質(zhì)上就是增加了一個Advisor,但我們使用@EnableTransactionManagement注解來開啟Spring事務(wù)是,該注解代理的功能就是向
    的頭像 發(fā)表于 12-06 09:56 ?654次閱讀

    Spring Web MVC注解

    RequestMapping注解的主要用途是將Web請求與請求處理類中的方法進行映射。Spring MVC和Spring WebFlux都通過`RquestMappingHandler
    的頭像 發(fā)表于 04-07 11:32 ?556次閱讀
    <b class='flag-5'>Spring</b> Web MVC<b class='flag-5'>注解</b>

    Spring Bean相關(guān)的4個注解及使用方法

    ComponentScan`注解用于配置Spring需要掃描的被組件注解注釋的類所在的包??梢酝ㄟ^配置其basePackages屬性或者value屬性來配置需要掃描的包路徑。value屬性是basePackages的別名。此
    的頭像 發(fā)表于 04-07 11:33 ?1290次閱讀
    <b class='flag-5'>Spring</b> Bean相關(guān)的4個<b class='flag-5'>注解</b>及使用方法

    Spring Dependency Inject與Bean Scops注解

    DependsOn`注解可以配置Spring IoC容器在初始化一個Bean之前,先初始化其他的Bean對象。下面是此注解使用示例代碼:
    的頭像 發(fā)表于 04-07 11:35 ?640次閱讀
    <b class='flag-5'>Spring</b> Dependency Inject與Bean Scops<b class='flag-5'>注解</b>

    容器配置及Spring Boot注解

    Autowired注解用于標記Spring將要解析和注入的依賴項。此注解可以作用在構(gòu)造函數(shù)、字段和setter方法上。
    的頭像 發(fā)表于 04-07 11:45 ?535次閱讀
    容器配置及<b class='flag-5'>Spring</b> Boot<b class='flag-5'>注解</b>

    Spring中@Component注解是怎么實現(xiàn)的

    想必`@Component`注解大家一直在使用,只要類上加上它,就可以被Spring容器管理,那大家有想過它是怎么實現(xiàn)的嗎?本篇文章就帶領(lǐng)到家揭秘。
    的頭像 發(fā)表于 04-07 15:23 ?1493次閱讀
    <b class='flag-5'>Spring</b>中@Component<b class='flag-5'>注解</b>是怎么實現(xiàn)的

    JAVA中注解是怎么做到的(上)

    注解想必大家在項目中經(jīng)常使用,比如Spring框架中常用的一些注解:`@Controller`、`@Service`、`@RequestMapping`等等,它是JDK1.5及以后版本
    的頭像 發(fā)表于 05-11 10:57 ?605次閱讀

    JAVA中注解是怎么做到的(下)

    注解想必大家在項目中經(jīng)常使用,比如Spring框架中常用的一些注解:`@Controller`、`@Service`、`@RequestMapping`等等,它是JDK1.5及以后版本
    的頭像 發(fā)表于 05-11 10:57 ?528次閱讀
    JAVA中<b class='flag-5'>注解</b>是怎么做到的(下)

    springmvc常用5種注解

    SpringMVC是一種基于Java的Web框架,使用注解可以更加方便靈活地開發(fā)和管理控制器,實現(xiàn)請求的映射和處理。在SpringMVC中,有許多常用注解,本文將詳細介紹其中的五種注解
    的頭像 發(fā)表于 11-22 16:51 ?728次閱讀

    springboot核心注解

    Spring Boot 是基于 Spring 框架的開源框架,它可以幫助開發(fā)者快速構(gòu)建、部署和運行獨立的、生產(chǎn)級的 Spring 應用程序。Spring Boot 提供了一系列核心
    的頭像 發(fā)表于 11-23 09:23 ?473次閱讀

    SpringBoot核心注解由幾個注解組成

    Spring Boot 是一個開源的 JavaEE 開發(fā)框架,它以簡化 Spring 框架的配置與開發(fā)為目標,旨在讓開發(fā)者能快速構(gòu)建獨立、生產(chǎn)級別的應用程序。Spring Boot 提供了大量用于
    的頭像 發(fā)表于 12-03 15:09 ?670次閱讀