<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
layout: post categories: Java title: 一文帶你瞭解 Spring 的@Enablexxx 註解 tagline: by 子悠 tags: - 子悠
前面的文章給大家介紹 Spring
的重試機制的時候有提到過 Spring
有很多 @Enable
開頭的註解,平時在使用的時候也沒有注意過為什麼會有這些註解,今天就給大家介紹一下。
首先我們先看一下有哪些常用的 @Enable
開頭的註解,以及都是幹什麼用的。
@EnableRetry
:開啟 Spring
的重試功能;@EnableScheduling
:開啟 Spring
的定時功能;@EnableAsync
:開啟 Spring
的非同步功能;@EnableAutoConfiguration
:開啟 Spring
的自動裝配功能;上面這幾個是我們經常會用到和看到的,都知道在使用相應的功能的時候,如果沒有設定上面的註解功能都是不生效的。以我們前面的文章的 Spring
重試為例,我們需要在啟動類上面設定 @EnableRetry
,否則自動重試註解 @Retryable
是不會生效的
那有的小夥伴就要問了,這個 @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
註解裡面包含多個設定類,不過這種在設定類較多的場景下還是相對不夠簡潔的,因而才有了各自功能對應的 @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
註解將設定類載入進來呢?在專案中的 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()); } }
啟動過後我們可以看到結果如下,提示我們在容器中找不到這個 bean
,有點小夥伴會說是不是 bean
的名字寫錯了,其實並不是,緊接著我們再把註釋的那一行放開再執行一下。
可以看到,這次我們成功的獲取到了這個 Bean
,這個實驗就是告訴我們,其實在預設情況下,Spring
的容器中是找不到RetryConfiguration
這個 Bean
的,因此我們需要通過使用 @Import
註解,將該類載入到容器中。
那麼為什麼在容器中找不到這個 Bean
呢?
其實很簡單,因為這個 Bean
跟我們當前環境的類是不是同一個包裡面的,在專案啟動的過程中並不會掃描到 RetryConfiguration
類所在的包,因此找不到是很正常的。
上面通過 @EnableRetry
這個註解帶大家瞭解了一下 Spring
的 @Enable
開頭的註解的使用原理,相信大家對這些註解有了更深入的瞭解。簡單來說就是因為我們要使用的很多類並不在我們專案所在的包下面,我們不能將所有的依賴包都進行掃描,也不不方便將所有的設定類都通過 @Import
的方式進行匯入,而是讓每個功能的專案包都提供一個 @Enable
開頭的註解,我們直接啟用註解就可以達到效果。
這種方式我們在平時的開發中也可以自己實現,實現一個自己的 @Enable
開頭的註解來實現特定的功能
以上就是一文詳解Spring的Enablexxx註解使用範例的詳細內容,更多關於Spring Enablexxx註解的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45