几个web框架 : sprint Avalon PicoContainer
class MovieLister
MovieFinder finder = ServiceLocator.movieFinder();

//单件注册表 注册的时候 载入一个已经确定好属性的服务定位器
class ServiceLocator...
public static MovieFinder movieFinder(){
return soleInstance.movieFinder;
}
private static ServiceLocator soleInstance;
private MovieFinder movieFinder;

public static void load(ServiceLocator arg) {
soleInstance = arg;
}
public ServiceLocator(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}

//test code
class Tester
private void configure(){
//说明服务定位器是有构造函数可以在这个时候来决定实用的movieFinder的。
ServiceLocator.load(new ServiceLocator(new ColonMovieFinder("Movie1.txt")));
}

public void testSimple(){
configure();
MovieLister lister = new MovieLister();
Movie[] movies = lister.moviesDirectedBy("Sergio");
assertEquals("Once Upon a Time in the West", movies[0].getTitle());
}
//ServiceLocator 应该是一个静态的全局变量,如此lister 才能直接载入。
//更复杂的情况: 服务定位器派生子类,并且将子类传递给注册表类变量。???
// 暴露一个静态方法,而不是直接访问该类实例的变量。

//-------单件模式 -------------//以上设计的设计模式

//为定位器使用分离接口:
//由于list 可能只需要使用一个服务,可以使用角色接口(role interface)这样不用使用全部的服务接口,只需要声明需要使用的接口就行了。
public interface MovieFinderLocator{
public MovieFinder movieFinder();
}

class MovieLister
MovieFinderLocator locator = ServiceLocator.locator();
MoiveFinder finder = locator.movieFinder();

class ServiceLocator
public static ServiceLocator locator(){
return soleInstance;
}
public MovieFinder movieFinder() {
return movieFinder;
}
private static ServiceLocator soleInstance;
private MovieFinder movieFinder;
//这个时候,由于使用了接口,就无法使用静态变量了,需要使用locator() 来 获取一个实例

//动态服务定位器 上面两个例子是静态的,但是我们也可以使用动态服务定位器,允许在其中注册需要的服务,并且在运行时动态按需获取。
// 如下 服务定位器是使用map来保存服务信息,而非放到字段中。
class ServiceLocator
private static ServiceLocator soleInstance;
public static void load(ServiceLocator arg){
soleInstance = arg;
}

private Map services = new HashMap();
public static Object getService(String key){
return soleInstance.services.get(key);
}
public void loadService(String key, Object service){
service.put(key, service);

}

class Tester
private void configure(){
ServiceLocator locator = new ServiceLocator();
locator.loadService("MovieFinder", new ColonMovieFinder("movie1.txt"));
ServiceLocator.load(locator);
}
class MovieLister
MovieFinder finder = (MovieFinder) ServiceLocator.getService("MovieFinder");

//Locator 和 Injection 同时使用的案列:
public class MyMovieLister implements MovieLister, Serviceable {
private MovieFinder finder;

public void service(ServiceManager manager) throws ServiceException {
finder = (MovieFinder) manager.lookup("finder");
}
}
//容器将中ServiceManager对象注入到list 中,ServiceManager 是一个服务定位器的,使用它来查找finder实例

//-------服务定位器和依赖注入的对比
服务定位器比较直观,但是所有的请求者都会需要依赖服务定位器
如果需要提供一个组件出去,最好还是使用注入的方式,因为无法控制使用者会使用什么样的实现,可以直接使用注入来定义对应的实现。

//-------构造注入和属性注入比较
两者都比较容易配置,而接口注入的方式十分容易在各处代码中泛滥。
构造注入和属性注入就涉及了是否应该在构造的时候就对属性进行赋值。
构造注入可以将属性设置为不可变的,并且可以明确意图。
属性注入在参数太多的时候很有必要,同时有多个方法来构造一个有效对象时,就可以使用Factory Method的模式。
同时如果对象有很多的构造器,并且对象间存在继承关系,这可能会导致构造器膨胀,由于子类的构造器需要调用父类的构造器然后再处理自己的参数。
//----代码配置还是文件配置
对于多数多处部署的应用程序来说,使用配置文件的方式比较好,我想是因为方便查看的原因。配置文件也多为XML,不过我们之前的项目多用json文件进行配置。
如果配置文件变得复杂了 就需要考虑换一个适合的编程语言来实现。
其中提到的:如果一个配置的逻辑变得复杂了,应该使用适合的语言来描述配置信息 这里没有考虑到对应的情况,不过觉得之前的表数据的配置,是否也可以用语言来实习?而不是一直增加怕配置文件。是否是会更加明了。
有很多组件有各自的配置文件,需要维护不同的配置文件,这种情况可以通过统一的编程接口来提供,可以分开配置文件。通过这个接口,可以管理配置文件???? 只想到了可以统一配置文件来实现,但是这里所说的统一配置文件接口的情境没有想好。

