SpringMVC 介面 導致對映失敗的原因 非同步註解Async失效 微服務對映的位置
阿新 • • 發佈:2020-10-16
對映失敗
發生的條件:對映層實現某個介面,並且該介面中必須有方法,此時會導致無法訪問該介面。
如題下圖所示:
若刪除MemberService中的程式碼,讓其成為一個空的介面,則對映可以訪問。
原因
由於spring預設,實現了介面的會以jdk代理形式產生代理類,當某個類實現了介面時,會讀取介面內的程式碼,並且丟失了註解,導致沒有進入spring容器內,所以訪問不到。
若介面內沒有程式碼,則以當前的類作為被代理物件。
ps:這裡有一個問題就是,微服務專案裡對映寫到介面中,feign卻可以呼叫到對映介面。
非同步註解Async失效
發生條件:直接訪問一個加了非同步註解的方法(相當於用當前物件訪問)
結果顯示呼叫其他單例的非同步方法時啟動了新執行緒,但是呼叫自己的方法沒有非同步。
原因
代理產生了一個新的代理物件(不是當前的類,當前程式碼層面上的類是被代理物件),但是在服務層裡直接呼叫自己,相當於沒有讓代理物件執行這個方法。
而MemberServiceManage可以非同步,是通過spring拿到代理物件去執行的,是從“外部”,而在方法"內部"直接addUser()相當於用被代理物件去呼叫,而不是代理物件。
參考:每特教育