纸上得来终觉浅,绝知此事要躬行

文章大纲

  • 什么是spring

    1. 传统Java web应用架构
    2. 更强的Java Web应用架构——MVC框架
    3. Spring——粘合式框架
  • spring的内涵

    1. spring核心

      • JavaBean
      • 应用上下文
      • IoC/DI
    2. spring框架组成
    3. spring还可以做什么

什么是Spring

Spring框架是Java平台的开源的全栈应用程序框架和控制反转容器实现。

传统的Java Web应用架构

传统的Java web框架一般分为两层:Contrller-Model。

控制器主要通过Servlet接收与处理请求,根据不同的Web请求生成动态内容。模型层主要处理与数据库的交互,接收控制器的请求,打包获得的数据返回给控制器。

主要流程如下:

  1. Web浏览器发送HTTP请求到服务器,被Controller(主要是Servlet)获取并进行处理
  2. Controller调用核心业务逻辑——Model
  3. Model进行数据库存取操作,并将结果返回给Controller
  4. Controller将业务逻辑处理结果交给View(通常是JSP),动态输出HTML内容
  5. 动态生成的HTML内容返回到浏览器显示

更强的Java Web架构——MVC框架(Spring MVC框架为例)

Spring MVC基于模型-视图-控制器(Model-VIew-Controller, MVC)模式实现,可以构建一个灵活和松耦合的Web应用程序,基于spring mvc架构的请求流程如下:

  1. 客户端产生请求,将数据提交给服务器。
  2. 经过前端控制器进行分发,通过查询处理器映射,将请求委托给应用程序的其他组件(控制器)来执行实际的请求。
  3. 控制器完成逻辑处理,产生响应信息(model),打包该模型数据,并标示逻辑视图名(用来确定用哪个视图渲染输出),将模型与视图名返回给前端控制器。
  4. 前端控制器使用视图解析器来将逻辑视图名匹配为一个特定的视图实现。
  5. 视图使用模型数据渲染输出,输出会通过响应对象传递给客户端。

Spring——粘合式框架

一站式的粘合框架,它像神奇的胶水一样,可以以松耦合的方式使各组件有机的粘合在一起。

Spring MVC完成用户请求并返回响应的过程中调用了大量的组件,而每个组件都有一个或多个JavaBean通过互相协调组合。为了降低耦合度,更方便、灵活的创建Bean以及Bean之间的联系,Spring采用了控制反转(Inverse of Controller,IoC)的思想,把强耦合的代码依赖从代码中移出去,放到统一的XML配置文件中,将程序对组件的主要控制权交给IOC容器,由IOC容器统一加载和管理,把Bean的创建、联系、属性分给Bean的过程,叫依赖注入(Dependency Injection, DI),由此可见,依赖注入与控制反转息息相关。

由此可见,Spring框架的核心技术思想是:控制反转/依赖注入。核心内容是:Bean

Spring的内涵

Spring核心

JavaBean

Spring官方文档对于Bean的解释:

In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.

翻译:

组成应用程序主干部分并由Spring IoC容器管理的对象叫做beans。Bean是由Spring IoC容器实例化、组装、管理的对象。

总结概括:

  1. Bean是对象
  2. Bean是Spring应用程序的主干部分
  3. Bean由Spring IoC容器统一管理

Spring应用上下文

已经知道,Spring IoC容器具有对象的创建、管理等控制权,但是需要我们自己去放入对象到容器里,需要我们自己决定对象之间的依赖关系,总的来说,容器只是提供了一个管理对象的空间。我们需要通过Spring的应用上下文向容器添加代为管理的对象。

Spring应用上下文可以简单的理解为将需要Spring管理的对象放入容器的容器对象,也即,应用上下文是Spring容器的一种抽象化表述,上面代码使用的ApplicationContext本质上就是一个维护Bean定义以及对象之间协作关系的高级接口。

Spring的核心是容器,Spring容器使用DI管理构成应用的组件。Spring自带了多个容器实现,可以归为两种不同的类型。BeanFactory是最简单的容器,提供基本的DI支持。应用上下文基于BeanFactory构建,它提供更多服务,例如解析配置文本信息等等。

IoC/DI