//------将配置和应用分离
服务的配置和应用分离,之前的应用就是这样的,单独配置应用的配置文件的地方。
一个设计原则:分离接口和具体的实现。
比如数据源的使用,测试的时候 可能是直接读取文件配置来着,但是在生产环境的时候,是读取服务器上的数据源JNDI的配置。

重点是应该将 服务配置从应用程序内部分离出来。

参考:

http://www.cnblogs.com/me-sa/archive/2008/07/30/IocDI.html

http://www.martinfowler.com/articles/injection.html

控制反转容器& 依赖注入模式 ---读感。的更多相关文章

  1. Java 控制反转和依赖注入模式【翻译】【整理】

    Inversion of Control Containers and the Dependency Injection pattern --Martin Fowler 本文内容 Component ...

  2. Ioc 器管理的应用程序设计,前奏:容器属于哪里? 控制容器的反转和依赖注入模式

    Ioc 器管理的应用程序设计,前奏:容器属于哪里?   我将讨论一些我认为应该应用于“容器管理”应用程序设计的原则. 模式1:服务字典 字典或关联数组是我们在软件工程中学到的第一个构造. 很容易看到使 ...

  3. [.net 面向对象程序设计深入](26)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)

    [.net 面向对象程序设计深入](26)实战设计模式——使用IoC模式(控制反转或依赖注入)实现松散耦合设计(1) 1,关于IOC模式 先看一些名词含义: IOC: Inversion of con ...

  4. [.net 面向对象程序设计深入](31)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)

    [.net 面向对象程序设计深入](31)实战设计模式——使用IoC模式(控制反转或依赖注入)实现松散耦合设计(1) 1,关于IOC模式 先看一些名词含义: IOC: Inversion of con ...

  5. 控制反转、依赖注入、Unity容器

    控制反转原则 依赖注入 Install-Package Unity:https://www.nuget.org/packages/Unity/ Github:https://github.com/un ...

  6. spring的容器(控制反转、依赖注入)

    一.spring的容器 ”容器“是spring的一个重要概念,其主要作用是完成创建成员变量,并完成装配. 而容器的特点”控制反转“和”依赖注入“是两个相辅相成的概念. 控制反转:我们在使用一个类型的实 ...

  7. java依赖的斗争:依赖倒置、控制反转和依赖注入

    控制反转(Inversion Of Controller)的一个著名的同义原则是由Robert C.Martin提出的依赖倒置原则(Dependency Inversion Principle),它的 ...

  8. Spring的控制反转和依赖注入

    Spring的官网:https://spring.io/ Struts与Hibernate可以做什么事? Struts, Mvc中控制层解决方案 可以进行请求数据自动封装.类型转换.文件上传.效验… ...

  9. spring(3)------控制反转(IOC)/依赖注入(DI)

    一.spring核心概念理解 控制反转: 控制反转即IoC (Inversion of Control).它把传统上由程序代码直接操控的对象的调用权交给容器.通过容器来实现对象组件的装配和管理. 所谓 ...

随机推荐

  1. 转:亿级Web系统的高容错性实践(好博文)

    亿级Web系统的高容错性实践 亿级Web系统的高容错性实践 背景介绍 大概三年前,我在腾讯负责的活动运营系统,因为业务流量规模的数倍增长,系统出现了各种各样的异常,当时,作为开发的我,7*24小时地没 ...

  2. X64操作系统组件Jmail无法正常服务问题

    故障现象: 近日,在VMware虚拟化部署迁移中,之前物理服务器中部署网站ASP组件Jmail服务一切正常,迁移完成后发现Jmail无法正常工作,其余组件能正常工作. 环境:Windows Serve ...

  3. read函数返回值始终为1

    部分程序如下: while(count=read(fd_s,buf,512)>0)      printf("count=%d\n",count);      write(f ...

  4. Linux分析日志获取最多访问的前10个IP

    原文地址:http://xuqq999.blog.51cto.com/3357083/774714 apache日志分析可以获得很多有用的信息,现在来试试最基本的,获取最多访问的前10个IP地址及访问 ...

  5. 禁止盗链,强制回登录页面web.config配置

    <system.web> <compilation debug="true" targetFramework="4.5" /> < ...

  6. SAP第一轮面试总结

    1. 开始是一套面试题,可以选JAVA或C/C++两个语言的英文题.基础语法题,以指针为主. 2. 英文介绍,自由发挥.问了以下几个问题: 离职的愿意,未来五年的计划,介不介意使用ABAP langu ...

  7. Wind7系统下 wifi设置

    netsh wlan set hostednetwork  mode=allow ssid=pass:123456789 key=123456789 netsh wlan set hostednetw ...

  8. 设置secureCRT支持中文

    将options菜单下面的session options 中的 appearance 标签页里面的 character encoding 选择UTF-8就可以.

  9. js继承

    js继承有5种实现方式: 继承第一种方式:对象冒充 function Parent(username){ this.username = username; this.hello = function ...

  10. Bomb

    Description The counter-terrorists found a time bomb in the dust. But this time the terrorists impro ...