热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

简述控制反转ioc_Spring复盘|IOC

全面进入复习模式,从Spring开始。1、关于SpringSpring是一个轻量级的开源框架,是为解决企业应用开发的复杂性而创建的。我很不喜欢这种略显官
5758672e965af281948d9fce16e33859.png

全面进入复习模式,从 Spring 开始。

1、关于 Spring

Spring 是一个轻量级的开源框架,是为解决企业应用开发的复杂性而创建的。我很不喜欢这种略显官方的说辞。千人千面,每个人对技术的理解都不一样。而在我的理解中,Spring 的主要就解决了两件事情(当然它还解决了数据访问、远程调用、单元测试等问题),分别对应 Spring 的两个设计思想 IOC 和 AOP:

  • IOC 容器(解耦合):解决各种 new 对象的问题
  • AOP (切面编程):把非业务范畴的功能,提取成一个切面,统一实现

2、Spring 概览

Spring 框架分为 6 个模块, 20+ 个 jar 包。为此我做了一张思维导图,如下:

1dfc21f0809aab71601daa3a92e2357e.png

图片可能不太清晰,1080 高清无码 Spring 思维导图获取地址:Spring概览

3、什么是 IOC ?

IoC 全称为 Inversion of Control,翻译为 “控制反转”,它还有一个别名为 DI(Dependency Injection),即依赖注入。说白了,IOC 就是由 Spring IOC 容器来负责对象的生命周期和对象之间的关系。

4、什么是控制反转?

来自:https://www.cnblogs.com/chenssy/p/9576769.html 的解释,我觉得说的非常通透,这里引用过来:

  • 谁控制谁:在传统的开发模式下,我们都是采用直接 new 一个对象的方式来创建对象,也就是说你依赖的对象直接由你自己控制,但是有了 IOC 容器后,则直接由 IoC 容器来控制。所以“谁控制谁”,当然是 IoC 容器控制对象。
  • 控制什么:控制对象。
  • 为何是反转:没有 IoC 的时候我们都是在自己对象中主动去创建被依赖的对象,这是正转。但是有了 IoC 后,所依赖的对象直接由 IoC 容器创建后注入到被注入的对象中,依赖的对象由原来的主动获取变成被动接受,所以是反转。
  • 哪些方面反转了:所依赖对象的获取被反转了。

5、直接 new 对象

public class StudentService {public static void main(String args[]) {StudentDao studentDao = new StudentDao();System.out.println(studentDao.save());}}

在没有 ioc 之前,我们都是直接 new 所依赖的对象,这是的控制权在于程序员。

6、IOC 依赖注入

IOC 依赖注入,分以下 3 种方式注入:

  • 构造器注入
  • setter 方法注入
  • 接口方式注入

其中接口方式注入用的很少,此文不再讨论。首先创建两个类,StudentService、StudentDao 。其中 StudentService 依赖 StudentDao。

xml 构造器注入

StudentDao 代码:

public class StudentDao {public String save(){return"保存学生信息";}}

StudentService 代码:

public class StudentService {private StudentDao studentDao;public StudentService(StudentDao studentDao) {this.studentDao = studentDao;}public String save(){return studentDao.save();}}

xml 配置



测试方法:

public static void main(String srgs[]) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("xmlConfig.xml");StudentService studentService = (StudentService) applicationContext.getBean("studentService");System.out.println(studentService.save());
}

resource 目录下新建 xmlConfig.xml 文件,引入 Spring xsd 规范,不了解 xsd 的自行百度。配置两个 bean :StudentService、StudentDao 前者依赖后者,依赖方式是构造函数, 注意到 xml 中的 constructor-arg 标签,表明了这一点。同时,它的属性 ref 指向了 StudentDao 中的 id 。意思就是把 StudentDao 当做参数传给 StudentService 的构造方法。

xml set 方法注入

StudentDao 代码不变,StudentService 代码如下:注入 StudentDao 方式变成 set 方法

public class StudentService {private StudentDao studentDao;public void setStudentDao(StudentDao studentDao) {this.studentDao = studentDao;}public String save(){return studentDao.save();}}

xml 配置




测试方法:

public static void main(String srgs[]) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("xmlConfig.xml");StudentService studentService = (StudentService) applicationContext.getBean("studentService");System.out.println(studentService.save());
}

resource 目录下新建 xmlConfig.xml 文件,引入 Spring xsd 规范,不了解 xsd 的自行百度。配置两个 bean :StudentService、StudentDao 前者依赖后者,依赖方式是set 方法, 注意到 xml 中的 property 标签,表明了这一点。同时,它的属性 ref 指向了 StudentDao 中的 id 。意思就是把 StudentDao 当做参数传给 StudentService 的 set 方法。

