日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

@Async注解失效的 9 種場景

來源: 責(zé)編: 時間:2024-05-07 09:07:55 163觀看
導(dǎo)讀前言最近有粉絲問了我一個問題:他在項目某個方法使用@Async注解,但是該方法還是同步執(zhí)行了,異步不起作用,到底是什么原因呢?偽代碼如下:@Slf4j@Servicepublic class UserService { @Async public void async(String v

前言

最近有粉絲問了我一個問題:他在項目某個方法使用@Async注解,但是該方法還是同步執(zhí)行了,異步不起作用,到底是什么原因呢?TqD28資訊網(wǎng)——每日最新資訊28at.com

偽代碼如下:TqD28資訊網(wǎng)——每日最新資訊28at.com

@Slf4j@Servicepublic class UserService {    @Async    public void async(String value) {        log.info("async:" + value);    }}

這個問題還是比較有意思的,今天這篇文章總結(jié)了@Async注解失效的9種場景,希望對你會有所幫助。TqD28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片TqD28資訊網(wǎng)——每日最新資訊28at.com

1 未使用@EnableAsync注解

在Spring中要開啟@Async注解異步的功能,需要在項目的啟動類,或者配置類上,使用@EnableAsync注解。TqD28資訊網(wǎng)——每日最新資訊28at.com

例如:TqD28資訊網(wǎng)——每日最新資訊28at.com

@EnableAsync@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})public class Application {    public static void main(String[] args) {        SpringApplication.run(Application.class, args);    }}

@EnableAsync注解相當(dāng)于一個開關(guān),控制是否開啟@Async注解異步的功能,默認(rèn)是關(guān)閉的。TqD28資訊網(wǎng)——每日最新資訊28at.com

如果在項目的啟動類上沒使用@EnableAsync注解,則@Async注解異步的功能不生效。TqD28資訊網(wǎng)——每日最新資訊28at.com

2 內(nèi)部方法調(diào)用

我們在日常開發(fā)中,經(jīng)常需要在一個方法中調(diào)用另外一個方法,例如:TqD28資訊網(wǎng)——每日最新資訊28at.com

@Slf4j@Servicepublic class UserService {    public void test() {        async("test");    }    @Async    public void async(String value) {        log.info("async:{}", value);    }}

這個示例中,在UserService類中的test()方法中調(diào)用了async()方法。TqD28資訊網(wǎng)——每日最新資訊28at.com

如果在controller中@Autowired了UserService類的對象,調(diào)用了它的test()方法,則async()異步的功能會失效。TqD28資訊網(wǎng)——每日最新資訊28at.com

我們知道Spring通過@Async注解實現(xiàn)異步的功能,底層其實是通過Spring的AOP實現(xiàn)的,也就是說它需要通過JDK動態(tài)代理或者cglib,生成代理對象。TqD28資訊網(wǎng)——每日最新資訊28at.com

異步的功能,是在代理對象中增加的,我們必須調(diào)用代理對象的test()方法才行。TqD28資訊網(wǎng)——每日最新資訊28at.com

而在類中直接進(jìn)行方法的內(nèi)部調(diào)用,在test()方法中調(diào)用async()方法,調(diào)用的是該類原對象的async方法,相當(dāng)于調(diào)用了this.async()方法,而并非UserService代理類的async()方法。TqD28資訊網(wǎng)——每日最新資訊28at.com

因此,像這種內(nèi)部方法調(diào)用,@Async注解的異步功能會失效。TqD28資訊網(wǎng)——每日最新資訊28at.com

3 方法非public

在Java中有4種權(quán)限修飾符TqD28資訊網(wǎng)——每日最新資訊28at.com

  • public:所有類都可以訪問。
  • private:只能同一個類訪問。
  • protected:同一個類,同一個包下的其他類,不同包下的子類可以訪問。
  • 默認(rèn)修飾符:同一個類,同一個包下的其他類可以訪問。

