概念

预备知识

1. POJO

POJO是Plain Old Java Object的缩写,是软件开发大师Martin Fowler提出的一个概念,指的是一个普通Java类。也就说,你随便编写一个Java类,就可以称之为POJO。之所以要提出这样一个专门的术语,是为了与基于重量级开发框架的代码相区分,比如EJB,我们编写的类一般都要求符合特定编码规范,实现特定接口、继承特定基类,而POJO则可以说是百无禁忌,灵活方便。

2. Javabean 和 Spring 的 bean

  1. JavaBeans是一种Java规范定义的一种组件模型,它包含了一些类编码的约定。简单来说,一个类如果拥有一个默认构造函数,拥有公共的访问内部属性且符合命名规范的setter和getter方法,同时实现了io.Serializable接口,就是一个JavaBean(具体的几条规则请百度)。那么为什么要这些约定呢? 因为大家都遵守这些约定,在编写或者修改一个类的时候,就能很容易在可视化的开发环境中进行操作,也更方便地分发给他人。

  2. Spring Bean是被Spring维护和管理的POJO。最早Spring只能管理符合JavaBeans规范的对象,这也是为什么称之为Spring Bean的原因。但是现在只要是POJO就能被Spring容器管理起来,而且这也是最为常见的情况

框架的含义

框架,即为解决一个开放性问题而设计的具有一定约束性的支撑结构。它是依据特定的设计,对一类底层 API、流程进行封装而得到的模块。
它帮你做了各种繁琐的事、肮脏的事、或者复杂的事,解决了一些底层 API 的问题,实现了一些更好的新功能,最后给上层提供一个简洁、一致、方便的 API。使用这些 API,程序员可以很方便的完成一些原本可能会很复杂繁琐肮脏的事。

Spring Overview

广义上的Spring(Spring全家桶)包含了 Spring 提供的一整套应用解决方案,包括 Spring、SpringMVC(RESTfull)、Spring JPA(Hibernate Implementation)、Spring Boot、Spring Security 等等。。

不过这里只说 这套体系的核心:Spring Core Technologies,它包括上图的 Core ContainerAOP,提供了控制反转 ( Inversion of Control, IoC)面向切面编程 (Aspect-Oriented Programming, AOP) 两个核心功能。

控制反转 ( Inversion of Control, IoC) 容器

概念

控制反转,即把控制权交给你使用的 IoC框架。运行时,是先从主类 启动 Ioc框架,再由该框架来创建你的其他类、管理你的类之间的交互。(也可以先创建其他类,但是需要控制反转功能的类一定要由 Spring 创建才行)
这样做可以降低你的代码的耦合度,提高代码内聚度。类之间的协作关系不再需要硬编码在该类中,直接写在 Ioc框架的配置里就好了。
耦合度降低了,变更代码也就变得容易了,也更容易做模拟测试了,项目的可维护性和健壮性自然就提升了。

实现

Spring 通过 依赖注入(Dependency Injection, DI) 实现了控制反转。它使用配置文件(xml/Annotation/JavaConfig)来设置依赖关系,然后在 Spirng 构建这些对象的过程中,自动注入所需的依赖。

container 的角色可以形象地用下图表示:

org.springframework.beansorg.springframework.context 这俩包是 Spring IoC 的基础。
org.springframework.beans.factory.BeanFactory 接口定义了最简单的容器,提供基本的 DI 支持。(太底层,一般不用)而 org.springframework.context.ApplicationContext 接口基于 BeanFactory 接口构建,提供更上层的功能。

ApplicationContext

实现类

ApplicationContext 接口只提供应用上下文相关信息,与具体的配置方法是分离的。不同的配置方式对应不同的实现类。这是一种很灵活的方式。
Spirng 自带了多种类型的应用上下文工厂类,不同的工厂类对应不同的配置方法。最有用的几个如下:

  1. AnnotationConfigApplicationContext:从基于注解的Java配置类中加载应用上下文,可接受参数为 Class 或 String.
  2. ClassPathXmlApplicationContext:从类路径(包含Jar文件)下的xml配置文件中加载应用上下文
  3. AnnotationConfigWebApplicationContext:因为 Spring 被主要被用于构建 Web 应用,因此也提供了这两个工厂类。
  4. XmlWebApplicationContext:同上
应用上下文(ApplicationContext)

从工厂类构建出应用上下文后,就能够使用在 BeanFactory/ApplicationContext 中定义的方法了,常用的几个如下:

  1. getBean():继承自 BeanFactory 接口,通过 Class/Id 获取对应的 Bean.
  2. getResources():继承自 ResourcesLoader,用于获取资源.

虽然如此说,但是一般来说你都不需要用到 Spring 提供的方法,这能保证你的代码不会依赖任何 Spring 的 API。
不过有的时候,比如需要在 JavaFx 中使用 Spring 的时候,因为 JavaFx 在读取 fxml 布局文件时(FXMLLoader),会自动注入 Controller,我们就需要用FxmlLoader 实例的setControllerFactory(context::getBean),告诉该布局,你的 Controller 需要找 Spring 要,而不应该自己创建。

配置方法

先前说了 Spring 有多种配置方式,不同的方式对应的不同的 ApplicationContext 实现类。
其中主流的两种方式分别是:xml方式 和 Java配置类方式。
因为Java配置类方式能在编译期发现很多潜在问题,因此正在成为主流选择。
xml 越来越被嫌弃(在数据传输领域它也正在被json替代),不过有些事只有 xml 能干,因此也需要学习。

具体的配置方法笔记记在了下一章,因为这一章主要还是概念的梳理。

