欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文詳解Spring的Enablexxx注解使用實例

 更新時間:2022年11月28日 14:08:13   作者:zi-you  
這篇文章主要為大家介紹了一文詳解Spring的Enablexxx注解使用實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

layout: post
categories: Java
title: 一文帶你了解 Spring 的@Enablexxx 注解
tagline: by 子悠
tags: 
  - 子悠

前面的文章給大家介紹 Spring 的重試機(jī)制的時候有提到過 Spring 有很多 @Enable 開頭的注解,平時在使用的時候也沒有注意過為什么會有這些注解,今天就給大家介紹一下。

@Enable 注解

首先我們先看一下有哪些常用的 @Enable 開頭的注解,以及都是干什么用的。

  • @EnableRetry:開啟 Spring 的重試功能;
  • @EnableScheduling:開啟 Spring 的定時功能;
  • @EnableAsync:開啟 Spring 的異步功能;
  • @EnableAutoConfiguration:開啟 Spring 的自動裝配功能;

上面這幾個是我們經(jīng)常會用到和看到的,都知道在使用相應(yīng)的功能的時候,如果沒有配置上面的注解功能都是不生效的。以我們前面的文章的 Spring重試為例,我們需要在啟動類上面配置 @EnableRetry ,否則自動重試注解 @Retryable 是不會生效的

@Import 注解

那有的小伙伴就要問了,這個 @EnableRetry 注解到底有什么作用呢?不用這個注解就沒辦法了嗎?

要知道這個注解有什么功效,我們可以點開看看源碼,代碼如下

package org.springframework.retry.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.Import;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@EnableAspectJAutoProxy(proxyTargetClass = false)
@Import(RetryConfiguration.class)
@Documented
public @interface EnableRetry {
	boolean proxyTargetClass() default false;
}

可以看到源碼很簡單,其中最有用的就一行 @Import(RetryConfiguration.class) ,我們可以嘗試把這一行代碼放到啟動類上面看看效果,如下所示,可以看到項目可以正常啟動,并且也還是有效果的,說明跟我們的 @EnableRetry 注解是一樣的。

從上面的實驗效果我們可以看到 @EnableRetry 注解其實就是對 @Import(RetryConfiguration.class) 的一個封裝,同樣的通過源碼我們還可以看到 @EnableScheduling 注解就是對 @Import({SchedulingConfiguration.class}) 的一個封裝。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import({SchedulingConfiguration.class})
@Documented
public @interface EnableScheduling {
}

那如果在沒有 @Enablexxx 注解的時候,我們直接通過 @Import 注解是可以這樣寫的,在一個 @Import 注解里面包含多個配置類,不過這種在配置類較多的場景下還是相對不夠簡潔的,因而才有了各自功能對應(yīng)的 @Enable 注解。

package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
import org.springframework.retry.annotation.RetryConfiguration;
import org.springframework.scheduling.annotation.SchedulingConfiguration;
@SpringBootApplication
@ComponentScan(value = "com.example.demo.*")
@Import({RetryConfiguration.class, SchedulingConfiguration.class})
public class DemoApplication {
  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }
}

為什么要使用 @Import 注解呢

那么很多的小伙伴又要問了,為啥要通過使用 @Import 注解將配置類加載進(jìn)來呢?在項目中的 Spring 上下文中不是能直接獲取到嗎?為此我們來實驗一下,通過下面的代碼我們看下是否能在 Spring 的容器中獲取到 RetryConfiguration 的 Bean

package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
import org.springframework.retry.annotation.RetryConfiguration;
import org.springframework.scheduling.annotation.SchedulingConfiguration;
@SpringBootApplication
@ComponentScan(value = "com.example.demo.*")
//@Import({RetryConfiguration.class, SchedulingConfiguration.class})
public class DemoApplication {
  public static void main(String[] args) {
    ConfigurableApplicationContext applicationContext = SpringApplication.run(DemoApplication.class, args);
    Object bean = applicationContext.getBean("org.springframework.retry.annotation.RetryConfiguration");
    System.out.println(bean.toString());
  }
}

啟動過后我們可以看到結(jié)果如下,提示我們在容器中找不到這個 bean,有點小伙伴會說是不是 bean 的名字寫錯了,其實并不是,緊接著我們再把注釋的那一行放開再運行一下。

