1. 程式人生 > >基於JMS代理的支援註解的遠端方法呼叫

基於JMS代理的支援註解的遠端方法呼叫

執行流程:對呼叫的方法進行代理,將代理物件在mq中傳輸,監聽到來的訊息並呼叫真實物件的方法。

理解前提:需要有JDK代理的使用經驗。

整個流程的思想和Dubbo實現遠端呼叫是一樣的,dubbo的核心讀在於proxy的使用,所有的操作都儘量向proxy上靠攏,從表面上看dubbo配置完成後可以讓遠端的服務實現成為本地的一個bean被使用,事實上是本地對介面進行代理,通過網路傳輸(netty),在真實服務上呼叫真實的實現類執行請求完成後返回結果。
基於jms代理的遠端方法呼叫,對介面進行JDK代理,代理通過訊息傳送進訊息佇列,被監聽類監聽到,在配置之後,對代理物件的方法呼叫將傳遞到真實的類方法呼叫上。

這裡解釋下代理,代理是由靜態代理再衍生至動態代理,靜態代理其實很常見,dao層被嵌入到service層也可以看做是靜態代理,service層上的get操作最終傳遞到dao層上的get方法,只是service層上會做一些處理。動態代理的出現是為了解決靜態代理需要為每一個被代理的類都進行一次重複的封裝操作,動態代理是基於執行時的。

筆記:
1.實現ApplicationContextAware可以獲取到容器,但前提是容器已經例項化完成,在這之前得到的applicationContext是null,但是同時實現BeanPostProcessor介面卻可以得到容器,debug發現實現了BeanPostProcessor介面的類會得到ApplicationContextAwareProcessor的處理,只有經過這個處理器處理後才會呼叫set方法將容器setApplicationContext,初步判斷原因是容器例項化時會先一步呼叫registerBeanPostProcessors方法,即實現了BeanPostProcessor介面的類會被優先處理。

2.手動註冊bean時,需要在獲取beanDefinationBuilder類後新增類屬性,類例項中的屬性會丟失。

3.使用field.set方法替換屬性時,需要滿足當前屬性和obj是可相互轉換的,否則將報錯,IllegalArgumentsException。

4.使用@Bean,所標註的方法如果有引數,這個方法返回的將被注入容器的物件,需要有這個引數的建構函式存在,否則報錯。