深入了解Spring控制反转IOC原理

目录
  • 一、什么是Spring IOC容器
  • 二、IOC有哪些优点
  • 三、控制反转(IOC)有什么作用
  • 四、IoC和DI有什么区别
  • 五、Spring IoC的实现机制
  • 六、IoC支持哪些功能
  • 七、BeanFactory和ApplicationContext有什么区别
  • 八、ApplicationContext通常的实现是什么
  • 九、依赖注入的方式,构造器依赖注入和 Setter方法注入的区别
  • 十、依赖注入的基本原则和优点

一、什么是Spring IOC容器

Spring是包含众多工具的IoC容器,控制反转即IoC,它有两个核心的功能:

①将对象(Bean)存储在容器(Spring)

②将对象(Bean)从容器(Spring)中取出来

【扩展:将对象存放到容器中的好处】

将对象存储在 IoC 容器相当于将以后可能⽤的所有工具制作好都放到仓库中,需要的时候直接取就行了,用完再把它放回到仓库。而new 对象的方式相当于,每次需要工具了,才现做,用完就扔掉了也不会保存,下次再用的时候还得重新做,这就是 IoC 容器和普通程序开发的区别

二、IOC有哪些优点

IOC 或 依赖注入把应用的代码量降到最低

它使应用容易测试,单元测试不再需要单例和JNDI查找机制

最小的代价和最小的侵入性使松散耦合得以实现

IOC容器支持加载服务时的饿汉式初始化和懒加载

三、控制反转(IOC)有什么作用

将创建对象的控制权交给Spring的IoC,以前需要程序员自己控制对象创建,现在交给Spring的IoC创建,如果需要使用需要通过DI(依赖注入)@Autowired自动注入

解耦,由容器去维护具体的对象,降低耦合度

【扩展:什么是解耦,代码示例】

解耦指的是解决了代码的耦合性,耦合性也可以换⼀种叫法叫程序相关性。这就好比我们打造⼀辆完整的汽车,如果所有的配件都是自己造,那么当客户需求发生改变的时候,比如轮胎的尺寸不再是原来的尺寸了,那我们要自己动手来改了,但如果我们是把轮胎外包出去,那么即使是轮胎的尺寸发生变变了,我们只需要向代理工厂下订单就行了,我们自身身是不需要出力的

在传统的代码中对象创建顺序是:Car -> Framework -> Bottom -> Tire

改进之后解耦的代码的对象创建顺序是:Tire -> Bottom -> Framework -> Car

public class IocCarExample {
   public static void main(String[] args) {
     Tire tire = new Tire(20);
     Bottom bottom = new Bottom(tire);
     Framework framework = new Framework(bottom);
     Car car = new Car(framework);
     car.run();
  }
  //车类,把创建⼦类的⽅式,改为注⼊传递的⽅式
  static class Car {
    private Framework framework;
    public Car(Framework framework) {
      this.framework = framework;
    }
    public void run() {
      framework.init();
    }
  }
  //车身类
  static class Framework {
    private Bottom bottom;
    public Framework(Bottom bottom) {
      this.bottom = bottom;
    }
    public void init() {
    bottom.init();
    }
  }

四、IoC和DI有什么区别

IoC:控制反转,由主动new产生对象(耦合过高)转换成从外部提供对象,就是将对象的创建控制权从程序转移到了外部

DI:依赖注入,就是在程序运行期间,自动的将一个对象从Spring拿出来给当前类使用

区别:

IoC 是“目标”也是⼀种思想,而目标和思想只是⼀种指导原则,而 DI 就是具体的实现

例如:比如说我今天心情比较好,吃⼀顿好的犒劳犒劳自己,那么“吃⼀顿好的”是思想和目标(是 IoC),但最后我是吃海底捞,这就是具体的实现,就是 DI

五、Spring IoC的实现机制

1. 简单工厂:通过一个方法传入一个标识,生产对应对象

工厂模式案例:

public static void main(String[] arge){
  // 调用工厂方法,根据传入参数,返回一个对象
  BaseService  userService = Factory.getBean("user");
}
class Factory{
  public static BaseService getBean(String beanName){
      if("user".equals(beanName)){
         return = new UserServiceImpl();
      }
      if("role".equals(beanName)){
         return = new RoleServiceImpl();
      }
   }
}

2.反射:反射就是在工厂模式getBean()方法中通过反射的方式来创建Bean

class Factory {
    public static Fruit getInstance(String ClassName) {
        Fruit f=null;
        try {
            f=(Fruit)Class.forName(ClassName).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return f;
    }
}

【扩展:反射是什么,反射的实现原理】

反射机制是在运行的状态,对于任何一个类,都能知道所有属性和方法,对于任何一个对象都能调用任意方法属性,所以反射就是将Java类的各种成分映射成一个个对象

①通过Class类的静态方法:forName(String className)(常用)获取Class对象

