学习框架1-Ioc模式
《Ioc模式解析》
来源:jdon.com 作者:板桥里人
http://tech.ccidnet.com/art/322/20041102/171997_1.html
分离关注( Separation of Concerns : SOC)是Ioc模式和AOP产生最原始动力,通过功能分解可得到关注点,这些关注可以是 组件Components, 方面Aspects或服务Services。
从GoF设计模式中,我们已经习惯一种思维编程方式:Interface Driven Design 接口驱动,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性等等,但是接口一定是需要实现的,也就是如下语句迟早要执行:
AInterface a = new AInterfaceImp();
AInterfaceImp是接口AInterface的一个子类,Ioc模式可以延缓接口的实现,根据需要实现,有个比喻:接口如同空的模型套,在必要时,需要向模型套注射石膏,这样才能成为一个模型实体,因此,我们将人为控制接口的实现成为“注射”。
Ioc英文为 Inversion of Control,即反转模式,这里有著名的好莱坞理论:你呆着别动,到时我会找你。
其实Ioc模式也是解决调用者和被调用者之间的一种关系,上述AInterface实现语句表明当前是在调用被调用者AInterfaceImp,由于被调用者名称写入了调用者的代码中,这产生了一个接口实现的原罪:彼此联系,调用者和被调用者有紧密联系,在UML中是用依赖 Dependency 表示。
但是这种依赖在分离关注的思维下是不可忍耐的,必须切割,实现调用者和被调用者解耦,新的Ioc模式 Dependency Injection 模式由此产生了, Dependency Injection模式是依赖注射的意思,也就是将依赖先剥离,然后在适当时候再注射进入。
Ioc模式(Dependency Injection模式)有三种:
第一种类型 从JNDI或ServiceManager等获得被调用者,这里类似ServiceLocator模式。 1. EJB/J2EE
2. Avalon(Apache的一个复杂使用不多的项目)
第二种类型 使用JavaBeans的setter方法 1. Spring Framework,
2. WebWork/XWork
第三种类型 在构造方法中实现依赖 1. PicoContainer,
2. HiveMind
有过EJB开发经验的人都知道,每个EJB的调用都需要通过JNDI寻找到工厂性质的Home接口,在我的教程EJB是什么章节中,我也是从依赖和工厂模式角度来阐述EJB的使用。
在通常传统情况下,为了实现调用者和被调用者解耦,分离,一般是通过工厂模式实现的,下面将通过比较工厂模式和Ioc模式不同,加深理解Ioc模式。
工厂模式和Ioc
假设有两个类B 和 C:B作为调用者,C是被调用者,在B代码中存在对C的调用:
public class B{
private C comp;
......
}
实现comp实例有两种途径:单态工厂模式和Ioc。
工厂模式实现如下:
public class B{
private C comp;
private final static MyFactory myFactory = MyFactory.getInstance();
public B(){
this.comp = myFactory.createInstanceOfC();
}
public void someMethod(){
this.comp.sayHello();
}
......
}
特点:
每次运行时,MyFactory可根据配置文件XML中定义的C子类实现,通过createInstanceOfC()生成C的具体实例。
使用Ioc依赖性注射( Dependency Injection )实现Picocontainer如下,B类如同通常POJO类,如下:
public class B{
private C comp;
public B(C comp){
this.comp = comp;
}
public void someMethod(){
this.comp.sayHello();
}
......
}
假设C接口/类有有一个具体实现CImp类。当客户端调用B时,使用下列代码:
public class client{
public static void main( String[] args ) {
DefaultPicoContainer container = new DefaultPicoContainer();
container.registerComponentImplementation(CImp.class);
container.registerComponentImplementation(B.class);
B b = (B) container.getComponentInstance(B.class);
b.someMethod();
}
}
因此,当客户端调用B时,分别使用工厂模式和Ioc有不同的特点和区别:
主要区别体现在B类的代码,如果使用Ioc,在B类代码中将不需要嵌入任何工厂模式等的代码,因为这些工厂模式其实还是与C有些间接的联系,这样,使用Ioc彻底解耦了B和C之间的联系。
使用Ioc带来的代价是:需要在客户端或其它某处进行B和C之间联系的组装。
所以,Ioc并没有消除B和C之间这样的联系,只是转移了这种联系。
这种联系转移实际也是一种分离关注,它的影响巨大,它提供了AOP实现的可能。
Ioc和AOP
AOP我们已经知道是一种面向切面的编程方式,由于Ioc解放自由了B类,而且可以向B类实现注射C类具体实现,如果把B类想像成运行时的横向动作,无疑注入C类子类就是AOP中的一种Advice,如下图:
通过下列代码说明如何使用Picocontainer实现AOP,该例程主要实现是记录logger功能,通过Picocontainer可以使用简单一行,使所有的应用类的记录功能激活。
首先编制一个记录接口:
public interface Logging {
public void enableLogging(Log log);
}
有一个LogSwitcher类,主要用来激活具体应用中的记录功能:
import org.apache.commons.logging.Log;
public class LogSwitcher
{
protected Log m_log;
public void enableLogging(Log log) {
m_log = log;
m_log.info("Logging Enabled");
}
}
一般的普通应用JavaBeans都可以继承这个类,假设PicoUserManager是一个用户管理类,代码如下:
public class PicoUserManager extends LogSwitcher
{
..... //用户管理功能
}
public class PicoXXXX1Manager extends LogSwitcher
{
..... //业务功能
}
public class PicoXXXX2Manager extends LogSwitcher
{
..... //业务功能
}
注意LogSwitcher中Log实例是由外界赋予的,也就是说即将被外界注射进入,下面看看使用Picocontainer是如何注射Log的具体实例的。
DefaultPicoContainer container = new DefaultPicoContainer();
container.registerComponentImplementation(PicoUserManager.class);
container.registerComponentImplementation(PicoXXXX1Manager.class);
container.registerComponentImplementation(PicoXXXX2Manager.class);
.....
Logging logging = (Logging) container.getComponentMulticaster();
logging.enableLogging(new SimpleLog("pico"));//激活log
由上代码可见,通过使用简单一行logging.enableLogging()方法使所有的应用类的记录功能激活。这是不是类似AOP的advice实现?
总之,使用Ioc模式,可以不管将来具体实现,完全在一个抽象层次进行描述和技术架构,因此,Ioc模式可以为容器、框架之类的软件实现提供了具体的实现手段,属于架构技术中一种重要的模式应用。J道的JdonSD框架也使用了Ioc模式。(T111)
分享到:
相关推荐
对于熟悉Spring框架的开发者来说,学习BlueSky-IOC会相对容易,因为它遵循了类似的依赖注入模式,但同时也有其独特的设计和实现。通过深入了解和实践,开发者不仅可以提升个人技能,还能为团队带来更高效、更灵活的...
"ioc"通常指的是"Inversion of Control"或"依赖注入",这是一种设计模式,用于提高代码的灵活性和可测试性。 描述中的"资源全名:python-ioc-0.1.17.tar.gz"确认了这是该库的一个特定版本——0.1.17,以tar.gz格式...
Spring 框架是 Java 开发中不可或缺的一部分,它以其强大的依赖注入(Dependency Injection, DI)和控制反转(Inversion of Control, IOC)特性而闻名。在这个名为“spring-demo02-IOC-DI案例”的压缩包中,我们将...
通过分析这个"Spring-IOC丐版"的实现,开发者可以更好地理解Spring是如何工作的,这对于深入学习Spring框架、优化自己的代码或者构建类似的轻量级容器都是非常有帮助的。同时,这也是一个很好的实践案例,可以帮助...
"spring-demo10-注解-IOC.zip"这个压缩包文件很显然包含了关于Spring框架如何使用注解进行依赖注入的示例代码。接下来,我们将深入探讨Spring中的注解和依赖注入。 依赖注入(DI)是一种设计模式,它允许我们解耦...
Spring框架,作为Java生态系统中的一个核心组件,充分利用了IoC这一概念。IoC的一个常见实现是依赖注入(Dependency Injection,简称DI),它允许对象之间的依赖关系在运行时动态地被管理和配置,而不是由对象自己来...
**Spring-IoC 复习笔记** Spring 框架是 Java 开发中不可或缺的一部分,其核心特性之一就是依赖注入(Dependency Injection,简称 DI),也...通过深入学习 Spring-IoC,我们可以更高效地构建高质量的 Java 应用程序。
在传统的编程模式中,对象通常自行创建和管理它们所依赖的对象,而在IOC中,这种控制权被反转,由一个外部容器负责创建和管理对象及其依赖关系。这样做的好处在于,我们可以通过配置文件或注解来控制对象的生命周期...
在Java Spring框架中,Spring IoC(Inversion of Control,控制反转)是核心特性之一,它使得应用程序的组件之间的依赖关系不再由代码直接管理,而是交由Spring IoC容器负责。这种设计模式降低了代码间的耦合,提高...
### 基于Ioc模式的软件开发框架重构 #### 引言 控制反转(Inversion of Control,IoC)模式及其相关技术如依赖注入(Dependency Injection),在现代软件开发中扮演着至关重要的角色。IoC模式的核心在于通过将对象...
IOC 是一种设计模式,它将对象的创建和管理权反转,由框架负责管理对象的生命周期,而不是由对象自身管理。这样,开发者可以更专注于业务逻辑,而无需关心对象的实例化、配置和组装。在 Spring 中,这种机制通过容器...
学习这个框架,开发者可以深入理解IOC和AOP的概念,掌握如何在C#中实现和使用这两种模式,提升自己的编程技巧和软件设计能力。同时,了解和使用开源框架,也有助于扩展视野,了解业界最佳实践。
### Spring IOC框架学习知识点 #### 一、Spring IOC框架简介 Spring框架是一个开源的企业级Java应用框架,它提供了丰富的功能来简化企业应用开发。其中,Inversion of Control (IoC)容器是Spring的核心特性之一,...
### Spring - 2 IoC #### 一、Spring与IoC概念详解 ...通过以上内容的学习,我们可以了解到Spring框架中IoC容器的基本概念、设计模式、实现方式以及具体的使用案例。这有助于更好地理解和应用Spring框架中的IoC技术。
在IT领域,依赖注入(Dependency Injection,简称DI)是一种设计模式,它可以帮助我们编写松散耦合、可测试且...这是一个很好的学习和理解Spring IoC机制的过程,有助于加深对依赖注入的理解,以及提高软件设计能力。
工厂模式的IoC应用,特别是在Spring框架中,是一个强大的工具,可以显著提高代码的可维护性和可测试性。`BeanFactory`作为Spring的核心组件,负责bean的创建、依赖注入、生命周期管理和作用域控制,使得开发人员能够...
Spring IOC(Inversion of Control,控制反转)是Java开发中的一种重要设计模式,它极大地简化了企业级应用的复杂性。在Spring框架中,IOC容器是核心组件,负责管理对象的生命周期和对象间的依赖关系。这个名为...
Java的反射机制是Java编程语言的核心特性之一,它...总的来说,理解Java的反射和动态代理机制对于深入学习Spring框架,尤其是其IOC和AOP机制至关重要。通过掌握这些技术,开发者可以构建出更加灵活、可扩展的Java应用。
标题“Spring-IoC-DI-main”提示我们讨论的核心是Spring框架中的两个核心特性:控制反转(Inversion of Control, IoC)和依赖注入(Dependency Injection, DI)。这两个概念是Java开发中的重要基石,尤其在构建大型...
在学习Spring的过程中,了解其IoC容器、AOP、MVC、数据访问和安全机制是至关重要的。此外,实践操作也是巩固知识的关键,通过创建实际项目,可以更好地理解和运用Spring的各种特性。 这个"三大框架--Spring详解...