一、 spring 在掃描bean的時候會掃描方法上是否包含@async的註解spring
- 若是包含的,spring會爲這個bean動態的生成一個子類,咱們稱之爲代理類(?),代理類是繼承咱們所寫的bean的,而後把代理類注入進來,那此時,在執行此方法的時候,會到代理類中,代理類判斷了此方法須要異步執行,就不會調用父類(咱們本來寫的bean)的對應方法。
- spring本身維護了一個隊列,他會把須要執行的方法,放入隊列中,等待線程池去讀取這個隊列,完成方法的執行,從而完成了異步的功能。
- 咱們能夠關注到再配置task的時候,是有參數讓咱們配置線程池的數量的。
- 由於這種實現方法,因此在同一個類中的方法調用,添加@Async註解是失效的!緣由是當你在同一個類中的時候,方法調用是在類體內執行的,spring沒法截獲這個方法調用
二、spring爲咱們提供了AOP,面向切面的功能(和smartFrame AOP實現原理差很少)異步
- 他的原理和異步註解的原理是相似的,spring在啓動容器的時候,會掃描切面所定義的類。
- 在這些類被注入的時候,所注入的也是代理類,當你調用這些方法的時候,本質上是調用的代理類。
- 經過代理類再去執行父類相對應的方法,那spring只須要在調用以前和以後執行某段代碼就完成了AOP的實現了