概念

预备知识

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 暂时只能看旧版文档了。

Spring 笔记(一)概念梳理的更多相关文章

  1. Spring笔记:AOP基础

    Spring笔记:AOP基础 AOP 引入AOP 面向对象的开发过程中,我们对软件开发进行抽象.分割成各个模块或对象.例如,我们对API抽象成三个模块,Controller.Service.Comma ...

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

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

  3. Spring AOP基本概念

    Spring AOP基本概念 目录 Spring AOP定义 AOP基本术语 通知类型 AOP定义 AOP基本术语 切面( Aspect ):一个能横切多个对象的模块化的关注点.对Spring AOP ...

  4. spring技术核心概念纪要

    一.背景 springframework 从最初的2.5版本发展至今,期间已经发生了非常多的修正及优化.许多新特性及模块的出现,使得整个框架体系显得越趋庞大,同时也带来了学习及理解上的困难. 本文阐述 ...

  5. Oracle RAC学习笔记:基本概念及入门

    Oracle RAC学习笔记:基本概念及入门 2010年04月19日 10:39 来源:书童的博客 作者:书童 编辑:晓熊 [技术开发 技术文章]    oracle 10g real applica ...

  6. Java IO学习笔记:概念与原理

    Java IO学习笔记:概念与原理   一.概念   Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...

  7. Spring笔记02_注解_IOC

    目录 Spring笔记02 1. Spring整合连接池 1.1 Spring整合C3P0 1.2 Spring整合DBCP 1.3 最终版 2. 基于注解的IOC配置 2.1 导包 2.2 配置文件 ...

  8. Spring笔记01_下载_概述_监听器

    目录 Spring笔记01 1.Spring介绍 1.1 Spring概述 1.2 Spring好处 1.3 Spring结构体系 1.4 在项目中的架构 1.5 程序的耦合和解耦 2. Spring ...

  9. Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven)

    Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven) 本篇和 Spring 没有什么关系,只是学习 Spring,必备一些知识,所以放在这里了. 本篇内容: (1)M ...

  10. Spring笔记:事务管理

    Spring笔记:事务管理 事务管理 Spring事务管理是通过SpringAOP去实现的.默认情况下Spring在执行方法抛出异常后,引发事务回顾,当然你可以用拦截器或者配置去改变它们. 这部门内容 ...

随机推荐

  1. EF Database first 中,实现 多个表对应一个 实体的 查询

    1.首先 创建好 数据 库. hobby表 major 表 student 表 外键 关系如下 2. 实现将 数据库 映射到EDM中 视图如下 在VS中 生成了 3个实体类  ,对应的是 数据库中的3 ...

  2. SQL随手记

    数据库改名 想要达到的效果,类似于将一个文件[复制粘贴重命名]. 0.首先得断开连接,复制一份备份.然后再连接上,进行下面的操作. 1.在树形上,选中要改名的数据库,右键重命名. 2.还是它,右键,属 ...

  3. 【Java】多线程相关复习—— 线程的创建、名字、运行情况以及顺序控制(join方法) 【一】

    一.创建线程的三种方式 · 继承Thread类 · 实现Runnable接口 · 实现Callable接口 二. 线程状态 · 线程名字 getName() · 线程活动情况 isAlive() · ...

  4. postgresql 免安装版使用

    免安装版 postgresql 使用 1.首先使用 initdb 初始化数据目录 initdb --pgdata=data --encoding=UTF8 --locale=C 2.启动 postgr ...

  5. udp重发java实现

    最近在处理框架通讯方面的问题,通过积累的开发经验,其实在很多情况(尤其是实时大数据量),udp是占有很多优势的:不需要连接,只管发送,理论上要快很多; 另外在穿墙上占有很大优势: 但是最大的一个问题就 ...

  6. CMD批处理复制目录下所有文件

    从我接触编程时,WIN7已经是最普及的系统了. 有一天,我需要在服务器更新某个软件或游戏的时候,我都需要先在其中一台服务器下载更新, 然后同步到其他服务器,而且这种操作也是非常频繁的,我就想写个批处理 ...

  7. JAVAOOP异常

    排序: Try-catch-finally:try正常执行,如果有异常执行catch后执行finally,如果没有直接执行finally 执行顺序:try-catch:try中的语句正常执行,如果遇到 ...

  8. arm-none-linux-gnueabi-gcc No such file or directory这个错误的解决方法

    这个gcc可执行文件是32位的版本,而在64位系统上需要安装32位兼容包才可以运行正常 .用file命令查看这个文件得到: 解决办法: 安装ia32-libs sudo apt-get install ...

  9. 数据分析处理库Pandas——merge操作

    有一列列名相同值也相同 有两列列名相同值也相同 按其中一列合并 按两列合并 有一列列名相同值也相同,有一列列名相同值不相同,按两列合并 列名相同值不相同的行删掉 保留所有行 保留所有行并显示合并后该值 ...

  10. 模块pandas

    python之pandas简单介绍及使用(一) https://www.cnblogs.com/misswangxing/p/7903595.html