文章目录

  • 介绍
  • 建模
  • 生产、装配/组装的思想
  • 再谈容器
  • Spring工作模式
  • Spring的好处
  • 总结

介绍

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的工作模式与现实生活中厨师的工作非常相似。厨师的工作就是根据菜品制作清单,将各食材加工成菜品。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是低侵入的。

我的Java Web之路 - Spring(1)- 介绍相关推荐

  1. java定义list_我的Java Web之路59 - Java中的泛型

    本系列文章旨在记录和总结自己在Java Web开发之路上的知识点.经验.问题和思考,希望能帮助更多(Java)码农和想成为(Java)码农的人. 目录 介绍 再谈Java中的类型 为什么需要泛型? J ...

  2. 我的Java Web之路 - HTML(1)

    文章目录 介绍 核心思想 基本结构 文本信息 链接 表单 总结 介绍 前面的文章多次使用到了HTML(HyperText Markup Language,中文就是超文本标记语言).这门语言可以使用任何 ...

  3. Java Web系列:Spring MVC基础

    1.Web MVC基础 MVC的本质是表现层模式,我们以视图模型为中心,将视图和控制器分离出来.就如同分层模式一样,我们以业务逻辑为中心,把表现层和数据访问层代码分离出来是一样的方法.框架只能在技术层 ...

  4. eclipse maven打包_我的Java Web之路47 - 使用Maven改造租房网工程

    本系列文章旨在记录和总结自己在Java Web开发之路上的知识点.经验.问题和思考,希望能帮助更多(Java)码农和想成为(Java)码农的人. 目录 介绍 原来的租房网工程结构 改造思路 将原有工程 ...

  5. java 抛出异常_我的Java Web之路51 - Java异常基础

    本系列文章旨在记录和总结自己在Java Web开发之路上的知识点.经验.问题和思考,希望能帮助更多(Java)码农和想成为(Java)码农的人. 目录 介绍 异常的本质 Java异常的设计 Java异 ...

  6. eclipse jstl包_我的Java Web之路41 - JSTL初步使用

    本系列文章旨在记录和总结自己在Java Web开发之路上的知识点.经验.问题和思考,希望能帮助更多(Java)码农和想成为(Java)码农的人. 目录 介绍 JSTL规范下载 JSTL包含哪些库 JS ...

  7. druid连接池jar包_我的Java Web之路56 - MyBatis使用第三方数据源(比如Druid)

    本系列文章旨在记录和总结自己在Java Web开发之路上的知识点.经验.问题和思考,希望能帮助更多(Java)码农和想成为(Java)码农的人. 目录 介绍 继承UnpooledDataSourceF ...

  8. java web应用程序_如何构建Java Web 应用程序 - Spring Boot?

    Spring Framework 是可以帮助 Java 开发人员创建企业级应用程序的开源解决方案.构建在该平台基础之上的较热门项目之一是 Spring Boot,它提供一种简化的方法来创建独立的 Ja ...

  9. java web 加载Spring --web.xml 篇

    spring是目前最流行的框架.今天谈谈对spring的认识 起步 javaweb中我们首先会遇到的配置文件就是web.xml,这是javaweb为我们封装的逻辑,不在今天的研究中.略过,下面是一个标 ...

最新文章

  1. 吴恩达深度学习ppt_【深度学习】吴恩达谈深度学习:数据科学家需要知道这些...
  2. 数据结构----内存分配问题
  3. vue input文本框中文字整体添加整体删除_揭秘神奇的PPT文本框,高手都喜欢这样的招数...
  4. python中装饰器的作用_Python装饰器详解,详细介绍它的应用场景
  5. 视频编辑SDK---我们只提供API,任你自由设计炫酷的功能
  6. Coursera课程Python for everyone:chapter7
  7. Windows下安装Object C开发环境,及Hello Word(转)
  8. Python爬虫开发:requests库的使用--发送带参数get请求
  9. 可称之为“伟大”的公司
  10. Alpine 操作系统是一个面向安全的轻型 Linux 发行版
  11. 在Python2.7下如何安装TA-lib库
  12. list集合下标从几开始_Java基础进阶 集合框架详解
  13. m5310采用芯片 中移物联_智慧交通,未来已来!汉天下助力中移物联,引爆NB-IoT行业!...
  14. 软硬一体的算法实践,阿里云如何以算法实现场景 “再创新”?
  15. 简明现代魔法 php,给PHP初学者的一些建议
  16. worldpress 添加网站关键词和描述
  17. 计算机思维在化工方面的应用,化工类院校计算机基础教学中计算思维的培养
  18. 用了三天终于安装成功 jsv8 centos7.6 + 宝塔+ php7.2 安装V8js
  19. LT6105电流检测放大器介绍
  20. win10系统picpick截图工具自动滚动截长图方法

热门文章

  1. HTML_07 —— style属性和样式
  2. PHP身份证有效期校验(通用)
  3. mysql set names中文乱码_mysql中文乱码解析
  4. 希希敬敬对Alpha阶段测试报告
  5. 使用gitee+gitbook搭建个人在线电子书
  6. PHP错题本功能实现,错题作用:错题本让错误变的有价值
  7. 有关服务器的一些小问题
  8. javascript翻转棋、javascript写的小游戏
  9. 春眠不觉晓,二极管种类知多少?「TVS、整流、稳压、肖特基、快回复、续流、发光LED、变容」
  10. 前端jQuery获取当前日期及前一周或者后一周的日期