IOC是spring的最基础部分,也是核心模块,Spring的其他组件模块和应用开发都是以它为基础的。IOC把spring的面向接口编程和松耦合的思想体现的淋漓尽致。

IOC概念

IOC(Inversion of Control)译为中文“控制反转”,许多应用都是由两个或更多个类通过彼此合作来实现业务逻辑的,这使得每个对象都要引用其合作对象(也就是它所以来的对象)来装配在一起工作,而这个装配过程如果靠硬编码来实现,他们之间的耦合性有多强就可想而知的。如果把这个装配过程交给第三方(如IOC容器)来实现,那么就能很好的解耦,此时控制就反转了,反转给了第三方(如IOC容器)。

IoC是一个很大的概念,可以用不同的方式来实现。其主要实现方式有两种

  • 依赖查找(Dependency Lookup):容器提供回调接口和上下文环境给组件。EJB和Apache Avalon都使用这种方式。
  • 依赖注入(Dependency Injection):组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。

Dependency Injection是时下最流行的IoC类型,所以有时我们说IOC的另一个名字叫依赖注入,它又有接口注入(Interface Injection),设值注入(Setter Injection)和构造子注入(Constructor Injection)三种方式。

IOC与旧方式的对比

本文Demo想实现的效果:架设需要之前是使用的MySql数据库,但后来却要转向Oracle数据,我们来看下使用IOC和不使用IOC的对比。当然这个例子并不合适,因为你可能立马想到Hibernate,所以请不要介意,这只是个Demo。

  1. 没有使用注入方式

    package net.oseye;
    
    public class App
    {
    public static void main( String[] args )
    {
    //调用数据库操作
    new MysqlHelper().insert();
    }
    }
    /**
    * Mysql数据库操作
    */
    class MysqlHelper{
    /**
    * 插入数据
    */
    public void insert(){
    System.out.println("Mysql数据库插入操作");
    }
    }

    那么如果现在转向Oracle数据库,那么你不仅要增加Oracle操作类,还必须更改调用数据库操作的代码(PS:为了演示方便,数据库操作类我没有单独文件)

    package net.oseye;
    
    public class App
    {
    public static void main( String[] args )
    {
    //调用数据库操作
    new OracleHelper().insert();
    }
    }
    /**
    * Mysql数据库操作
    */
    class MysqlHelper{
    /**
    * 插入数据
    */
    public void insert(){
    System.out.println("Mysql数据库插入操作");
    }
    }
    /**
    * Oracle数据库操作
    */
    class OracleHelper{
    /**
    * 插入数据
    */
    public void insert(){
    System.out.println("Oracle数据库插入操作");
    }
    }

    可见耦合性是很强的。

  2. 使用IOC的构造器注入方式
    使用IOC你能感受到面向接口编程的思想,App.java代码如下:

    package net.oseye;
    
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.context.support.ClassPathXmlApplicationContext; public class App
    {
    public static void main( String[] args )
    {
    //IOC容器装载Bean定义资源
    BeanFactory beanFactory=new ClassPathXmlApplicationContext("applicationcontext.xml");
    //依赖装配
    IDbHelperManager idbHelperManager= beanFactory.getBean("dbhelpermanager",IDbHelperManager.class);
    idbHelperManager.insert();
    }
    }
    /**
    * 数据库操作管理接口
    */
    interface IDbHelperManager{
    public void insert();
    }
    /**
    * 数据库操作管理实现
    */
    class DbHelperManager implements IDbHelperManager{
    //构造器注入准备工作
    private IDbHelper dbHelper;
    public DbHelperManager(IDbHelper dbHelper){
    this.dbHelper=dbHelper;
    } public void insert(){
    this.dbHelper.insert();
    }
    }
    /**
    * 数据库操作接口
    */
    interface IDbHelper{
    public void insert();
    }
    /**
    * Mysql数据库操作实现
    */
    class MysqlHelper implements IDbHelper{
    public void insert(){
    System.out.println("Mysql数据库插入操作");
    }
    }
    /**
    * Oracle数据库操作实现
    */
    class OracleHelper implements IDbHelper{
    public void insert(){
    System.out.println("Oracle数据库插入操作");
    }
    }

    applicationcontext.xml配置文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="mysqldbhelper" class="net.oseye.MysqlHelper"></bean>
    <bean id="oracledbhelper" class="net.oseye.OracleHelper"></bean>
    <bean id="dbhelpermanager" class="net.oseye.DbHelperManager">
    <constructor-arg ref="mysqldbhelper"></constructor-arg>
    </bean>
    </beans>

    maven的pom.xml配置如下:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion> <groupId>net.oseye</groupId>
    <artifactId>IOCDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging> <name>IOCDemo</name>
    <url>http://maven.apache.org</url> <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties> <dependencies>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.0.3.RELEASE</version>
    </dependency>
    </dependencies>
    </project>

    项目结构如下:

    当你想切换使用Oracle数据库,只需要修改applicationcontext.xml配置文件,把dbhelpermanager的bean配置为oracledbhelper:

    <bean id="dbhelpermanager" class="net.oseye.DbHelperManager">
    <constructor-arg ref="oracledbhelper"></constructor-arg>
    </bean>

