2-形象理解SpringIOC(控制反转)

通过一个学生选择课程的demo 以3中不同的实现方式理解一下springIOC,体会IOC的好处:

声明一个ICourse接口:

package org.ks.newinstance;

public interface ICourse {
    void learn();        //学习。。。。
}

两个ICourse接口的实现类:JavaCourse.java  ,   HtmlCourse.java

package org.ks.newinstance;

public class JavaCourse implements ICourse {

    @Override
    public void learn() {
        System.out.println("学习Java");
    }

}
package org.ks.newinstance;

public class HtmlCourse implements ICourse {

    @Override
    public void learn() {
        System.out.println("学习HTML");
    }

}

学生实体类:Student

package org.ks.entity;

import org.ks.factory.CourseFactory;
import org.ks.newinstance.HtmlCourse;
import org.ks.newinstance.ICourse;
import org.ks.newinstance.JavaCourse;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Student {
    private int stuNo;
    private String stuName;
    private int stuAge;
    public int getStuNo() {
        return stuNo;
    }
    public void setStuNo(int stuNo) {
        this.stuNo = stuNo;
    }
    public String getStuName() {
        return stuName;
    }
    public void setStuName(String stuName) {
        this.stuName = stuName;
    }
    public int getStuAge() {
        return stuAge;
    }
    public void setStuAge(int stuAge) {
        this.stuAge = stuAge;
    }
    @Override
    public String toString() {
        return this.stuName + "," + this.stuAge + "," + this.stuNo;
        }

    //学习所有课程
    public void learn(String name)
    {
        /*
        //方式2.
            //从自己编写的简单工厂中国获取课程
        ICourse course = CourseFactory.getCourse(name);//course就是根据name拿到的相应课程
        course.learn();
        */

        //方式3.
        //直接从IOC容器中获取
        //从SpringIOC提供的超级工厂中获取课程(前提:之前设置过Bean)
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        ICourse course = (ICourse)context.getBean(name);
        course.learn();

    }

    //方式1.
    public void learnjava() {         //学习Java课程
        ICourse course = new JavaCourse();
        course.learn();
    }

    //学习HTML课程
    public void learnhtml() {
        ICourse course = new HtmlCourse();
        course.learn();
    }
}

模拟的工厂(用于产生课程):

package org.ks.factory;

import org.ks.newinstance.HtmlCourse;
import org.ks.newinstance.ICourse;
import org.ks.newinstance.JavaCourse;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

//课程工厂(用于产生课程)
public class CourseFactory {
    public static ICourse getCourse(String name)//getCourse声明为静态方法,可以通过类名直接调用
    {

        //方式2.
        if(name.equals("java"))
        {
            return (ICourse)new JavaCourse();

        }else
        {
            return (ICourse)new HtmlCourse();
        }

        /*
        //方式3.
        //获取IOC容器
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        if(name.equals("java"))
        {
            return (ICourse)context.getBean("JavaCourse");     // new -> 从 IOC获取
        }
        else if(name.equals("html"))
        {
            return (ICourse)context.getBean("HtmlCourse");      // new -> 从 IOC获取
        }
        */
    }
}

配置文件: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">

    <!-- 该文件中所产生的所有对象,被spring放入了一个称之为spring IOC 容器的地方 -->
    <!-- id:唯一标识符  class:指定类型 -->
    <bean id = "student" class = "org.ks.entity.Student">  <!-- 相当于:Student stu = new Student() -->
        <!-- property:该class代表的类的属性
            name:属性名
            value:属性值
         -->
        <property name="stuName" value = "李四"></property>
        <property name="stuAge" value = "20"></property>
        <property name="stuNo" value = "13"></property>
    </bean>

    <bean id = "JavaCourse" class = "org.ks.newinstance.JavaCourse">

    </bean>

    <bean id = "HtmlCourse" class = "org.ks.newinstance.HtmlCourse">

    </bean>
</beans>

入口:

package org.ks.test;

import org.ks.entity.Student;
import org.ks.factory.CourseFactory;
import org.ks.newinstance.ICourse;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class test2 {
    //方式1.
    public static void learnCourse()
    {
        Student stu = new Student();
        stu.learnjava();
        stu.learnhtml();
    }

    //方式2.
    public static void learnCourseWithFactory()
    {
        Student stu = new Student();
        stu.learn("html");
    }

    //方式3.
    public static void learnCourseWithIOC()
    {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //执行从springioc容器中获取一个id为student的对象
        Student stu = (Student)context.getBean("student");  //new Student() 变成  从IOC获取student
        stu.learn("HtmlCourse");
    }

    public static void main(String[] args)
    {
        //learnCourse();           //方式1.直接通过创建Student对象的方式
        //learnCourseWithFactory();         //方式2.自己设置建档工厂的方式
        learnCourseWithIOC();          //方式3.通过SpringIOC(超级工厂)的方式
    }
}

总结:

IOC:控制反转(将创建对象,属性值 的方式进行了反转,从 new,setXxx() 反转为了 从springIOC容器中 getBean() )

