【Spring 从0开始】IOC 容器、底层原理

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 【Spring 从0开始】IOC 容器、底层原理

一、什么是IOC


IOC 是控制反转,把对象创建和对象之间的调用过程,交给 Spring 来管理,可以使代码耦合度降低。


在上篇中,使用了xml管理对象的创建,其实这就是IOC的实现。


二、IOC底层原理


IOC的实现主要用到了3种技术:工厂模式、XML解析、反射。


1. 工厂模式介绍


原始状态


用图示表示下,初始的对象调用的样子。比如我在 UserService 类中想调用 UserDao 类下的 add() 方法,需要 new 一个 UserDao 的对象。


1268169-20210627161724479-503125971.png


但是这种调用方法会让 UserService 和 UserDao 这2个类耦合过于紧密。比如,当 UserDao 路径变化了,UserService 里也要跟着变。


本着高内聚、低耦合,我们还需要进一步降低程序的耦合。


工厂模式


于是,为了更好的解耦合,出现了工厂模式。加入了工厂之后,上面的对象调用关系就变成了这样:


1268169-20210627162835634-1274217947.png


通过 UserFactory 这个工厂类,降低 UserService 和 UserDao 这2个类的耦合。


但是,UserFactory 这个工厂也是一个类,这个类与其它的耦合也仍然是存在,所以这仍然不是最终方案。


若再进一步的降低耦合,则是用到 IOC 的方案了。


XML解析用来获取或操作文件里的内容。而反射则是通过得到类的字节码文件,也就是写的java文件编译后的class文件,然后操作类中的所有内容。


2. IOC 执行过程


第一步


通过 XML 文件,进行对象的配置。比如我在文件里配置了一个 user 对象。


1268169-20210627164747653-1487350526.png


第二步


有了 XML 文件后,IOC就可以解析文件获取对象,然后创建工厂类,进行对象的返回了。


1268169-20210627165551916-584046484.png


图示代码仅示意用:


  1. 通过解析XML,拿到class属性的值。
  2. 通过反射,创建对象。
  3. 创建对象,返回。


同样是用到工厂模式,不过通过IOC的方式,进一步降低了耦合度。


因为,这时候就算 User 类的路径变了,不是这个 "com.pingguo.spring5.User",那么只需要改XML文件即可,不需要改其他的代码。


三、IOC 接口


IOC 容器其实指得就是对象工厂,而在 spring 里,提供了两种实现 IOC 容器的方式(接口)。


在上篇文章的测试代码中,我把 ApplicationContext 替换成 BeanFactory 一样可以正常运行。


1268169-20210627170912351-876604170.png


1. BeanFactory


Spring 内部使用的接口,一般不提供给我们开发人员使用。它的特点是:


  • 加载配置文件的时候不会创建对象,当使用对象的时候才会创建对象。


1268169-20210627171612697-1785937649.png

2. ApplicationContext


BeanFactory 是 ApplicationContext 的子接口,提供了更多、更强大的功能,这个接口是面向我们开发人员使用的。


如果你使用 idea 编辑器,可以 Ctrl+左击 BeanFactory ,然后点击 BeanFactory 前面的 ↓ 箭头看到实现的父接口。


1268169-20210627171201153-1233788522.png


它的特点与 BeanFactory 相反:


  • 加载配置文件的时候,就会创建配置的对象。


1268169-20210627172140742-1894251673.png

3. ApplicationContext 的两个主要实现类


可以单击 ApplicationContext,按 Ctrl+H,查看结构。


1268169-20210627173031118-458551119.png


  • ClassPathXmlApplicationContext:在上篇的示例代码里,使用的就是这个类。它的特点是,这里直接写 src 下的xml文件路径即可。


1268169-20210627173605124-543037434.png


  • FileSystemXmlApplicationContext:这里用的是文件在磁盘里的全路径,比如D:\IdeaProjects\spring5_demo\src\bean1.xml


1268169-20210627173733863-257114610.png


4. BeanFactory 与 ApplicationContext 谁更好?


乍一看感觉 BeanFactory 更好一些,因为我需要用的时候再创建,节省资源。


不过,站在实际生产的角度,spring通常是应用于web项目,比如结合tomcat。那么当tomcat的启动的时候,我们更希望把这些耗时耗资源的操作,都在项目启动的时候处理,会更合适。

相关文章
|
9天前
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
20 0
|
3月前
|
Java
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
这篇文章是Spring5框架的实战教程,深入讲解了AOP的基本概念、如何利用动态代理实现AOP,特别是通过JDK动态代理机制在不修改源代码的情况下为业务逻辑添加新功能,降低代码耦合度,并通过具体代码示例演示了JDK动态代理的实现过程。
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
|
1月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
1月前
|
Java Spring 容器
Spring底层原理大致脉络
Spring底层原理大致脉络
|
1月前
|
存储 监控 Shell
docker的底层原理二:容器运行时环境
本文深入探讨了Docker容器运行时环境的关键技术,包括命名空间、控制组、联合文件系统、容器运行时以及分离的进程树,这些技术共同确保了容器的隔离性、资源控制和可移植性。
39 5
|
1月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
129 9
|
1月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
70 0
|
2月前
|
XML Java 开发者
经典面试---spring IOC容器的核心实现原理
作为一名拥有十年研发经验的工程师,对Spring框架尤其是其IOC(Inversion of Control,控制反转)容器的核心实现原理有着深入的理解。
125 3
|
1月前
|
XML 前端开发 Java
拼多多1面:聊聊Spring MVC的工作原理!
本文详细剖析了Spring MVC的工作原理,涵盖其架构、工作流程及核心组件。Spring MVC采用MVC设计模式,通过DispatcherServlet、HandlerMapping、Controller和ViewResolver等组件高效处理Web请求。文章还探讨了DispatcherServlet的初始化和请求处理流程,以及HandlerMapping和Controller的角色。通过理解这些核心概念,开发者能更好地构建可维护、可扩展的Web应用。适合面试准备和技术深挖
43 0
|
1月前
|
负载均衡 Java API
Spring Cloud原理详解
Spring Cloud原理详解
71 0