1. 程式人生 > 實用技巧 >SpringMVC 介面 導致對映失敗的原因 非同步註解Async失效 微服務對映的位置

SpringMVC 介面 導致對映失敗的原因 非同步註解Async失效 微服務對映的位置

對映失敗

發生的條件:對映層實現某個介面,並且該介面中必須有方法,此時會導致無法訪問該介面。

如題下圖所示:

若刪除MemberService中的程式碼,讓其成為一個空的介面,則對映可以訪問。

原因

由於spring預設,實現了介面的會以jdk代理形式產生代理類,當某個類實現了介面時,會讀取介面內的程式碼,並且丟失了註解,導致沒有進入spring容器內,所以訪問不到。

若介面內沒有程式碼,則以當前的類作為被代理物件。

ps:這裡有一個問題就是,微服務專案裡對映寫到介面中,feign卻可以呼叫到對映介面。

非同步註解Async失效

發生條件:直接訪問一個加了非同步註解的方法(相當於用當前物件訪問)

結果顯示呼叫其他單例的非同步方法時啟動了新執行緒,但是呼叫自己的方法沒有非同步。

原因

代理產生了一個新的代理物件(不是當前的類,當前程式碼層面上的類是被代理物件),但是在服務層裡直接呼叫自己,相當於沒有讓代理物件執行這個方法。

而MemberServiceManage可以非同步,是通過spring拿到代理物件去執行的,是從“外部”,而在方法"內部"直接addUser()相當於用被代理物件去呼叫,而不是代理物件。

參考:每特教育