控制反转容器& 依赖注入模式 ---读感。
几个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
控制反转容器& 依赖注入模式 ---读感。的更多相关文章
- Java 控制反转和依赖注入模式【翻译】【整理】
Inversion of Control Containers and the Dependency Injection pattern --Martin Fowler 本文内容 Component ...
- Ioc 器管理的应用程序设计,前奏:容器属于哪里? 控制容器的反转和依赖注入模式
Ioc 器管理的应用程序设计,前奏:容器属于哪里? 我将讨论一些我认为应该应用于“容器管理”应用程序设计的原则. 模式1:服务字典 字典或关联数组是我们在软件工程中学到的第一个构造. 很容易看到使 ...
- [.net 面向对象程序设计深入](26)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)
[.net 面向对象程序设计深入](26)实战设计模式——使用IoC模式(控制反转或依赖注入)实现松散耦合设计(1) 1,关于IOC模式 先看一些名词含义: IOC: Inversion of con ...
- [.net 面向对象程序设计深入](31)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)
[.net 面向对象程序设计深入](31)实战设计模式——使用IoC模式(控制反转或依赖注入)实现松散耦合设计(1) 1,关于IOC模式 先看一些名词含义: IOC: Inversion of con ...
- 控制反转、依赖注入、Unity容器
控制反转原则 依赖注入 Install-Package Unity:https://www.nuget.org/packages/Unity/ Github:https://github.com/un ...
- spring的容器(控制反转、依赖注入)
一.spring的容器 ”容器“是spring的一个重要概念,其主要作用是完成创建成员变量,并完成装配. 而容器的特点”控制反转“和”依赖注入“是两个相辅相成的概念. 控制反转:我们在使用一个类型的实 ...
- java依赖的斗争:依赖倒置、控制反转和依赖注入
控制反转(Inversion Of Controller)的一个著名的同义原则是由Robert C.Martin提出的依赖倒置原则(Dependency Inversion Principle),它的 ...
- Spring的控制反转和依赖注入
Spring的官网:https://spring.io/ Struts与Hibernate可以做什么事? Struts, Mvc中控制层解决方案 可以进行请求数据自动封装.类型转换.文件上传.效验… ...
- spring(3)------控制反转(IOC)/依赖注入(DI)
一.spring核心概念理解 控制反转: 控制反转即IoC (Inversion of Control).它把传统上由程序代码直接操控的对象的调用权交给容器.通过容器来实现对象组件的装配和管理. 所谓 ...
随机推荐
- 开发Protege插件时,出现打开Protege后并不显示插件的原因
最近跟着导师一起开发了一个Protege插件,在按照http://www.cnblogs.com/biaoyu/archive/2011/01/07/1929715.html中所述一步步进行到最后时, ...
- 利用Jurassic在.net下运行js函数
static void Main(string[] args) { var eng = new Jurassic.ScriptEngine(); eng.Evaluate("function ...
- ORACLE 日常处理办法
Oracle删除当前用户下所有的表的方法 1.如果有删除用户的权限,则可以: drop user user_name cascade; 加了cascade就可以把用户连带的数据全部删掉. 删除后再创建 ...
- MVC 构建图片/文件选择器 参考其它CMS功能
实现结果,如下 点击选择图片,弹出一个iframe框 顶部默认图片根目录,依次下面是文件列表 底部是选择的文件地址,以及上传新的图片和文件 加载iframe 调用js方法 function initF ...
- 总结下用Vue.js和webpack遇到的问题
这段时间用vue.js+webpack做一个单页应用的demo,第一次尝试模块化,技术水平有限,学习不够深入,总是遇到各种问题,所谓前事不忘后事之师,so记录下. 1.ES6匿名函数里面this值 结 ...
- C语言的关键字,标示符以及数据类型
1. 关键字 1> 关键字就是C语言提供的有特殊含义的符号,也叫做“保留字” 2> C语言一共提供了32个关键字,这些关键字都被C语言赋予了特殊含义 auto doub ...
- the fourth class
6 居右 label加宽度,text-align:right 7 list copy: list1.concat(list1) 8 灵活运用addHandle,addEventListener 给in ...
- OD使用教程7
破解程序获得使用权限: 破解思路:其实程序加密或者添加neg窗口都是为了让消费者付出更多的代价来解决这些问题.然而身为一个技术人员是可以靠技术来使这些东西消失的.只要我们找到那些东西出现的 ...
- C# 加密
一.RSA加密解密 using System; using System.Collections.Generic; using System.IO; using System.Linq; using ...
- 计算机网路之动态NAT配置
配置路由端口的ip地址与打开(省略) 配置路由协议 router eigrp 100 network 211.1.1.0(网络号) 0.0.0.255(通配子掩) network 192.168.1. ...