IOC也可以称之为DI(依赖注入)
依赖注入:将属性值注入给了属性,将属性注入给了Bean,将Bean注入给了IOC容器。(形象理解:社会主义)

因此:IOC/DI,无论要什么对象,都可以直接去springIOC容器中获取,而不需要自己操作(new/setXxx()....)
           所以IOC分为两步:1.先在springIOC中存放对象并赋值     2.获取对象

原文地址:https://www.cnblogs.com/kesheng/p/12507738.html

时间: 2024-11-02 05:43:15

2-形象理解SpringIOC(控制反转)的相关文章

SpringIOC控制反转

在Spring中,依赖注入(DI)模式实现了控制反转(IoC)原理.让我们通过一个例子来帮助理解依赖注入.我们先看到java版的例子,然后在此基础上加上spring的功能.就例子而言,是相当地简单.QuizMater接口暴露了popQuestion()方法.为了保持简单性,QuizMaster将只生成一个问题. /**  * QuizMaster.java  */ package com.vaannila;   public interface QuizMaster {       public

【转】深入理解IOC控制反转及应用实例(转 https://www.cnblogs.com/harlen/p/7120708.html)

一.IOC雏形 1.程序V1.0 话说,多年以前UT公司提出一个需求,要提供一个系统,其中有个功能可以在新春佳节之际给公司员工发送一封邮件.邮件中给大家以新春祝福,并告知发放一定数额的过节费. 经分析,决定由张三.李四和王五来负责此系统的开发. 其中:由张三负责业逻辑控制模块 LogicController的开发,此处简化为UT.LogicController.exe :由李四负责祝福消息管理类(GreetMessageService),并集成到组件 UT.MessageService.dll中

控制反转(IOC)/依赖注入(DI)理解

个人学习笔记,来自Acode. 1.术语 控制反转/反向控制,英文全称“Inversion of Control”,简称IoC. 依赖注入,英文全称“Dependency Injection”,简称DI. 据说是Martin Fowler对控制反转的原理进行了深入的探索后,为控制反转起了个新的名字叫“依赖注入”.也就是说,这两个术语讲的是同一个事物. 2.控制反转的“奥义” “实现必须依赖抽象,而不是抽象依赖实现”. 3.实例理解 只看了控制反转的奥义,对于一般人来说还是难以理解,就好比一位功夫

谈谈php里的IOC控制反转,DI依赖注入

理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(Inversion of Control,缩写为IoC):是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度. 依赖注入(Dependency Injection,简称DI):DI是IOC的一种实现,表现为:在类A的实例创建过程中即创建了依赖的B对象,通过类型或名称来判断将不同的对象注入到不同的属

谈谈php里的IOC控制反转,DI依赖注入(转)

转自:http://www.cnblogs.com/qq120848369/p/6129483.html 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(Inversion of Control,缩写为IoC):是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度. 依赖注入(Dependency Injection,简称DI):DI是IOC的一种实现

控制反转(IoC)与依赖注入(DI)

前言 最近在学习Spring框架,它的核心就是IoC容器.要掌握Spring框架,就必须要理解控制反转的思想以及依赖注入的实现方式.下面,我们将围绕下面几个问题来探讨控制反转与依赖注入的关系以及在Spring中如何应用. 什么是控制反转? 什么是依赖注入? 它们之间有什么关系? 如何在Spring框架中应用依赖注入? 什么是控制反转 在讨论控制反转之前,我们先来看看软件系统中耦合的对象.图1:软件系统中耦合的对象从图中可以看到,软件中的对象就像齿轮一样,协同工作,但是互相耦合,一个零件不能正常工

02_Spring控制反转案例快速入门

Spring控制反转案例快速入门 1.下载Spring最新开发包 http://www.springsource.org/download/community 下载spring3.2 的开发包 目录结构(spring-framework-3.2.0.RELEASE) * docs 存放API和 规范文档 * libs 开发jar包 * schemas 开发过程中需要导入xml的schema 约束 我们还有一个依赖包(spring-framework-3.0.2.RELEASE-dependenc

依赖注入和控制反转的理解,写的太好了。

学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解. 一.分享Iteye的开涛对Ioc的精彩讲解 首先要分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinniansh

Spring中控制反转最通俗理解

套用好莱坞的一句名言就是:你呆着别动,到时我会找你. 什么意思呢?就好比一个皇帝和太监 有一天皇帝想幸某个美女,于是跟太监说,今夜我要宠幸美女 皇帝往往不会告诉太监,今晚几点会回宫,会回哪张龙床,他只会告诉太监他要哪位美女 其它一切都交由太监去安排,到了晚上皇帝回宫时,自然会有美女出现在皇帝的龙床上 这就是控制反转,而把美女送到皇帝的寝宫里面去就是注射 太监就是是框架里面的注射控制器类BeanFactory,负责找到美女并送到龙床上去 整个后宫可以看成是spring框架,美女就是Spring控制