关键词:
一.使用远程服务
远程调用是客户端应用和服务端之间的会话。
1.Spring通过多种远程调用技术支持RPC(remote procedure call,远程过程调用)
RPC模型 | 使用场景 |
RMI | 不考虑网络限制时(例如防火墙),访问/发布基于Java的服务 |
Hessian 或 Burlap | 考虑网络限制时,通过HTTP访问/发布基于Java的服务。Hessian是二进制协议,而Burlap是基于XML的 |
HTTP invoker | 考虑网络限制,并希望使用基于XML或专有的序列化机制实现Java序列化时,访问/发布基于Spring的服务 |
JAX-RPC 和 JAX-WS | 访问/发布平台独立的、基于SOAP的Web服务 |
远程服务:
-- RMI:基于Java的远程方法调用,使用了Java的序列化机制,服务端和客户端Java版本需要保持一致(http://blog.csdn.net/a19881029/article/details/9465663);
-- Hessian:类似于RMI,都是使用二进制消息进行客户端和服务端的交互,但Hessian的二进制消息可以移植到其他非Java语言中(PHP、Python、C++、C#);
-- Burlap:基于XML的远程调用技术,能够移植到能够解析XML的语言上,在调试过程中易读。
Hessian和Burlap是基于HTTP的,解决了RMI的防火墙渗透问题。但是当传递过来的RPC消息包含序列化对象时应使用RMI。
-- HTTP invoker:是Spring框架提供的远程调用解决方案。客户端和服务端必须是Spring应用,且必须是基于Java的(序列化机制)。
-- SOA:面向服务的架构,简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议。核心理念是应用程序可以并且应该被设计成依赖一组公共的核心服务,而不是为每个应用都重新实现相同功能。
Spring为使用Java API for XML Web Service(JAX-WS)来发布和使用所支持的SOAP Web服务提供了大力支持。
JAX-WS编程模型使用注解将类和类的方法声明为Web服务的操作。使用@WebService注解所标注的类被认为Web服务的端点,而使用@WebMethod注解所标注的方法被认为是操作。
https://www.ibm.com/developerworks/cn/xml/x-sisoap/index.html
2.REST
RPC和REST的区别:
-- RPC远程过程调用是面向服务的,关注于行为和动作;
-- REST是面向资源的,强调描述应用程序的事物和名词。
REST:
-- 表述性(Representational):REST资源实际上可以用各种形式进行表述,包括XML、JSON、HTML(选择最适合资源使用者的任意形式);
-- 状态(State):当使用REST时,我们更关注资源的状态而不是对资源采取的行为;
-- 转移(Transfer):REST涉及到转移资源数据,它以某种表述性形式从一个应用转移到另一个应用。
即:REST就是将资源的状态以最适合客户端或服务端的形式从服务器端转移到客户端(或者反过来)。
资源在网络中以某种表现形式进行状态转移。
用HTTP协议里的动词来实现资源的添加,修改,删除等操作:
-- GET:用来获取资源,
-- POST:用来新建资源(也可以用于更新资源),
-- PUT:用来更新资源,
-- DELETE:用来删除资源。
Spring支持以下方式创建REST:
-- 控制器可以处理所有的HTTP方法,包含四个主要的REST方法:GET、PUT、DELETE、POST,PATCH在Spring 3.2及以上版本中支持。
-- 借助@PathVariable注解,控制器能够处理参数化的URL(将变量输入作为URL的一部分);
-- 借助Spring的视图和视图解析器,资源能够以多种方式进行表述,包括将模型数据渲染为XML、JSON、Atom以及RSS的View实现;
-- 可以使用ContentNegotiatingViewResolver来选择最合适客户端的表述;
-- 借助@ResponseBody注解和各种HttpMethodConverter实现,能够替换基于视图的渲染方式;
-- @RequestBody注解以及HttpMethodConverter实现可以讲传入的HTTP数据转化为传入控制器处理方法的Java对象;
-- 借助RestTemplate,Spring应用能够方便地使用REST资源。
Spring提供了两种方式将资源的Java转换为发送给客户端的表述形式:
-- 内容协商:选择一个视图,它能够将模型渲染为呈现给客户端的表述形式;
视图解析器ContentNegotiatingViewResolver和ContentNegotiationManager共同作用。该方法得到的响应是渲染模型:key-value组成的Map,而不是资源,并不是客户端预期结果。
-- 消息转换器(HTTP信息转换器):通过一个消息转换器将控制器所返回的对象转换为呈现给客户端的表述形式。
在响应体返回资源状态:
正常情况下,方处理方法返回Java对象(除String或View的实现以外)时,这个对象会放在模型中并在视图中渲染使用。而使用消息转换功能时,我们需要告诉Spring跳过正常的模型/视图流程,并使用消息转换器。最简单的方法就是为控制器方法添加@ResponseBody注解。
@ResponseBody注解会告诉Spring,我们要将返回的对象作为资源发送给客户端,并将其转换为客户端可以接收的表述形式。
@RequestMapping(method=RequestMethod.GET, produces="application/json") public @ResponseBody List<Spittle> spittles( @RequestParam(value="max", defaultValue=MAX_LONG_AS_STRING) long max, @RequestParam(value="count", defaultValue="20") int count) { return spittleRepository.findSpittles(max, count); }
该例中的@RequestMapping注解中使用了produces属性,表明这个方法只处理预期输出为JSON的请求。即该方法只处理Accept头部信息包含"application/json"的请求。其他任何类型的请求,即使他的URL匹配指定的路径并且是GET请求也不会被这个方法处理。这样的请求会被其他方法来进行处理(如果存在适当方法的话),或者返回客户端HTTP 406响应。
在请求体中接收资源状态:
@ResponseBody能够告诉Spring在把数据发送给客户端的时候,要使用一个消息器,类似的,@RequestBody能告诉Spring查找一个消息转换器。
@RequestMapping(method=RequestMethod.POST, consumes="application/json") --consumes与produces类似,不过它会关注Content-Type请求的头部信息 public @ResponseBody List<Spittle> saveSpittle(@RequestBody Spittle spittle) { return spittleRepository.save(spittle); }
@ResponseBody和@RequestBody是启用消息转换器的一种简洁和强大的方式,Spring 4.0中引入@RestController注解,在控制器类上使用@RestController来代替@Controller的话,Spring将会为该控制器的所有处理方法应用消息转换功能。
发送错误信息到客户端:
Spring提供多种方式处理返回错误信息的场景:
-- 使用@ResponseStatus注解可以指定状态码;
-- 控制器方法可以返回ResponseEntity对象,该对象能够包含更多响应相关的元数据;
-- 异常处理器能够应对错误场景,这样处理器方法就能关注于正常的状况。
@RequestMapping(value="/{id}", method=RequestMethod.GET) public @ResponseEntity<?> spittleById(@PathVariable long id) { Spittle spittle = spittleRepository.findOne(id); if (spittle == null) { Error error = new Error(4, "Spittle [" + id + "] not found"); return new ResponseEntity<Error>(error, HttpStatus.NOT_FOUND); } return new ResponseEntity<Error>(spittle, HttpStatus.OK); }
处理异常:
当抛出指定异常时运行。
@ExceptionHandler(SpittleNotFoundException.class) @ResponseStatus(HttpStatus.NOT_FOUND) public ResponseEntity<Error> spittleNotFound(SpittleNotFoundException e) { long spittleId = e.getSpittleId(); return new Error(4, "Spittle [" + id + "] not found"); }
3.Spring消息
同步通信:客户端应用程序直接与远程服务相交互,并且一直等到远程过程完成后才就像执行。
异步消息:一个应用程序向另一个应用程序间接发送消息的一种方式,无需等待对方的响应。
在Spring中搭建消息代理:
-- 创建连接工厂;
-- 声明ActiveMQ;
-- 使用Spring的JMS模板。
前方高能预警!阿里大佬出品“spring实战学习笔记”震撼来袭
Spring框架已经成为Java开发人员的必备知识,而且Spring3引入了强大的新特性,例如SpEL、Spring表达式语言、loC容器的新注解以及用户急需的对REST的支持。无论你是刚刚接触Spring还是被Spring3.0的新特性所吸引,这份笔记... 查看详情
前方高能预警!阿里大佬出品“spring实战学习笔记”震撼来袭!(代码片段)
Spring框架已经成为Java开发人员的必备知识,而且Spring3引入了强大的新特性,例如SpEL、Spring表达式语言、loC容器的新注解以及用户急需的对REST的支持。无论你是刚刚接触Spring还是被Spring3.0的新特性所吸引,这份笔记... 查看详情
spring实战笔记:spring核心
springcore一.简介: 1.依赖注入(DI) 优点:解耦 Spring通过应用上下文(ApplicationContext)装载bean的定义,并把它们组装起来。 Spring应用上下文负责对象的创建和组装。 &n... 查看详情
spring实战笔记二
一、Spring配置的方式 spring容器用来创建应用程序中的bean,并通过DI来协调这些对象间的关系。 在bean进行装配时,spring提供了三种主要的装配机制。 ①在XML中进行显式配置 ②在Java中进... 查看详情
spring实战笔记:web中的spring
一.构建SpringWeb应用1.SpringMVC中用户请求处理 上图展示了请求使用SpringMVC所经历的所有站点。 1:在请求离开浏览器时,会带有所有请求内容的信息,至少会包含请求的URL。 请求通过Spring的Di... 查看详情
spring实战笔记一
1、是什么? Spring是一个开源的框架,是为了解决企业级应用开发的复杂性而创建的。 简而言之,Spring是为简化Java开发而创建的。 2、如何简化开发? 为了降低java开发的复杂性,Spring采用了4中关键策略。 ... 查看详情
高质量spring实战学习笔记,腾讯内部学习spring首推
Spring框架已经成为Java开发人员的必备知识,而且Spring3引入了强大的新特性,例如SpEL、Spring表达式语言、loC容器的新注解以及用户急需的对REST的支持。无论你是刚刚接触Spring还是被Spring3.0的新特性所吸引,这份笔记... 查看详情
spring4实战学习笔记
《Spring4实战第4版》2016年4月新出版的,之前的第三版看起来还是不错的,所以看到新版就直接买下来。英文版源码地址:SpringinAction,FourthEditionCoversSpring4 1.IOC装配Bean参考【Spring实战4 2.2】,作者提倡无XML配置化... 查看详情
spring实战读书笔记spring之旅(代码片段)
Spring可以做很多事情,但是这个事情底层都依赖于2个核心特征:依赖注入(DI)和面向切面编程(AOP)概念:POJO:简单java对象,PlainOldJavaObject,在Spring中基本可以等同于javabean为了简化Java... 查看详情
spring实战读书笔记spring装配bean(代码片段)
...过Xml装配Bean借助构造器注入初始化bean设置属性混合配置Spring容器负责创建应用程序中的bean并通过DI来装配(wiring)他们。Spring有三种装配方式,三种方式可以搭配使用 (1)隐式的bean发现 查看详情
前方高能预警!阿里大佬出品“spring实战学习笔记”震撼来袭
Spring框架已经成为Java开发人员的必备知识,而且Spring3引入了强大的新特性,例如SpEL、Spring表达式语言、loC容器的新注解以及用户急需的对REST的支持。无论你是刚刚接触Spring还是被Spring3.0的新特性所吸引,这份笔记... 查看详情
前方高能预警!阿里大佬出品“spring实战学习笔记”震撼来袭!(代码片段)
Spring框架已经成为Java开发人员的必备知识,而且Spring3引入了强大的新特性,例如SpEL、Spring表达式语言、loC容器的新注解以及用户急需的对REST的支持。无论你是刚刚接触Spring还是被Spring3.0的新特性所吸引,这份笔记... 查看详情
redis学习笔记8--spring集成redis
spring配置单个redis<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>1.3.4.RELEASE</version></dependenc 查看详情
阅读笔记《javaee企业应用实战》(第四版)第七章——spring的基本用法
Spring的定义和相关知识点Spring包括基于依赖注入的核心机制(再也不用new一个对象啦)基于AOP的声明式事物管理与多种持久层技术的整合WebMVC框架Spring的优点低侵入式设计,代码污染低独立于各种应用服务器,基于Spring框架的应... 查看详情
《spring实战》学习笔记-第二章:装配bean
2.1 Spring配置的可选方案 当描述bean如何进行装配时,Spring具有非常大的灵活性,它提供了三种主要的装配机制: (1)在XML中进行显式配置。 (2)在Java中进行显式配置。 (3)隐式的bean发现机制和自动装配。 建议是... 查看详情
spring框架集成mybatis框架的配置(笔记)
<!--0.注解扫描--><!--1.导入外部文件--><!--2.数据源--><!--3.sessionFactory--><!--4.事务模板--><!--5.AOP相关配置--><!--Mapper扫描--> <?xmlversion="1.0"encoding="UTF-8"?>< 查看详情
跳槽神器!阿里巴巴内部出品“spring全线笔记”,不止是全家桶,理论与实战结合
前言对于每一位Java开发人员来说,提起Spring定是不陌生的,实际上自Spring框架诞生以来,就备受开发者的青睐,基本上现在的互联网公司都要使用到Spring框架。Spring框架中又包含了SpringMVC、SpringBoot、SpringCloud等... 查看详情
跳槽神器!阿里巴巴内部出品“spring全线笔记”,不止是全家桶,理论与实战结合
前言对于每一位Java开发人员来说,提起Spring定是不陌生的,实际上自Spring框架诞生以来,就备受开发者的青睐,基本上现在的互联网公司都要使用到Spring框架。Spring框架中又包含了SpringMVC、SpringBoot、SpringCloud等... 查看详情