最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解Spring的Enablexxx注解使用實(shí)例

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

引言

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

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

@Enable 注解

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

  • @EnableRetry:開(kāi)啟 Spring 的重試功能;
  • @EnableScheduling:開(kāi)啟 Spring 的定時(shí)功能;
  • @EnableAsync:開(kāi)啟 Spring 的異步功能;
  • @EnableAutoConfiguration:開(kāi)啟 Spring 的自動(dòng)裝配功能;

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

@Import 注解

那有的小伙伴就要問(wèn)了,這個(gè) @EnableRetry 注解到底有什么作用呢?不用這個(gè)注解就沒(méi)辦法了嗎?

要知道這個(gè)注解有什么功效,我們可以點(diǎn)開(kāi)看看源碼,代碼如下

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;
}

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

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

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

那如果在沒(méi)有 @Enablexxx 注解的時(shí)候,我們直接通過(guò) @Import 注解是可以這樣寫(xiě)的,在一個(gè) @Import 注解里面包含多個(gè)配置類(lèi),不過(guò)這種在配置類(lèi)較多的場(chǎng)景下還是相對(duì)不夠簡(jiǎn)潔的,因而才有了各自功能對(duì)應(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 注解呢

那么很多的小伙伴又要問(wèn)了,為啥要通過(guò)使用 @Import 注解將配置類(lèi)加載進(jìn)來(lái)呢?在項(xiàng)目中的 Spring 上下文中不是能直接獲取到嗎?為此我們來(lái)實(shí)驗(yàn)一下,通過(guò)下面的代碼我們看下是否能在 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());
  }
}

啟動(dòng)過(guò)后我們可以看到結(jié)果如下,提示我們?cè)谌萜髦姓也坏竭@個(gè) bean,有點(diǎn)小伙伴會(huì)說(shuō)是不是 bean 的名字寫(xiě)錯(cuò)了,其實(shí)并不是,緊接著我們?cè)侔炎⑨尩哪且恍蟹砰_(kāi)再運(yùn)行一下。

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

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

其實(shí)很簡(jiǎn)單,因?yàn)檫@個(gè) Bean 跟我們當(dāng)前環(huán)境的類(lèi)是不是同一個(gè)包里面的,在項(xiàng)目啟動(dòng)的過(guò)程中并不會(huì)掃描到 RetryConfiguration 類(lèi)所在的包,因此找不到是很正常的。

總結(jié)

上面通過(guò) @EnableRetry 這個(gè)注解帶大家了解了一下 Spring 的 @Enable 開(kāi)頭的注解的使用原理,相信大家對(duì)這些注解有了更深入的了解。簡(jiǎn)單來(lái)說(shuō)就是因?yàn)槲覀円褂玫暮芏囝?lèi)并不在我們項(xiàng)目所在的包下面,我們不能將所有的依賴包都進(jìn)行掃描,也不不方便將所有的配置類(lèi)都通過(guò) @Import 的方式進(jìn)行導(dǎo)入,而是讓每個(gè)功能的項(xiàng)目包都提供一個(gè) @Enable 開(kāi)頭的注解,我們直接啟用注解就可以達(dá)到效果。

這種方式我們?cè)谄綍r(shí)的開(kāi)發(fā)中也可以自己實(shí)現(xiàn),實(shí)現(xiàn)一個(gè)自己的 @Enable 開(kāi)頭的注解來(lái)實(shí)現(xiàn)特定的功能

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

相關(guān)文章

最新評(píng)論

确山县| 台南市| 岢岚县| 新竹县| 芮城县| 永康市| 岱山县| 桦甸市| 鹰潭市| 济南市| 南川市| 兴安县| 修水县| 南陵县| 江都市| 金平| 砚山县| 竹北市| 越西县| 辰溪县| 北流市| 禹州市| 手游| 黎城县| 滦平县| 西安市| 屏南县| 商南县| 广昌县| 抚顺市| 博湖县| 无棣县| 行唐县| 措勤县| 公主岭市| 乃东县| 六安市| 宁明县| 河北省| 桃源县| 韩城市|