什么是Spring的IoC,依赖注入又该怎么实现?

这篇具有很好参考价值的文章主要介绍了什么是Spring的IoC,依赖注入又该怎么实现?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是IoC

所谓的控制反转(Inversion of Control),缩写为IoC,其实就是把对象的创建和对象之间的依赖关系处理,交给 Spring容器来管理,不用程序员自己创建和维护的一种技术。我们使用IoC的目的,主要是为了降低类之间的耦合。

IoC的底层原理

IoC的底层原理主要是基于xml解析+工厂模式+反射等技术进行实现。

  • xml解析:基于xml,配置好要创建的Javabean对象;

  • 工厂模式:把对类的创建初始化等工作,全都交给一个工厂来执行;

  • 反射:使用反射技术创建xml中配置的bean。

IoC模拟实现

为了让大家更好地理解IoC的工作原理,接下来我们自己简单模拟一下Spring IoC的底层实现原理。

第一步:我们先准备一个属性文件beans.properties,我这里使用属性文件代替xml的文件功能。

dept=com.qfedu.pojo.Dept
emp=com.qfedu.pojo.Emp

第二步:编写工厂类QfBeanFactory.java

/**
* 模拟spring 容器的工厂类
*/
public class QfBeanFactory {
    private static Properties properties = new Properties();
    //该map相当于spring容器,用来存储创建好的bean对象
    private static Map<String, Object> ioc = new HashMap<String, Object>();
    static {
        try {
            properties.load(BeanFactory.class.getClassLoader().getResourceAsStream("beans.properties"));
            //获取所有属性名
            Set<String> names = properties.stringPropertyNames();
            System.out.println(names);
            //通过反射技术创建属性文件里配置的要创建的bean开始
            for (String name : names) {
                //获取全类名
                String clsName= (String) properties.get(name);
                Class clazz=Class.forName(clsName);
                if (!Objects.isNull(clazz)){
                    //反射构建对象
                   Object object=clazz.getConstructor().newInstance();
                   // 存储到map中
                   ioc.put(name,object);
                }
            }
         //通过反射技术创建属性文件里配置的要创建的bean结束
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
       通过属性文件中属性名(类似spring配置文件中的bean的id)获取工厂创建好的对象
    */
    public  static Object getBean(String beanName){
        return ioc.get(beanName);
    }
}

代码解释:

  • 工厂类中的静态代码块实现读取属性文件中的配置信息;

  • 根据读到的配置信息,使用反射技术构建bean对象;

  • 然后将构建好的对象放到map中;

  • 通过提供的getBean方法,获取工厂中创建好的bean对象。

第三步:我们再编写一个测试类:

public class IocTest{
  public static void main(String[] args) {
      Dept dept= (Dept)QfBeanFactory.getBean("dept");
      System.out.println(dept);
      Emp emp= (Emp)QfBeanFactory.getBean("emp");
      System.out.println(emp);
    }
}

经过以上测试我们可以获得创建好的dept和emp对象,以上我们模拟了spring ioc的原理。

bean对象的创建

接下来我们再来看看Spring框架又是怎么创建和使用bean对象的。

4.1 创建spring-bean.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

        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="dept" class="com.qfedu.pojo.Dept"></bean>

    <bean id="emp" class="com.qfedu.pojo.Emp"></bean>

</beans>

4.2 加载配置文件获得Spring IoC容器

ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-bean.xml");

4.3 通过spring容器获取dept、emp 对象

Emp emp= (Emp) applicationContext.getBean("emp");
System.out.println(emp);
Dept dept= (Dept) applicationContext.getBean("dept");
System.out.println(dept);

4.4 小结

最后我们再总结一下Spring创建bean对象的过程。

  • spring-bean.xml相当于

    beans.properties;

  • ClassPathXmlApplicationContext就相当于QfBeanFactory;

  • getBean 方法相当于QfBeanFactory中的getBean。

其中ClassPathXmlApplicationContext类的结构图如下所示:

什么是Spring的IoC,依赖注入又该怎么实现?,Java,spring,java,rpc

通过以上类结构图,我们可以看出ClassPathXmlApplicationContext的最顶层就是BeanFacorty工厂,而ClassPathXmlApplicationContext则是一个具体的实现类。BeanFacorty有很多实现类,其中ClassPathXmlApplicationContext、AnnotationConfigApplicationContext则是比较常用的具体子类。

什么是Spring的IoC,依赖注入又该怎么实现?,Java,spring,java,rpc

BeanFactory以Factory结尾,表示这是一个工厂类(接口), 它负责生产和管理bean的一个工厂。在Spring中,BeanFactory是IOC容器的核心接口,它的职责包括实例化、定位、配置应用程序中的对象及建立这些对象间的依赖等。BeanFactory只是个接口,并不是IoC容器的具体实现,所以Spring容器给出了多种实现,如 ClassPathXmlApplicationContext、AnnotationConfigApplicationContext、ApplicationContext等。

现在你知道Spring是怎么实现IoC的了吗?如果你还有什么疑问,可以在评论区留言哦。关注千锋官方博客,干货天天都不断哦!文章来源地址https://www.toymoban.com/news/detail-664635.html

到了这里,关于什么是Spring的IoC,依赖注入又该怎么实现?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring IOC:详解【依赖注入数值问题 & 依赖注入方式】

    编译软件:IntelliJ IDEA 2019.2.4 x64 操作系统:win10 x64 位 家庭版 Maven版本:apache-maven-3.6.3 Mybatis版本:3.5.6 spring版本:5.3.1 第一章:初识Spring:如何在Maven工程上搭建Spring框架? 第二章:Spring IOC:IOC在Spring底层中如何实现? 第三章:Spring IOC:详解【依赖注入数值问题 依赖注入

    2024年02月04日
    浏览(49)
  • Spring6-IoC(Inversion of Control)控制反转和DI(Dependency Injection)依赖注入,手动实现IOC

    Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的 反射机制 。简单来说, 反射机制指的是程序在运行时能够获取自身

    2024年02月09日
    浏览(61)
  • spring--Ioc控制反转/DI依赖注入

    1.概念:在使用对象的时候,由主动的new转换为外部提供对象,将对象创建的控制权交给外部,即控制反转 2.spring提供了一个容器,称为IOC容器,用来从当ioc中的外部 3.被管理或者被创建的对象在ioc中被叫做bean 使用步骤 1.导入依赖 spring-context 依赖,用到xml文件就需导入 2.创建

    2024年02月12日
    浏览(42)
  • Spring框架IOC容器和DI依赖注入

    IOC(Invertion Of Control):控制反转,使用对象时,由使用new创建对象转变为由外部提供对象,此过程中对象的创建控制权由程序转移到外部的思想称之为控制反转. DI(Dependency Injection):依赖注入,在容器中建立bean与bean之间的关系的过程,称之为依赖注入 pom.xml依赖引入 BookDao BookDaoImpl Book

    2023年04月09日
    浏览(89)
  • 深入理解 Spring IoC 和 DI:掌握控制反转和依赖注入的精髓

    在本文中,我们将介绍 IoC (控制反转)和 DI (依赖注入)的概念,以及如何在 Spring 框架中实现它们。 控制反转是软件工程中的一个原则,它将对象或程序的某些部分的控制权转移给容器或框架。我们最常在面向对象编程的上下文中使用它。 与传统编程相比,传统编程中我

    2024年02月04日
    浏览(57)
  • Spring5学习随笔-IOC(反转控制)、DI(依赖注入)和创建复杂对象

    学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】 控制:对于成员变量赋值的控制权 反转控制:把对于成员变量赋值的控制权,从代码中反转(转移)到Spring工厂和配置文件中。 好处:解耦合

    2024年02月05日
    浏览(41)
  • Spring的依赖注入(DI)是什么,有哪些实现方式?

    在Spring中,依赖注入的实现方式主要有以下几种: 类型式依赖注入(Type Based Dependency Injection):这种注入方式是通过Java接口或抽象类来实现的。具体来说,就是将需要注入的依赖关系定义为接口或抽象类,然后通过注解或XML配置文件等方式来指定具体的实现类。在运行时,

    2024年02月09日
    浏览(36)
  • 【Spring】1、Spring 框架的基本使用【读取配置文件、IoC、依赖注入的几种方式、FactoryBean】

    Spring 框架可以说是 Java 开发中最重要的框架,功能 非常 强大 中文文档:https://springdoc.cn/spring/ 官网:https://spring.io/ Spring makes Java Simple、modern、productive … Spring 框架的几个核心概念: IoC: I nversion o f C ontrol:控制反转 DI: D ependency I njection:依赖注入 AOP: A spect O riented P rogram

    2024年02月09日
    浏览(66)
  • 【Spring专题】Spring之Bean的生命周期源码解析——阶段二(二)(IOC之属性填充/依赖注入)

    由于Spring源码分析是一个前后联系比较强的过程,而且这边分析,也是按照代码顺序讲解的,所以不了解前置知识的情况下,大概率没办法看懂当前的内容。所以,特别推荐看看我前面的文章(自上而下次序): Spring底层核心原理解析【学习难度: ★★☆☆☆ 】 手写简易

    2024年02月12日
    浏览(39)
  • 【Spring进阶系列丨第二篇】Spring中的两大核心技术IoC(控制反转)与DI(依赖注入)

    我们都知道Spring 框架主要的优势是在 简化开发 和 框架整合 上,至于如何实现就是我们要学习Spring 框架的主要内容,今天我们就来一起学习Spring中的两大核心技术IoC(控制反转)与DI(依赖注入)。 以经典的三层架构MVC作为案例,以前我们都是这么干的,看如下代码: 按照

    2024年02月05日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包