前言
Spring 大家一定耳熟能详, 涉及到 Java 的开发, 有很多套装供我们选择, 比如 : SSM (Spring + SpringMVC + Mybatis), SSH(Struts2 + Spring + Hibernate), SpringBoot, SpringCloud 的分布式解决方案, 再古老一点的 Servlet, JSP .
本篇文章主要就来 3 分钟扫盲一下 Spring 来看一下 Spring 中到底都有些什么
Spring 的出现
Spring 的出现替代了其他更加重量级的的企业级Java技术, 简化了 Java 的开发 .
Spring 是非侵入式的框架
侵入式框架的代表为 Struts2 框架, 在开发时需要实现特定的接口, 继承特定的类才可以实现功能, 这种框架改变了 Java 本身的结构 .
相较于 Struts2, Spring 的非侵入性表现在对类的结构并进行变动便可以增强 JavaBean 的功能, Hibernate 也是非侵入式框架 .
Spring 通过依赖注入(DI)与面向接口实现松耦合
在学校老师教学的时候, 或者有自己的在网上找网课上的同学们一定会发现, 开发的基本套路都是通过 @Autowired 注入 Service 层, 然后在 Service 层注入 Dao 层进行 DB 操作 .然而大家想过没有, 如果没有 @Autowired 这个注解, 我们该怎样去实现呢 ?
比如我想在 Service 层调用 Dao 层, 那么我就要在 Service 层去 new Dao 层的对象, 这样 Service 和 Dao 就变为了紧耦合关系, 而 Spring 提供的依赖注入, 控制反转(IOC)就完美的解决了这些问题 .
Spring 的 AOP 面向切面编程
Spring 可以通过 动态代理 + 注解 的方式给方法添加权限, 可以理解为 : 在方法前执行前执行代码, 在方法执行后执行代码, 在方法异常时执行代码等 .
通过 AOP 我们可以减少很多冗余代码的编写, 也可以简单的完成很多看似复杂的操作 .
常见概念扫盲
IOC 和 DI
IOC - Inversion of Control 为控制反转 (以下为行文方便全部标记为 IOC )
从名称来看, 我们可以简单的提出几个疑问, 谁控制谁 ? 反转是什么意思, 什么反转了 ?
-
谁控制谁 ?
我们经过上面的举例, 可以发现在传统的 new 对象中, 是程序去创建依赖的对象, 而 IOC 就是将这个创建对象的过程交给外部容器来完成, 那么谁控制谁也就有了答案, 即 IOC 控制了 bean 的创建, 管理权限, 控制 bean 的生命周期
-
反转是什么意思, 什么反转了 ?
所谓反转那么一定是改变了原来的正向思维, 什么是正向思维呢 ? 在不采用 Spring 框架时, 是由我们自己在对象中主动控制去获取依赖对象的; 而在 Spring 中则是由容器替代我们创建及注入对象 . 容器帮我们找到并注入对象, 对象只是被动的接受依赖, 那么我们可以得出反转的是依赖获取的对象
DI - Dependency Injection (以下为行文方便全部标记为 DI )
依旧是从名称来看, 我们提出几个问题, 谁依赖谁 ? 为什么要存在依赖关系 ? 谁注入谁 ? 注入了什么 ?
-
谁依赖谁 ?
通过上面的 IOC 讲解我们可以知道应用程序依赖于 IOC
-
为什么要存在依赖关系 ?
应用程序需要 IOC 容器提供对象需要的外部资源
-
谁注入谁 ?
IOC 容器注入应用程序某个应用程序依赖的对象
-
注入了什么 ?
注入这个对象所需要的外部资源
IOC 和 DI 的关系
这个其实面试经常问的, IOC 和 DI 是同一个概念的不同角度描述, 由于一开始推出时的控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系), 所以2004年大师级人物 Martin Fowler 又给出了一个新的名字:"依赖注入",相对 IOC 而言,"依赖注入" 明确描述了 "被注入对象依赖IoC容器配置依赖对象" .
为什么要采用 IOC 的思想 ?
目的是 解耦, 它将对象之间的依赖关系变为配置文件来管理, 由 Spring IOC Container 来管理 .
如上图, 这是没有采用 Spring 方式的程序, 为了达成业务逻辑它们就像齿轮一样, 在代码中势必要建立高度耦合的关系, 一旦一个齿轮出现了问题那么一定会对其他的齿轮造成影响 .
而交由 IOC 容器管理后, 原本的 A, B, C, D 是相互关联在一起的, 现在每个对象只和第三方容器进行关联, 彼此之间没有其他联系, 没有了耦合关系, 这就叫解耦 .
关于 IOC 与 DI 的一些优秀博文整理
其实关于 IOC 和 DI 网上有很多文章, 包括一些思想的分析和关联其他功能的好处等等... 因为本篇文章只是为了为之后的 Spring 篇做基础扫盲, 所以就不大篇幅赘述一些拓展知识了, 在这里贴出一些优秀的博文, 大家感兴趣的可以看一下 :
-
Spring IOC有什么好处 ? -- 知乎
-
Spring 依赖注入 -- 刘欣,码农翻身
Spring 模块
- Spring Core: 基础,可以说 Spring 其他所有的功能都需要依赖于该类库。主要提供 IoC 依赖注入功能。
- Spring Aspects :该模块为与AspectJ的集成提供支持。
- Spring AOP :提供了面向切面的编程实现。
- Spring JDBC : Java数据库连接。
- Spring JMS :Java消息服务。
- Spring ORM : 用于支持Hibernate等ORM工具。
- Spring Web : 为创建Web应用程序提供支持。
- Spring Test : 提供了对 JUnit 和 TestNG 测试的支持。
Spring 应用到的设计模式
- 工厂模式 : Spring 使用工厂模式通过
BeanFactory、ApplicationContext创建 bean 对象 - 代理模式 : Spring AOP 功能的实现
- 单例模式 : Spring 的 bean 都是单例的
- 模板方法模式 : Spring 中
jdbcTemplate、hibernateTemplate等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式 - 观察者模式 : Spring 事件驱动模型是观察者模式
- 适配器模式 : Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配
Controller - ......
Spring 与 Spring MVC 的关系 ?
首先这里要提出一个概念, 父子容器
Spring 框架的整体核心思想就是容器, 用来管理 bean 的生命周期, 一个项目可能会包含很多容器, 它们还会分出上下层的关系 . 而 Spring 与 Spring MVC 就是便是两个容器, 并且是典型的父子容器 .
Spring 是父容器,SpringMVC 是子容器,Spring 父容器中注册的 Bean 对 Spring MVC 子容器是可见的,反之则不行
SpringBoot 又是什么 ?
如果您用过 SSM 套装, 您就一定了解, 里面的配置简直繁琐的不行, 并且我要创建其他项目时可能还多多出很多一模一样的配置, 这部分工作完全可以省略 .
基于此原因, SpringBoot 出现了, SpringBoot 基于 Spring 4.0 设计, 不仅继承了 Spring 框架原有的优秀特性, 还简化配置, 可以更简单的搭建和开发, Spring 所具备的特征 :
- 可以创建独立的 Spring 应用程序, 内嵌 Tomcat, 可以使用 Maven 插件打成 JAR 包直接发布
- 提供自动配置的 'starter' 项目对象模型(POMS)以简化 Maven 配置
- 尽可能的自动配置 Spring 容器, 避免了繁琐的配置
- 提供准备好的特性,如指标、健康检查和外部化配置
- 没有代码生成,不需要XML配置
结尾
因为 idea 现在很便捷, 基本上点几下一个 Spring 项目就完成了, 所以在这里就不给出具体的配置到项目开始的过程讲解了, 推荐感兴趣的小伙伴, 还是自己配一遍 Spring 有很多东西都是一键部署了解不到的 .
本篇大致谈了一下 Spring 的常见概念, 相当于小白扫盲, 没有什么难以理解的内容, 从今天开始 loger 会进入 Spring 篇, Spring 篇会包含很多东西, 比如 : bean 的生命周期, 父子容器的概念, 循环依赖......