- 浏览: 117741 次
- 来自: ...
文章分类
最新评论
IoC避不开的一个问题是如何处理应用程序的模块化, 因为IoC通常针对单个对象提供了良好的支持, 比如依赖管理,生命周期管理,部署时配置甚至运行时配置, 但往往一组内聚的互相协作的对象才构成应用程序基本的构建块. 这组内聚对象间的协作关系是实现细节, 包括单个对象的构造函数和属性也是, 如果把这些暴露出来, 固然可以提高灵活性, 但是以最后的部署阶段的复杂性以及难以维护性为代价的. 以配置文件为例, 可能需要在包含了几百个对象定义的配置文件中, 去改动七八个属性, 变换五六个实现, 来适应不同的运行环境
两个解决这个问题的方向, 一个是IoC框架提供模块化支持, 以及部署时支持, 一种是IoC框架应该避开这个问题, 这本不属于IoC的范围, 应该交由专门的模块化框架如OSGi去解决
在我相对熟悉的IoC框架中, Autofac试图提供"Module"这个概念来解决一部分问题. 对象间的协作可以隐藏在Module对象中, 一些必要的参数可以通过Module的属性设置进来, 而对使用者,对部署只需暴露Module对象即可. 这是以丧失灵活性为代价的, 替换某个内部对象的实现变成了Hack, 需要通过团队成员间的交流, 源代码集体所有来完成. 如果在Module对象内部枚举扩展点的所有实现, 通过部署时的参数来挑选某个实现, 则会引入不必要的依赖, 更是得不偿失
个人倾向于第二种. 谁介绍一下.Net平台上的模块化框架?
所以相对聚焦一点, 了解一下IoC框架在处理单个对象的时候所需要解决的问题
1, 部署时如何方便的支持产品环境和测试环境, 即在不同环境下提供同一接口的不同实现
这个甚至不需要IoC框架解决, 应用开发人员在不同环境下提供不同配置文件即可. 那问题变成了
2, 如何简化配置, 使得框架能够自动识别依赖
这个被称为Auto wire, 一般根据构造函数参数或属性的类型来匹配依赖. 那么带来的一个问题是
3, 运行时如何动态切换同一个类型的不同实现, 比如用户选择了只读模式, 那么所有的Save操作都应被忽略不做任何事, 可以通过提供Save操作的Dummy版本来实现
Auto wire根据类型匹配有一定的局限性, 即同一个运行时环境有某个接口的多个实现怎么办. 这里实际上有一个概念, 即对象的标识. 而类型只是标识的一种. 另外一种适应性更广的标识是字符串. 有的框架称之为ID, 有的称之为name. 标识的重要特征就是在一个运行时环境里是唯一的. 类型标识因此也可以转化为字符串标识, 取其全名就可以了. (标识本身是个概念, 可以用一个类来表达, 然后有不同的子类实现, 如基于类型的标识, 基于字符串的标识等)
因此就有两种策略: 一种是允许运行时某个对象可以重新声明依赖的标识, 一种是运行时用同样标识的对象替换原先的实现. 后一种相对容易实现一点, 按注册顺序Last One Win就可以了
如果同一个类型的多个实例需要同时存在, 则部署时给予不同的ID即可. 然而另一个问题是
4, 多用户环境下, 如何保证每个用户都有自己的对象组合而不互相干扰
IoC框架一般被称为IoC容器. 容器这个概念是对运行时环境,上下文的封装, 提供了一组基础设施, 以及运行时所需的各种服务, 最重要的一点是, 它提供了在同一个进程里的隔离. 多用户环境下, 可以创建多个彼此独立的容器, 每个容器负责创建所需的对象, 提供所需的服务, 彼此之间互不影响. 于是带来新的问题,
5, 对象的生命周期如何管理
很显然, 有的对象概念上属于全局, 在程序运行过程中不能创建多个实例, 也不能被销毁. 有的跟用户的一次操作, 一次请求相关联, 同一次请求中可以复用同一个对象实例, 但不同请求必须创建不同的对象实例. 有的则每次需要访问它的时候都得创建一个新的实例. 容器必须提供基础设施, 让应用开发者可以指定对象的生命周期, 并在周期结束时销毁所有该销毁的对象. C# 提供了 Dispose 机制, 可供利用
其它的一些问题, 比如:
- 如何支持composite, decorator, proxy模式
- 如何方便用户注册, 包括自动注册
- 如何注入容器创建的对象到用户手工创建的对象中
- 如何与现有各种框架集成
- 如何避免循环引用: Constructor/property dependencies
- Open generics injection
- List injection Unregistered resolution
- Auto-mocking
- Startable
- Strongly-typed Activation Events
- Adding to an Existing Container
发表评论
-
Architecture is layered
2004-12-11 11:57 374那天被问道软件架构师需要了解编程语言的细节吗? 呵呵,架构是 ... -
Thinking Everyday
2004-12-11 12:01 4351,编程语言的发展趋势 ... -
糟糕命名集锦
2004-12-11 16:50 5661,公交支线,如375和375 ... -
古代的软件开发 (一)
2005-02-19 16:45 6721,额外的中间层鞋子:人类发明鞋子的意义无论如何评价都不过分, ... -
访问控制 : 语言和平台
2005-03-15 19:27 608程序逻辑上的组织方式(如名称空间,包等)可以和部署时的分发 ... -
Thinking Everyday II
2005-03-17 15:11 6151, 是业务,不是技术,傻瓜 是集成,不是编程 是使用,不 ... -
内容与标准为王:下一代互联网与下一代搜索
2005-07-25 14:53 697第一代互联网混淆了真正的数据和它的表现形式,第一代搜索无法 ... -
个性与定制为王:下一代互联网和下一代门户
2005-07-28 11:28 593看一下现在我与互联网有关的生活:我有两三个常用的Web邮箱 ... -
泛型编程 vs. 面向对象
2005-08-10 14:30 804面向对象:封装(数据抽象)是基础,继承是手段,多态是目的 ... -
函数式编程 vs. 对象式编程
2005-08-10 14:44 646<<我爱我家>>有一集和平摔成了脑 ... -
用手机从ATM取钱
2005-11-21 22:49 690手机的以下两个特性,使它潜在的可能成为统一的支付和信用平 ... -
Web 3.0 : Unified Human-like Interaction
2006-01-14 16:31 696你还在到搜索引擎的主页上去搜索吗?你还登录新闻网站查询最新比赛 ... -
软件生物学
2006-01-14 16:59 644长久以来,软件的建筑学隐喻已经深入人心,可始终无法达到建筑 ... -
广义对象论
2006-01-25 15:31 681前几天本想接着以前的思维中对“3.2 Programming ... -
Thinking Everyday III
2006-03-26 14:17 7821, RAII让我告别了delete,IoC让我告别了ne ... -
简单至及的AOP和IOC
2006-03-26 14:21 654I. AOP的例子 1, Google To ... -
TDD: Tricky Driven Development
2007-05-10 07:07 587命名 测试用例的名字应该描述需求, 不要描述实现. ... -
Thinking Everyday IV
2007-05-15 04:36 5131, 实际上 C# 2.0 已经部 ... -
迭代本质论
2008-02-14 13:58 624新年伊始, 可能你又要制定一些计划了, 实际上, 你的生活在开 ... -
建筑的永恒之道
2004-08-10 18:31 6442,质 这种特质是任 ...
相关推荐
Spring IOC,全称为...以上内容详细阐述了Spring IOC容器的工作原理,bean的作用域管理,循环引用的解决方式,注解的加载时机,以及动态代理可能导致的问题。深入理解这些概念有助于更好地使用和调试Spring应用。
在本示例"iocdemo.rar"中,我们将探讨如何模仿Spring的IoC原理,通过XML配置和注解两种方式进行Bean的管理。 **控制反转(IoC)** IoC意味着应用程序的控制权由传统的程序流程控制转向了外部容器,即Spring框架。在...
学习Spring IOC,你需要理解Bean的定义、作用域、依赖注入的原理和方式,以及如何通过配置文件或注解来配置Bean。同时,掌握如何利用ApplicationContext获取Bean,以及如何利用AOP和生命周期管理功能,将帮助你更好...
这在一定程度上节省了资源,但同时也意味着延迟初始化可能导致的性能问题。 - **ApplicationContext**:相对于BeanFactory,ApplicationContext提供了更多的高级特性。它在启动时就会初始化所有单例Bean,避免了...
Spring IOC 容器是Java开发中非常关键的组件,它是Spring框架的核心部分,负责管理对象的生命周期和依赖关系。本项目"手写一个SpringIoc容器"旨在模仿Spring的IOC(Inversion of Control,控制反转)功能,帮助...
- 在使用 Spring IoC 时,需要注意 bean 的作用域设置,避免因作用域不当导致的问题。 - 虽然 XML 配置方式比较直观,但在大型项目中推荐使用注解配置,以提高代码的可读性和可维护性。 - Spring 的 IoC 容器是 ...
Spring通过Bean的生命周期管理和作用域(如Singleton、Prototype等)来解决这些问题。对于循环依赖,Spring提供了早期绑定和晚期绑定两种解决策略;对于延迟加载,可以使用`@Lazy`注解;对于工厂方法,可以定义一个...
4. **Bean的作用域**:Spring提供了多种Bean的作用域,如单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)等,根据不同的需求选择合适的Bean作用域。 5. **Bean的生命周期**:Spring容器对...
**工厂模式的IoC应用** 在软件工程中,控制反转(Inversion of Control,简称IoC)是一种设计原则,它将对象的创建和管理权从代码中剥离出来,交由一个外部容器负责。Spring框架是Java领域实现IoC的典型代表,通过...
**Spring IoC 框架详解** Spring框架是Java开发中的一个核心组件,它提供了许多功能,其中最重要的一项就是Inversion of Control(IoC),也称为Dependency Injection(DI)。IoC容器是Spring的核心,它负责管理...
总结来说,Spring通过注解实现的IOC,主要包括了Bean的声明、依赖的自动装配、作用域的定义、生命周期方法的控制以及属性值的注入等功能。通过这些注解,开发者可以轻松地管理和控制应用程序中的对象,实现松散耦合...
Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性之一,它允许开发者将对象的创建和管理交给Spring容器来处理,从而使代码更加松耦合,更易于测试和维护。下面将详细介绍Spring IOC的基本概念、...
**控制反转(IOC)与Spring框架** 控制反转(IOC)是一种...以上就是关于Spring框架中IOC的概念、Bean的定义和管理、依赖注入以及作用域的详解。在实际开发中,灵活运用这些特性可以提升代码的可扩展性和可维护性。
实际的Spring框架提供了更多高级特性,如AOP、事件机制、Bean的作用域等。在模拟时,可以根据需求逐步添加这些功能。 通过以上步骤,我们可以构建一个简单的IOC容器,模拟Spring的核心功能。这不仅有助于理解Spring...
在 Spring 中,IoC 容器还提供了其他高级功能,如 Bean 的作用域(singleton、prototype 等)、AOP(面向切面编程)支持、事件发布、资源加载等。这些特性使得 Spring 成为了一个功能丰富的框架,能够满足复杂应用...
4. **Bean的作用域**:Spring提供了多种Bean的作用域,包括单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)和全局会话(Global Session)。这允许我们根据需求选择合适的Bean生命周期。 5...
Bean的作用域,如单例(singleton)、原型(prototype)等;以及事件驱动模型,允许bean之间进行通信。 此外,Spring框架还提供了大量的工具类和模块,如数据访问/集成层(包括JDBC、ORM支持)、Web MVC、Test支持...
【自定义IOC容器】是一个Java开发中的实践项目,旨在深入理解Spring框架的核心组件——IOC(Inversion of Control,控制反转)容器的工作原理。IOC容器是Spring框架的核心,它负责管理和装配应用中的对象,实现了...