Spring 综述

本贴最后更新于 1979 天前,其中的信息可能已经水流花落

关键词:Spring 框架、SpringIOC 容器、SpringAOP、SpringMVC、Springboot、设计模式

一、Spring 是什么

   Spring 框架是一个开源的、轻量级的 J2EE 开发框架,核心思想是 IOC 实现松耦合,利用 AOP 将应用的业务逻辑与系统服务分离;

    广义上地说,Spring 是一系列开源项目的总称,SpringIOC\SpringMVC 等只是其中的开源项目而已

二、Spring 生态

Spring 容器:

    专门存放和管理对象及对象间关系的类

https://blog.csdn.net/zorkeaccount/article/details/80818711

SpringIOC:

    利用工厂模式 + 反射实现 Spring 容器

https://blog.csdn.net/zorkeaccount/article/details/80503941

SpringAOP:

    动态代理,即在运行时生成 AOP 代理对象

    https://blog.csdn.net/zorkeaccount/article/details/80517710    

SpringMVC:

    基于 Servlet 的一个 MVC-web 框架,是 Spring 的一个模块,提供了一种轻度耦合的方式来开发 web 应用;

   ** 通过 Dispatcher Servlet, ModelAndView 和 View Resolver**,使得开发 web 应用变得很容易;解决的问题领域是网站应用程序或者服务开发——URL 路由、Session、模板引擎、静态 Web 资源等等。

Springboot:

   由于 Spring 框架需要进行大量的配置,**Spring Boot 引入自动配置的概念,让项目设置变得很容易,**降低了项目搭建的复杂度

   Spring Boot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序

Spring 设计模式:

    简单工厂(静态工厂方法)模式:

        其实质就是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类,不属于 23 种 GOF 设计模式之一;

        如 BeanFactory 类,就是根据传入的一个唯一标识来获取 bean 对象,但传参前还是传参后创建该 bean 对象视具体情况而定

    工厂方法 Factory Method 模式:

        定义一个用于创建对象的工厂 bean 接口,由实现类子类决定实例化哪一个类,也即工厂方法模式将一个类的实例化(bean 对象生成)延迟到其子类;

        如 FactoryBean 接口及其各个实现子类就是典型的工厂方法模式       

    单例 Singleton 模式:

        保证一个类只有一个实例,并对外提供一个可以访问它的全局访问点;

        Spring 中每个 bean 定义只生成一个对象实例,有两种模式饿汉模式(即类加载时已初始化,缺省时默认为该模式,容器启动即实例化容器时,为所有 spring 配置文件中定义的 bean 都生成一个实例)和懒汉模式(即类加载时不初始化,)=>【如可通过静态变量是否初始化实现饿汉和懒汉两种方式】

    适配器 Adapter 模式:

        将一个类的接口转换成另外一个接口

       Spring 中对于 aop 的处理用到 Adapter 模式,如因 Advisor 链需要的是 MethodInterceptor 对象,所以每一个 Advisor 中的 Advice 对象都是适配成对应的 MethodInterceptor 对象

    包装器 Decortor 模式:

        动态地给一个对象添加一些额外的职责,增加功能角度而言该模式比生产子类更加灵活;

        Spring 中用到包装器模式的类如:*Wrapper.java,或者*Decorator.java

    代理 Proxy 模式:

        为其他对象提供一种代理以控制对这个对象的访问,结构上类似于 Decortor 模式,但 Proxy 为控制是一种对功能的限制而 Decortor 是增加职责

        Spring 中 aop 的思想就是 Proxy 模式,比如 JdkDynamicAopProxy 和 Cglib2AopProxy

    观察者 Observer 模式:

        定义对象间一种一对多的依赖关系,当一个对象的状态改变时,所有依赖于该对象的其他对象均会得到通知并自动更新

        Spring 中 listen 的实现,如 ApplicationListener

    策略 Strategy 模式:

        定义一系列算法,并且将它们一个个封装起来且可以互相替换,使得算法可独立于使用它的客户而发生变化

        Spring 中如 SimpleInstantiationStrategy

    模板方法 Template Method 模式:

         定义一个操作中算法的骨架,而将一些步骤延迟到子类中;模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,该模式一般是需要继承的(也可以不需要继承的,如 JdbcTemplate)

Springboot 注解:

    @SpringBootApplication:

        Springboot 的入口注解,是多个注解的组合,其中比较重要的是 @EnableAutoConfiguration 注解,即可自动化配置,这是 SpringBoot 可以方便快捷地新建和启动一个项目的关键

    @EnableAutoConfiguration:

        该注解比较重要的是导入了可自动化配置导入选择器,@Import({EnableAutoConfigurationImportSelector.class})

    有关该 springboot 注解的详细分析过程可见,springboot 自动化配置

三、Spring&SpringMVC&Springboot 之间的关系和区别

    ** Spring 是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架**,通过容器管理 JavaBean(代替 EJB)的配置和声明周期; -> 即 Spring 是一个管理 bean 的容器,可称之为 SpringIOC 容器

    SpringMVC 是一个 MVC 框架容器,负责 controller 相关的 Bean 的管理,且 SpringIOC 容器的子容器;

    Springboot 本质上就是 Spring,只不过做了一些 SpringBean 的默认配置(开箱即用、快速启动);

    通俗地说,就是:Spring 最初利用“工厂模式”(DI)和“代理模式”(AOP)解耦应用组件。大家觉得挺好用,于是按照这种模式搞了一个 MVC 框架(一些用 Spring 解耦的组件),用开发 web 应用( SpringMVC )。然后有发现每次开发都写很多样板代码,为了简化工作流程,于是开发出了一些**“懒人整合包”(starter)**。

Spring 是一个“引擎”;

Spring MVC 是基于 Spring 的一个 MVC 框架 ;

Spring Boot 是基于 Spring4 的条件注册的一套快速开发整合包。

  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    940 引用 • 1458 回帖 • 158 关注

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 9 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 421 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    198 引用 • 120 回帖
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 1 关注
  • 音乐

    你听到信仰的声音了么?

    59 引用 • 509 回帖
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 682 关注
  • 倾城之链
    23 引用 • 66 回帖 • 96 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    16 引用 • 53 回帖 • 118 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    261 引用 • 662 回帖
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 132 关注
  • danl
    61 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 602 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    45 引用 • 113 回帖 • 317 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    7 引用 • 26 回帖 • 3 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 628 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    139 引用 • 441 回帖
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    27 引用 • 66 回帖
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    108 引用 • 54 回帖 • 1 关注
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    18601 引用 • 69242 回帖 • 1 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 250 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    228 引用 • 1450 回帖
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    83 引用 • 165 回帖 • 47 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 7 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    122 引用 • 73 回帖