 try {
   Class stuClass3 = Class.forName("fanshe.Student");//注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
   System.out.println(stuClass3 == stuClass2);//判断三种方式是否获取的是同一个Class对象
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }

②通过反射获取构造方法并使用:

public class Student {
  //---------------构造方法-------------------
 //(默认的构造方法)
 Student(String str){
  System.out.println("(默认)的构造方法 s = " + str);
 }
 //无参构造方法
 public Student(){
  System.out.println("调用了公有、无参构造方法执行了。。。");
 }

 //有一个参数的构造方法
 public Student(char name){
  System.out.println("姓名:" + name);
 }
 //有多个参数的构造方法
 public Student(String name ,int age){
  System.out.println("姓名:"+name+"年龄:"+ age);//这的执行效率有问题,以后解决。
 }
 //受保护的构造方法
 protected Student(boolean n){
  System.out.println("受保护的构造方法 n = " + n);
 }
 //私有构造方法
 private Student(int age){
  System.out.println("私有的构造方法   年龄:"+ age);
 }

}

六、IoC支持哪些功能

Spring 的 IoC 设计支持以下功能:

1.依赖注入

2.依赖检查

3.自动装配

4.支持集合

5.指定初始化方法和销毁方法

6.支持回调某些方法(但是需要实现 Spring 接口,略有侵入)

其中,最重要的就是依赖注入,从 XML 的配置上说,即 ref 标签。对应 Spring RuntimeBeanReference 对象。

对于 IoC 来说,最重要的就是容器。容器管理着 Bean 的生命周期,控制着 Bean 的依赖注入

【扩展:解释Bean周期】下篇博客详细介绍

七、BeanFactory和ApplicationContext有什么区别

首先创建Spring上下文的时候,会使用BeanFactory和ApplicationContext两种方法

//先得到Spring上下文
  ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");//配置文件对应
 // 先得到 spring 获取 bean 的对象
  BeanFactory beanFactory =
                new XmlBeanFactory(new ClassPathResource("spring-config.xml"));

共同点:BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口

区别:

①继承关系和功能:ApplicationContext是BeanFactory的子类,BeanFactory只是提供了基础操作Bean的方法,ApplicationContext除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化⽀持,资源访问⽀持等

②性能:ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象,而 BeanFactory是需要那个才去加载那个,因此更加轻量

八、ApplicationContext通常的实现是什么

FileSystemXmlApplicationContext :此容器从一个XML文件中加载beans的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数

ClassPathXmlApplicationContext:此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置

WebXmlApplicationContext:此容器加载一个XML文件,此文件定义了一个WEB应用的所有bean

九、依赖注入的方式,构造器依赖注入和 Setter方法注入的区别

依赖注入是时下最流行的IoC实现方式,依赖注入分为接口注入,Setter方法注入,和构造器注入,三种方式。其中接口注入由于在灵活性和易用性比较差,现在从Spring4开始已被废弃

1.构造器注入

将被依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注入。优点:对象初始化完成后便可获得可使用的对象。

缺点:当需要注入的对象很多时,构造器参数列表将会很长;不够灵活。若有多种注入方式,每种方式只需注入指定几个依赖,那么就需要提供多个重载的构造函数,麻烦

2.setter方法注入

lOC Service Provider通过调用成员变量提供的setter函数将被依赖对象注入给依赖类优点:灵活,可以选择性地注入需要的对象

缺点:依赖对象初始化完成后由于尚未注入被依赖对象,因此还不能使用

3.接口注入

依赖类必须要实现指定的接口,然后实现该接口中的一个函数,该函数就是用于依赖注入。该函数的参数就是要注入的对象

优点:接口注入中,接口的名字、函数的名字都不重要,只要保证函数的参数是要注入的对象类型即可。缺点:侵入行太强,不建议使用

【扩展:什么是侵入性?】

如果类A要使用月别人提供的一个功能,若为了使用这功能,需要在自己的类中增加额外的代码,这就是侵入性

区别:

十、依赖注入的基本原则和优点

依赖注入的基本原则:

应用组件不应该负责查找资源或者其他依赖的协作对象。配置对象的工作应该由IoC容器负责,“查找资源”的逻辑应该从应用组件的代码中抽取出来,交给IoC容器负责。容器全权负责组件的装配,它会把符合依赖关系的对象通过属性(JavaBean中的setter)或者是构造器传递给需要的对象

优势:

①查找定位操作与应用代码完全无关

②不依赖于容器的API,可以很容易地在任何容器以外使用应用对象

③不需要特殊的接口,绝大多数对象可以做到完全不必依赖容器

以上就是深入了解Spring控制反转IOC原理的详细内容,更多关于Spring控制反转IOC的资料请关注我们其它相关文章!

(0)

相关推荐