面向切面编程 (Aspect-Oriented Programming, AOP)

使用 AOP 可以实现 关注点分离,每一个切面只需要干一类事(日志、事务管理、安全等),降低代码复杂性。
DI 帮助实现了类之间的解耦,而 AOP 则有助于实现横切关注点(即日志等与业务逻辑无关的事)与具体业务逻辑之间的解耦。

待续

P.S. Spring 曾经的 overview 提供了非常详尽的体系介绍。但是在
2017-7-28 日的一次提交中,整个 overview 都被重写了一遍,然后信息就变得相当简略。因此 overview 暂时只能看旧版文档了。

转载于:https://www.cnblogs.com/kirito-c/p/9195536.html

Spring 笔记(一)概念梳理相关推荐

  1. 软考高项之学习笔记——质量成本概念

    软考高项之学习笔记--质量成本概念 一.常见混淆概念 二.质量成本相关概念解释 1.质量成本概念 2.一致性成本 3.非一致性成本 三.历年真题 一.常见混淆概念 质量成本.一致性成本.非一致性成本. ...

  2. [DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event

    [DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event 事件 事件(Event)是用来通知代码,一些有趣的事情发生了. 每一个Event都会被一个Eve ...

  3. 使用Spring Roo进行概念验证

    在Keyhole期间,我参与了许多项目,其中客户要求我们重写旧系统,同时保留其现有数据库. 有时,它有助于快速演示如何使用当前技术来简化开发,测试和维护其代码. 我发现可以创建一个快速示例(与当前项目 ...

  4. 使用react实现select_React笔记——核心概念:9.表单

    1.受控组件 在 React 中,可变状态(mutable state)通常保存在组件的 state 属性中,并且只能通过使用 setState()来更新. state:唯一数据源 渲染表单的 Rea ...

  5. Spring:笔记整理(1)——HelloWorld

    Spring:笔记整理(1)--HelloWorld 导入JAR包: 核心Jar包 Jar包解释 Spring-core 这个jar 文件包含Spring 框架基本的核心工具类.Spring 其它组件 ...

  6. spring 笔记2:Spring MVC : Did not find handler method for 问题的解决

    spring 笔记2:Spring MVC : Did not find handler method for 问题的解决 参考文章: (1)spring 笔记2:Spring MVC : Did n ...

  7. 狂神说Spring笔记(全网最全)

    Spring框架 1.Spring 狂胜说Spring笔记以及代码 1.1 简介 Spring : 春天 -->给软件行业带来了春天 2002年,Rod Jahnson首次推出了Spring框架 ...

  8. 嵌入式技术(单片机原理)基本概念梳理(保研/考研面试)

    嵌入式技术基础(单片机原理),常见概念及知识点整理(保研面试用). 目录 第1章 概论 第2章 MCS-51系列单片机的资源配置 第3章 MCS-51系列单片机的指令系统及汇编语言程序设计 第4章 单 ...

  9. HDMI EDID概念梳理

    EDID概念梳理: EDID数据格式: EDID包含两个部分,基本的EDID只有128个字节,还有128字节的扩展EDID,扩展部分不是必须有的.那通常电视都有扩展EDID.那EDID的详细定义在规范 ...

  10. 自动控制原理概念梳理(保研面试用)

    自控上下两册,常见概念及知识点整理(保研面试用). 目录 第1章 自动控制系统的一般概念 第2章 控制系统的数学模型 第3章 控制系统的时域分析 第4章 控制系统的根轨迹分析法 第5章 控制系统的频域 ...

最新文章

  1. 介绍html CSS和JS的定义或引用
  2. 基于Metronic的Bootstrap开发框架经验总结(2)--列表分页处理和插件JSTree的使用...
  3. numpy.ndarray.view()(懵逼,看不太懂???)(view不会开辟新的内存空间)
  4. vb.net2019-多线程并行计算(1)
  5. vs2008环境下MFC对注册表的读写操作
  6. viewpager+fragment学习笔记
  7. 2016年第12本:成功就靠专注一件事
  8. 编写区块链_编写由区块链驱动的在线社区的综合指南
  9. (转)Hibernate框架基础——在Hibernate中java对象的状态
  10. 大数据_Flink_流式处理_简介_为什么要用Flink---Flink工作笔记0002
  11. mysql 怎么算第二天_mysql 第二天
  12. 【劲峰论道时空分析技术-学习笔记】4 如何度量时空变化
  13. arcgis java api,Java中调用ArcGIS Server REST API
  14. 硬盘img镜像备份工具
  15. matlab常微分方程2次初值问题,MATLAB求解二阶常微分方程初值问题
  16. vue 播放m3u8视频
  17. CAD打断线条的快捷键是什么?CAD打断线条教程
  18. 易语言安卓模拟器adb模块制作查看模拟器设备adb devices
  19. 使用计算机自适应测验大型测验,计算机自适应测验中测验安全控制方法评述.pdf...
  20. 鲸鱼算法优化PID参数优化附matlab代码

热门文章

  1. JS 封装事件(鼠标事件举例)-封装引入部分
  2. 《需求工程——软件建模与分析》阅读笔记之一
  3. 部分编程错误小集-15.04
  4. CreateFeatureClass COM异常
  5. 英雄七十寿 无物下冷酒 横刀上闹市 直取数人头
  6. Java中的堆分配参数总结《对Java的分析总结》(二)
  7. Javascript如何显示完整的大数加法结果而不是科学计数法形式
  8. java枚举类型转换为Struts2的select的数据
  9. JavaScript 调用后台事件和方法
  10. css3实现的the Sexy Buttons