【SpringBoot实战】笔记

——————Spring——————

AOP:面向切面编程

面向切面编程,可以采用注解式拦截和方法规则式拦截,使用注解拦截方法,然后编写一个切面,使用@Aspect注解切面类,通过@Pointcut声明切点。【P27】

EL-Spring

Spring EL-Spring 表达式语言,支持在xml和注解中使用表达式。【P33】

Profile

Profile 为在不同环境下使用不同的配置提供了支持。【P40】

Spring的事件(Application Event)

当发生某一个事件时就执行某一个操作,主要流程是:

1、自定义事件类

2、定义该事件的监听器及操作内容

3、使用ApplicationContext发布事件即可得到监听器中的操作内容

主要用于ApplicationContext中的标准内定事件:

  • ContextRefreshedEvent:当ApplicationContext初始化或者刷新时触发该事件。

  • ContextClosedEvent:当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。

  • RequestHandleEvent:在Web应用中,当一个http请求(request)结束触发该事件。

  • ContestStartedEvent:Spring2.5新增的事件,当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。

  • ContestStopedEvent:Spring2.5新增的事件,当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。【P44】

Spring Aware

Spring的依赖注入最大的亮点就是所有的Bean对Spring容器的存在是没有意识的,但是在实际项目中,你不可避免的要用到Spring容器本身的功能资源,这是Bean就必须意识到Spring容器的存在。Bean继承Spring提供的Aware接口既可以得到容器的信息,比如继承BeanNameAware接口就可以得到Bean的名称。【P49】

Spring TaskExecutor

任务执行器来实现多线程和并发编程。【P51】

Spring Scheduled

定时任务:@Scheduled(cron = "0 0 3 * * ?")【P54】

0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发

@Conditional条件注解

作用:根据条件,决定类是否加载到Spring Ioc容器中,在SpringBoot中有大量的运用。【P56】

1
2
3
4
//仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean
@ConditionalOnMissingBean
//仅仅在当前上下文中存在某个对象时,才会实例化一个Bean
@ConditionalOnBean

@ControllerAdvice

通过它我们可以将对于控制器的全局配置放置在同一个位置,可以拦截异常,配置请求参数等。【P91】

HttpMessageConverter

HttpMessageConverter是用来处理request和response里的数据的。Spring为我们内置了大量的HttpMessageConverter,例如json媒体类型等。我们也可以自定义HttpMessageConverter来处理请求的数据。【P101】

服务器端推送技术:SSE

SSE(Server Send Event 服务端发送事件),当客户端向服务端发送请求,服务端会抓住这个请求不放,等有数据更新的时候才返回给客户端,当客户端接收到消息后,再向服务端发送请求,周而复始。

测试驱动开发:TDD

TDD(Test Driven Development),先预测结果,在逐步测试中,让结果达到预测结果。MockMvc:模拟MVC对象,用于测试Web项目而不需要启动项目。

——————SpringBoot——————

SpringBoot

SpringBoot运行原理,做了许多的自动配置。【P151】

Thymeleaf模板引擎

因为JSP在内嵌的servlet、tomcat的容器上运行可能有问题,SpringBoot中推荐使用Thymeleaf作为模板引擎,因为Thymeleaf提供了完美的SpringMVC的支持。【P171】

安全套接层:SSL

SSL(Secure Sockets Layer)是为网络通信提供安全及数据完整性的一种安全协议,SSL在网络传输层对网络连接进行加密。SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通信提供安全支持。

WebSocket

WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。长久以来, 创建实现客户端和用户端之间双工通讯的web app都会造成HTTP轮询的滥用: 客户端向主机不断发送不同的HTTP呼叫来进行询问。这会导致一系列的问题:

1.服务器被迫为每个客户端使用许多不同的底层TCP连接:一个用于向客户端发送信息,其它用于接收每个传入消息。
2.有线协议有很高的开销,每一个客户端和服务器之间都有HTTP头。
3.客户端脚本被迫维护从传出连接到传入连接的映射来追踪回复。

一个更简单的解决方案是使用单个TCP连接双向通信。 这就是WebSocket协议所提供的功能。 结合WebSocket API ,WebSocket协议提供了一个用来替代HTTP轮询实现网页到远程主机的双向通信的方法。
在实现websocket连线过程中,需要通过浏览器发出websocket连线请求,然后服务器发出回应,这个过程通常称为“握手” 。在 WebSocket API,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此WebSocket 协议中,为我们实现即时服务带来了两大好处:

  • Header
    互相沟通的Header是很小的-大概只有 2 Bytes

  • Server Push
    服务器的推送,服务器不再被动的接收到浏览器的请求之后才返回数据,而是在有新数据时就主动推送给浏览器。【P197】

Spring Data