Spring框架中的Bean不再是传统上的用new的方式创建了,而是通过把Bean的管理权限统一交由一个名为Spring IoC的容器统一管理,管理权限包括:实例化、配置和组装beans。Spring IoC容器通过读取配置元数据获取需要实例化、配置、组装的对象的信息。配置元数据信息通常以XML文件或Java注解或Java代码表示。

代码举例:

接口:

public interface HelloService {
public void sayHello();
}

实现类:

public class HelloServiceImp implements HelloService {
public void sayHello() {
System.out.println("Hello World!");
}
}

前面提到可以用三种方式配置元数据信息,这里采用XML的方式:

helloworld.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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- id 表示组件的名字,class表示组件类 -->
<bean id="helloService" class="com.HelloServiceImpl" /> </beans>

实例化一个IoC容器:

public class HelloServiceTest {
public void testHelloWorld() {
// 1、加载Spring上下文,读取配置文件实例化一个IOC容器
ApplicationContext context = new ClassPathXmlApplicationContext("helloworld.xml");
// 2、从容器中获取Bean
HelloService helloService = context.getBean("helloService", HelloService.class);
// 3、执行业务逻辑
helloService.sayHello();
}
}

可以看到,顶层接口规定了方法,底下可以有各种打印输出不同内容的实现类。通过配置xml的方式,将实现类注册为一个具有特定ID的bean。在实例化容器部分,首先通过应用上下文读取了元数据信息,得到一个容器实例,然后获取到一个bean,并将这个bean注入到Service,Service再执行具体方法。可以看到,我们的Service并不需要知道它要打印输出的内容是什么,只需负责它本来的任务,各部分各司其职,互不干扰但却又互相配合。

Spring框架组成

Spring核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

面向切面编程:这个模块是Spring应用系统中开发切面的基础。AOP可以帮助应用对象解耦——将遍布系统的关注点(如:事务、安全等)从它们所应用的对象中解耦出来。

数据访问与集成:此模块抽象了大量样板式代码,使得数据库代码变得简单明了。Spring ORM模块建立再对DAO的支持之上,并为多个ORM框架(如:Hibernate、iBATIS SQL Maps等)提供了一种构建DAO的简便方式。

Web与远程调用:自带MVC框架——Spring MVC。集成RMI(Remote Method Invocation)、Hessian、Burlap、JAX-WS,自带远程调用框架——HTTP invoker。

测试:Spring为使用JNDI、Servlet和Portlet编写端元测试提供了一些列的mock对象实现。

Spring还可以做什么

Spring Portfolio包括多个构建于核心Spring框架之上的框架和类库。整个Spring Portfolio几乎为每一个领域的Java开发都提供了Spring编程模型。

Spring Boot:以Spring的视角,致力于简化Spring本身。Spring Boot大量依赖于自动配置技术,它能够消除大部分Spring配置。

Spring Web Flow:建立于Spring MVC框架之上,为基于流程的会话式Web应用(如购物车、向导等)提供了支持。

Spring Web Service:提供了契约优先的Web Service模型,服务的实现都是为了满足服务的契约而编写的。

Spring Security:利用Spring AOP,Spring Security为Spring应用提供了声明式的安全机制。

Spring Integration:为了方便应用直接的交互,Spring Integerration提供了多种通用应用集成模式的Spring声明式风格实现。

Spring Batch:适用于开发批处理应用,比如需要进行对数据的大量操作时。

Spring Data:不管使用的是文档数据库(如:MongoDB),图数据库(如:Neo4j),还是传统的关系型数据库,Spring Data都提供了一种简单的编程模型。

Spring Social:Spring Social更多的是关注connect而不是social,它能够帮助你通过REST API连接Spring应用。

Spring Mobile:是Spring MVC新的扩展模块,用于支持移动Web应用开发。

如有错误之处,请多多原谅并且提出来,一起进步