在實際工作中,我們使用頻率最高的可能是public和private了。TqD28資訊網(wǎng)——每日最新資訊28at.com

如果我在定義Service類中的某個方法時,有時把權(quán)限修飾符定義錯了,例如:TqD28資訊網(wǎng)——每日最新資訊28at.com

@Slf4j@Servicepublic class UserService {    @Async    private void async(String value) {        log.info("async:{}", value);    }}

這個例子中將UserService類的async()方法的權(quán)限修飾符定義成了private的,這樣@Async注解也會失效。TqD28資訊網(wǎng)——每日最新資訊28at.com

因為private修飾的方法,只能在UserService類的對象中使用。TqD28資訊網(wǎng)——每日最新資訊28at.com

而@Async注解的異步功能,需要使用Spring的AOP生成UserService類的代理對象,該代理對象沒法訪問UserService類的private方法,因此會出現(xiàn)@Async注解失效的問題。TqD28資訊網(wǎng)——每日最新資訊28at.com

4 方法返回值錯誤

我們在寫一個新的方法時,經(jīng)常需要定義方法的返回值。TqD28資訊網(wǎng)——每日最新資訊28at.com

返回值可以是void、int、String、User等等,但如果返回值定義錯誤,也可能會導(dǎo)致@Async注解的異步功能失效。TqD28資訊網(wǎng)——每日最新資訊28at.com

例如:TqD28資訊網(wǎng)——每日最新資訊28at.com

@Servicepublic class UserService {    @Async    public String async(String value) {        log.info("async:{}", value);        return value;    }}

UserService類的async方法的返回值是String,這種情況竟然會導(dǎo)致@Async注解的異步功能失效。TqD28資訊網(wǎng)——每日最新資訊28at.com

在AsyncExecutionInterceptor類的invoke()方法,會調(diào)用它的父類AsyncExecutionAspectSupport中的doSubmit方法,該方法時異步功能的核心代碼,如下:TqD28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片TqD28資訊網(wǎng)——每日最新資訊28at.com

從圖中看出,@Async注解的異步方法的返回值,要么是Future,要么是null。TqD28資訊網(wǎng)——每日最新資訊28at.com

因此,在實際項目中,如果想要使用@Async注解的異步功能,相關(guān)方法的返回值必須是void或者Future。TqD28資訊網(wǎng)——每日最新資訊28at.com

5 方法用static修飾了

有時候,我們的方法會使用static修飾,這樣在調(diào)用的地方,可以直接使用類名.方法名,訪問該方法了。TqD28資訊網(wǎng)——每日最新資訊28at.com

但如果在@Async方法上加了static修飾符,例如:TqD28資訊網(wǎng)——每日最新資訊28at.com

@Slf4j@Servicepublic class UserService {    @Async    public static void async(String value) {        log.info("async:{}", value);    }}

這時@Async的異步功能會失效,因為這種情況idea會直接報錯:Methods annotated with '@Async' must be overridable 。TqD28資訊網(wǎng)——每日最新資訊28at.com

使用@Async注解聲明的方法,必須是能被重寫的,很顯然static修飾的方法,是類的靜態(tài)方法,是不允許被重寫的。TqD28資訊網(wǎng)——每日最新資訊28at.com

因此這種情況下,@Async注解的異步功能會失效。TqD28資訊網(wǎng)——每日最新資訊28at.com

6 方法用final修飾

在Java種final關(guān)鍵字,是一個非常特別的存在。TqD28資訊網(wǎng)——每日最新資訊28at.com

用final修飾的類,沒法被繼承。TqD28資訊網(wǎng)——每日最新資訊28at.com

用final修飾的方法,沒法被重寫。TqD28資訊網(wǎng)——每日最新資訊28at.com

用final修飾的變量,沒法被修改。TqD28資訊網(wǎng)——每日最新資訊28at.com

