热门标签 | 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



推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 【MicroServices】【Arduino】装修甲醛检测,ArduinoDart甲醛、PM2.5、温湿度、光照传感器等,数据记录于SD卡,Python数据显示,UI5前台,微服务后台……
    这篇文章介绍了一个基于Arduino的装修甲醛检测项目,使用了ArduinoDart甲醛、PM2.5、温湿度、光照传感器等硬件,并将数据记录于SD卡,使用Python进行数据显示,使用UI5进行前台设计,使用微服务进行后台开发。该项目还在不断更新中,有兴趣的可以关注作者的博客和GitHub。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
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社区 版权所有