`
chelsea
  • 浏览: 117741 次
  • 来自: ...
社区版块
存档分类
最新评论

IoC 问题域

    博客分类:
 
阅读更多


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

 

分享到:
评论

相关推荐

    SpringIOC问题-回复1

    Spring IOC,全称为...以上内容详细阐述了Spring IOC容器的工作原理,bean的作用域管理,循环引用的解决方式,注解的加载时机,以及动态代理可能导致的问题。深入理解这些概念有助于更好地使用和调试Spring应用。

    iocdemo.rar

    在本示例"iocdemo.rar"中,我们将探讨如何模仿Spring的IoC原理,通过XML配置和注解两种方式进行Bean的管理。 **控制反转(IoC)** IoC意味着应用程序的控制权由传统的程序流程控制转向了外部容器,即Spring框架。在...

    Spring-ioc-jar

    学习Spring IOC,你需要理解Bean的定义、作用域、依赖注入的原理和方式,以及如何通过配置文件或注解来配置Bean。同时,掌握如何利用ApplicationContext获取Bean,以及如何利用AOP和生命周期管理功能,将帮助你更好...

    Spring_IOC详解.pdf

    这在一定程度上节省了资源,但同时也意味着延迟初始化可能导致的性能问题。 - **ApplicationContext**:相对于BeanFactory,ApplicationContext提供了更多的高级特性。它在启动时就会初始化所有单例Bean,避免了...

    手写一个SpringIoc容器

    Spring IOC 容器是Java开发中非常关键的组件,它是Spring框架的核心部分,负责管理对象的生命周期和依赖关系。本项目"手写一个SpringIoc容器"旨在模仿Spring的IOC(Inversion of Control,控制反转)功能,帮助...

    springioc的搭建和配置

    - 在使用 Spring IoC 时,需要注意 bean 的作用域设置,避免因作用域不当导致的问题。 - 虽然 XML 配置方式比较直观,但在大型项目中推荐使用注解配置,以提高代码的可读性和可维护性。 - Spring 的 IoC 容器是 ...

    Springioc注入Demo

    Spring通过Bean的生命周期管理和作用域(如Singleton、Prototype等)来解决这些问题。对于循环依赖,Spring提供了早期绑定和晚期绑定两种解决策略;对于延迟加载,可以使用`@Lazy`注解;对于工厂方法,可以定义一个...

    spring ioc和aop原理流程图(详细)

    4. **Bean的作用域**:Spring提供了多种Bean的作用域,如单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)等,根据不同的需求选择合适的Bean作用域。 5. **Bean的生命周期**:Spring容器对...

    工厂模式的IoC应用

    **工厂模式的IoC应用** 在软件工程中,控制反转(Inversion of Control,简称IoC)是一种设计原则,它将对象的创建和管理权从代码中剥离出来,交由一个外部容器负责。Spring框架是Java领域实现IoC的典型代表,通过...

    maven-spring-ioc

    **Spring IoC 框架详解** Spring框架是Java开发中的一个核心组件,它提供了许多功能,其中最重要的一项就是Inversion of Control(IoC),也称为Dependency Injection(DI)。IoC容器是Spring的核心,它负责管理...

    Spring通过注解实现IOC

    总结来说,Spring通过注解实现的IOC,主要包括了Bean的声明、依赖的自动装配、作用域的定义、生命周期方法的控制以及属性值的注入等功能。通过这些注解,开发者可以轻松地管理和控制应用程序中的对象,实现松散耦合...

    spring ioc思维导图源文件

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性之一,它允许开发者将对象的创建和管理交给Spring容器来处理,从而使代码更加松耦合,更易于测试和维护。下面将详细介绍Spring IOC的基本概念、...

    01-ioc.pdf

    **控制反转(IOC)与Spring框架** 控制反转(IOC)是一种...以上就是关于Spring框架中IOC的概念、Bean的定义和管理、依赖注入以及作用域的详解。在实际开发中,灵活运用这些特性可以提升代码的可扩展性和可维护性。

    模拟Spring的IOC

    实际的Spring框架提供了更多高级特性,如AOP、事件机制、Bean的作用域等。在模拟时,可以根据需求逐步添加这些功能。 通过以上步骤,我们可以构建一个简单的IOC容器,模拟Spring的核心功能。这不仅有助于理解Spring...

    实现ioc功能的spring框架

    在 Spring 中,IoC 容器还提供了其他高级功能,如 Bean 的作用域(singleton、prototype 等)、AOP(面向切面编程)支持、事件发布、资源加载等。这些特性使得 Spring 成为了一个功能丰富的框架,能够满足复杂应用...

    springioc的详细讲解

    4. **Bean的作用域**:Spring提供了多种Bean的作用域,包括单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)和全局会话(Global Session)。这允许我们根据需求选择合适的Bean生命周期。 5...

    Spring之IOC示例

    Bean的作用域,如单例(singleton)、原型(prototype)等;以及事件驱动模型,允许bean之间进行通信。 此外,Spring框架还提供了大量的工具类和模块,如数据访问/集成层(包括JDBC、ORM支持)、Web MVC、Test支持...

    自定义IOC容器

    【自定义IOC容器】是一个Java开发中的实践项目,旨在深入理解Spring框架的核心组件——IOC(Inversion of Control,控制反转)容器的工作原理。IOC容器是Spring框架的核心,它负责管理和装配应用中的对象,实现了...

Global site tag (gtag.js) - Google Analytics