依赖注入三种方式

  1. 构造器注入
    如上面Demo不在累述,构造器注入参数有值类型和引用类型(以下雷同)

    <constructor-arg ref="引用类型"></constructor-arg>
    <constructor-arg value="值类型"></constructor-arg>
  2. setter方法注入
    通过 JavaBean的属性分配依赖性,只需要修改DbHelperManager类和配置文件即可。

    class DbHelperManager implements IDbHelperManager{
    //构造器注入准备工作
    private IDbHelper dbHelper;
    public void setDbHelper(IDbHelper dbHelper){
    this.dbHelper=dbHelper;
    } public void insert(){
    this.dbHelper.insert();
    }
    }

    applicationcontext.xml配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="mysqldbhelper" class="net.oseye.MysqlHelper"></bean>
    <bean id="oracledbhelper" class="net.oseye.OracleHelper"></bean>
    <bean id="dbhelpermanager" class="net.oseye.DbHelperManager">
    <property name="dbHelper" ref="oracledbhelper"></property>
    </bean>
    </beans>

    这里的property要用name才能找到setter;上面通过构造器注入,因为构造器只有一个参数,所以没有使用name;

  3. 接口注入
    这种方式不常用,而且具有侵入性,暂不研究!

三种注入方式都是将对象交与IOC容器管理,避免在程序中出现具体实现。通过代码我们可以看出IOC依赖注入的好处:

  • 对象之间的依赖关系,不由对象自身来负责,而是由容器依据配置文件动态建立,这样就很灵活,可配;
  • 采用依赖注入,模块之间一定是松散耦合的;
  • 代码易维护易测试;

Spring IOC以及三种注入方式的更多相关文章

  1. Spring IOC 中三种注入方式

    项目错误知识点记录 正文 最近在项目的时候,用到Spring框架,Spring框架提供了一种IOC的自动注入功能,可以很轻松的帮助我们创建一个Bean,这样就省的我们四处写new Object()这样 ...

  2. Spring学习笔记(6)——IoC的三种注入方式

    1.接口注入(不推荐) 2.构造器注入(死的应用) 3.getter,setter方式注入(比较常用) Type1 接口注入 我们常常借助接口来将调用者与实现者分离.如: public class C ...

  3. Spring常用的三种注入方式

    好文要收藏,摘自:https://blog.csdn.net/a909301740/article/details/78379720 Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入 ...

  4. Spring:Spring-IOC三种注入方式、注入不同数据类型

    一.Spring IOC(依赖注入的三种方式): 1.Setter方法注入 package com.jpeony.spring.setter; import com.jpeony.spring.com ...

  5. spring Bean的三种注入方式

    1.构造函数注入: 构造函数的注入方式分为很多种 (1)普通构造函数,空参数的构造函数 <bean id="exampleBean" class="examples ...

  6. 【SSH系列】深入浅出spring IOC中三种依赖注入方式

    spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入什么?控 ...

  7. 深入浅出spring IOC中三种依赖注入方式

    深入浅出spring IOC中三种依赖注入方式 spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和 ...

  8. spring ioc三种注入方式

    spring ioc三种注入方式 IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转 什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容 ...

  9. Spring IOC 三种注入方式

    1.    接口注入 2.    setter注入 3.    构造器注入 对象与对象之间的关系可以简单的理解为对象之间的依赖关系:A类需要B类的一个实例来进行某些操作,比如在A类的方法中需要调用B类 ...

随机推荐

  1. SpringMVC详解

    来源:Sunnier(http://www.admin10000.com/document/6436.html) 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入Spr ...

  2. ubuntu vi编辑insert时上下左右建为ABCD

    ubuntu  在vi编辑insert时上下左右建不能移动光标而是输出ABCD,backspace也不能起删除作用, 开始我退出insert模式就能够移动和删除了,不过这样太麻烦很不适应, 只要一次执 ...

  3. 列表视图(ListView)和ListActivity

    ListView是手机系统中使用非常广泛的一种组件,它以垂直列表的形式显示所有列表项. 创建ListView有如下两种方式: 直接使用ListView进行创建. 让Activity继承ListActi ...

  4. flex 事件注册和鼠标拖动

    flex 事件注册和鼠标拖动 <?xml version="1.0" encoding="utf-8"?> <s:Application xm ...

  5. P2P直播承载平台与CDN直播承载平台比较

    收看软件不一样:CDN直播收看无需安装第三方收看软件,一般操作系统已带播放器软件:P2P直播收看需要安装厂家自己的播放器软件,每家P2P的软件不兼容,收看者要装多套软件才能收看不同内容. 收看人数不一 ...

  6. Apple官方IOS开发入门教程[v0.2]

    今天,又跑去找IOS开发入门教程了,结果发现没什么好的PDF. 后来发现,原来苹果官方有开发入门教程,而且写的很好.所以整理出来了,给大家分享一下. 我就不在这里贴pdf的内容了,下面有苹果官方教程的 ...

  7. 【The Most Important】浅谈JSP表单Post方式中文乱码问题

    首先祝大家鸡年吉祥!在这里我要说下这两天里这个问题困扰着我,大过年的心情都被烦扰的不好了,所以我带着兴奋的心情来赶快完成这篇博客,解决大家的问题.我的问题是post方式传递表单数据,Tomcat服务器 ...

  8. MongoDB基础之五:游标

    1.cursor(游标)是什么 ? 通俗的说,游标不是查询结果,而是查询的返回资源,或者接口. 通过这个接口,你可以逐条读取. 就像php中的fopen打开文件,得到一个资源一样, 通过资源,可以一行 ...

  9. 【.Net Framework 体积大?】不安装.net framework 也能运行!?开篇叙述-1

    [声明:请尊重作者micro-chen的原创,抓文章,请添加来源和作者署名.作者保留追责权利.......] 写在前言 看着日渐没落的.net ,心里多少有了点悲凉.国内的越来越多的新兴公司 都是JA ...

  10. 【读书笔记】-- JavaScript模块

    在JavaScript编程中我们用的很多的一个场景就是写模块.可以看成一个简单的封装或者是一个类库的开始,有哪些形式呢,先来一个简单的模块. 简单模块 var foo = (function() { ...