`
zwh910621
  • 浏览: 143338 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring IOC(一)

阅读更多

 

Spring IOC

IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转, Spring 框架的核心基于控制反转原理。

什么是控制反转?

控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术。

<!>由容器控制程序之间的关系,而不是由代码直接控制

<!>由于控制权由代码转向了容器,所以称为反转

 

对象与对象之间的关系可以简单的理解为对象之间的依赖关系:

依赖关系:在 A 类需要类 B 的一个实例来进行某些操作,比如在类 A 的方法中需要调用类 B 的方法来完成功能,叫做 A 类依赖于 B 类。

 

一个需要特定的依赖的组件一般会涉及一个依赖对象,在 IOC 的概念中叫做目标 (target) 。换句话说, IOC 提供了这样的服务,使一个组件能够在它的整个生命周期中访问它的依赖和服务,用这种方法与它的依赖进行交互。总的来说, IOC 能够被分解为两种子类型:依赖注入和依赖查找。

 

(1) 依赖查找

比如使用 JNDI 注册一个数据库连接池的示例中,代码中从注册处获得依赖关系的 JNDI 查找 (JNDI lookups)

initContext = new InitialContext();

// 获取数据源

DataSource ds = (DataSource) initContext.lookup("java:comp/env/jdbc/mysql");

 

(2) 依赖注入

(Dependency Injection) 依赖注入:两个对象之间的依赖关系在程序运行时由外部容器动态的注入依赖行为方式称为依赖注入 (DI) DI IOC 的一种形式。

 

IoC 在应用开发中是一个非常有力的概念。如 Martin Flower 所述, IoC 的一种表现形式就是依赖性注射。依赖性注射用的是好莱坞原则, " 不要找我,我会找你的。 " 。换句来说,你的类不会去查找或是实例化它们所依赖的类。控制恰好是反过来的,某种容器会设置这种依赖关系。使用 IoC 常常使代码更加简洁,并且为相互依赖的类提供一种很好的方法。

 

依赖注入的三种实现类型:接口注入、 Setter 注入和构造器注入。

<1> 接口注入 (Type1)

public class ClassA {

private InterfaceB clzB;

public void doSomething() {

Ojbect obj =Class.forName(Config.BImplementation).newInstance();

clzB = (InterfaceB)obj;

clzB.doIt()

}

……

}

上面的代码中, ClassA 依赖于 InterfaceB 的实现,如何获得 InterfaceB 实现类的实例?传统的方法是在代码中创建 InterfaceB 实现类的实例,并将起赋予 clzB

而这样一来, ClassA 在编译期即依赖于 InterfaceB 的实现。为了将调用者与实现者在编译期分离,于是有了上面的代码,我们根据预先在配置文件中设定的实现类的类名 (Config.BImplementation) ,动态加载实现类,并通过 InterfaceB 强制转型后为 ClassA 所用。这就是接口注入的一个最原始的雏形。

而对于一个 Type1 IOC 容器而言,加载接口实现并创建其实例的工作由容器完成,见如下代码。

 

public class ClassA {

       private InterfaceB clzB;

              public Object doSomething(InterfaceB b) {

              clzB = b;

              return clzB.doIt();

       }

       ……

}

在运行期, InterfaceB 实例将由容器提供。

Type1 IOC 发展较早(有意或无意),在实际中得到了普遍应用,即使在 IOC 的概念尚未确立时,这样的方法也已经频繁出现在我们的代码中。

下面的代码大家应该非常熟悉:

public class MyServlet extends HttpServlet {

       public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {

              ……

       }

}

这也是一个 Type1 型注入, HttpServletRequest HttpServletResponse 实例由 Servlet Container 在运行期动态注入。

<2>Setter( 设值 ) 注入 (Type2)

各种类型的依赖注入模式中,设值注入模式在实际开发中得到了最广泛的应用。

 

public class ClassA {

private InterfaceB clzB;

public void setClzB(InterfaceB clzB) {

    this. clzB = clzB;

}

……

}

 

详见 Hello World 程序

<3> 构造器注入 (Type3)

依赖关系是通过类构造函数建立的

容器通过调用类的构造方法将其所需的依赖关系注入其中

 

public class DIByConstructor {

       private final DataSource dataSource;

       public DIByConstructor(DataSource ds) {

              this.dataSource = ds;

       }

……

}

 

<4> 三种依赖注入方式的比较

接口注入:

接口注入模式因为历史较为悠久,在很多容器中都已经得到应用。但由于其在灵活性、易用性上不如其他两种注入模式,因而在 IOC 的专题世界内并不被看好。

 

Setter 注入:

<!-- [if !supportLists]-->l         <!-- [endif]-->对于习惯了传统 javabean 开发的程序员,通过 setter 方法设定依赖关系更加直观。

<!-- [if !supportLists]-->l         <!-- [endif]-->如果依赖关系较为复杂,那么构造子注入模式的构造函数也会相当庞大,而此时设值注入模式则更为简洁。

<!-- [if !supportLists]-->l         <!-- [endif]-->如果用到了第三方类库,可能要求我们的组件提供一个默认的构造函数,此时构造子注入模式也不适用。

 

构造器注入:

<!-- [if !supportLists]-->l         <!-- [endif]-->在构造期间完成一个完整的、合法的对象。

<!-- [if !supportLists]-->l         <!-- [endif]-->所有依赖关系在构造函数中集中呈现。

<!-- [if !supportLists]-->l         <!-- [endif]-->依赖关系在构造时由容器一次性设定,组件被创建之后一直处于相对“不变”的稳定状态。

<!-- [if !supportLists]-->l         <!-- [endif]-->只有组件的创建者关心其内部依赖关系,对调用者而言,该依赖关系处于“黑盒”之中。

 

总结:

可见, Type3 Type2 模式各有千秋,而 Spring PicoContainer 都对 Type3 Type2 类型的依赖注入机制提供了良好支持。这也就为我们提供了更多的选择余地。理论上,以 Type3 类型为主,辅之以 Type2 类型机制作为补充,可以达到最好的依赖注入效果,不过对于基于 Spring Framework 开发的应用而言, Type2 使用更加广泛。

分享到:
评论

相关推荐

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

    spring ioc容器初始化流程图 spring ioc容器依赖注入流程图 spring aop实现原理流程图

    springIoc实现原理

    spring ioc指的是控制反转,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。交由Spring容器统一进行管理,从而实现松耦合

    springIOC手写框架分析

    springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC...

    spring ioc模块手写demo

    spring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demo...

    SpringIoc示例代码

    SpringIoc示例代码,SpringIoc示例代码,SpringIoc示例代码,SpringIoc示例代码

    spring Ioc容器配置

    spring Ioc容器配置 IOC容器数据源配置 &lt;!-- 配置数据源 --&gt; destroy-method="close"&gt; &lt;value&gt;org.gjt.mm.mysql.Driver &lt;value&gt;jdbc:mysql://localhost:3306/demo &lt;value&gt;root ...

    spring ioc思维导图源文件

    spring ioc思维导图,让自己快速、详尽地了解spring ioc知识。

    Spring ioc Spring ioc

    Spring ioc Spring ioc

    以注解方式模拟Spring IoC AOP

    以注解方式模拟Spring IoC AOP,了解Spring是如何实现的.

    Springioc注入Demo

    详细讲解了springioc的各种注入方式以及对应的java方式。讲解了springioc和DI的区别,以及注入特殊复杂的属性

    Spring中IoC优点与缺点解析

    主要为大家详细解析了Spring中IoC优点与缺点,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Spring IoC加载流程讲解

    Spring IoC加载流程讲解以及IoC思想和依赖倒置原则

    springioc和spring aop

    控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找...

    SpringIOC经典Demo

    SpringIOC经典Demo,绝对的经典.

    Spring Ioc 注解 依赖注入

    Spring Ioc 注解 依赖注入

    模拟spring ioc过程

    这是个模拟spring ioc的学习例子,是个java工程。有助于对aop和ioc的理解

    实验一 Springioc基本操作.docx

    实验一 Springioc基本操作.docx

    springioc的详细讲解

    spring的ioc容器详细讲解,理解springioc容器

    springioc加载流程图.pdf

    springioc加载流程图.pdf

    spring_ioc

    这是spring_ioc部分的内容。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...

Global site tag (gtag.js) - Google Analytics