javaConfig 注入

StudentDao 不变,StudentService 代码如下:

public class StudentService {private StudentDao studentDao;@Autowiredpublic StudentService(StudentDao studentDao) {this.studentDao = studentDao;}public String save() {return studentDao.save();}
}

配置类:

/*** 声明这是一个配置类,程序运行时初始化这个类,把 @Bean 注解的 bean 加载到 ioc 容器备用*/
@Configuration
public class StudentConfig {@Beanpublic StudentDao studentDao() {return new StudentDao();}@Beanpublic StudentService studentService(StudentDao studentDao) {return new StudentService(studentDao);}}

测试方法:

public class App {public static void main(String srgs[]) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(StudentConfig.class);StudentService studentService = (StudentService) applicationContext.getBean("studentService");System.out.println(studentService.save());}}

注意到这里新增了个 StudentConfig 这个类是一个配置类,加上 @Configuration 注解之后,程序启动时就会把带 @Bean 注解的 bean 加载到 ioc 容器中备用。StudentService 类的 set 方法上加了一个 @Autowired 注解,意思是按照类名加载 StudentDao 。

自动装配

xml 配置



StudentDao 加上 @Component 让自动扫描发现

@Component
public class StudentDao {public String save(){return"保存学生信息";}}

StudentService 加上 @Component 让自动扫描发现

@Component
public class StudentService {private StudentDao studentDao;@Autowiredpublic StudentService(StudentDao studentDao) {this.studentDao = studentDao;}public String save() {return studentDao.save();}
}

测试方法

public class StudentTest {@Testpublic void testSave() {ApplicationContext context = new ClassPathXmlApplicationContext("autoConfig.xml");StudentService studentService = (StudentService) context.getBean("studentService", StudentService.class);Assert.assertNotNull(studentService.save());}
}

注意到 xml 的头部声明多了一些 url ,那是因为自动扫描标签是在 context 包下管理的。使用他,必须加入 context 命名空间。

7、源码地址

turoDog/review_spring​github.com
b04643250670250405fa629bb2c94742.png

推荐阅读:

java | 什么是动态代理?​mp.weixin.qq.com
d456a539819c42d8dabc7fb879a01352.png
SpirngBoot | 启动原理 01​mp.weixin.qq.com
400a5325c260595c2cf3873aad097db2.png
SpringBoot | 是如何实现自动配置的?​mp.weixin.qq.com
92903b5aea6256304ee0a40717c9c287.png



推荐阅读
  • 本文详细介绍了利用JavaScript实现的五种不同的网页弹出窗口技术,包括全屏窗口、全屏模式窗口、带收藏链接工具栏的窗口、网页对话框及HTA窗口。 ... [详细]
  • GCC(GNU Compiler Collection)是GNU项目下的一款功能全面且高效的多平台编译工具,广泛应用于Linux操作系统中。本文将详细介绍GCC的特点及其基本使用方法。 ... [详细]
  • SpringBoot底层注解用法及原理
    2.1、组件添加1、Configuration基本使用Full模式与Lite模式示例最佳实战配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断配置类组 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 详解MyBatis二级缓存的启用与配置
    本文深入探讨了MyBatis二级缓存的启用方法及其配置细节,通过具体的代码实例进行说明,有助于开发者更好地理解和应用这一特性,提升应用程序的性能。 ... [详细]
  • 本文探讨了在 PHP 的 Zend 框架下,使用 PHPUnit 进行单元测试时遇到的 Zend_Controller_Response_Exception 错误,并提供了解决方案。 ... [详细]
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 个人博客:打开链接依赖倒置原则定义依赖倒置原则(DependenceInversionPrinciple,DIP)定义如下:Highlevelmo ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • 如何使用Maven将依赖插件一并打包进JAR文件
    本文详细介绍了在使用Maven构建项目时,如何将所需的依赖插件一同打包进最终的JAR文件中,以避免手动部署依赖库的麻烦。 ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • 在使用mybatis进行mapper.xml测试的时候发生必须为元素类型“mapper”声明属性“namespace”的错误项目目录结构UserMapper和UserMappe ... [详细]
  • Gradle 是 Android Studio 中默认的构建工具,了解其基本配置对于开发效率的提升至关重要。本文将详细介绍如何在 Gradle 中定义和使用共享变量,以确保项目的一致性和可维护性。 ... [详细]
  • 汇总了2023年7月7日最新的网络安全新闻和技术更新,包括最新的漏洞披露、工具发布及安全事件。 ... [详细]
author-avatar
BeBe-DANIC_796
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有