Restlet实战(十)结合源代码分析Restlet-Spring配置文件

Restlet实战(四)与Spring集成给出了Restlet如何与Spring进行集成。下面就结合Restlet的源码分析一下Spring配置文件。

 

在Spring的配置文件中,我们能看到这样的代码:

 

Java代码   收藏代码
  1. <entry key="/customers">  
  2.     <bean class="org.restlet.ext.spring.SpringFinder">  
  3.         <lookup-method name="createResource" bean="customersResource" />  
  4.     </bean>  
  5. </entry>  

 

 

从配置上很容易看出SpringFinder有一个方法:createResource,作用就是实例化在Spring中定义的Resource。看源码中的crateResource方法:

 

Java代码   收藏代码
  1. public Resource createResource() {  
  2.     Resource result = null;  
  3.   
  4.     if (getTargetClass() != null) {  
  5.         try {  
  6.             // Invoke the default constructor  
  7.             result = (Resource) getTargetClass().newInstance();  
  8.         } catch (Exception e) {  
  9.             getLogger()  
  10.                     .log(  
  11.                             Level.WARNING,  
  12.                             "Exception while instantiating the target resource.",  
  13.                             e);  
  14.         }  
  15.     }  
  16.   
  17.     return result;  
  18. }  

 

代码如此简单,就不用多做解释了。

 

接下来,我们看一下另外的一个配置项:

 

Xml代码   收藏代码
  1. <bean id="restRoute" class="org.restlet.ext.spring.SpringRouter">  
  2.     <property name="attachments">  
  3.         <map>  
  4.             <entry key="/customers">  
  5.                 <bean class="org.restlet.ext.spring.SpringFinder">  
  6.                     <lookup-method name="createResource" bean="customersResource" />  
  7.                 </bean>  
  8.             </entry>  
  9.             <entry key="/customers/{customerId}">  
  10.                 <bean class="org.restlet.ext.spring.SpringFinder">  
  11.                     <lookup-method name="createResource" bean="customerResource" />  
  12.                 </bean>  
  13.             </entry>  
  14.         </map>  
  15.     </property>  
  16. </bean>  

 

是的,接下去就要分析SpringRouter,从上面的配置能看到此类有一个attachments的属性,那么跟这个属性有关的方法就是setAttachments了

 

Java代码   收藏代码
  1. public static void setAttachments(Router router, Map<String, Object> routes) {  
  2.     Object value;  
  3.     Class resourceClass;  
  4.   
  5.     try {  
  6.         for (final String key : routes.keySet()) {  
  7.             value = routes.get(key);  
  8.   
  9.                 if (value instanceof Restlet) {  
  10.                         router.attach(key, (Restlet) value);  
  11.                 } else if (value instanceof Class) {  
  12.                         router.attach(key, (Class<? extends Resource>) value);  
  13.                 } else if (value instanceof String) {  
  14.                         resourceClass = Engine.loadClass((String) value);  
  15.       
  16.                         if (Resource.class.isAssignableFrom(resourceClass)) {  
  17.                             router.attach(key, resourceClass);  
  18.                         } else {  
  19.                             router .getLogger() .warning(  
  20.                                     "Unknown class found in the mappings. Only subclasses of org.restlet.resource.Resource are allowed.");  
  21.                         }  
  22.                 } else {  
  23.                         router.getLogger().warning(  
  24.                                 "Unknown object found in the mappings. Only instances of Restlet and subclasses of org.restlet.resource.Resource are allowed.");  
  25.                 }  
  26.             }  
  27.     } catch (ClassNotFoundException e) {  
  28.             router.getLogger().log(Level.WARNING,  
  29.             "Unable to set the router mappings", e);  
  30.     }  
  31. }  

 

 上述代码首先从一个循环开始,从Map里面取出需要的元素。key就上上面配置中的URL了,例如:/customers,/customers/{customerId},而value就是我们配置的相应的bean,程序里首先会check得到的value是不是Restlet的实例,如果是,就把这个value attach到router上,如果不是,则检查这个value是一个class还是一个String类型的字符串。如果是class,则认为这个class必定是一个Resource,直接attach到router;如果是String类型的字符串,则首先会认为是一个指定Resource的字符串,实例化,并attach到router,否则记录警告的日志信息。

 

 看到这里,不知各位是否有想法,当时我看的时候,对第二、三个判断倒是很清晰,无非是把Resource直接attach到Router上,而对于第一个判断,按照上述代码所写,只要是Restlet的实例貌似就可以,换句话说,是不是我定义一个Application也可以作为一个元素配置上去?

 

限于篇幅的长度以及可读性,下篇给出相关的测试。

猜你喜欢

转载自chenjianfei2016.iteye.com/blog/2355188
今日推荐