如果final使用不當(dāng),也會導(dǎo)致@Async注解的異步功能失效,例如:TqD28資訊網(wǎng)——每日最新資訊28at.com

@Slf4j@Servicepublic class UserService {    public void test() {        async("test");    }    @Async    public  final void async(String value) {        log.info("async:{}", value);    }}

這種情況下idea也會直接報錯:Methods annotated with '@Async' must be overridable 。TqD28資訊網(wǎng)——每日最新資訊28at.com

因為使用final關(guān)鍵字修飾的方法,是沒法被子類重寫的。TqD28資訊網(wǎng)——每日最新資訊28at.com

因此這種情況下,@Async注解的異步功能會失效。TqD28資訊網(wǎng)——每日最新資訊28at.com

7 業(yè)務(wù)類沒加@Service注解

有時候,我們在新加Service類時,會忘了加@Service注解,例如:TqD28資訊網(wǎng)——每日最新資訊28at.com

@Slf4j//@Servicepublic class UserService {    @Async    public void async(String value) {        log.info("async:{}", value);    }}@Servicepublic class TestService {   @Autowired   private UserService userService;    public void test() {        userService.async("test");    }}

這種情況下,@Async注解異步的功能也不會生效。因為UserService類沒有使用@Service、@Component或者@Controller等注解聲明,該類不會被Spring管理,因此也就無法使用Spring的異步功能。TqD28資訊網(wǎng)——每日最新資訊28at.com

8 自己new的對象

在項目中,我們經(jīng)常需要new一個對象,然后對他賦值,或者調(diào)用它的方法。TqD28資訊網(wǎng)——每日最新資訊28at.com

但如果new了一個Service類的對象,可能會出現(xiàn)一些意想不到的問題,例如:TqD28資訊網(wǎng)——每日最新資訊28at.com

@Slf4j@Servicepublic class UserService {    @Async    public void async(String value) {        log.info("async:{}", value);    }}@Servicepublic class TestService {    public void test() {        UserService userService = new UserService();        userService.async("test");    }}

在TestService類的test()方法中,new了一個UserService類的對象,然后調(diào)用該對象的async()方法。TqD28資訊網(wǎng)——每日最新資訊28at.com

很顯然這種情況下,async()方法只能同步執(zhí)行,沒法異步執(zhí)行。TqD28資訊網(wǎng)——每日最新資訊28at.com

因為在項目中,我們自己new的對象,不會被Spring管理,因此也就無法使用Spring的異步功能。TqD28資訊網(wǎng)——每日最新資訊28at.com

不過我們可以通過BeanPostProcessor類,將創(chuàng)建的對象手動注入到Spring容器中。TqD28資訊網(wǎng)——每日最新資訊28at.com

9 Spring無法掃描異步類

我們在Spring項目中可以使用@ComponentScan注解指定項目中掃描的包路徑,例如:TqD28資訊網(wǎng)——每日最新資訊28at.com

@ComponentScan({"com.susan.demo.service1"})@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})public class Application {    public static void main(String[] args) {        SpringApplication.run(Application.class, args);    }}

項目中com.susan.demo.service1這個路徑是不存在的,會導(dǎo)致@Async注解異步的功能失效。TqD28資訊網(wǎng)——每日最新資訊28at.com

同時如果@ComponentScan注解定義的路徑,沒有包含你新加的Servcie類的路徑,@Async注解異步的功能也會失效。TqD28資訊網(wǎng)——每日最新資訊28at.com

好了,今天的文章內(nèi)容先到這里。TqD28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-86983-0.html@Async注解失效的 9 種場景

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: LayoutInflater的工作原理,從解析XML布局文件到創(chuàng)建Java對象,再到構(gòu)建View樹

下一篇: 新鮮出爐,截止到2024年5月最火爆的幾個前端開源庫

