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

简介: 【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的启动的时候,我们更希望把这些耗时耗资源的操作,都在项目启动的时候处理,会更合适。

相关文章
|
6月前
|
缓存 Java 开发者
【Spring】原理:Bean的作用域与生命周期
本文将围绕 Spring Bean 的作用域与生命周期展开深度剖析,系统梳理作用域的类型与应用场景、生命周期的关键阶段与扩展点,并结合实际案例揭示其底层实现原理,为开发者提供从理论到实践的完整指导。
771 22
|
6月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
2246 0
|
5月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
5月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
630 2
|
7月前
|
Java 关系型数据库 数据库
深度剖析【Spring】事务:万字详解,彻底掌握传播机制与事务原理
在Java开发中,Spring框架通过事务管理机制,帮我们轻松实现了这种“承诺”。它不仅封装了底层复杂的事务控制逻辑(比如手动开启、提交、回滚事务),还提供了灵活的配置方式,让开发者能专注于业务逻辑,而不用纠结于事务细节。
1024 1
|
9月前
|
XML 人工智能 Java
Spring IOC 到底是什么?
IOC(控制反转)是一种设计思想,主要用于解耦代码,简化依赖管理。其核心是将对象的创建和管理交给容器处理,而非由程序直接硬编码实现。通过IOC,开发者无需手动new对象,而是由框架负责实例化、装配和管理依赖对象。常见应用如Spring框架中的BeanFactory和ApplicationContext,它们实现了依赖注入和动态管理功能,提升了代码的灵活性与可维护性。
234 1
|
8月前
|
缓存 安全 Java
Spring 框架核心原理与实践解析
本文详解 Spring 框架核心知识,包括 IOC(容器管理对象)与 DI(容器注入依赖),以及通过注解(如 @Service、@Autowired)声明 Bean 和注入依赖的方式。阐述了 Bean 的线程安全(默认单例可能有安全问题,需业务避免共享状态或设为 prototype)、作用域(@Scope 注解,常用 singleton、prototype 等)及完整生命周期(实例化、依赖注入、初始化、销毁等步骤)。 解析了循环依赖的解决机制(三级缓存)、AOP 的概念(公共逻辑抽为切面)、底层动态代理(JDK 与 Cglib 的区别)及项目应用(如日志记录)。介绍了事务的实现(基于 AOP
300 0
|
8月前
|
监控 架构师 NoSQL
spring 状态机 的使用 + 原理 + 源码学习 (图解+秒懂+史上最全)
spring 状态机 的使用 + 原理 + 源码学习 (图解+秒懂+史上最全)
|
7月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1082 108