一分钟带你玩转 Spring IoC(下)

简介: 接上文。

搭建 Spring 项目


知道要导入哪些 jar 包了,那就找吧?。


一、手动加载 jar 包的方式


1. 下载


下载地址:


image.png


如果你要问我怎么找的,那就还是从刚才 4.3.26 版本的 Reference Doc 中进去,然后刚开头就有一个 Distribution Zip Files


image.png


好奇心带着我打开了它,发现...


image.png


发现了仓库地址!


打开后发现是各个版本的 jar 包啊~


我们搜 5.2.3 版的,它在最下面:


image.png


然后就可以愉快的使用了~


  • Dist.zip 是 jar 包


  • Docs.zip 是文档


其他的暂时先不用管~


下载好了之后,就好好看看 Spring 送我们的这份大礼包吧。


此处回答上文的遗留问题:哪里找 Spring Framework 框架图。


答案是:下载的 docs.zip → spring-framework-reference → images → spring-overview


image.png


我们需要导入 Intellij 的 jar 包在哪里呢?


Dist.zip → libs


image.png


这里可以看到,每个黑色框对应3个 jar 包,我们要导入 Intellij 的是 RELEASE.jar.


2. 不用 IoC 构建项目


我们 new project,不用 maven 构架,就新建一个普通的 Java 项目,比如我就叫它 Spring_HelloWorld,然后还是用我常用的 class Rectangle 的例子。


然后在 External Libraries 中导入我们刚才在模块图里看到的那4个模块所对应的 jar 包,结构如下:


image.png


这样你以为就大功告成了吗?Too young too simple 啊~


来运行一下:


image.png


出现了老盆友:no class def found error, 就是找不到这个类。


我们谷歌 Maven common logging 并下载它的 jar 包,再加到项目里就可以了。


我上图里是已经加过了的,所以你会看到一个 commons-logging-1.2.


再运行一下就可以了。这里的两个文件上文都有截图。


目前为止我们是手动用 set() 方法设置对象的,那怎么用 Spring IoC 呢?


3. Spring IoC 配置文件详解


还需要有一个配置文件,可是这个文件需要配置啥,该怎么配置呢?


官网里都给我们写好了:


image.png


第一段是一些命名空间及其规范的介绍,


第二段就是给 bean 的属性赋值了。


这里注意下 bean 里面的配置要改一下,改成我们这个项目对应的。


这里的 id, class 是什么意思呢?官网上也有解释,我这里简单概括下:


  • bean 标签:告诉 Spring 要创建的对象


  • id: 对象的唯一标识,就像每个人的身份证一样,不可重复


  • class: bean 的完全限定名,即从 package name 到 class name


  • property:给属性赋值,name 的名称取决于 set() 方法后面的参数;


其实也可以用 constructor 来赋值,name 的名称取决于参数列表;


更多给复杂数据类型赋值的使用可以在官网查到。


当然,在工作中更常用的是注解。但是往往也会有 xml 文件配合着一起使用的,所以还是要懂的。


我的 service 文件配置如下:


image.png


4. 最后一步,我们再来看它是怎么用的:


image.png


这里面并没有直接的 new 这个 service,但是 Spring 容器帮我们创建了这个对象。


那么 Spring 是如何帮我们创建对象的呢?


ApplicationContextIoC 容器的入口,其实也就是 Spring 程序的入口,

刚才已经说过了它的两个具体的实现子类,在这里用了从 class path 中读取数据的方式;


然后第二行,就是获取具体的 bean 了。这个其实有很多方式,在使用的时候就能看到:


image.png


点进去发现,是在 BeanFactory.class 里定义的:


image.png


这其中比较常用的是通过


  • Id → 需要 cast


  • Bean 的类型 → 只能在 Singleton 的时候使用,否则不知道用哪个呀


  • Id + 类型 → 下图代码示例


来获取对象,最后两种 String, Class objects 这种可变参数的方式用的很少。


照猫画虎,我的 test 文件改动如下:


image.png


成功运行~~??


Follow up 1. 对象在容器中默认是单例的


实践是检验的唯一标准:


再用 getBean() 得到一个对象,测试是否还是同一个。

即:


