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

Java中@Async異步失效的9種場(chǎng)景

 更新時(shí)間:2024年05月08日 09:39:22   作者:蘇三說技術(shù)  
最近在項(xiàng)目某個(gè)方法使用@Async注解,但是該方法還是同步執(zhí)行了,異步不起作用,到底是什么原因呢?接下來本文給大家介紹了Java?@Async異步失效的9種場(chǎng)景,需要的朋友可以參考下

前言

最近有粉絲問了我一個(gè)問題:他在項(xiàng)目某個(gè)方法使用@Async注解,但是該方法還是同步執(zhí)行了,異步不起作用,到底是什么原因呢?

偽代碼如下:

@Slf4j
@Service
public?class?UserService?{

????@Async
????public?void?async(String?value)?{
????????log.info("async:" + value);
????}
}

這個(gè)問題還是比較有意思的,今天這篇文章總結(jié)了@Async注解失效的9種場(chǎng)景,希望對(duì)你會(huì)有所幫助。

1 未使用@EnableAsync注解

在Spring中要開啟@Async注解異步的功能,需要在項(xiàng)目的啟動(dòng)類,或者配置類上,使用@EnableAsync注解。

例如:

@EnableAsync
@SpringBootApplication(exclude?=?{DataSourceAutoConfiguration.class})
public?class?Application?{

????public?static?void?main(String[]?args)?{
????????SpringApplication.run(Application.class,?args);
????}
}

@EnableAsync注解相當(dāng)于一個(gè)開關(guān),控制是否開啟@Async注解異步的功能,默認(rèn)是關(guān)閉的。

如果在項(xiàng)目的啟動(dòng)類上沒使用@EnableAsync注解,則@Async注解異步的功能不生效。

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

我們?cè)谌粘i_發(fā)中,經(jīng)常需要在一個(gè)方法中調(diào)用另外一個(gè)方法,例如:

@Slf4j
@Service
public?class?UserService?{

????public?void?test()?{
????????async("test");
????}

????@Async
????public?void?async(String?value)?{
????????log.info("async:{}",?value);
????}
}

這個(gè)示例中,在UserService類中的test()方法中調(diào)用了async()方法。

如果在controller中@Autowired了UserService類的對(duì)象,調(diào)用了它的test()方法,則async()異步的功能會(huì)失效。

我們知道Spring通過@Async注解實(shí)現(xiàn)異步的功能,底層其實(shí)是通過Spring的AOP實(shí)現(xiàn)的,也就是說它需要通過JDK動(dòng)態(tài)代理或者cglib,生成代理對(duì)象。

異步的功能,是在代理對(duì)象中增加的,我們必須調(diào)用代理對(duì)象的test()方法才行。

而在類中直接進(jìn)行方法的內(nèi)部調(diào)用,在test()方法中調(diào)用async()方法,調(diào)用的是該類原對(duì)象的async方法,相當(dāng)于調(diào)用了this.async()方法,而并非UserService代理類的async()方法。

因此,像這種內(nèi)部方法調(diào)用,@Async注解的異步功能會(huì)失效。

3 方法非public

在Java中有4種權(quán)限修飾符

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

在實(shí)際工作中,我們使用頻率最高的可能是public和private了。

如果我在定義Service類中的某個(gè)方法時(shí),有時(shí)把權(quán)限修飾符定義錯(cuò)了,例如:

@Slf4j
@Service
public?class?UserService?{

????@Async
????private?void?async(String?value)?{
????????log.info("async:{}",?value);
????}
}

這個(gè)例子中將UserService類的async()方法的權(quán)限修飾符定義成了private的,這樣@Async注解也會(huì)失效。

因?yàn)閜rivate修飾的方法,只能在UserService類的對(duì)象中使用。

而@Async注解的異步功能,需要使用Spring的AOP生成UserService類的代理對(duì)象,該代理對(duì)象沒法訪問UserService類的private方法,因此會(huì)出現(xiàn)@Async注解失效的問題。

4 方法返回值錯(cuò)誤

我們?cè)趯懸粋€(gè)新的方法時(shí),經(jīng)常需要定義方法的返回值。

返回值可以是void、int、String、User等等,但如果返回值定義錯(cuò)誤,也可能會(huì)導(dǎo)致@Async注解的異步功能失效。

例如:

