可拔插的 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 容器的更多相关文章

  1. 设计一个可拔插的 IOC 容器

    前言 磨了许久,借助最近的一次通宵上线 cicada 终于更新了 v2.0.0 版本. 之所以大的版本号变为 2,确实是向下不兼容了:主要表现为: 修复了几个反馈的 bug. 灵活的路由方式. 可拔插 ...

  2. spring源码学习之路---IOC容器初始化要义之bean定义载入(五)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近工作很忙,时间不多,研究 ...

  3. Spring IOC容器创建bean过程浅析

    1. 背景 Spring框架本身非常庞大,源码阅读可以从Spring IOC容器的实现开始一点点了解.然而即便是IOC容器,代码仍然是非常多,短时间内全部精读完并不现实 本文分析比较浅,而完整的IOC ...

  4. Spring系列14:IoC容器的扩展点

    Spring系列14:IoC容器的扩展点 回顾 知识需要成体系地学习,本系列文章前后有关联,建议按照顺序阅读.上一篇我们详细介绍了Spring Bean的生命周期和丰富的扩展点,没有阅读的强烈建议先阅 ...

  5. 深入理解DIP、IoC、DI以及IoC容器

    摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...

  6. IL实现简单的IOC容器

    既然了解了IL的接口和动态类之间的知识,何不使用进来项目实验一下呢?而第一反应就是想到了平时经常说的IOC容器,在园子里搜索了一下也有这类型的文章http://www.cnblogs.com/kkll ...

  7. 通过中看不中用的代码分析Ioc容器,依赖注入....

    /** * 通过生产拥有超能力的超人实例 来理解IOC容器 */ //超能力模组接口 interface SuperModuleInterface{ public function activate( ...

  8. Spring在非web应用中关闭IoC容器 (registerShutdownHook)

    在基于web的ApplicationContext实现中,已有相应的实现来处理关闭web应用时恰当地关闭Spring IoC容器.但,如果你正在一个非web应用的环境下使用Spring的IoC容器,如 ...

  9. .net自带的IOC容器MEF使用

    IOC能做什么 IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序. 控制反转: 将控制权移交给第三方容器  new 操作 依赖注入: 在程序 ...

随机推荐

  1. 宏 函数 内联函数inline

    带参宏有时候可以代替函数作用:优点直接替代,省去函数调用过程的开销:但缺点也是很明显:容易出错,系统不做检查非常容易出错. 改进方案:内联函数:既有带参宏的直接替代(拷贝)的优点,又有系统检查的优点. ...

  2. 转 Java 208道面试题及部分答案 补充部分答案

    转自https://www.cnblogs.com/chen1005/p/10481102.html   ---恢复内容开始--- 一.Java 基础 1.JDK 和 JRE 有什么区别? 答:JRE ...

  3. 【转】Android Support Library详细介绍

    网上对Android Support Library中各个依赖包介绍的中文资料太少了,结合官方文档和有限的参考资料做了一次总结,有描述得不对的地方还请指正. 一.主工程.依赖包.jar包.androi ...

  4. 【学习笔记】C++ cout 输出小数点后指定位数

    在C中我们可以使用 printf("%.2lf",a);但在C++中是没有格式操作符的,该如何操作: C++使用setprecision()函数,同时必须包含头文件iomanip, ...

  5. 后TOS时代的码头数字化生产力

    之前看过一篇文章是,是INFORM的副总裁写的关于以TOS外挂模式提升码头生产效能的文章.文章对外挂模式的总结挺好的,我最近也一直从事这块的工作,以此文梳理一下前面的经验,记录一下自己的感想. TOS ...

  6. CCF|中间数|Java

    import java.util.*; public class tyt { public static void main(String[] args) { Scanner in = new Sca ...

  7. 洛谷P1724 东风谷早苗

    题目描述 在幻想乡,东风谷早苗是以高达控闻名的高中生宅巫女.某一天,早苗终于入手了最新款的钢达姆模型.作为最新的钢达姆,当然有了与以往不同的功能了,那就是它能够自动行走,厉害吧(好吧,我自重).早苗的 ...

  8. (转)Spring提供的CharacterEncoding和OpenSessionInView功能

    http://blog.csdn.net/yerenyuan_pku/article/details/52902282 前面我们以一种更加优雅的方式集成了Spring4.2.5+Hibernate4. ...

  9. TCP socket如何判断连接断开

    http://blog.csdn.net/zzhongcy/article/details/21992123 SO_KEEPALIVE是系统底层的机制,用于系统维护每一个tcp连接的. 心跳线程属于应 ...

  10. uva1628 Pizza Delivery

    fixing great wall 的变形dp(i,j,k,p)不考虑i-j的客人,还要送k个人,目前位置在p起点i和总数量k都要枚举dp(i,j,k,p)=max(dp(m,j,k-1,p)+val ...