  • spring IOC控制反转原理详解

    目录 IOC概念 补:工厂模式和单例模式区别 IOC接口——实现IOC容器 1.BeanFactory 2.ApplicationContext IOC操作管理Bean xml配置bean 工厂Bean和普通Bean 注解配置bean 注册Bean 使用Bean Bean的配置 作用域:如何设置bean的单例or多例 生命周期:创建到销毁 Bean扫描 总结 IOC概念 定义:控制反转,把对象的创建和调用(传统方式是通过new之后直接使用对象),交给Spring进行管理(依靠对象工厂通过注入的方

  • spring中IOC控制反转依赖注入和new对象的区别说明

    目录 IOC控制反转依赖注入和new对象的区别 new对象 依赖注入 spring的IOC容器比New对象究竟好在哪 IOC控制反转依赖注入和new对象的区别 spring默认是单例模式的,依赖注入其中操作的都是一个对象 new对象 单例中如果要做到注入的效果就是在类的头部进行实例化对象,这个时候该对象不管使用与否都贯穿该类的始终.该类对象不被回收,这个实例化对象也不会被回收,因为存在引用状态.如果要使用多例对象则最好使用new创建对象而不是依赖注入,即使依赖注入有多例模式也不推荐. 依赖注入:

  • 浅析springboot通过面向接口编程对控制反转IOC的理解

    IoC是什么 Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制.如何理解好Ioc呢?理解好Ioc的关键是要明确"谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了",那我们来深入分析一下: ●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象

  • Java Spring 控制反转(IOC)容器详解

    目录 什么是容器? 无侵入容器 IOC控制反转 IOC理论推导 传统应用程序开发的弊端 "注入"机制 小结 IOC本质 DI(依赖注入) 总结 IoC 容器是 Spring 的核心,也可以称为 Spring 容器.Spring 通过 IoC 容器来管理对象的实例化和初始化,以及对象从创建到销毁的整个生命周期. Spring 中使用的对象都由 IoC 容器管理,不需要我们手动使用 new 运算符创建对象.由 IoC 容器管理的对象称为 Spring Bean,Spring Bean 就是

  • Spring.Net控制反转IoC入门使用

    Spring.Net包括控制反转(IoC) 和面向切面(AOP),这篇文章主要说下IoC方面的入门. 一.首先建立一个MVC项目名称叫SpringDemo,然后用NuGet下载spring(我用的是Spring.Net NHibernate 4 support) 二.类设计,在Models文件夹下面建立类,主要IUserInfo,UserInfo,Order 三个类代码如下: public interface IUserInfo { string ShowMeg(); } public clas

  • Spring的IOC控制反转详解

    目录 1.什么是 IOC? 2.分享Bromon的blog上对IoC与DI浅显易懂的讲解 3.Spring 容器创建对象的三种方式 第一种方法:利用默认的构造方法 第二种方法:利用静态工厂方法 第三种方法:利用实例工厂方法 4.Spring 容器创建对象的时机 第一种:默认情况下,启动 spring 容器便创建对象(遇到bean便创建对象) 第二种:在spring的配置文件bean中有一个属性 lazy-init="default/true/false" 5.spring的bean中的

  • 深入了解Spring控制反转IOC原理

    目录 一.什么是Spring IOC容器 二.IOC有哪些优点 三.控制反转(IOC)有什么作用 四.IoC和DI有什么区别 五.Spring IoC的实现机制 六.IoC支持哪些功能 七.BeanFactory和ApplicationContext有什么区别 八.ApplicationContext通常的实现是什么 九.依赖注入的方式,构造器依赖注入和 Setter方法注入的区别 十.依赖注入的基本原则和优点 一.什么是Spring IOC容器 Spring是包含众多工具的IoC容器,控制反转

  • Spring 控制反转和依赖注入的具体使用

    目录 控制反转的类型 1.依赖查找 1.1依赖拉取 1.2上下文依赖查找 2.依赖注入 2.1构造函数注入 2.2setter函数注入 Spring中的控制反转 1.Bean和BeanFactory 2.设置Spring配置 2.1XML配置 2.2注解配置 2.3Java配置 3.setter注入 4.构造函数注入 控制反转的类型 控制反转(IOC)旨在提供一种更简单的机制,来设置组件的依赖项,并在整个生命周期管理这些依赖项.通常,控制反转可以分成两种子类型:依赖注入(DI)和依赖查找(DL)

  • Spring核心容器IOC原理实例解析

    这篇文章主要介绍了Spring核心容器IOC原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一 .BeanFactory Spring Bean 的创建是典型的工厂模式,这一系列的 Bean 工厂,也即 IOC 容器为开发者管理对象 间的依赖关系提供了很多便利和基础服务.最基本的 IOC 容器接口 BeanFactory,来看一下它的源码: public interface BeanFactory { //对 FactoryBean

  • .NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI)

    依赖倒置原则(DIP) 依赖倒置(Dependency Inversion Principle,缩写DIP)是面向对象六大基本原则之一.他是指一种特定的的解耦形式,使得高层次的模块不依赖低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象. 该原则规定: 高层次的模块不应该依赖低层次模块,二者都应该依赖其抽象接口. 抽象接口不应该依赖于具体实现,而具体实现则应该依赖于抽象接口. 通过如下一个简单的示例,我们来看一下,我们通过一个简单地下单流程向我们的用户发

  • PHP依赖注入(DI)和控制反转(IoC)详解

    首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程序间的耦合,鄙人学习了一下,看TP官网还没有相关的文章,就写下这篇拙作介绍一下这种设计模式,希望能为TP社区贡献一些力量. 首先先别追究这个设计模式的定义,否则你一定会被说的云里雾里,笔者就是深受其害,百度了N多文章,都是从理论角度来描述,充斥着大量的生涩词汇,要么就是java代码描述的,也生涩. 不管怎么样,总算弄清楚一些了,下面就以php的角度来描述一下依赖注入这个概念. 先假设我们这里有一个类,类里面需要用到数据

  • Android应用开发中控制反转IoC设计模式使用教程

    1.概述 首先我们来吹吹牛,什么叫IoC,控制反转(Inversion of Control,英文缩写为IoC),什么意思呢? 就是你一个类里面需要用到很多个成员变量,传统的写法,你要用这些成员变量,那么你就new 出来用呗~~ IoC的原则是:NO,我们不要new,这样耦合度太高:你配置个xml文件,里面标明哪个类,里面用了哪些成员变量,等待加载这个类的时候,我帮你注入(new)进去: 这样做有什么好处呢?  回答这个问题,刚好可以回答另一个问题,很多人问,项目分层开发是吧,分为控制层.业务层

  • Java 中的控制反转(IOC)详解

    目录 IOC理论推导 Spring管理对象 Spring管理对象的简单例子 Bean无参构造类创建和有参构造类创建 Spring的一些配置 别名 Bean的配置 import 总结 IOC理论推导 Dao层 1.UserDao 接口 2.UserDaoImpl 实现类 Service层 3.UserService 业务接口 4.UserServiceImpl 业务实现类 用户实际调用service层 不会动dao层! Dao层接口创建 package com.ckm.dao; public in

随机推荐