Java面试题:你知道Spring的IOC吗?那么,它为什么这么重要呢?

这篇具有很好参考价值的文章主要介绍了Java面试题:你知道Spring的IOC吗?那么,它为什么这么重要呢?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring的IOC(控制反转)是一种设计模式,它允许开发者将对象的创建和管理交给Spring框架来完成。在Spring中,IOC允许开发者将对象依赖关系从代码中分离出来,从而使代码更加灵活、可重用和易于管理。

IoC 全称Inverse of Control(反向控制或控制反转)。

在类和类之间存在控制权,控制权指的是对象的创建和使用,比如有类A和类B,我们之前的做法是在A中调用B,那么控制权就在A中,这样做的耦合度较高,如果修改了 B,A也要做相应修改。

class A {

} 

class B {
  // B需要将A的实例new出来,也就是我们说的控制 private A a = new A();
  public void use() {      
    System.out.print(a);
  }
}

 文章来源地址https://www.toymoban.com/news/detail-860833.html

引入Spring框架后,控制权由 spring 容器来负责。当A想使用B时,需要由 Spirng容器通过配置文件进行注入。这种思想就是IoC(为了更好的理解,我们可以这样认为,对象创建和使用的控制权转移到了Spring容器,由Spring容器来控制)。

// 说明A自己控制自己,把自己初始化出来,注入给了容器 
@Component 
class A {

}

class B {
   // B不需要控制a,直接使用。如果A没有把自己注入给容器,B就不能使用
   @Resource private A a;

   public void use() {
        System.out.print(a);
   }
}

 

实现Spring的IOC(控制反转)有以下几种方式

  • 使用@Autowired注解:这是Spring中最常用的实现IOC的方式。通过在需要依赖注入的类上使用@Autowired注解,Spring会自动将依赖对象注入到该类中。

  • 使用配置文件:通过在Spring配置文件中定义bean,可以手动创建和管理对象。这种方式适合于需要灵活控制对象创建和生命周期的情况。

  • 使用Java配置:通过使用Java配置类,可以更灵活地定义bean和配置对象之间的关系。这种方式适合于需要更细粒度控制的情况。

 

如何实现一个简易的IOC功能?

上述是Spring容器简单的使用IOC功能,如果我们自己想实现一个简单版的,可以按照以下步骤:

  • 定义一个容器类,用于管理对象的创建和注入。

  • 实现对象的创建方法,可以使用常见的工厂模式或依赖查找等方式来创建对象。

  • 在容器类中定义一个注入方法,用于将对象注入到需要依赖的对象中。


下面是一个简单的代码示例,展示了如何实现一个简易的IOC功能:

// 定义容器类
public class ObjectContainer {
  // 创建对象的方法
  public static Object createObject(String className) throws Exception {
    // 使用反射创建对象
    return Class.forName(className).newInstance();
  }

  // 注入对象的方法
  public static void injectObject(Object target, String className) throws Exception {
    // 将对象注入到目标对象中
    Field field = target.getClass().getField(className);
    field.set(target, ObjectContainer.createObject(className));
  }
}

// 使用示例
public class ExampleClass {
  private Object obj; // 需要注入的对象