public class MyTest {
  public void test myTest() {
    ApplicationContext context = new ClassPathXmlApplicationContext("service.xml");
        Rectangle rect = context.getBean("rectangle", Rectangle.class);
        Rectangle rect2 = context.getBean("rectangle", Rectangle.class);
        System.out.println(rect == rect2);
    }
  }
}


返回 True or False?


答:True


因为默认是单例的,如果要改,需要在配置文件里改 <bean … scope = “prototype”>.


至于这些标签的用法,这里不再延伸了~


Follow up 2. 容器中的对象是什么时候创建的?


实践是检验的唯一标准:


定义一个无参的 constructor,里面打印一句话,然后只 new ClassPathXmlApplicationContext,如下图:


image.png


发现也是可以打印的,所以其实是每次启动容器的时候,就已经创建好容器中的所有对象了。(当然,这在 scope = "prototype" 的时候不适用,只是 singleton 的时候。)


多说一句,其实最好应该一直保留一个无参的 constructor,因为这里 bean 对象的创建是通过反射,


  • clazz.newInstance() 默认是调用无参的 constructor


不过,现在已经被弃用掉了,换用了这个:


  • clazz.getDeclaredConstructor().newInstance()


二、使用 Maven 构建项目


我们再回到最开始的构建项目,相信大家都体会到了手动导入 jar 包的繁琐之处,其实我们还可以用 Maven 来管理项目中的 jar 包,在公司中也是比较常用的一种方式,免除了手动下载 jar 包的过程。


1. 新建项目


使用 Maven 的话就简化很多了,首先我们创建一个 Maven 项目,不同于刚才的过程在于:


New Project 的时候要选择从 Maven 构建,而不是一个简单的 Java 项目。


image.png


建好之后,我们会发现比起刚才的 Java 项目,多了很多东西:


和之前的空项目不太一样,这里有 main, test,其中 resources 是放配置文件的地方,也就是我们刚才的 service.xml 应该放在这里,如果没有放对位置是代码找不到哦~


image.png


2. 添加对应的 pom 依赖,就不用手动导 jar 包了


  1. 仓库地址 https://mvnrepository.com/


  1. spring


  1. 选择 Spring context5.2.3 release,把里面的配置 copy 到 pom.xml

最终在左边 external libraries 会自动出现所需的包,一键导入,不要太方便~


3. 写代码~~??


小结


我们最后再来体会一下用 Spring 创建对象的过程:


通过 ApplicationContext 这个 IoC 容器的入口,用它的两个具体的实现子类,从 class path 或者 file path 中读取数据,用 getBean() 获取具体的 bean instance。

那使用 Spring 到底省略了我们什么工作?


答:new 的过程。把 new 的过程交给第三方来创建、管理,这就是「解藕」。


image.png


Spring 也是用的 set() 方法,它只不过提供了一套更加完善的实现机制而已。


而说到底,底层的原理并没有很复杂,只是为了提高扩展性、兼容性,Spring 提供了丰富的支持,所以才觉得源码比较难。


因为框架是要给各种各样的用户来使用的,它们考虑的更多的是扩展性。如果让我们来实现,或许三五行就能搞定,但是我们实现的不完善、不完整、不严谨,总之不高大上,所以它写三五十行,把框架设计的尽可能的完善,提供了丰富的支持,满足不同用户的需求,才能占领更大的市场啊。


以上就是本文的全部内容了,如果觉得写的不错,请记得转发或者在看,这是对我最大的认可和鼓励!


还想跟我看更多 Java 技术干货的小伙伴们,记得关注我,我是田小齐,Java 就这么回事。

目录
相关文章
|
4月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
8天前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
24 2
|
1月前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
3月前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
239 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
3月前
|
XML Java 测试技术
spring复习01,IOC的思想和第一个spring程序helloWorld
Spring框架中IOC(控制反转)的思想和实现,通过一个简单的例子展示了如何通过IOC容器管理对象依赖,从而提高代码的灵活性和可维护性。
spring复习01,IOC的思想和第一个spring程序helloWorld
|
1月前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
35 0
|
2月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
139 9
|
2月前
|
存储 开发框架 Java
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
36 0
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
|
3月前
|
缓存 Java Spring
手写Spring Ioc 循环依赖底层源码剖析
在Spring框架中,IoC(控制反转)是一个核心特性,它通过依赖注入(DI)实现了对象间的解耦。然而,在实际开发中,循环依赖是一个常见的问题。
43 4
|
2月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
76 0