可拔插的 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即可
可拔插的 IOC 容器的更多相关文章
- 设计一个可拔插的 IOC 容器
前言 磨了许久,借助最近的一次通宵上线 cicada 终于更新了 v2.0.0 版本. 之所以大的版本号变为 2,确实是向下不兼容了:主要表现为: 修复了几个反馈的 bug. 灵活的路由方式. 可拔插 ...
- spring源码学习之路---IOC容器初始化要义之bean定义载入(五)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近工作很忙,时间不多,研究 ...
- Spring IOC容器创建bean过程浅析
1. 背景 Spring框架本身非常庞大,源码阅读可以从Spring IOC容器的实现开始一点点了解.然而即便是IOC容器,代码仍然是非常多,短时间内全部精读完并不现实 本文分析比较浅,而完整的IOC ...
- Spring系列14:IoC容器的扩展点
Spring系列14:IoC容器的扩展点 回顾 知识需要成体系地学习,本系列文章前后有关联,建议按照顺序阅读.上一篇我们详细介绍了Spring Bean的生命周期和丰富的扩展点,没有阅读的强烈建议先阅 ...
- 深入理解DIP、IoC、DI以及IoC容器
摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...
- IL实现简单的IOC容器
既然了解了IL的接口和动态类之间的知识,何不使用进来项目实验一下呢?而第一反应就是想到了平时经常说的IOC容器,在园子里搜索了一下也有这类型的文章http://www.cnblogs.com/kkll ...
- 通过中看不中用的代码分析Ioc容器,依赖注入....
/** * 通过生产拥有超能力的超人实例 来理解IOC容器 */ //超能力模组接口 interface SuperModuleInterface{ public function activate( ...
- Spring在非web应用中关闭IoC容器 (registerShutdownHook)
在基于web的ApplicationContext实现中,已有相应的实现来处理关闭web应用时恰当地关闭Spring IoC容器.但,如果你正在一个非web应用的环境下使用Spring的IoC容器,如 ...
- .net自带的IOC容器MEF使用
IOC能做什么 IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序. 控制反转: 将控制权移交给第三方容器 new 操作 依赖注入: 在程序 ...
随机推荐
- 生产环境中nginx既做web服务又做反向代理
一.写对于初入博客园的感想 众所周知,nginx是一个高性能的HTTP和反向代理服务器,在以前工作中要么实现http要么做反向代理或者负载均衡.尚未在同一台nginx或者集群上同时既实现HTTP又实现 ...
- Ansj分词的使用
jar包下载地址:http://download.csdn.net/download/jj12345jj198999/6020541 博客地址:http://blog.csdn.net/a822631 ...
- .net excel 导入 导出
哎,好好的代码今天说来个实验,结果用的是office15 气死人了,网上最高office14.dll 文章转自2012年 QQ群:13615607 MR.Young protected void Bt ...
- JUnit的好搭档-Hamcrest
一.Hamcrest简介 Hamcrest是一个用于编写匹配器(matcher)对象的框架,允许以声明方式定义“匹配(match)”规则.它可以与JUnit框架配合使用,使断言可读更高,更加灵活(例如 ...
- Unity c# 状态机的简单入门
状态机模式在unity中作用是非常大的,可以实现角色的移动和场景的跳转,包括一些动画的播放,在很多unity框架中也是很常见的,发散思维广阔,下面是简单的状态机的实现,有注释 using System ...
- 创建线程的三种方式_Callable和Runnable的区别
Java 提供了三种创建线程的方法 通过实现Runnable接口 通过继承Thread接口 通过Callable和Future创建线程 通过实现 Runnable 接口来创建线程 public cla ...
- Error:Failed to resolve: com.afollestad:material-dialogs:
http://www.chenruixuan.com/archives/1068.html 背景: 同事把Android项目直接考给了我...我在Android Studio上运行,然后提示: Err ...
- 1.入手树莓派之linux环境搭建
最近刚刚买了一款 树莓派3代B型 raspberrypi 板载蓝牙和WIFI 英国版本,没玩过,觉得很好奇,生怕记性不好哈,把自己玩的过程记录一下,以备不时之需: 需要材料: 1) 树莓派: 2)sd ...
- Python虚拟环境 之 virtualenv 与 virtualenvwrapper
在开发Python应用程序的时候,比如系统安装的Python3只有一个版本:3.6.所有第三方的包都会被 pip 安装到Python3的 site-packages 目录下. 如果我们要 ...
- VR技术在数据中心3D机房中的应用 (下)
VR技术在数据中心3D机房中的应用 (下) 前面给大家简单科普了一下VR的硬件设备以及VR在各个领域的应用,是不是觉得非常高大上?千言万语概括成一句话,VR能给用户带来前所未有的沉浸感和交互方式,让人 ...