SpringBoot中如何支持異步方法?
很高興回答你的問(wèn)題。
有時(shí)我們的系統(tǒng)可能需要異步,也就是說(shuō),一個(gè)請(qǐng)求可能有兩個(gè)或多個(gè)線程。
異步用法@EnableAsync批注
要使用@Async,首先需要使用@EnableAsync注釋來(lái)打開(kāi)SpringBoot中的異步特性。
阻力比
公共類(lèi)AppConfig{
}
注1。沒(méi)有參數(shù)和返回值的方法
您可以用@Async注釋來(lái)修飾該方法,這表明該方法是異步調(diào)用的。換句話說(shuō),程序在調(diào)用這個(gè)方法時(shí)會(huì)立即返回,方法的實(shí)際執(zhí)行發(fā)生在已經(jīng)提交給SpringTaskExecutor的任務(wù)中。在最簡(jiǎn)單的情況下,您可以將批注應(yīng)用于返回void的方法,如下例所示:
r
voiddoSomething(){
//這將異步執(zhí)行
}
2.有參數(shù)但沒(méi)有返回值的方法
與使用@Scheduled注釋的方法不同,這些方法可以指定參數(shù),因?yàn)樗鼈兪怯?正常",而不是由容器管理的計(jì)劃任務(wù)。例如,以下代碼是@Async批注的合法應(yīng)用:
r
voiddoSomething(字符串){
//這將異步執(zhí)行
}
3.帶有參數(shù)和返回值的方法
您甚至可以調(diào)用異步返回值的方法。但是,這些方法需要一個(gè)Future類(lèi)型的返回值。這仍然提供了異步執(zhí)行的好處,因此調(diào)用者可以在將來(lái)調(diào)用get()之前執(zhí)行其他任務(wù)。下面的示例顯示了如何在返回值的方法上使用@Async:
r
FutureStringreturnsomething(intI){
//這將異步執(zhí)行
}
管理@Async的異常當(dāng)@Async方法的返回值類(lèi)型為Future時(shí),很容易管理方法執(zhí)行過(guò)程中拋出的異常,因?yàn)檎{(diào)用get結(jié)果時(shí)會(huì)拋出異常。但是,對(duì)于返回值類(lèi)型為void的方法,異常不會(huì)被捕獲,也不能被傳輸。您可以提供AsyncUncaughtExceptionHandler來(lái)處理這種異常。以下示例顯示了如何做到這一點(diǎn):
公共類(lèi)myasyncunchaughtexceptionhandlerimplementsasynuncaughtexceptionhandler{
r
公共voidhandleuncautchexc
springboot各個(gè)層是怎么調(diào)用的?
每一層springboot調(diào)用的方法是構(gòu)建一個(gè)容量足夠大的容器,注入不同層次的相關(guān)文件,實(shí)現(xiàn)對(duì)象傳輸。spring配置文件applicationContext.xml是spring容器。
lt!-injectDao-gtltbeanid#34userdaoimpl#34class##34/gt。
類(lèi)中的類(lèi)被ioc容器用來(lái)創(chuàng)建bean對(duì)象,id是標(biāo)識(shí)節(jié)點(diǎn)lt!-注入服務(wù)-gt。
ltbeanid#34userserviceimpl#34class##34gt.
ltpropertyname#34userdao#34ref#34userdaoimpl#34gtlt/propertygt將dao層注入到服務(wù)層中,因?yàn)樵诜?wù)層中,要用dao層的對(duì)象調(diào)用Dao層的方法,并將創(chuàng)建的對(duì)象傳遞給userDao(userDao是serviceImpl中聲明的對(duì)象)lt/beangt。
Springboot分為控制器層、服務(wù)層、dao層和實(shí)體層,實(shí)際上分別指數(shù)據(jù)庫(kù)實(shí)體層、數(shù)據(jù)持久層、業(yè)務(wù)邏輯層和控制層。