可拔插的 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即可