標(biāo)簽:
  • 熱門焦點
  • 一加Ace2 Pro官宣:普及16G內(nèi)存 引領(lǐng)24G

    一加官方今天繼續(xù)為本月發(fā)布的新機(jī)一加Ace2 Pro帶來預(yù)熱,公布了內(nèi)存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引領(lǐng),還有呢?#一加Ace2Pro#,2023 年 8 月,敬請期待。”同時
  • Automa-通過連接塊來自動化你的瀏覽器

    1、前言通過瀏覽器插件可實現(xiàn)自動化腳本的錄制與編寫,具有代表性的工具就是:Selenium IDE、Katalon Recorder,對于簡單的業(yè)務(wù)來說可快速實現(xiàn)自動化的上手工作。Selenium IDEKat
  • JavaScript學(xué)習(xí) -AES加密算法

    引言在當(dāng)今數(shù)字化時代,前端應(yīng)用程序扮演著重要角色,用戶的敏感數(shù)據(jù)經(jīng)常在前端進(jìn)行加密和解密操作。然而,這樣的操作在網(wǎng)絡(luò)傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數(shù)據(jù)
  • 使用LLM插件從命令行訪問Llama 2

    最近的一個大新聞是Meta AI推出了新的開源授權(quán)的大型語言模型Llama 2。這是一項非常重要的進(jìn)展:Llama 2可免費用于研究和商業(yè)用途。(幾小時前,swyy發(fā)現(xiàn)它已從LLaMA 2更名為Lla
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標(biāo)系統(tǒng)提供非預(yù)期的輸入并監(jiān)視異常結(jié)果來發(fā)現(xiàn)軟件漏洞的方法。可以用來發(fā)現(xiàn)應(yīng)用程序、操作系統(tǒng)和網(wǎng)絡(luò)協(xié)議等中的漏洞或
  • 小米汽車電池信息疑似曝光:容量101kWh,支持800V高壓快充

    7月14日消息,今日一名博主在社交媒體發(fā)布了一張疑似小米汽車電池信息的照片,顯示該電池包正是寧德時代麒麟電池,容量為101kWh,電壓為726.7V,可以預(yù)測小
  • 三星電子Q2營收60萬億韓元 存儲業(yè)務(wù)營收同比仍下滑超過50%

    7月27日消息,據(jù)外媒報道,從三星電子所發(fā)布的財報來看,他們主要利潤來源的存儲芯片業(yè)務(wù)在今年二季度仍不樂觀,營收同比仍在大幅下滑,所在的設(shè)備解決方案
  • 7月4日見!iQOO 11S官宣:“雞血版”驍龍8 Gen2+200W快充加持

    上半年已接近尾聲,截至目前各大品牌旗下的頂級旗艦都已悉數(shù)亮相,而下半年即將推出的頂級旗艦已經(jīng)成為了數(shù)碼圈爆料的主流,其中就包括全新的iQOO 11S系
  • 引領(lǐng)旗艦級影像能力向中端機(jī)普及 OPPO K11 系列發(fā)布 1799 元起

    7月25日,OPPO正式發(fā)布K系列新品—— OPPO K11 。此次 K11 在中端手機(jī)市場長期被忽視的影像板塊發(fā)力,突破性地搭載索尼 IMX890 旗艦大底主攝,支持 OIS
Top 主站蜘蛛池模板: 扶余县| 浪卡子县| 盐山县| 英超| 贵溪市| 南靖县| 厦门市| 津市市| 永顺县| 岐山县| 嘉禾县| 鄂托克前旗| 黄石市| 肃宁县| 开封县| 青龙| 福安市| 道真| 江津市| 吐鲁番市| 独山县| 桂东县| 铜鼓县| 道真| 万山特区| 和田市| 新巴尔虎右旗| 明溪县| 屏边| 桑日县| 石阡县| 阿坝县| 宜良县| 宿迁市| 科技| 廉江市| 博兴县| 绥滨县| 镇远县| 秭归县| 永安市|