Spring 笔记(一)概念梳理
概念
预备知识
1. POJO
POJO是Plain Old Java Object的缩写,是软件开发大师Martin Fowler提出的一个概念,指的是一个普通Java类。也就说,你随便编写一个Java类,就可以称之为POJO。之所以要提出这样一个专门的术语,是为了与基于重量级开发框架的代码相区分,比如EJB,我们编写的类一般都要求符合特定编码规范,实现特定接口、继承特定基类,而POJO则可以说是百无禁忌,灵活方便。
2. Javabean 和 Spring 的 bean
JavaBeans是一种Java规范定义的一种组件模型,它包含了一些类编码的约定。简单来说,一个类如果拥有一个默认构造函数,拥有公共的访问内部属性且符合命名规范的setter和getter方法,同时实现了io.Serializable接口,就是一个JavaBean(具体的几条规则请百度)。那么为什么要这些约定呢? 因为大家都遵守这些约定,在编写或者修改一个类的时候,就能很容易在可视化的开发环境中进行操作,也更方便地分发给他人。
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 Container
和 AOP
,提供了控制反转 ( 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.beans
和 org.springframework.context
这俩包是 Spring IoC 的基础。
org.springframework.beans.factory.BeanFactory
接口定义了最简单的容器,提供基本的 DI 支持。(太底层,一般不用)而 org.springframework.context.ApplicationContext
接口基于 BeanFactory 接口构建,提供更上层的功能。
ApplicationContext
实现类
ApplicationContext 接口只提供应用上下文相关信息,与具体的配置方法是分离的。不同的配置方式对应不同的实现类。这是一种很灵活的方式。
Spirng 自带了多种类型的应用上下文工厂类,不同的工厂类对应不同的配置方法。最有用的几个如下:
- AnnotationConfigApplicationContext:从基于注解的Java配置类中加载应用上下文,可接受参数为 Class 或 String.
- ClassPathXmlApplicationContext:从类路径(包含Jar文件)下的xml配置文件中加载应用上下文
- AnnotationConfigWebApplicationContext:因为 Spring 被主要被用于构建 Web 应用,因此也提供了这两个工厂类。
- XmlWebApplicationContext:同上
应用上下文(ApplicationContext)
从工厂类构建出应用上下文后,就能够使用在 BeanFactory/ApplicationContext 中定义的方法了,常用的几个如下:
- getBean():继承自 BeanFactory 接口,通过 Class/Id 获取对应的 Bean.
- 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 笔记(一)概念梳理的更多相关文章
- Spring笔记:AOP基础
Spring笔记:AOP基础 AOP 引入AOP 面向对象的开发过程中,我们对软件开发进行抽象.分割成各个模块或对象.例如,我们对API抽象成三个模块,Controller.Service.Comma ...
- [DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event
[DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event 事件 事件(Event)是用来通知代码,一些有趣的事情发生了. 每一个Event都会被一个E ...
- Spring AOP基本概念
Spring AOP基本概念 目录 Spring AOP定义 AOP基本术语 通知类型 AOP定义 AOP基本术语 切面( Aspect ):一个能横切多个对象的模块化的关注点.对Spring AOP ...
- spring技术核心概念纪要
一.背景 springframework 从最初的2.5版本发展至今,期间已经发生了非常多的修正及优化.许多新特性及模块的出现,使得整个框架体系显得越趋庞大,同时也带来了学习及理解上的困难. 本文阐述 ...
- Oracle RAC学习笔记:基本概念及入门
Oracle RAC学习笔记:基本概念及入门 2010年04月19日 10:39 来源:书童的博客 作者:书童 编辑:晓熊 [技术开发 技术文章] oracle 10g real applica ...
- Java IO学习笔记:概念与原理
Java IO学习笔记:概念与原理 一.概念 Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...
- Spring笔记02_注解_IOC
目录 Spring笔记02 1. Spring整合连接池 1.1 Spring整合C3P0 1.2 Spring整合DBCP 1.3 最终版 2. 基于注解的IOC配置 2.1 导包 2.2 配置文件 ...
- Spring笔记01_下载_概述_监听器
目录 Spring笔记01 1.Spring介绍 1.1 Spring概述 1.2 Spring好处 1.3 Spring结构体系 1.4 在项目中的架构 1.5 程序的耦合和解耦 2. Spring ...
- Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven)
Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven) 本篇和 Spring 没有什么关系,只是学习 Spring,必备一些知识,所以放在这里了. 本篇内容: (1)M ...
- Spring笔记:事务管理
Spring笔记:事务管理 事务管理 Spring事务管理是通过SpringAOP去实现的.默认情况下Spring在执行方法抛出异常后,引发事务回顾,当然你可以用拦截器或者配置去改变它们. 这部门内容 ...
随机推荐
- EF core 学习笔记
应该 以领域 为核心开发程序, 不应该 以数据库 entityframeworkcore entityframeworkcore.sqlserver entityframeworkcore.tool ...
- GDB调试手册[转]
Linux 包含了一个叫gdb 的GNU 调试程序.gdb 是一个用来调试C和C++程序的强力调试器.它使你能在程序运行时观察程序的内部结构和内存的使用情况.以下是 gdb 所提供的一些功能:它使你能 ...
- 三、Object-C内存管理
一.管理范围:任何继承了NSObject的对象,对基本数据类型无效 原理: 1.每个对象都有个引用计数器,是一个与之关联的整数 2.使用了 3.给对象发送一条retain消息,可以使对计数器+1 4. ...
- NoClassDefFoundError: com/ibatis/sqlmap/engine/transaction/external/ExternalTransactionConfig处理
根据老系统拷贝maven依赖新搭建了一个项目,启动抛异常如下: Caused by: java.lang.NoClassDefFoundError: com/ibatis/sqlmap/engine/ ...
- 前端jQuery之事件流
1.事件流概念 描述的是从页面中接收事件的顺序 包含事件捕获阶段,处于目标阶段,事件冒泡阶段 2.绑定事件 语法 bind(type,data,fn) 示例:每个标签被点击的时候,弹出其文本 $(&q ...
- sudo 密码超时时间
Centos 没有默认超时时间,所以用一次sudo就需要输入密码. vi /etc/sudoers 添加下面的内容,2表示分钟数(看自己需求更改). Defaults timestamp_timeou ...
- 搞定 mybatis generator 三步走
基于idea 编辑器下maven项目使用mybatis generator快速生成持久层 添加插件:插件网址:http://www.mybatis.org/generator/running/runn ...
- Servlet学习笔记05——什么是jsp?
1. jsp (java server page) (1)jsp是什么? sun公司制订的一种服务器端动态页面技术规范. 注: 因为虽然使用servlet也可以生成动态页面, 但是过于繁琐(需要使用o ...
- DNS介绍与安装使用
DNS简介 DNS是互联网的一项服务.它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网.DNS使用TCP和UDP的53号端口. DNS服务的基本概念 在使用DNS前需要了解 ...
- myql简单语法测试
删除某一行 delete from name1 where agee=10 limit 1; insert into name1(agee,namee)values(10,'wwww'),(10,' ...