@Service
public?class?UserService?{

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

UserService類的async方法的返回值是String,這種情況竟然會(huì)導(dǎo)致@Async注解的異步功能失效。

在AsyncExecutionInterceptor類的invoke()方法,會(huì)調(diào)用它的父類AsyncExecutionAspectSupport中的doSubmit方法,該方法時(shí)異步功能的核心代碼,如下:

從圖中看出,@Async注解的異步方法的返回值,要么是Future,要么是null。

因此,在實(shí)際項(xiàng)目中,如果想要使用@Async注解的異步功能,相關(guān)方法的返回值必須是void或者Future

5 方法用static修飾了

有時(shí)候,我們的方法會(huì)使用static修飾,這樣在調(diào)用的地方,可以直接使用類名.方法名,訪問該方法了。

但如果在@Async方法上加了static修飾符,例如:

@Slf4j
@Service
public?class?UserService?{

????@Async
????public?static?void?async(String?value)?{
????????log.info("async:{}",?value);
????}
}

這時(shí)@Async的異步功能會(huì)失效,因?yàn)檫@種情況idea會(huì)直接報(bào)錯(cuò):Methods annotated with '@Async' must be overridable 。

使用@Async注解聲明的方法,必須是能被重寫的,很顯然static修飾的方法,是類的靜態(tài)方法,是不允許被重寫的。

因此這種情況下,@Async注解的異步功能會(huì)失效。

6 方法用final修飾

在Java種final關(guān)鍵字,是一個(gè)非常特別的存在。

用final修飾的類,沒法被繼承。

用final修飾的方法,沒法被重寫。

用final修飾的變量,沒法被修改。

如果final使用不當(dāng),也會(huì)導(dǎo)致@Async注解的異步功能失效,例如:

@Slf4j
@Service
public?class?UserService?{

????public?void?test()?{
????????async("test");
????}

????@Async
????public??final?void?async(String?value)?{
????????log.info("async:{}",?value);
????}
}

這種情況下idea也會(huì)直接報(bào)錯(cuò):Methods annotated with '@Async' must be overridable 。

因?yàn)槭褂胒inal關(guān)鍵字修飾的方法,是沒法被子類重寫的。

因此這種情況下,@Async注解的異步功能會(huì)失效。

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

有時(shí)候,我們?cè)谛录覵ervice類時(shí),會(huì)忘了加@Service注解,例如:

@Slf4j
//@Service
public?class?UserService?{

????@Async
????public?void?async(String?value)?{
????????log.info("async:{}",?value);
????}
}

@Service
public?class?TestService?{

???@Autowired
???private?UserService?userService;

????public?void?test()?{
????????userService.async("test");
????}
}

這種情況下,@Async注解異步的功能也不會(huì)生效。因?yàn)閁serService類沒有使用@Service、@Component或者@Controller等注解聲明,該類不會(huì)被Spring管理,因此也就無法使用Spring的異步功能。

8 自己new的對(duì)象

在項(xiàng)目中,我們經(jīng)常需要new一個(gè)對(duì)象,然后對(duì)他賦值,或者調(diào)用它的方法。

但如果new了一個(gè)Service類的對(duì)象,可能會(huì)出現(xiàn)一些意想不到的問題,例如:

@Slf4j
@Service
public?class?UserService?{

????@Async
????public?void?async(String?value)?{
????????log.info("async:{}",?value);
????}
}

@Service
public?class?TestService?{

????public?void?test()?{
????????UserService?userService?=?new?UserService();
????????userService.async("test");
????}
}

在TestService類的test()方法中,new了一個(gè)UserService類的對(duì)象,然后調(diào)用該對(duì)象的async()方法。

很顯然這種情況下,async()方法只能同步執(zhí)行,沒法異步執(zhí)行。

因?yàn)樵陧?xiàng)目中,我們自己new的對(duì)象,不會(huì)被Spring管理,因此也就無法使用Spring的異步功能。

不過我們可以通過BeanPostProcessor類,將創(chuàng)建的對(duì)象手動(dòng)注入到Spring容器中。

9 Spring無法掃描異步類

我們?cè)赟pring項(xiàng)目中可以使用@ComponentScan注解指定項(xiàng)目中掃描的包路徑,例如:

@ComponentScan({"com.susan.demo.service1"})
@SpringBootApplication(exclude?=?{DataSourceAutoConfiguration.class})
public?class?Application?{

????public?static?void?main(String[]?args)?{
????????SpringApplication.run(Application.class,?args);
????}
}

項(xiàng)目中com.susan.demo.service1這個(gè)路徑是不存在的,會(huì)導(dǎo)致@Async注解異步的功能失效。

