• 注册
  • 后端开发博客 后端开发博客 关注:0 内容:2360

    Spring 基础概念3分钟扫盲

  • 查看作者
  • 打赏作者
  • 当前位置: 职业司 > 后端开发 > 后端开发博客 > 正文
    • 后端开发博客
    • 前言

      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 基础概念3分钟扫盲

      如上图, 这是没有采用 Spring 方式的程序, 为了达成业务逻辑它们就像齿轮一样, 在代码中势必要建立高度耦合的关系, 一旦一个齿轮出现了问题那么一定会对其他的齿轮造成影响 .

      Spring 基础概念3分钟扫盲

      而交由 IOC 容器管理后, 原本的 A, B, C, D 是相互关联在一起的, 现在每个对象只和第三方容器进行关联, 彼此之间没有其他联系, 没有了耦合关系, 这就叫解耦 .

      关于 IOC 与 DI 的一些优秀博文整理

      其实关于 IOC 和 DI 网上有很多文章, 包括一些思想的分析和关联其他功能的好处等等... 因为本篇文章只是为了为之后的 Spring 篇做基础扫盲, 所以就不大篇幅赘述一些拓展知识了, 在这里贴出一些优秀的博文, 大家感兴趣的可以看一下 :

      • Spring IOC有什么好处 ? -- 知乎

        www.zhihu.com/question/23…

      • Spring 依赖注入 -- 刘欣,码农翻身

        mp.weixin.qq.com/s?__biz=MzA…

      Spring 模块

      Spring 基础概念3分钟扫盲

      • 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 使用工厂模式通过 BeanFactoryApplicationContext 创建 bean 对象
      • 代理模式 : Spring AOP 功能的实现
      • 单例模式 : Spring 的 bean 都是单例的
      • 模板方法模式 : Spring 中 jdbcTemplatehibernateTemplate 等以 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 的生命周期, 父子容器的概念, 循环依赖......

      请登录之后再进行评论

      登录

      手机阅读天地(APP)

      • 微信公众号
      • 微信小程序
      • 安卓APP
      手机浏览,惊喜多多
      匿名树洞,说我想说!
      问答悬赏,VIP可见!
      密码可见,回复可见!
      即时聊天、群聊互动!
      宠物孵化,赠送礼物!
      动态像框,专属头衔!
      挑战/抽奖,金币送不停!
      赶紧体会下,不会让你失望!
    • 实时动态
    • 签到
    • 做任务
    • 发表内容
    • 偏好设置
    • 到底部
    • 帖子间隔 侧栏位置:
    • 还没有账号?点这里立即注册