是Spring用来解决数据访问问题的一揽子解决方案,使用它我们可以简单地使用数据访问技术,它为我们使用统一的API来对各种数据存储技术进行数据访问操作提供支持。Spring Data Commons让我们在使用关系型或非关系型数据访问技术时都使用基于Spring的统一标准。Spring Data Commons的一个重要概念:Spring Data Repository抽象。使用Spring Data Repository 可以极大地减少数据访问层的代码。【P235】

几种连接的定义

  • webSocket:客户端与服务端建立连接,服务端有新信息自动推送给客户端。保持连接。

  • 短连接:客户端发起连接请求,服务端返回信息(有没有信息都返回),断开连接。

  • 长连接:这里的长连接指的是TCP连接不断开,客户端发起连接请求,客户端与服务端之间建立一条连接通道,用于信息的请求和返回。若一段时间没有信息会自动关闭长连接。

  • 短轮询:和短连接一样,发起连接,返回信息,断开连接。然后短时间内不断发送请求。

  • 长轮询:客户端发起连接请求,服务端等到有新信息时才返回信息给客户端,并断开连接。

表述性状态传递:REST

REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。
目前在三种主流的Web服务实现方案中,因为REST模式的Web服务与复杂的SOAP和XML-RPC对比来讲明显的更加简洁,越来越多的web服务开始采用REST风格设计和实现。REST就是一种请求原则,和ajax完美结合

声明式事务

@Transactional的属性:

  • propagationtion:传播级别

默认值required,方法A调用时没有事务新建一个事务,当在方法A调用方法B时,方法B使用相同的事务;如果方法B发生异常,整个事务都回滚。

  • isolation:隔离级别

默认值default,isolation(隔离)决定了事务的完整性,处理在多事务对相同数据下的处理机制,包含多种隔离级别。

数据缓存Cache

CacheManager是Spring提供的各种缓存技术抽象接口。【P309】

非关系型数据库NoSQL

非关系型数据库NoSQL:MongoDB。【P321】

Redis

Redis是一个基于键值对的开源内存数据存储,当然Redis也可以做数据缓存。Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

——————SpringBoot企业级开发——————

Spring Security

Spring Security是专门针对基于Spring的项目的安全框架,充分利用了依赖注入和AOP来实现安全的功能。安全框架有两个重要的概念,即认证和授权。认证即确认用户可以访问当前系统,授权即确定用户在当前系统下所拥有的功能权限。【P341】

Spring Batch

Spring Batch是用来处理大量数据操作的一个框架,主要用来读取大量数据,然后进行一定处理后输出成指定的形式。组成部分:JobRepository、JobLauncher、Job、Step等。【P362】

异步消息

异步消息主要目的是为了系统与系统之间的通信。所谓异步消息即消息发送者无须等待消息接收者的处理及返回,甚至无须关心消息是否发送成功。异步消息中有两个重要的概念:消息代理和目的地。当消息发送者发送消息后,消息将由消息代理接管,消息代理保证消息传递到指定的目的地。形式有两种:队列和主题

  • 队列:点对点式,消息放到队列中,每一条消息只有唯一的发送者和接收者。

  • 主题:发布订阅式,消息发送到主题,而多个接收者监听这个主题。

企业级消息代理:

  • JMS是基于JVM消息代理的规范,ActiveMQ、HornetQ是一个JMS消息代理的实现

  • AMQP是一个消息代理的规范,兼容JMS,RabbitMQ是一个AMQP消息代理的实现。【P391】

RabbitMQ

  • 支持可拓展性:

RabbitMQ能实现系统扩展的一个重要功能在于,可以两个邮箱收同一个地址的信,翻译成专业的话 RabbitMQ 可以两个队列Queue订阅同一个RoutingKey的信息。RabbitMQ在投递的时候,会把一份信息,投递到多个队列邮箱中Queue,这是系统可扩展性的基础。

image

image

image

image

  • 满足性能的可伸缩性. 也就是可集群性:

性能扩展的关键点就在于订阅人C1,订阅人C2轮流收到邮箱队列里面的信息,订阅人C1和订阅人C2收到的信息内容不同,但都属于同一类,
所以,订阅人C1和订阅人C2是干同一种工作的客户端,用来提高处理能力。

Spring Integration系统集成

Spring Integration主要解决的问题是不同系统之间交互的问题,通过异步消息驱动来达到系统交互时系统之间的松耦合。主要由Message、Channel和Message EndPoint组成:

  • Message

是用来在不同部分之间传递的数据。它由消息体和消息头组成。消息体可以是任何数据类型;消息头表示的元数据就是解释消息体的内容。

  • Channel

在消息系统中,消息发送者发送消息到通道,消息收受者从通道接收消息。

  • Message EndPoint

消息端点是真正处理消息的组件,它还可以控制通道的路由。包括许多功能的端点,控制出入站、控制路由、网关、过滤器、拆分器、处理器、聚合器、转换器等等。【P395】

应用监控和管理

SpringBoot提供了运行时的应用监控和管理的功能。我们可以通过http、JMX、SSH协议来进行操作。审计、健康及指标信息将会自动得到。【P430】

参考文献