Spring 学习笔记(2)框架介绍
本篇文章主要对 Spring 框架进行整体介绍,包括其核心功能模块与体系结构,让大家对该框架有个大体的认识。
1. 前景提要
如果你之前学过 Servlet 的话,那么一定会对 MVC 分层概念有所了解,我们一般在做项目的时候,会将与数据库操作(比如增、删、改、查)相关的部分放在 Dao 层,将登录、注册等功能放在 Service 层,而将用户获取表单数据、调用业务逻辑、分发转向等操作放在 Web 层(也叫表示层,具体的说,应该是在表示层下的控制层)。Servlet 的主要功能是交互式地浏览和交互数据,生成动态的 Web 内容,因此其可以响应任何类型的请求。
一个清晰的结构图如下:

2. Spring 介绍
这时候你可能会问了:介绍 Servlet 干嘛?这和 Spring 有什么关系吗?其实,我这里是为了引出 Spring 框架,接下来会通过结构图的形式让你知道 Spring 处在什么位置。如下所示:
你可以看到,不管是 SSH 框架还是 SSM 框架,底层都需要 Spring 的支持,所以说,学好 Spring 极其重要。
Spring 其实是一种容器框架,基于控制反转 (IoC,Inversion of Control) 与依赖注入 (DI,Dependency Injection) 进行实现,我们暂且将这两个名词理解为:通过 IoC 和 DI 操作将对象交付给 Spring,让 Spring 容器来控制对象,也就是我们平时 new 的对象不在程序中 new 了,而是让 Spring 帮助我们去做,我们只需要在配置文件中进行配置就可以了(当然可以在程序中标记注解),后面几篇文章会详细讲到。
3. Spring 体系结构
Spring 框架是一个分层的架构,每个层次有许多模块,在这里我们先主要关注 Core Container、AOP、Aspects、JDBC、Transactions 这几个部分,如下所示:

Core Container 部分是 Spring 的核心容器,其中 Beans 用于管理各种 bean,Core 是容器的核心,这两个部分是 Spring 的基本内容,包括控制反转与依赖注入。Context 指的是上下文,是 Spring 的配置文件。SpEl 模块提供了强大的表达式语言(就如同 JSP 中的EL表达式一样),可以在程序运行时查询和操作对象。AOP 是切面编程的部分,而 Aspect 是一种 AOP 框架。
在 Data Access/Integration 中的 JDBC 用于 JDBCTemplate 的数据库开发,Transactions 用于事务的管理。当然,Web 层还有用于 Web 的开发。主要是这么多内容,这些内容都会在以后的文章中进行介绍,也会编写例子来加深对 Spring 的理解。
4. Spring 特点
说完了 Spring 的结构,我们来看一下它有哪些优点。
- Spring 相当与一个容器,也称之为工厂,它可以用于创建对象以及维护对象之间的依赖关系,Spring 通过管理这些对象可以简化我们的开发,降低程序的耦合性。
- Spring 支持 AOP 编程,也就是面向切面编程。这个切面就相当于在程序中的某个地方进行了拦截,拦截后会执行其它操作,等到操作执行完之后就回过头来继续执行原来的程序,用到地方最多的是对账号登录的权限进行拦截,判断有没有权限,如果有权限就放行,没有权限就执行另外的操作。
- 以前我们在操作数据库的事务的时候需要自己手动编写代码,而引入 Spring 后,我们只需在 Spring 的配置文件中进行配置就可以实现事务的管理了。
- 以前我们在测试程序的时候需要单独写一个测试类,而 Spring 支持 Junit4,可以通过注解的方式测试 Spring 程序。
- Spring 可以很方便的集成其它框架,从上面第二张图可以看出,Spring 可以与 Structs、Hibernate、MyBatis 等框架进行整合。
- 以前我们在实现对数据库操作的时候可以通过 JDBC 实现,这种 API 的方式很是繁琐,而 Spring 很好的实现了 API 的封装,从而使得这些 API 的使用难度大大降低。
5. 初探 Spring
先看下面的代码:
// HelloWorld.java
public class HelloWorld {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void hello() {
System.out.println("hello: " + name);
}
}
// Main.java
public class Main {
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorld();
helloWorld.setName("Carol");
helloWorld.setAge(123);
helloWorld.hello();
}
}
上面的代码很简单,在 Main 这个类中,首先创建了一个 HelloWorld 对象,然后对 name 和 age 进行了属性填充,最后调用其 hello 方法将内容输出。
然而,引入 Spring 以后,「创建对象」和「填充属性」的工作可以交给 Spring 来做。那么该如何操作呢?
在项目工程的 src/main/resources 目录下,创建一个 Spring 配置文件,即 applicationContext.xml。其内容如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置 bean-->
<bean id="helloWorld" class="com.example.springdemo.beans.HelloWorld" >
<property name="name" value="Spring"></property>
<property name="age" value="123"></property>
</bean>
</beans>
其中,class需要指定当前类的全限定名,Spring 通过反射的方式来创建 HelloWorld 对象;id通常为首字母小写的类名,用来标识这个对象的同时,引用这个 Bean。Bean 的定义中可以有零个或多个<property></property>。<property></property>被称为元素,元素中有多个属性,即name和value。每个 property 元素对应 JavaBean 中相应的 setter 方法。
此时,可以改写 main 方法,如下所示:
public class Main {
public static void main(String[] args) {
// 创建 Spring 的 IoC 容器对象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 从 IoC 容器中获取 Bean 实例
HelloWorld helloWorld = (HelloWorld) context.getBean("helloWorld");
helloWorld.hello();
}
}
输出内容如下:
hello: Spring, age: 123
可以看到,Spring 容器自动为属性进行了赋值。为了看到 Spring 在创建 IoC 容器对象的时候做了哪些事情,我们在 main 方法中将后两行代码注释掉,然后在 HelloWorld 类中添加一个无参的构造器,同时在 setter 方法中加入输出语句,如下所示:
public class HelloWorld {
private String name;
private int age;
public void setName(String name) {
System.out.println("setName: " + name);
this.name = name;
}
public void setAge(int age) {
System.out.println("setAge: " + age);
this.age = age;
}
public void hello() {
System.out.println("hello: " + name + ", age: " + age);
}
public HelloWorld() {
System.out.println("HelloWorld's Constructor...");
}
}
运行程序后,输出内容如下:
HelloWorld's Constructor...
setName: Spring
setAge: 123
可以看到,Spring 在创建 IoC 容器的时候,就执行了无参构造器,并调用了 setter 方法。
需要注意的是:由于在 xml 中使用全类名的方式,通过反射来创建对象。因此需要当前类提供无参的构造器,如果没有提供的话,那么在运行程序的时候,会出现如下错误:
Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.example.springdemo.beans.HelloWorld]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.example.springdemo.beans.HelloWorld.<init>()
6. 总结
这是《Spring 学习笔记》的第一篇文章,主要围绕 Spring 是什么?Spring 可以做什么?以及 Spring 的特点进行介绍,通过引入了结构图可以很清晰的看到 Spring 的内部结构特点,便于自己的理解。当然了,博主只是简单的对这部分内容进行了说明,如果感兴趣的话,可以查看下方的官方文档进行阅读。
此外,如果有任何错误或者描述不正确的地方,欢迎以评论或邮箱的方式联系我。
参考
Spring 学习笔记(2)框架介绍的更多相关文章
- Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)
在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...
- 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回
作者:ssslinppp 时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...
- Java架构师之路 Spring学习笔记(一) Spring介绍
前言 这是一篇原创的Spring学习笔记.主要记录我学习Spring4.0的过程.本人有四年的Java Web开发经验,最近在面试中遇到面试官总会问一些简单但我不会的Java问题,让我觉得有必要重新审 ...
- spring学习笔记(一) Spring概述
博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书. 强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...
- Spring学习笔记2——表单数据验证、文件上传
在上一章节Spring学习笔记1——IOC: 尽量使用注解以及java代码中,已经搭建了项目的整体框架,介绍了IOC以及mybatis.第二节主要介绍SpringMVC中的表单数据验证以及文件上传. ...
- 不错的Spring学习笔记(转)
Spring学习笔记(1)----简单的实例 --------------------------------- 首先需要准备Spring包,可从官方网站上下载. 下载解压后,必须的两个包是s ...
- Spring学习笔记 - 第二章 - 注解开发、配置管理第三方Bean、注解管理第三方Bean、Spring 整合 MyBatis 和 Junit 案例
Spring 学习笔记全系列传送门: Spring学习笔记 - 第一章 - IoC(控制反转).IoC容器.Bean的实例化与生命周期.DI(依赖注入) [本章]Spring学习笔记 - 第二章 - ...
- 【Spring学习笔记-MVC-3.1】SpringMVC返回Json数据-方式1-扩展
<Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...
- 【Spring学习笔记-MVC-15.1】Spring MVC之异常处理=404界面
作者:ssslinppp 异常处理请参考前篇博客:<[Spring学习笔记-MVC-15]Spring MVC之异常处理>http://www.cnblogs.com/sssl ...
- 【Spring学习笔记-MVC-9】SpringMVC数据格式化之日期转换@DateTimeFormat
作者:ssslinppp 1. 摘要 本文主要讲解Spring mvc数据格式化的具体步骤: 并讲解前台日期格式如何转换为java对象: 在之前的文章<[Spring学习笔记-MVC ...
随机推荐
- Mysql报:error while loading shared libraries libtinfo.so.5的解决办法
版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin #.今天闲来无事,想在Anolis8的系统上装一个MySQL8.0玩.前期在安装和配置的过程中没有什么问题,但是在我想 ...
- JAVA学习week2
这周:根据老师在群里面推荐的JAV学习路线,初步规划了一下学习方案 并找到了相关的视频,目前来说在学习SE.学习内容:环境变量的配置和简单的hello world程序书写的注意点 下周:打算进行简单的 ...
- [UOJ#748] [UNR#6 1B] 机器人表演
在这个科技发达的年代,真人表演已经落伍了.参加完 UOI 后,hehe 蚤去到了下山市大剧院,观看下山市最火爆的机器人表演. 机器人有时比人类更能抓住事情的本质.所谓表演,其实也就是开场有若干个机器人 ...
- Object.defineProperty用法
1.能干啥? Object.defineProperty()可以给传入的对象动态的添加或修改属性 2.怎么玩? Object.defineProperty(obj,prop,desc)它有三个参数: ...
- Vue学习笔记-快速入门
整体代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- postman——请求与相应
一.新建一个项目 直接点击左边栏上面的添加目录图标来新增一个根目录,这样就等于新建了一个项目,我们可以把一个项目或一个模块的用例都存放在这个目录之下,并且在根目录之下我们还可以在建立子目录来进行功能用 ...
- ASR项目实战-决策点
针对语音识别的产品,分别记录设计.开发过程中的决策点. 实时语音识别 对于实时语音识别来说,客户端和服务端之间实时交换语音数据和识别的结果. 客户端在启动识别时,即开始发送语音数据,期望在等待较短的时 ...
- ElasticSearch之cat nodes API
命令样例如下: curl -X GET "https://localhost:9200/_cat/nodes?v=true&pretty" --cacert $ES_HOM ...
- 谷歌浏览器输入地址后http自动转https解决方法
谷歌浏览器输入地址后http自动转https解决方法 https://blog.csdn.net/qq_51563725/article/details/133691727
- springsecurity 使用浅谈(一)
1. 背景 springsecurity框架主要用于Web应用的认证和授权.所谓认证就是验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户.而授权就是经过认证后判断当前用户是否有权 限进行 ...