同時(shí)如果@ComponentScan注解定義的路徑,沒有包含你新加的Servcie類的路徑,@Async注解異步的功能也會(huì)失效。

以上就是Java中@Async異步失效的9種場(chǎng)景的詳細(xì)內(nèi)容,更多關(guān)于Java @Async異步失效的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot自定義雪花算法生成ID的實(shí)現(xiàn)示例

    SpringBoot自定義雪花算法生成ID的實(shí)現(xiàn)示例

    雪花算法是一種生成唯一ID的分布式算法,它能生成不重復(fù)的、有時(shí)間順序的全局唯一ID,本文主要介紹了SpringBoot自定義雪花算法生成ID的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • java下載指定文件并返回給前端返回流文件的實(shí)現(xiàn)步驟

    java下載指定文件并返回給前端返回流文件的實(shí)現(xiàn)步驟

    在Java中我們可以根據(jù)文件地址返回一個(gè)文件流,以便對(duì)文件進(jìn)行讀取、寫入等操作,下面這篇文章主要給大家介紹了關(guān)于java下載指定文件并返回給前端返回流文件的實(shí)現(xiàn)步驟,需要的朋友可以參考下
    2024-03-03
  • Spring Boot啟動(dòng)過程(六)之內(nèi)嵌Tomcat中StandardHost、StandardContext和StandardWrapper的啟動(dòng)教程詳解

    Spring Boot啟動(dòng)過程(六)之內(nèi)嵌Tomcat中StandardHost、StandardContext和Sta

    這篇文章主要介紹了Spring Boot啟動(dòng)過程(六)之內(nèi)嵌Tomcat中StandardHost、StandardContext和StandardWrapper的啟動(dòng)教程詳解,需要的朋友可以參考下
    2017-04-04
  • Java實(shí)現(xiàn)中英文詞典功能

    Java實(shí)現(xiàn)中英文詞典功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)中英文詞典功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • springboot+thymeleaf+layui的實(shí)現(xiàn)示例

    springboot+thymeleaf+layui的實(shí)現(xiàn)示例

    本文主要介紹了springboot+thymeleaf+layui的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • 深扒Java中POJO、VO、DO、DTO、PO、BO、AO、DAO的概念和區(qū)別以及如何應(yīng)用

    深扒Java中POJO、VO、DO、DTO、PO、BO、AO、DAO的概念和區(qū)別以及如何應(yīng)用

    po vo bo dto dao 和 pojo 是軟件開發(fā)中經(jīng)常使用的一些概念,用于設(shè)計(jì)和實(shí)現(xiàn)對(duì)象模型,下面將分別解釋這些概念的含義及其在開發(fā)中的應(yīng)用,這篇文章主要給大家介紹了關(guān)于Java中POJO、VO、DO、DTO、PO、BO、AO、DAO的概念和區(qū)別以及如何應(yīng)用的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • java設(shè)計(jì)模式之抽像工廠詳解

    java設(shè)計(jì)模式之抽像工廠詳解

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之抽像工廠的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Spring Boot 配置文件詳解(小結(jié))

    Spring Boot 配置文件詳解(小結(jié))

    Spring Boot提供了兩種常用的配置文件,分別是properties文件和yml文件。本章重點(diǎn)介紹yml的語法和從配置文件中取值。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • springboot對(duì)象為null的屬性在json中不顯示的解決

    springboot對(duì)象為null的屬性在json中不顯示的解決

    這篇文章主要介紹了springboot對(duì)象為null的屬性在json中不顯示的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Nacos注冊(cè)中心和配置中心的底層原理全面解讀

    Nacos注冊(cè)中心和配置中心的底層原理全面解讀

    這篇文章主要介紹了Nacos注冊(cè)中心和配置中心的底層原理的全面解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06

最新評(píng)論

呼图壁县| 禹城市| 阳西县| 磐石市| 荆州市| 泾源县| 礼泉县| 工布江达县| 蓬莱市| 荥阳市| 亳州市| 乡宁县| 平山县| 新平| 和田县| 普宁市| 威海市| 成安县| 白朗县| 静安区| 江油市| 玉龙| 尤溪县| 宜兰市| 德安县| 漯河市| 合作市| 阜新市| 东台市| 舒城县| 进贤县| 清流县| 双江| 扎囊县| 水富县| 鄂伦春自治旗| 大丰市| 闸北区| 安塞县| 勃利县| 宁河县|