1. 程式人生 > >可拔插的 IOC 容器

可拔插的 IOC 容器

  可拔插的 IOC 容器
  
  於是我打算自己實現一個這樣的 bean 容器。
  
  但在實現之前又想到一個 feature:
  
  不如把實現 bean 容器的方案交給使用者選擇,可以選擇使用 bean 容器,也可以就用之前的每次都建立新的例項,就像 Spring 中的 prototype 作用域一樣。
  
  甚至可以自定義容器實現,比如將 bean 存放到資料庫、Redis 都行;當然一般人也不會這麼幹。
  
  和 SPI 的機制也有點類似。
  
  要實現上述的需求大致需要以下步驟:
  
  一個通用的介面,包含了註冊容器、從容器中獲取例項等方法。
  
  BeanManager 類,由它來管理具體使用哪種 IOC 容器。
  
  所以首先定義了一個介面;CicadaBeanFactory:
  
  包含了註冊和獲取例項的介面。
  
  同時分別有兩個不同的容器實現方案。
  
  預設實現;CicadaDefaultBean:
  
  也就是文中說道的,每次都會建立例項;由於這種方式其實根本就沒有 bean 容器,所以也不存在註冊了。
  
  接下來是真正的 IOC 容器;CicadaIoc:
  
  它將所有的例項都存放在一個 Map 中。
  
  當然也少不了剛才提到的 CicadaBeanManager,它會在應用啟動的時候將所有的例項註冊到 bean 容器中。
  
  重點是圖中標紅的部分:
  
  需要根據使用者的選擇例項化 CicadaBeanFactory 介面。
  
  將所有的例項註冊到 CicadaBeanFactory 介面中。
  
  同時也提供了一個獲取例項的方法:
  
  resin4.0.53安裝部署文件(linux)
  
  tar xzvf resin-4.0.53.tar.gz
  
  cd resin-4.0.53
  
  ./configure --prefix=/data/resin-4.0.53
  
  make && make install
  
  3.配置resin.properties
  
  cd /data/resin-4.0.53/conf
  
  vim resin.properties
  
  將app_servers引數改為127.0.0.1:6852
  
  註釋app.http和web.http
  
  一定要註釋app.http,app_servers引數改不改也可以,因為我們會在resin.xml中不使用它,不改的話,會有歧義
  
  4.配置resin.xml,修改埠與部署war包
  
  vim resin.xml
  
  刪除id不是app的cluster,只保留app cluster,其餘不需要,此cluster的示例配置如下:
  
  <cluster id="app">
  
  <!--
  
  <server-multi id-prefix="app-" address-list="${app_servers}" port="6800"/>
  
  -->
  
  <server id="app" address="127.0.0.1" port="6852" >
  
  <watchdog-port>4852</watchdog-port>
  
  <http address="*" port="8852"/>
  
  </server>
  
  <host-default>
  
  <!-- creates the webapps directory for .war expansion -->
  
  <web-app-deploy path="webapps"
  
  expand-preserve-fileset="WEB-INF/work/**"
  
  multiversion-routing="${webapp_multiversion_routing}"
  
  path-suffix="${elastic_webapp?resin.id:''}"/>
  
  </host-default>
  
  <!-- the default host, matching any host name -->
  
  <host id="" root-directory="www.furong157.com.">
  
  <web-app id="/" root-directory="www.mcyllpt.com /path/to/appdir"/>
  
  </host>
  
  <resin:if test="${resin_doc}"www.michenggw.com>
  
  <host id="${resin_doc_host}" root-directory="${resin_doc_host}">
  
  <web-app id="/resin-doc" root-directory="${resin.root}/doc/resin-doc"/>
  
  </host>
  
  </resin:if>
  
  </cluster>
  
  重點關注server與host標籤
  
  server配置了管理埠:6852,監控埠:4852,http埠:8852
  
  管理埠:resin內部管理使用
  
  監控埠:類似守護進度,時刻關注resin是否掛了,若掛了則重啟
  
  http埠:對外開放使用的http埠
  
  host配置了app路徑,如果是部署war包,使用以下配置
  
  <host id="" root-directory=".">
  
  <web-app id="/" root-directory="webapps/app" archive-path="/path/to/app.war"/>
  
  </host>
  
  web-app標籤解釋
  
  archive-path:war包路徑
  
  root-directory:war包解壓之後的檔案存放路徑
  
  5.啟動/停止/重啟 resin
  
  cd resin-4.0.53/bin
  
  ./resinctl start
  
  ./resinctl stop
  
  ./resinctl www.huarenyl.cn restart
  
  ./resinctl status
  
  ./resinctl console
  
  附加說明
  
  在resin中使用spring框架注入properties檔案時,若properties檔案未找到,則需要修改配置
  
  <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  
  <property name="locations"www.gcyl152.com value=www.xingyi178.com"classpath:*.properties" />
  
  <property name="ignoreUnresolvablePlaceholders"www.hjpt521.com value="true" />
  
  </bean>
  
  將classpath:*.properties改為classpath*:*.properties即可