Spring IOC与DI核心深入理解

2023-05-16 0 957

目录

深入理解IOC思想

spring本质就在于对象全部交由给spring容器创建和管理,由容器控制对象的整个生命周期核心就是IOC控制反转和AOP面向切面编程

先说IOC

IOC是一种设计思想,叫做控制反转。本质就是通过Spring来负责对象的生命周期以及对象间的关系。在面向对象的开发过程中,我们程序中的各个对象往往会存在各种各样的依赖关系,因此耦合度极高,一旦修改其中一个类信息就会牵扯到很多相关类需要修改。那么为了降低这种耦合度IOC指出引用第三方容器,也就是将所有对象的创建和管理交由第三方容器统一操作。这里的容器指的就是spring容器,我们需要将各个实现类映射到spring容器中的bean。

看了网上一些大佬的理解,针对IOC主要两个问题,IOC是谁控制谁,被反转的是什么?Spring容器控制了对象,创建对象的主动权从程序编码反转给了spring容器。扯到IOC就不得不提DI依赖注入,

  • 应用程序依赖于IOC容器
  • 通过DI,程序可以获得所需的依赖资源比如一个对象或常量数据
  • IOC容器将依赖对象注入到程序中

这个过程就体现出了IOC思想。

面试回答:什么是IOC?传统的面向对象开发中需要我们手动编码通过new关键字创建对象并为对象装配所需资源,而控制反转则可以将创建对象的主动权交给第三方容器完成,程序变成被动的接收对象。我认为IOC主要牵扯到两个问题就是谁控制谁,什么被反转?首先控制就是由最初的程序控制对象反转为由容器控制对象,被反转的就是获取依赖对象的方式

DI&IOC

一直觉得对于IOC的理解不够深入,发现自己忽略了一个关键词–>依赖对象,那么什么是依赖对象。对于依赖对象的定义我的理解是,两个对象都有自己需要完成的工作,但是A对象的一些行为需要B对象协作完成,那么在这些协作完成的行为中A对象就可以被称之为B对象的依赖对象。此时两者的耦合度是较高的,因为一旦某一个对象发生变化将会影响到另一个对象

我们假设对象A需要去操作数据库,那么A就会需要获得Connection连接对象,在使用spring之前我们通过编码new关键字获取一个连接交给对象A,此时对象A与Connection就是存在一定的耦合性的。引入了spring容器之后,我们将Connection去注册到容器当中然后Connection会由容器创建完成,当A需要的时候就丢给A去使用,不用去关心Connection怎么创建,实现解耦。Connection就是对象A的一个依赖对象,但是在我看来,依赖对象并不仅仅代表一个对象,也可以是一个常量数据。我在整合mybatis和spring的时候,我终于体会到了解耦的感觉,之前在使用sqlSessionFactory创建SqlSession的过程中,首先要创建sqlSessionFactory然后通过它的openSession方法去获取SqlSession实例,也就是说SqlSession依赖于SqlSessionFactory,下面看最初的写法

{
  private static SqlSessionFactory sqlSessionFactory;
  static {
    try {
      InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
      sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }
  // 提供工厂方法 创建sqlSession实例
  public static SqlSession getSqlSession(){
    return sqlSessionFactory.openSession();
  }
}

上述代码中,我们通过new创建SqlSessionFactoryBuilder,在调用它的build方法创建出了sqlSessionFactory,这之间就存在这依赖关系,也就是存在耦合。继续往下看,我们直接编写好一个方法用于获取SqlSession实例,但是这个方法也是通过factory创建的。所以两者之间同样存在耦合关系。那么引入spring容器之后,我们利用第三方的容器,就可以实现两者的解耦。看下列applicationContext的配置

<!--  配置sqlSessionFactory  -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="datasource"/>
  <!--   绑定mybatis配置文件     -->
  <property name="configLocation" value="classpath:mybatis-config.xml"/>
  <!--     映射器  注册mapper.xml文件   -->
  <property name="mapperLocations" value="classpath:com/yuqu/dao/*.xml"/>
</bean>
<!--  配置sqlsession  -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
  <!--      只能选择构造器注入sqlSessionFactory  没有SqlSessionTemplate提供set方法  -->
  <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

看到了吗,sqlSessionFactory被我们映射为容器中的bean,然后映射SqlSession的bean,然后通过注入的方式将sqlSessionFactory注入进sqlSession中,当在程序中需要获取sqlSession的时候就不用再去管SqlSessionFactory是如何创建的。以此实现真正解耦的目的。同样的我们可以将sqlSession去配置到其他的bean中

<bean id="userMapperImpl" class="com.yuqu.dao.UserMapperImpl">
  <property name="sqlSession" ref="sqlSession"/>
</bean>

这样在需要获取userMapperImpl对象的时候就不用再去创建sqlSession实例然后getMapper,只需要直接用spring去getBean即可获取到,同样也完成了解耦工作。

所以说,DI依赖注入就是实现IOC的一种方式。

资源下载此资源下载价格为1小猪币,终身VIP免费,请先
由于本站资源来源于互联网,以研究交流为目的,所有仅供大家参考、学习,不存在任何商业目的与商业用途,如资源存在BUG以及其他任何问题,请自行解决,本站不提供技术服务! 由于资源为虚拟可复制性,下载后不予退积分和退款,谢谢您的支持!如遇到失效或错误的下载链接请联系客服QQ:442469558

:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!

猪小侠源码-最新源码下载平台 Java教程 Spring IOC与DI核心深入理解 http://www.20zxx.cn/705809/xuexijiaocheng/javajc.html

猪小侠源码,优质资源分享网

常见问题
  • 本站所有资源版权均属于原作者所有,均只能用于参考学习,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,建议提前注册好百度网盘账号,使用百度网盘客户端下载
查看详情

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务