Spring 框架学习(1)--Spring、Spring MVC扫盲的更多相关文章

  1. Spring框架学习之--搭建spring框架

    此文介绍搭建一个最最简单的spring框架的步骤 一.创建一个maven项目 二.在pom.xml文件中添加依赖导入spring框架运行需要的相关jar包 注意:在引入jar包之后会出现org.jun ...

  2. Spring框架学习总结(上)

    目录 1.Spring的概述 2.Spring的入门(IOC) 3.Spring的工厂类 4.Spring的配置 5.Spring的属性注入 6.Spring的分模块开发的配置 @ 1.Spring的 ...

  3. Spring框架学习1

    AnonymouL 兴之所至,心之所安;尽其在我,顺其自然 新随笔 管理   Spring框架学习(一)   阅读目录 一. spring概述 核心容器: Spring 上下文: Spring AOP ...

  4. Spring框架学习笔记(5)——Spring Boot创建与使用

    Spring Boot可以更为方便地搭建一个Web系统,之后服务器上部署也较为方便 创建Spring boot项目 1. 使用IDEA创建项目 2. 修改groupid和artifact 3. 一路n ...

  5. Spring框架学习笔记(1)

    Spring 框架学习笔记(1) 一.简介 Rod Johnson(spring之父) Spring是分层的Java SE/EE应用 full-stack(服务端的全栈)轻量级(跟EJB比)开源框架, ...

  6. Spring框架学习一

    Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...

  7. spring框架学习(三)junit单元测试

    spring框架学习(三)junit单元测试 单元测试不是头一次听说了,但只是听说从来没有用过.一个模块怎么测试呢,是不是得专门为一单元写一个测试程序,然后将测试单元代码拿过来测试? 我是这么想的.学 ...

  8. spring 框架学习网站

    spring 框架学习网站 NO1 http://www.mkyong.com NO2 https://spring.io/docs/reference

  9. Spring框架学习

    没有状态变化的对象(无状态对象):应当做成单例. Spring-framework的下载:http://repo.spring.io/release/org/springframework/sprin ...

  10. Spring框架学习之IOC(二)

    Spring框架学习之IOC(二) 接着上一篇的内容,下面开始IOC基于注解装配相关的内容 在 classpath 中扫描组件 <context:component-scan> 特定组件包 ...

随机推荐

  1. P1061 最长连号

    题目描述 输入n个正整数,(1<=n<=10000),要求输出最长的连号的长度.(连号指从小到大连续自然数) 输入格式 第一行,一个数n; 第二行,n个正整数,之间用空格隔开. 输出格式 ...

  2. dotnet 使用 Qpush 快速从电脑到手机推送文字

    在手机打字总不是方便,于是就有了 Qpush 这个工具,通过这个工具可以快速从电脑到手机推送文字. 但是这个工具没有找到客户端,于是我就给他写了一个库,通过这个库可以快速进行开发 先介绍QPush 快 ...

  3. Nginx的三种应用场景介绍

    配置虚拟主机 就是在一台服务器启动多个网站. 如何区分不同的网站: 1.域名不同 2.端口不同 1.1. 通过端口区分不同虚拟机 Nginx的配置文件: /usr/local/nginx/conf/n ...

  4. RabbitMQ-Exchange交换器

    交换器分类 RabbitMQ的Exchange(交换器)分为四类: direct(默认) headers fanout topic 其中headers交换器允许你匹配AMQP消息的header而非路由 ...

  5. Github上的英文解释

    1.AFAIK: As far as I know.  据我所知 2.SPOF: Single point of failure. 单节点崩溃 3.ASAP: As soon as possible. ...

  6. Linux USB 的 Urbs

    linux 内核中的 USB 代码和所有的 USB 设备通讯使用称为 urb 的东西( USB request block). 这个请求块用 struct urb 结构描述并且可在 include/l ...

  7. apply call 用法

    1.对象转数组  tips 先看怎么用  再研究方法原理 var obj = {     0: 'qian',     1: 'long',     2: 'chu',     3: 'tian', ...

  8. 学习Java第六周

    1.内存结构 Java程序在运行时,需要在内存中的分配空间为提高运算效率,空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式. 栈内存 ·用于存储局部变量,当数据使用完,所占 ...

  9. js中时间戳转换成xxxx-xx-xx xx:xx:xx类型日期格式的做法

    1.十三位数字的时间戳转换方法 var time = new Date(datetime).toLocaleString().replace(/年|月/g, "-").replac ...

  10. java项目中rmi远程调用实例

    1.创建一个学生实体类Student.java: package com.RMIdemo.entity; @SuppressWarnings("serial") public cl ...