我的Java Web之路 - Spring(1)- 介绍

Spring框架作为Java开发中的核心工具,解决了传统EJB开发的不足,通过生产、装配对象的方式提升开发效率。本文深入解析Spring的工作原理,包括其如何作为IoC容器管理和装配Bean,以及它如何促进组件间的松耦合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

Spring在目前Java和Java Web开发里面简直就是神一样的存在,就是无处不在。这当然是有原因的,就是它确实好用。据说Spring的发明者就是为了解决EJBEnterprise JavaBean,你可以理解为另一个库、框架、组件模型、技术、中间件或规范等,属于Java自身族谱中的一员)开发Java EE应用(就是企业级应用,简单理解就是服务端应用、web应用)时存在的效率低、单调枯燥、复杂、大量重复(反正就是不好用)等问题,而发明了Spring。所以,Spring是野路子出身,不过却干过了正统的EJB。

我没有使用过EJB等技术,使用Java和Spring的时间也没有太长,所以理解得不会太深刻。没关系,以后再慢慢去学习、去使用、去理解。

Spring这个词有广义和狭义之分,广义上它包括了底下一系列的框架和项目,比如核心框架、Spring Boot、Spring MVC、Spring Data、Spring Cloud等等,狭义上就仅仅是指核心框架,它是其他所有项目的基石。以后文章中提到Spring就是指狭义上的Spring。

这里暂且不提IoC(Inversion of Control,控制反转)、DI(Dependency Injection,依赖注入)、AOP(Aspect Oriented Programming,面向切面编程)这些高大上的概念,不过它们确实是Spring的核心思想,网络上对它们的解释也是信手拈来。我是按照我自己的理解来描述Spring是什么。

建模

你可能很奇怪为什么要提到建模,我也为自己能把建模跟Spring扯上关系而感到惊讶。

首先,建模是人们解决问题的根本方式,就是将客观世界用某种语言表达出来。建筑师要为建筑建模、数理化科学家要为各种问题建立数学物理化学模型等。软件工程师也要为各种问题建立模型,可以使用面向对象的思想、也可以使用面向过程的思想,最后用编程语言表达出来。

既然我们是用Java语言,那理所当然就应该使用面向对象的思想,这也是符合人类思维方式的。也就是说,我们开发一个应用系统的建模就是要将问题抽象出一个一个类,及其它们之间的关系。

生产、装配/组装的思想

类之间的关系,我们已经学习过继承,它其实就是抽象与具体、一般与特殊、共性与个性的关系(已经与哲学挂钩了,哲学真不愧为科学的科学),就比如男人是人、人是动物、苹果是水果等等。

现实世界中各个对象之间还有另外一种很重要的关系,泛泛地说就是依赖关系,当然依赖又分很多种,比如人要吃饭,那就是依赖于粮食,这种依赖是外部的;又比如人要依赖心脏来提供血液循环以输送养分,这种依赖是内部的,是一种整体与部分的关系。

正是由于我们的模型中广泛存在这种整体与部分的关系,所以我们的应用系统中到处充斥着生产各个部分、将它们装配/组装成一个整体这样的代码。当然,这里的部分和整体就是一个个对象。

生产各个部分,就相当于用使用new关键字构造一个个对象。

装配/组装成一个整体,就相当于使用整体的某些方法将部分(一个个对象)注入到其私有属性中,或者在构造整体时就将部分注入,这听起来就有点依赖注入的味道了。

既然我们的应用系统中到处充斥着这样的代码,运用消除重复、单一职责的原则,我们应该将这些内容独立出来专门干这件事才对,而Spring框架就是专门干这件事的,无需我们再去实现这么个框架了。

再谈容器

前面文章我们提到过Tomcat是一个Servlet容器,它用来装载Servlet、管理Servlet、并将请求分派给Servlet执行。

根据前面的描述,Spring就是专门用来生产、装配/组装对象的框架,所以,它必然也要容纳和管理这些对象。即它也是一个容器,习惯上我们称之为IoC容器(就是控制反转容器,控制反转感觉不是很好理解,以后再细说)。容器中的对象也有一个专门的称呼,叫Bean

Spring工作模式

前面了解了Spring最核心的功能,那Spring具体是怎么工作的呢?如下图:
Spring工作模式.png
Spring的工作模式与现实生活中厨师的工作非常相似。厨师的工作就是根据菜品制作清单,将各食材加工成菜品。Spring也是如此,它将根据Bean的配置清单,去寻找各个组件,然后通过Java反射技术构造对象,然后将它们组装成Bean并扔到容器中管理起来。Spring就好像是厨师,而Bean的配置清单就好像是菜品制作清单,组件就是各种各样的食材。

所以,要想使用Spring,我们就必须提供配置清单组件

先说组件,组件其实就是你所开发的或别人开发的各种类、接口等,甚至是直接的数据(比如某个字符串、数字等)。

配置清单有三种方式:

  • 一种是基于XML文件
  • 一种是基于注解,实际上就是自动扫描带有@Component、@Service、@Repository、@Controller、@Autowired等注解的组件,生成并装配Bean。
  • 还有一种是基于Java配置,它也使用了Java注解,但特指@Configuration和@Bean两个,不要与第二种混淆。

Spring的好处

Spring的最大好处就是好用,这简直就是废话。到底怎么好用呢?我没用过EJB或其他类似的框架,也就没法做比较,但是最显然的一点是你无需再使用new来构造对象了,除了那些临时使用的对象之外。也无需再使用方法来组装对象了。

其次,Spring与多态、面向接口编程原则结合起来,能够使应用更加灵活,组件之间更加松耦合。当然,能够生成Bean的组件肯定是一个具体类,不可能是接口或抽象类,但构成组件的部分可以只关注共性,即组件中的属性域可以且尽量是接口或抽象类的引用。而Spring会将生成的具体类的Bean装配进去,所以,一旦需要更换为另一个具体类的Bean,只需要修改一下配置清单即可,甚至能做到更换的时候不停止应用。

Spring的另外一个好处是它是低侵入的。就是说,你无需 继承实现 Spring中的类或接口,你只要像往常一样开发自己的类和接口,然后在配置清单中进行配置即可。

上面可能理解的不太准确,欢迎批评指正。

总结

  • 编程其实也是一种建模;
  • 面向对象思想的建模就是抽象出各种类及其关系;
  • 类之间的关系有继承和组合;
  • 继承是抽象与具体、一般与特殊、共性与个性的关系;
  • 组合/聚合是整体与部分的关系;
  • Spring的核心思想就是生产各个部分装配/组装成一个整体
  • Spring是一个IoC容器,容器中的对象叫Bean
  • 使用Spring时,我们需要提供组件配置清单
  • Spring能让组件之间更加松耦合;
  • Spring是低侵入的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值