Spring中HttpInvoker遠程調用使用實例

代碼結構圖以下: web

客戶端經過Spring的HttpInvoker,完成對遠程函數的調用。涉及的類有:

客戶端調用User類的服務UserService,完成對實現類UserServiceImpl的addUser(User u)方法調用。其中User類爲普通Pojo對象,UserService爲接口,UserServiceImpl爲UserService的具體實現。代碼以下:
public interface UserService {
    void addUser(User u);
} spring

public class UserServiceImpl implements UserService {
    public void addUser(User u) {
        System.out.println("add user ["+u.getUsername()+ "] ok !!!");
    }
} app

客戶端調用時,主方法代碼爲:
public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
                new String[] {"ApplicationContext.xml" });
    
        UserService us = (UserService)ctx.getBean("ServletProxy");
        us.addUser(new User("Hook1"));
        
        UserService us2 = (UserService)ctx.getBean("UrlPathProxy");
        us2.addUser(new User("Hook2"));
    } 函數

其調用流程用時序圖可表示爲:

圖中粉紅色表示基於Url映射方式的配置時程序的處理流程,紅色表示基於Servlet配置時的處理流程。
當以示基於Url映射方式的配置時,遠程系統處理請求的方式同SpringMVC的controller相似,全部的請求經過在web.xml中的org.springframework.web.servlet.DispatcherServlet統一處理,根據url映射,去對應的【servlet名稱-servlet.xml】文件中,查詢跟請求的url匹配的bean配置;而基於Servlet配置時,由org.springframework.web.context.support.HttpRequestHandlerServlet去攔截url-pattern匹配的請求,若是匹配成功,去ApplicationContext中查找name與servlet-name一致的bean,完成遠程方法調用。 url

當使用URL映射配置時,實力配置以下(application-servlet.xml):
<bean name="/userHttpInvokerService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
        <property name="service" ref="userService"/>
        <property name="serviceInterface" value="com.handou.httpinvoker.service.UserService"/>
    </bean> spa

web.xml文件配置:
 <servlet>
        <servlet-name>application</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
     
    <servlet-mapping>
        <servlet-name>application</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping> 3d

 若是使用基於Servlet的配置,web.xml文件配置以下:

    <!-- 基於servlet配置時使用 ,根據請求的url匹配url-pattern,若是匹配成功,去ApplicationContext
    中查找name與servlet-name一致的bean-->
    <servlet>
        <servlet-name>userHttpInvokerService</servlet-name>
        <servlet-class>org.springframework.web.context.support.HttpRequestHandlerServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>userHttpInvokerService</servlet-name>
        <url-pattern>/UserHttpInvokerService</url-pattern>
    </servlet-mapping> xml

applicationContext.xml文件中配置以下:
<bean id="userService" class="com.handou.httpinvoker.service.UserServiceImpl" />
    <!--第二種配置方式 --> 
    <bean name="userHttpInvokerService" 
        class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
        <property name="service" ref="userService"/>
        <property name="serviceInterface" value="com.handou.httpinvoker.service.UserService"/>
    </bean> 對象

 

兩種方式,客戶端配置均相同:
<bean id="ServletProxy" 
     class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">  
     <property name="serviceUrl">  
           <value>http://localhost:8080/HttpInvoke/UserHttpInvokerService</value>  
       </property>  
       <property name="serviceInterface">  
            <value>com.handou.httpinvoker.service.UserService</value>  
        </property>  
   </bean> 接口

具體可參考源碼 :點擊下載

相關文章
相關標籤/搜索