一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 關(guān)于Spring注解@Async引發(fā)其他注解失效的解決

關(guān)于Spring注解@Async引發(fā)其他注解失效的解決

2021-04-15 12:05atheva Java教程

這篇文章主要介紹了關(guān)于Spring注解@Async引發(fā)其他注解失效的解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

概述

在前面一篇文章中,介紹,在一個bean中注入自己,如果有@async和@transaction,如果使用@autowire注入自身,會報循環(huán)依賴,如果使用beanfactoryaware注入自己,會使得@transaction失效。 例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@service
public class myservice implements beanfactoryaware{
 private myservice self;
 
 //事務(wù)注解無效
 @transactional
 public void notwork() {
  ...
 }
 
 @async
 public future async(){
  ...
 }
 
 
 @override
 public void setbeanfactory(beanfactory beanfactory) throws beansexception {
  self= beanfactory.getbean(myservice.class);
 }
}

當(dāng)時只是簡單提了一下,這篇文章就是來介紹為什么會失效。

一般情況

造成上面的情況需要滿足以下條件:

  1. 有@async和其他類似@transaction注解
  2. 自己類在beanfactoryaware中,通過beanfactory獲取自己

造成的結(jié)果:除@async外的注解生效,其他的都不生效,如下圖

關(guān)于Spring注解@Async引發(fā)其他注解失效的解決

而正常代理的應(yīng)該是下圖:

關(guān)于Spring注解@Async引發(fā)其他注解失效的解決

原因

首先想到的是@async注解的處理方式可能和其他的不一樣。在asyncannotationbeanpostprocessor的實現(xiàn)中(具體代碼是在其父類abstractadvisingbeanpostprocessor),發(fā)現(xiàn)一個問題,

正常情況下,進(jìn)來的bean已經(jīng)是被代理的動態(tài)代理類,而失效的時候,進(jìn)來的確實實際的類,如下圖:

關(guān)于Spring注解@Async引發(fā)其他注解失效的解決

然后在分析下代碼,如果是實際的類,走到69行的時候,返回是true,把@aysnc的advisor加入到動態(tài)道理中,而如果是實際的類,走到83行的時候,就會創(chuàng)建代理類,只把@aysnc的advisor加入到動態(tài)代理中,所已諸如@transaction就會失效。

為什么進(jìn)來的不是代理類

其實唯一的區(qū)別就是beanfactoryaware中,是否通過了beanfactory獲取了自己。那為什么使用beanfactory獲取了自己,后續(xù)的beanpostprocessor中就不是代理了?如果熟悉spring @transaction加載機(jī)制的就知道,諸如@transaction,@retryable 注解的動態(tài)代理創(chuàng)建是在annotationawareaspectjautoproxycreator中創(chuàng)建的。通過debug發(fā)現(xiàn),經(jīng)過annotationawareaspectjautoproxycreator后,我們的動態(tài)代理竟然沒有加上。

再看一下annotationawareaspectjautoproxycreator中的實現(xiàn),但是經(jīng)過他卻沒有生成代理類。原因竟然是提前暴露的map里面竟然有“myservice”,

關(guān)于Spring注解@Async引發(fā)其他注解失效的解決

他是什么時候暴露出來的呢?其實就是在

?
1
2
3
4
@override
public void setbeanfactory(beanfactory beanfactory) throws beansexception {
 self= beanfactory.getbean(myservice.class);
}

那么,一切水落石出了,在實例myservice中,觸發(fā)了beanfactoryaware,通過beanfactory.getbean(myservice.class);中創(chuàng)建了代理類(tips:當(dāng)前代理類并沒有包含@async的adivisor),因為現(xiàn)在spring其實正是在創(chuàng)建myservice這個bean,還沒有放入到beanfactory中。然后我們再這個過程中又觸發(fā)了一次beanfactory.getbean(myservice.class);導(dǎo)致創(chuàng)建代理并返回后,加入到了到了提前暴露的map中。導(dǎo)致后面的一系列問題。感覺有點繞。看圖說話:

正常情況,應(yīng)該是如下流程:

關(guān)于Spring注解@Async引發(fā)其他注解失效的解決

異常情況卻是這樣的

關(guān)于Spring注解@Async引發(fā)其他注解失效的解決

小結(jié)

正常情況下,還是使用@autowire來注入把(如果使用autowire,上述情況直接回拋出循環(huán)依賴)。當(dāng)然,出現(xiàn)了問題,也是不能放過了,要知其然還要知其所以然!

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.cnblogs.com/lizo/p/8652576.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩xx00| 91亚洲精品国产自在现线 | heyzo1754北岛玲在线视频 | 亚洲精品久久久WWW游戏好玩 | 555www成人网 | 亚洲欧美日韩中文字幕久久 | 成人免费福利网站在线看 | 91系列在线观看免费 | 日韩丝袜在线观看 | 日本一区二区三区在线 视频 | julia ann黑人巨大 | 欧美精品一区视频 | 福利片成人午夜在线 | 深夜在线小视频 | 私人家庭影院5577 | 午夜视频一区二区三区 | 四虎成人4hutv影院 | 欧美精品久久久久久久影视 | 天堂资源在线www中文 | 欧美另类性xxoo | 久草草在线视视频 | 男人在女人下面狂躁 | 无限资源在线观看完整版免费下载 | 国产日韩欧美精品在线 | 天天操精品视频 | 啾咪成人漫画免费 | 国产欧美精品一区二区三区–老狼 | 日本成人高清视频 | 欧美添下面视频免费观看 | gogo人体模特啪啪季玥图片 | 色人阁小说 | 国产精品www | 亚洲国产欧美日韩在线一区 | 欧美在线播放成人免费 | 茄子视频懂你更多apl | α级毛片 | 国产成人精品一区 | 秋霞一级毛片 | 亚洲男人天堂久久 | 884hutv四虎永久7777 | 天堂成人在线观看 |