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

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

@Async注解失效的 9 種場景

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

前言

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

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

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

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

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

1 未使用@EnableAsync注解

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

例如:BfS28資訊網(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)閉的。BfS28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

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

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

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

3 方法非public

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

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

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

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

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

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

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

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

4 方法返回值錯誤

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

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

例如:BfS28資訊網(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注解的異步功能失效。BfS28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

5 方法用static修飾了

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

但如果在@Async方法上加了static修飾符,例如:BfS28資訊網(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 。BfS28資訊網(wǎng)——每日最新資訊28at.com

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

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

6 方法用final修飾

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

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

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

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

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

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

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

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

有時候,我們在新加Service類時,會忘了加@Service注解,例如:BfS28資訊網(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的異步功能。BfS28資訊網(wǎng)——每日最新資訊28at.com

8 自己new的對象

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

但如果new了一個Service類的對象,可能會出現(xiàn)一些意想不到的問題,例如:BfS28資訊網(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()方法。BfS28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

9 Spring無法掃描異步類

我們在Spring項目中可以使用@ComponentScan注解指定項目中掃描的包路徑,例如:BfS28資訊網(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注解異步的功能失效。BfS28資訊網(wǎng)——每日最新資訊28at.com

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

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

本文鏈接:http://m.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)簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
影音先锋日韩资源| 欧美精品首页| 午夜在线成人av| 午夜一区在线| 久久久久久久久久久一区| 鲁大师成人一区二区三区| 欧美国产视频在线| 国产精品电影网站| 国产亚洲欧美一区| 亚洲国产成人tv| 亚洲激情电影在线| 亚洲综合丁香| 榴莲视频成人在线观看| 欧美日韩一视频区二区| 国产欧亚日韩视频| 亚洲国产一区视频| 亚洲字幕在线观看| 麻豆国产精品777777在线| 欧美日韩在线观看一区二区三区| 国产欧美综合在线| 91久久精品国产| 亚洲欧美日韩国产中文| 乱中年女人伦av一区二区| 欧美调教vk| 在线电影国产精品| 亚洲在线不卡| 蜜臀99久久精品久久久久久软件| 欧美午夜视频| 1769国产精品| 午夜精品福利在线观看| 欧美福利在线| 国产主播在线一区| 在线中文字幕日韩| 蜜臀av在线播放一区二区三区 | 亚洲视频在线一区观看| 国产综合久久久久久| 红桃视频国产精品| 国产日韩av一区二区| 激情综合视频| 国产精品男gay被猛男狂揉视频| 一区二区在线观看视频| 亚洲一区二区成人| 免费黄网站欧美| 国产情侣一区| 亚洲性人人天天夜夜摸| 欧美成人自拍| 狠狠噜噜久久| 亚洲欧美美女| 欧美色欧美亚洲高清在线视频| 激情欧美一区| 亚洲欧美日韩视频一区| 欧美日韩理论| 亚洲日本欧美天堂| 久久亚洲精品一区| 国产一区二区三区在线观看网站 | 亚洲国产影院| 久久国产精品久久久久久电车| 国产精品成av人在线视午夜片| 亚洲精品一级| 男人插女人欧美| 国内成人自拍视频| 欧美一区二区三区久久精品茉莉花| 欧美日韩在线另类| 日韩一二在线观看| 欧美激情一区二区在线| 在线日本欧美| 久久在线免费观看视频| 黄色成人av网| 久久精品免费看| 国产乱码精品一区二区三区av| 中日韩男男gay无套| 欧美日韩国产美| 亚洲精品一级| 欧美久久精品午夜青青大伊人| 亚洲国产欧美一区二区三区同亚洲 | 国内一区二区三区| 欧美中文字幕在线观看| 国产女主播一区二区| 亚洲欧美日韩人成在线播放| 国产精品久久久久9999| 亚洲伊人网站| 国产精品亚发布| 午夜在线播放视频欧美| 国产九区一区在线| 性欧美精品高清| 国产亚洲一区在线| 久久久久久久一区| 亚洲成人直播| 欧美激情91| 99精品视频网| 国产精品久久久久久影院8一贰佰| 亚洲性感美女99在线| 国产精品久久久久影院色老大| 亚洲欧美日韩国产综合精品二区| 国产精品入口夜色视频大尺度| 亚洲欧美韩国| 国产综合自拍| 老牛嫩草一区二区三区日本| 亚洲第一免费播放区| 欧美电影美腿模特1979在线看| 亚洲区第一页| 欧美日本韩国一区二区三区| 亚洲一区二区三区精品在线 | 欧美高清在线一区| 欧美日韩国产综合一区二区| 亚洲精品中文字幕女同| 尤物yw午夜国产精品视频| 久久久久久自在自线| 在线观看国产日韩| 欧美精品电影| 亚洲永久免费视频| 国产午夜精品全部视频在线播放| 久久久久www| 亚洲黑丝一区二区| 欧美性猛交一区二区三区精品| 亚洲欧美久久久久一区二区三区| 国产一区二区在线免费观看| 老司机免费视频一区二区三区| 亚洲精品男同| 国产精品丝袜xxxxxxx| 久久免费视频网| 9久草视频在线视频精品| 国产精品一区二区在线观看网站 | 日韩一级在线| 国产美女精品一区二区三区| 久久一日本道色综合久久| 日韩视频免费在线观看| 国产欧美日韩亚州综合| 欧美成人福利视频| 亚洲欧美日韩在线| 在线观看日韩欧美| 国产精品久久久久久户外露出| 久久久一区二区| 亚洲少妇一区| 在线观看欧美成人| 国产精品高潮在线| 老色批av在线精品| 亚洲男人天堂2024| 亚洲国产日韩精品| 国产欧美不卡| 欧美日本高清视频| 久久久久91| 亚洲天堂网站在线观看视频| 一区二区三区自拍| 国产精品每日更新在线播放网址| 鲁大师成人一区二区三区| 亚洲一区二区免费看| 亚洲成人在线视频播放| 国产精品私拍pans大尺度在线| 欧美成人一区在线| 欧美一区二区在线免费播放| 亚洲精品乱码久久久久久黑人| 国产亚洲欧美日韩美女| 欧美日韩在线观看一区二区| 久久综合色一综合色88| 亚洲欧美国产一区二区三区| 亚洲欧洲一区二区三区| 国产一区二区三区高清| 欧美成人首页| 欧美一区二区成人6969| 亚洲精品视频在线| 韩国免费一区| 国产精品老牛| 欧美理论大片| 久久免费精品视频| 亚洲影院高清在线| 日韩午夜一区| 亚洲国产一区在线| 精品av久久707| 国产欧美精品在线| 欧美性天天影院| 欧美激情影院| 老色鬼精品视频在线观看播放| 久久xxxx| 午夜宅男久久久| 亚洲香蕉网站| 一本色道**综合亚洲精品蜜桃冫| 91久久国产综合久久91精品网站| 黄色成人在线| 国产视频一区二区三区在线观看| 国产精品第一区| 欧美三级精品| 欧美日韩国产免费| 欧美韩国一区| 欧美大片国产精品| 蜜桃av综合| 老司机67194精品线观看| 久久精品亚洲精品国产欧美kt∨| 香蕉免费一区二区三区在线观看 | 午夜欧美理论片| 亚洲在线观看免费视频| 在线一区二区视频| 在线视频精品一区| 一区二区三区日韩在线观看| 日韩一级在线观看| 99天天综合性| 一本色道88久久加勒比精品| 亚洲精品一区二区三区樱花| 91久久综合亚洲鲁鲁五月天| 亚洲二区免费| 亚洲人成啪啪网站| 亚洲免费av观看| 一区二区三区国产在线观看| 一区二区三区免费在线观看|