  public ExampleClass(String className) {
    try {
      // 注入对象
      ObjectContainer.injectObject(this, className);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public void doSomething() {
    // 使用对象进行操作
    obj.method();
  }
}

 

在上面的示例中,我们定义了一个ObjectContainer类,它包含了创建对象和注入对象的方法。在ExampleClass中,我们使用了ObjectContainer的注入方法将对象注入到目标对象中。使用时只需要传入对象的类名即可。

请注意,上述示例只是一个简单的实现,没有考虑一些复杂的场景,例如循环依赖、类型转换等问题。在实际开发中,需要根据具体的需求和场景进行适当的调整和优化。

使用IOC有哪些好处?

①、使用者不用关心引用Bean的实现细节,譬如对于B b = new A(c,d,e,f);来说,如果B要使用A,那还要 把c,d,e,f侈个类全都感知一遍,这显然是非常麻烦且不合理的。

②、不用创建多个相同的bean导致浪费,仍然是: 

A b = new A();
A c = new A();

如果B和C都引用了A,那么B和C就可能new两个A实例,实际上,我们只需要一个就好了。 

③、Bean的修改使用方无需感知。同样是上面的例子,假如说Bean A需要修改,如果没有IOC的话,所有引用到A的其他Bean都需要感知这个逻辑,并且做对应的修改。但是如果使用了IOC,其他Bean就完全不用感知到。

 

到了这里,关于Java面试题:你知道Spring的IOC吗?那么,它为什么这么重要呢?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 为什么 Microsoft Office 365 那么贵,还有那么多人用Microsoft 365?

    随着数字化办公的普及,越来越多的人开始使用各种办公软件来提高工作效率和便捷性。而Microsoft 365作为全球领先的办公软件套件,拥有着丰富的功能和服务,深受全球用户的欢迎。下面将详细介绍Microsoft 365的功能、版本、软件和适用人群等信息。 Office 365 直装版:https:/

    2024年02月05日
    浏览(45)
  • 软文发稿平台那么多,为什么选择媒介盒子

    近年来随着互联网技术的发展,越来越多的企业开始注重软文营销,品牌软文推广对企业来说是至关重要的,也有许多企业选择和软文发稿平台合作来增强品牌曝光,提升宣传效果,那么为什么会有这么多企业选择媒介盒子合作呢,接下来就由小编告诉大家。 一、 传统软文

    2024年02月09日
    浏览(30)
  • CentOS软件那么老为什么大家还要用它?

    作为一个专业的服务器系统,RHEL 系统理论上每一个软件包都有 RedHat 内部的人员负责维护,这个维护包括长期(和系统生命周期一样长)的开发、更新、测试、运维等。也就是说你能从 RHEL 系统源上获得的每一个软件包,出现问题都可以找 RedHat 负责。所以 RHEL 不可能无限制

    2024年02月01日
    浏览(42)
  • ElasticSearch(七):ES查询速度为什么那么快

    介绍给大家一个开源SpringCloud项目。整合了大部分开源中间件,详情信息可以查看文档: spring cloud开源组件开发 另外自己以后博客所讲解的代码内容,都会我的Git上同步(GitHub同步)GIT地址 ES使用的数据结构是倒排索引,在对搜索内容进行分词的时候,会根据搜索内容分词结

    2023年04月08日
    浏览(68)
  • mysql面试题30:什么是数据库连接池、应用程序和数据库建立连接的过程、为什么需要数据库连接池、你知道哪些数据库连接池

    该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 数据库连接池是一种用于管理和复用数据库连接的技术。它是在应用程序和数据库之间建立一组数据库连接,并以池的形式存储起来,每当应用程序需

    2024年02月07日
    浏览(44)
  • ElasticSearch第七讲:ES查询速度为什么那么快

    介绍给大家一个开源SpringCloud项目。整合了大部分开源中间件,详情信息可以查看文档: spring cloud开源组件开发 另外自己以后博客所讲解的代码内容,都会我的Git上同步(GitHub同步)GIT地址 ES使用的数据结构是倒排索引,在对搜索内容进行分词的时候,会根据搜索内容分词结

    2023年04月19日
    浏览(41)
  • ElasticSearch第七讲 ES查询速度为什么那么快

    介绍给大家一个开源SpringCloud项目。整合了大部分开源中间件,详情信息可以查看文档: spring cloud开源组件开发 另外自己以后博客所讲解的代码内容,都会我的Git上同步(GitHub同步)GIT地址 ES使用的数据结构是倒排索引,在对搜索内容进行分词的时候,会根据搜索内容分词结

    2023年04月25日
    浏览(40)
  • 从CPU的视角看 多线程代码为什么那么难写!

      当我们提到多线程、并发的时候,我们就会回想起各种诡异的bug,比如各种线程安全问题甚至是应用崩溃,而且这些诡异的bug还很难复现。我们不禁发出了灵魂拷问 “为什么代码测试环境运行好好的,一上线就不行了?”。 为了解决线程安全的问题,我们的先辈们在编

    2024年02月02日
    浏览(55)
  • 【AI学习】Transformer的Token嵌入表示为什么那么长

    有朋友问,BERT等大模型的参数量怎么计算的?这个问题,李沐在BERT那篇论文中讲过,主要包括几部分。1、词嵌入:token数量乘以token表示的向量长度,就是 V H;2、注意力计算没有参数,只计算多头注意力的投影矩阵,三个输入的权重矩阵,每个矩阵参数= H (H/头数) 头数

    2024年04月25日
    浏览(33)
  • 为什么在马云成功前就有那么多影像留下来?

    马云创业的各个阶段, 都有意无意得到媒体的推波助澜 ,不光是影像,还留下了很多相关的文字报道。站在当时的角度,马云或许并不总是以一种成功人士的身份出现,但即便如此,他做事情也足够新潮、足够前卫、或者足够具有正能量。媒体对于类似的人或事,一向有着

    2024年02月01日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包