可以看到,這次我們成功的獲取到了這個 Bean,這個實驗就是告訴我們,其實在默認(rèn)情況下,Spring 的容器中是找不到RetryConfiguration 這個 Bean 的,因此我們需要通過使用 @Import 注解,將該類加載到容器中。

那么為什么在容器中找不到這個 Bean 呢?

其實很簡單,因為這個 Bean 跟我們當(dāng)前環(huán)境的類是不是同一個包里面的,在項目啟動的過程中并不會掃描到 RetryConfiguration 類所在的包,因此找不到是很正常的。

總結(jié)

上面通過 @EnableRetry 這個注解帶大家了解了一下 Spring 的 @Enable 開頭的注解的使用原理,相信大家對這些注解有了更深入的了解。簡單來說就是因為我們要使用的很多類并不在我們項目所在的包下面,我們不能將所有的依賴包都進(jìn)行掃描,也不不方便將所有的配置類都通過 @Import 的方式進(jìn)行導(dǎo)入,而是讓每個功能的項目包都提供一個 @Enable 開頭的注解,我們直接啟用注解就可以達(dá)到效果。

這種方式我們在平時的開發(fā)中也可以自己實現(xiàn),實現(xiàn)一個自己的 @Enable 開頭的注解來實現(xiàn)特定的功能

以上就是一文詳解Spring的Enablexxx注解使用實例的詳細(xì)內(nèi)容,更多關(guān)于Spring Enablexxx注解的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java 10 局部變量類型推斷淺析

    Java 10 局部變量類型推斷淺析

    這篇文章主要介紹了Java 10 局部變量類型推斷淺析,Java 10 引進(jìn)一種新的閃閃發(fā)光的特性叫做局部變量類型推斷。文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,,需要的朋友可以參考下
    2019-06-06
  • java多線程編程必備volatile與synchronized深入理解

    java多線程編程必備volatile與synchronized深入理解

    這篇文章主要介紹了java多線程編程必備volatile與synchronized的深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Java設(shè)計模式之java觀察者模式詳解

    Java設(shè)計模式之java觀察者模式詳解

    這篇文章主要介紹了Java經(jīng)典設(shè)計模式之觀察者模式,簡單分析了觀察者模式的概念、原理并結(jié)合實例形式給出了java觀察者模式的具體用法與相關(guān)注意事項,需要的朋友可以參考下
    2021-09-09
  • java使用計算md5校驗碼方式比較兩個文件是否相同

    java使用計算md5校驗碼方式比較兩個文件是否相同

    MD5文件效驗碼是一個判斷文件是否是相同文件的途徑,通過比較兩個文件的Md5效驗碼是否相同來精確判斷兩個文件是否相同
    2014-04-04
  • Java項目中獲取路徑的絕對路徑問題和相對路徑問題

    Java項目中獲取路徑的絕對路徑問題和相對路徑問題

    這篇文章主要介紹了如何Java項目中獲取文件地址,在 Java 項目中我們經(jīng)常會讀取配置文件,但是文件的路徑在獲取時我們是怎么得到的?下面我們就一起進(jìn)入文章學(xué)習(xí)該內(nèi)容吧,需要的朋友可以參考下
    2022-02-02
  • Spring之spring-context-indexer依賴詳解

    Spring之spring-context-indexer依賴詳解

    這篇文章主要介紹了Spring之spring-context-indexer依賴詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Springboot Thymeleaf模板文件調(diào)用Java類靜態(tài)方法

    Springboot Thymeleaf模板文件調(diào)用Java類靜態(tài)方法

    這篇文章主要介紹了Springboot Thymeleaf模板文件調(diào)用Java類靜態(tài)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2007-09-09
  • Java 實戰(zhàn)圖書管理系統(tǒng)的實現(xiàn)流程

    Java 實戰(zhàn)圖書管理系統(tǒng)的實現(xiàn)流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實現(xiàn)一個圖書管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • servlet 解決亂碼問題

    servlet 解決亂碼問題

    這篇文章主要介紹了servlet 解決亂碼問題 ,需要的朋友可以參考下
    2015-04-04
  • Mybatis插件之自動生成不使用默認(rèn)的駝峰式操作

    Mybatis插件之自動生成不使用默認(rèn)的駝峰式操作

    這篇文章主要介紹了Mybatis插件之自動生成不使用默認(rèn)的駝峰式操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11

最新評論