Spring/SpringBoot
一.Spring 基础
1.Spring 概述
Spring 的简史
xml 配置
注解配置
java 配置
Spring 概述
Spring 的模块
核心容器 CoreContainer
Spring-Core
Spring-Beans
Spring-Context
Spring-Context-Support
Spring-Expression
AOP
Spring-AOP
Spring-Aspects
Messaging
Spring-Messaging
WEB
Spring-Web
Spring-WebMVC
Spring-Websocket
Spring-WebMvc-Portlet
数据访问/集成(DataAccess/Intefration)
Spring-JDBC
Spring-TX
Spring-ORM
Spring-OXM
Spring-JMS
Spring 的生态
Spring Boot
Spring XD
Spring Data
Spring Integration
Spring Batch
Spring Security
Spring HATEOAS
Spring Social
Spring AMQP
Spring Mobile
Spring for Android
Spring Web Flow
Spring Web Services
Spring LDAP
Spring Session
2.Spring 基础配置
1.使用 POJO 进行轻量级和最小侵入式开发
2.通过依赖注入和基于接口编程实现松耦合
3.通过 AOP 和默认习惯进行声明式编程
4.使用 AOP 和模板(template) 减少模块化代码
Spring 所有功能的设计和实现都是基于此四大原则
依赖注入:
声明Bean的注解
@Component 组件,没有明确的角色
@Service 在业务逻辑层(service层)
@Repository 在数据访问层(dao层)
@Controller 在展现层(MVC——>SpringMVC)
注入Bean的注解
@Autowired:Spring 提供的注解
@Inject:JSR-330 提供的注解
@Resource:JSR-250 提供的注解
Java 配置
@Configuration 声明当前类是一个配置类
@Bean 注解在方法上,声明当前方法的返回值为一个 Bean.
AOP
面向切面编程,相对于 OOP 面向对象编程。Spring的AOP的存在的目的是为了解耦。AOP 可以让一组类共享相同的行为。
在 OOP 中只能通过继承类和实现接口,来代码的耦合度增强,且类继承只能为单继承,阻碍更多行为添加到一组类上,AOP弥补了OOP的不足。
@Aspact 声明是一个切面
拦截规则@After,@Before,@Around
PointCut
JoinPoint
二.Spring 常用配置
1.Bean 的 Scope
scope : 描述的是 Spring 容器如何新建 Bean 的实例
Singleton :
一个 Spring 容器中只有一个 Bean 的实例,此为 Spring 的默认配置,全容器共享一个实例
Prototype :
每次调用新建一个 Bean 的实例。
Request:
Web 项目中给每一个 http request 新建一个 Bean 实例
Session:
Web 项目中给每一个 http Session 新建一个 Bean 实例
GlobalSession:
这个只在 portal 应用中有用,给每一个 global http session 新建一个 Bean 实例。
2.SpringEL和资源调用
注入普通字符
注入操作系统属性
注入表达式计算结果
注入其他 Bean 的属性
注入文件内容
注入网址内容
注入属性文件
3.Bean 的初始化和销毁
Java 配置方式
@Bean 的 initMethod 和 destroyMethod 方法
注解方式
JSR250-API
利用 JSR-250 的 @PostConstruct 和 @PreDestroy
4.Profile
Profile 为在不同环境下使用不同的配置提供了支持
@Profile
通过设定 JVM 的 spring.profiles.active 参数
web 项目设置在 Servlet 的 context paramter 中
5.事件Application Event
为 Bean 与 Bean 之间的消息通信提供了支持。当一个Bean 处理完一个任务之后,希望另一个 Bean 知道并能做相应的处理,这时我们就需要
让另一个 Bean 监听当前 Bean 所发送的事件。
自定义事件,继承 ApplicationEvent
定义事件监听器,实现 ApplicationListener
使用容器发布事件
三.Spring 高级话题
1.Spring Aware
BeanNameAware
获得到容器中 Bean 的名称
BeanFactoryAware
获取当前 bean factory,这样可以调用容器的服务
ApplicationContextAware
当前的 Application Context,这样可以调用容器的服务
MessageSourceAware
获得 Message source,这样可以获得文本信息
ApplicationEventPublisherAware
应用时间发布器,可以发布时间
ResourceLoaderAware
获得资源加载器,可以获得外部资源文件
2.多线程
Spring 通过任务执行器(TaskExecutor)来实现多线程和并发编程。
使用 ThreadPoolTaskExecutor 可实现一个基于线程池的 TaskExecutor
实际开发中,任务一般是非阻碍的,即异步的,所以我们要在配置类中通过 @EnableAsync 开启对异步任务的支持,并通过
在实际执行的 Bean 的方法中使用 @Async 注解来声明其是一个异步任务。
3.计划任务
计划任务在 Spring 中的实现变得异常的简单,首先通过在配置类注解 @EnableScheduling 来开启对计划任务的支持,
然后在要执行计划任务的方法上注解 @Scheduled,声明这是一个计划任务
cron
fixDelay
fixRate
4.条件注解@Conditional
@Conditional 根据满足某一个特定条件创建一个特定的 Bean.
当某一个 Jar 在一个类路径下的时候,自动配置一个或多个 Bean;或者只有某个 Bean 被创建才会创建另外一个 Bean,
总的来说,就是根据特定条件来控制 Bean 的创建行为,这样我们可以利用这个特性进行一些自动的配置。
5.组合注解与元注解
6.@Enable*注解的工作原理
直接导入配置类
依据条件选择配置类
动态注册 Bean
7.测试
Spring TestContext Framework 集成测试。
四.SpringMVC 基础
1.SpringMVC 的常用注解
@Controller
@RequestMapping
@ResponseBody
@RequestBody
@PathVariable
@RestController
2.SpringMVC 的基本配置
静态资源映射
拦截器配置
@ControllerAdvice
@ExceptionHandler
用于全局处理控制器里的异常
@InitBinder
用来设置 WebDataBinder: WebDataBinder用来自动绑定前后请求参数到 Model 中。
@ModelAttribute
@ModelAttribute 本来的作用是绑定键值对到 Model 里,
此处是让全局的 @RequestMapping 都能获得在此处设置的键值对。
其他配置
ViewController
路径匹配参数配置
WebMvcConfigurerAdapter
WebMvcConfigurer
3.SpringMVC 的高级配置
文件上传配置
commons-fileupload
文件上传是一个项目里经常要用到的功能,Spring MVC 通过配置一个 MultipartResolver 来接受文件,通过
MultipartFile[] files 接收多个文件上传
自定义HttpMessageConverter
HttpMessageConverter 是用来处理 request 和 response 里的数据的。
MappingJackson2HttpMessageConverter
StringHttpMessageConverter
服务器端推送技术
当客户端向服务端发送请求,服务端会抓住这个请求不放,等有数据更新的时候才返回给客户端,当客户端接收到消息后,
再向服务端发送请求,周而复始。
SSE(Server Send Event 服务端发送事件)的服务器端推送和基于 Servlet3.0+的异步方法特性,其中第一种方式需要
新式浏览器的支持,第二种方式是跨浏览器的。
Servlet3.0+异步方法处理
4.SpringMVC 的测试
MockMVC
MockHttpServletRequest
MockHttpServletResponse
MockHttpSession
五.SpringBoot 基础
SpringBoot:
随着动态语言的流行,Java 开发显得格外的笨重:繁多的配置,低下的开发效率,复杂的部署流程以及第三方技术集成难度大。
SpringBoot 应用而生。
它使用"习惯优于配置"(项目中存在大量的配置,此外还内置一个习惯性配置,它让你无需手动进行配置)的理念让你的项目快运行起来。
使用 SpringBoot 很容易创建一个独立运行(运行 Jar 内嵌 Servlet 容器)准生产级别的基于 Spring 框架的项目,使用 SpringBoot
你可以不用或者只需要很少的 Spring 配置。
Spring 核心功能:
独立运行的 Spring 项目 : SpringBoot 可以以 Java 包的形式独立运行,运行一个 Spring Boot 项目只需要通过 java -jar xx.jar 来运行
内嵌 Servlet 容器:Spring Boot 可选择内嵌 Tomcat Jetty 或者 Undertow,这样我们无须以 war 包形式部署项目
提供 starter 简化 maven 配置
自动配置 Spring
准生产的应用监控
无代码声称和 xml 配置 : 注解
SpringBoot 优点:
快速构建项目
对主流开发框架的无配置集成
项目可独立运行,无需外部依赖 Servlet 容器
提供运行时的应用监控
极大的提高了开发,部署效率
与云计算的天然集成
六.SpringBoot 核心
1.基本配置
入口类和 @SpringBootApplication
@Configuration
@EnableAutoConfiguration
@ComponentScan
关闭特定的自动配置
使用 @SpringBootApplication 注解的 exclude 参数:
例如:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
定制 Banner
修改Banner
src/mainresource 新建一个 banner.txt 通过 http://patorjk.com/software/taag
关闭Banner
main 里修改
fluentAPI
SpringBoot 的配置文件
application.properties
application.yml
src/main/resources
Starter pom
官方 starter pom
spring-boot-starter : SpringBoot 核心 Starter,包含自动配置,日志,yml 配置文件的支持
spring-boot-starter-actuator : 准生产特性,用来监控和管理应用
spring-boot-starter-remote-shell : 提供基于 ssh 协议的监控和管理
spring-boot-starter-amqp : 使用 Spring-rabbit 来支持 AMQP
spring-boot-starter-aop : 使用 Spring-AOP 和 AspectJ 支持面向切面编程
spring-boot-starter-batch : 对 Spring Batch 的支持
spring-boot-starter-cache : 对 Spring Cache 抽象的支持
spring-boot-starter-cloud-connectors : 对云平台(Cloud Foundry Heroku) 提供的服务提供简化的连接方式
spring-boot-starter-date-elasticsearch : 通过 Spring-data-elasticsearch 对 Elasticsearch 支持
spring-boot-starter-data-gemfire : 通过对spring-data-gemfire对分布式存储GemFire的支持
spring-boot-starter-data-jpa : 对JPA的支持,包含spring-data-jpa spring-orm和Hibernate
spring-boot-starter-data-mongodb : 通过spring-data-mongdb,对MongoDB进行支持
spring-boot-starter-data-rest : 通过spring-data-rest-webmvc将Spring Data repository 暴露为REST形式的服务
spring-boot-starter-data-solr : 通过spring-data-solrd对Apache Solr 数据检索平台的支持
spring-boot-starter-freemarker : 对 Freemarker 模板引擎的支持
spring-boot-starter-groovy-templates : 对 Groovy 模板引擎的支持
spring-boot-starter-hateoas : 通过 Spring-hateoas 对基于 HATEOAS 的 REST 形式的网络服务的支持
spring-boot-starter-hornetq : 通过HornetQ对JMS的支持
spring-boot-starter-integration : 对系统集成框架spring-integration的支持
spring-boot-starter-jdbc : 对JDBC数据库的支持
spring-boot-starter-jerscy : 对Jersery REST形式的网络服务的支持
spring-boot-starter-jta-atomikos : 通过Atomikos对分布式事务的支持
spring-boot-starter-jta-bitronix : 通过Bitronix对分布式事务的支持
spring-boot-starter-mail : 对javax.mai的支持
spring-boot-starter-mobile : 对spring-mobile的支持
spring-boot-starter-mustache : 对Mustache模板引擎的支持
spring-boot-starter-redis : 对键值对内存数据库Redis的支持,包含spring-redis
spring-boot-starter-security : 对spring-security的支持
spring-boot-starter-social-facebook : 通过spring-social-facebook对Facebook的支持
spring-boot-starter-social-linkedin : 通过spring-social-linkedin对Linkedin的支持
spring-boot-starter-social-twitter : 通过spring-social-twitter对Twitter的支持
spring-boot-starter-test : 对常用的测试框架JUnit Hamcrest 和Mockito的支持,包含spring-test模块
spring-boot-starter-thymeleaf : 对Thymeleaf模版引擎的支持,包含于Spring整合的配置
spring-boot-starter-velocity : 对Velocity模版引擎的支持
spring-boot-starter-web : 对Web项目开发的支持,包含Tomcat和spring-webmvc
spring-boot-starter-Tomcat : Spring Boot默认的Servlet容器Tomcat
spring-boot-starter-Jetty : 使用Jetty作为Servlet容器替换Tomcat
spring-boot-starter-undertow : 使用Undertow作为Servlet容器替换Tomcat
spring-boot-starter-logging : Spring Boot 默认的日志框架Logback
spring-boot-starter-log4j : 支持使用Log4J日志框架
spring-boot-starter-websocket : 对WebSocket开发的支持
spring-boot-starter-ws : 对Spring Web Services的支持
第三方 Starter Pom
Handlebars
Vaadin
Apache Camel
WRO4J
Spring Batch
HDIV
Jade Templates(jade4J)
Activiti
使用 xml 配置 : @ImportResource
2.外部配置
外部配置
命令行参数配置
常规属性配置
类型安全的配置(基于 properties)
3.日志配置
4.Profile 配置
5.SpringBoot运行原理
java -jar xx.jar --debug
appliaction.properties
debug=true
1.运作原理
2.核心注解
@ConditionalOnBean :当容器里有指定的 Bean 的条件下
@ConditionalOnClass : 当类路径下有指定的类的条件下
@ConfitionalOnExpression :基于SpEL表达式作为判断条件
@ConditionalOnJava : 基于JVM版本作为判断条件
@ConditionalOnJndi : 在JNDI存在的条件下查找指定的位置
@ConditionalOnMissingBean : 当容器里没有指定Bean的情况下
@ConditionalOnMissingClass : 当类路径下没有指定的类的条件下
@ConditionalOnNotWebApplication : 当前项目不是Web项目的条件下
@ConditionalOnProperty : 指定的属性是否有指定的值
@ConditionalOnResource : 类路径是否有指定的值
@ConditionalOnSingleCandidate :当指定Bean在容器中只有一个,或者虽然有多个但是指定首选的Bean
@ConditionalWebApplication : 当前项目是Web项目的条件下
3.实例分析
配置参数
配置 Bean
七.springBoot 的 WEB 开发
1.SpringBoot 的 Web 开发支持
ServerPropertiesAutoConfiguration 和 ServerProperties : 自动配置内嵌 Servlet 容器
HttpEncodingAutoConfiguration 和 HttpEncodingProperties :用来自动配置 http 的编码
MultipartAutoConfiguration 和 MultipartProperties :用来自动配置上传文件的属性
JacksonHttpMessageConvertersConfiguration :
用来自动配置 mappingJackson2HttpMessageConverter 和 mappingJackson2XmlHttpMessageConverter
WebMvcAutoConfiguration 和 WebMvcProperties : 配置 SpringMVC.
2.Thymeleaf 模板引擎
Thymeleaf 模板引擎
Thymeleaf 基础知识
Thymeleaf是一个Java类库,它是一个xml/xhtml/html5的模版引擎,可以作为MVC的Web应用的View层.
Thymeleaf还提供了额外的模块与Sping MVC集成,所以我们可以使用Thymeleaf完全替代JSP。
引入 Thymeleaf
访问 model 中的数据
model 中的数据迭代
数据判断
在 Javascript 中访问 html
其他知识:http://www.thymeleaf.org
与 SpringMVC 集成
SpringBoot 的 Thymeleaf 支持
3.Web 相关配置
SpringBoot 提供的自动配置
自动配置的 ViewResoler :
ContentNegotiatingViewResolver
BeanNameViewResolver
InternalResourceViewResolver
自动配置的静态资源
类路径文件
webjar
自动配置的 Formatter 和 Converter
自动配置的 HttpMessageConverters
静态首页的支持
接管 SpringBoot 的 Web 配置
注册 Servlet,Filter,Listener
4.Tomcat 配置
Tomcat 配置:
配置 Tomcat :
配置 Servlet 容器
server.port
配置 Tomcat
server.tomcat.uri-encoding
代码配置 Tomcat
通用配置 :
新建类的配置
当前配置文件内配置
特定配置
替换 Tomcat
替换为 Jetty
替换为 Undertow
SSL 配置
生成证书:
keytool
keytool -genkey -alias tomcat
SpringBoot 配置 SSL
http 转向 Https
5.Favicon 配置
默认的 Favicon
关闭 Favicon
spring.mvc.favicon.enabled=false
设置自己的 Favicon
favicon.ico放置在src/main/resources/static
6.WebSocket
WebSocket:
WebSocket为浏览器和服务端提供了双工异步通信的功能,即浏览器可以向服务端发送消息,服务端也可以向浏览器发送消息.
SpringBoot 提供的自动配置
Spring Boot 为WebSocket提供的 stater pom是spring-boot-starter-websocket
实战:
准备 : 选择 Thymeleaf 和 WebSocket 依赖
广播式: 广播式即服务端有消息时,会将消息发送给所有连接了当前endpoint的浏览器
配置 WebSocket
需要在配置类上使用@EnableWebSocketMessageBroket开启WebSoccket支持,
并通过继承AbstractWebSocketMessageBrokerConfigurer类,重写其方法来配置WebSocket
浏览器向服务端发送的消息用此类接收
服务端向浏览器发送的此类的消息
控制器
添加脚本
演示页面
配置 ViewController
点对点式:
添加 Spring Security 的 starter pom
Spring Security 的简单配置
配置 WebSocket
控制器
登录页面
聊天页面
增加页面的 ViewController
7.基于 Bootstrap 和 AnglargJS 的现代 Web 应用
单页面应用
简称 SPA,指的是一种类似于原生客户端软件的更流畅的用户体验的页面
响应式设计
简称 RWD,指的是不同的设备(电脑、平板、手机)访问相同的页面的时候,得到不同的页面视图,而得到视图是适应当前屏幕的。
数据导向是对于页面而言的,页面上的数据获得是通过消费后台的 REST 服务来实现的,而不是通过服务器渲染的动态页面来实现的,
一般数据交换使用的格式是 JSON。
Bootsrap :
什么是 Bootstrap
下载并引入 Bootstrap
CSS 支持
页面组件支持
JavaScript 支持
AngularJS
什么是 AngularJS
下载并导入 AngularJS
模块,控制器和数据绑定
scope 和 event :
scope
Event
冒泡事件
广播事件
多视图和路由
依赖注入
Service 和 Factory
自定义指令
八.SpringBoot 的数据访问
1.引入 Docker
Docker 安装
Linux 下安装
Windows 下安装
Docker 常用命令及参数
Docker 镜像命令
Docker 镜像检索
docker search 镜像名
docker search redis
镜像下载
docker pull 镜像名
docker pull redis
镜像列表
docker images
删除镜像
删除指定镜像
docker rmi image-id
删除所有镜像
docker rmi$(docker images -g)
Docker 容器命令
容器基本操作
最简单的运行镜像容器
docker run --name container-name -d image-name
容器列表
docker ps
查看运行和停止状态
docker ps -a
停止和启动容器
停止容器
docker stop container-name/container-id
docker stop test-redis
启动容器
docker start container-name/container-id
docker start test-redis
端口映射
Docker容器中运行的软件所使用的端口,在本机和本机的局域网是不能访问的,所以我们需要将Docker
容器中的端口映射到当前主机的端口上,这样我们在本机和本机所在的局域网就能够访问该软件了
docker run -d -p 6378:6379 --name port-redis redis
删除容器
删除单个容器
docker rm container-id
删除所有容器
dokcer rm $(docker ps -a -q)
容器日志
查看当前容器日志
docker logs container-name/container-id
docker logs port-redis
登录容器
docker exec -it container-id/container-name bash
下载所需的 Docker 镜像
docker pull wnameless/oracle-xe-11g
docker pull mongo
docker pull redis:2.8.21
docker pull cloudesire/activemq
docker pull rabbitmq
docker pull rabbitmq:3-management
异常处理
boot2docker ssh
2.SpringDataJPA
2.1.SpringDataJPA
什么是 Spring Data JPA
定义数据访问层
继承 JpaRepository
public interface PersonRepository extends JpaRepository<Person,Long>{
}
配置使用 @EnableJpaRepositories
定义查询方法:
根据属性名查询
常规查询
select p from person p wehere p.name=?1
List findByName(string name);
select p from person p wehere p.name like ?1
List findByNameLike(string name);
select p from person p wehere p.name =?1 and p.address=?2
List findByNameAndAddress(string name,String address);
限制结果数量
List findFirst10ByName(String name);
使用 JPA 的 NamedQuery
使用 @Query 查询
使用参数索引
使用命名参数
更新查询
Specification
排序与分页
定义
使用排序
使用分页
自定义 Repository 的实现
定义自定义 Repository 接口
定义接口实现
自定义 RepositoryFactoryBean
开启自定义支持使用 @EnableJpaRepositories 的 repositoryFactoryBeanClass 来指定 FactoryBean 即可
2.2.SpringBoot 的支持
JDBC 的自动配置
对 JPA 的自动配置
对 Spring Data JPA 的自动配置
Spring Boot 下的 Spring Data JPA
2.3.实例
实例
安装 Oracle XE :
非 Docker 安装
Docker 安装
运行一个oracle容器
docker run -d -p 9090:8080 -p 1521:1521 我那么less/oracle-xe-11g
端口映射
管理
新建 SpringBoot项目
配置基本属性
spring:
profiles: dev
datasource:
url: jdbc:postgresql://192.168.3.219:5432/intp-fxl?useUnicode=true=utf-8
username: postgres
password: postgres
filters: log4j,wall,mergeStat
定义映射实体类
定义数据访问接口
运行
3.SpringDataREST
2.1.Spring Data REST
Spring Data TEST
什么是 Spring Data REST
Spring MVC 中配置使用 Spring Data REST
继承方式
RepositoryRestMvcConfiguration
导入方式
@Configuration
@Import(RepositoryRestMvcConfiguration.class)
2.2.Spring Boot 的支持
2.3实例
新建 Spring Boot 项目
实体类
实体类的 Repository
Postman
REST 服务测试
JQuery
AngularJS
列表
获取单一对象
查询
分页
排序
保存
更新
删除
定制:
定制根路径
spring.data.rest.base-path= /api
定制节点路径
@RepositoryRestResource(path="people")
4.声明式事务
4.1.Spring 的事务机制
提供一个PlatformTransactionManager接口,不同的数据访问技术的事务使用不同的接口实现
JDBC :DataSourceTransactionManager
JPA :JpaTransactionManager
Hibernate : HibernateTransactionManager
JDO : JdoTransactionManager
分布式事务 : JtaTransactionManager
4.2.声明式事务
@Transactional
4.3.注解事务方式
4.4.类级别使用 @Transactional
4.5.SpringDataJPA的事务支持
4.6.SpringBoot 的事务支持
自动配置的事务管理器
自动开启注解事务的支持
5.数据缓存 Cache
内存速度大于硬盘速度.
当我们需要重复地获取相同的数据的时候,我们一次又一次的请求数据库或者远程服务,导致大量的时间耗费在数据库查询或者远程方法调用上,
导致程序性能的恶化,这便是数据缓存要解决的问题.
5.1.Spring 缓存支持
Spring 支持的 CacheManager
SimpleCacheManager : 使用简单的Collection来存储缓存,主要用来测试用途
ConcurrentMapCacheManager : 使用ConcurrentMap来存储缓存
NoOpCacheManager : 仅测试用途,不会实际存储缓存
EhCacheCacheManager : 使用EhCache作为缓存技术
GuavaCacheManager : 使用Google Guava的GuavaCache作为缓存技术
HazelcastCacheManager : 使用Hazelcast作为缓存技术
JCacheCacheManager : 支持Jcache(JSR-107)标准的实现作为缓存技术,如Apache Commons JCS
RedisCacheManager : 使用Redis 作为缓存技术
声明式缓存注解
@Cacheable
在方法执行前Spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放进缓存
@CachePut
无论怎样,都会将方法的返回值放到缓存中.@CachePut的属性与@Cacheable保持一致
@CacheEvict
将一条或多条数据从缓存中删除
@Caching
可以通过@Caching注解组合多个注解策略在一个方法上
开启声明式缓存支持
@EnableCaching
5.2.SpringBoot 的事务支持
5.3.切换缓存技术
EhCache
Guava
Redis
6.非关系型数据库 NoSQL
NoSQL是对于不使用惯性作为数据管理的数据库系统的统称.
NoSQL的主要特点是不使用SQL语言作为查询语言,数据存储也不是固定那个的表,字段
主要有文档存储型(MongoDB)
图形关系存储型(Neo4j)
键值对存储型(Redis)
MongoDB
MongoDB是一个基于文档(Document)的存储型的数据库,使用面向对象的思想,每一条数据记录都是文档的对象.
Spring 的支持 : Spring 对MongoDB的支持主要是通过Spring Data MongoDB来实现.
Object/Document 映射注解支持
JPA提供了一套Object/Relation映射的注解(@Entity @Id),
@Document : 映射领域对象与MongoDB的一个文档
@Id : 映射当前属性是ID
@DbRef : ID档前属性将参考其他的文档
@Field : 为文档的属性定义名称
@Version : 将当前属性作为版本
MongoTemplate
Repository 的支持
SpringBoot 的支持
安装 MongoDB
非 Docker
Docker 安装
docker run -d -p 27017:27017 mongo
Redis
Spring 的支持
配置
使用
opsForValue() : 操作只有简单属性的数据
opsForList() : 操作含有list的数据
opsForSet() : 操作含有set的数据
opsForZSet() : 操作含有ZSet(有序的set)的数据
opsForHash() : 操作含有hash的数据
定义 Serializer
Spring Boot 支持
安装 Redis
非 Docker 安装
Docker 安装
docker run -d -p 6379:6379 redis:2.8.21
九.SpringBoot企业级开发
1.安全控制 SpringSecurity
SpringSecurity 快速入门
什么是 Spring Security
Spring Security是专门针对基于Spring的项目的安全框架,充分利用了依赖注入和AOP来实现安全的功能.
安全框架有两个重要的概念,即认证(Authentication)和授权(Authorization),认证即确认用户可以访问当前系统;
授权即确定用户在当前系统下所拥有的功能权限
Spring Security 的配置
DelegatingFilterProxy
用户认证:
内存中的用户
JDBC 中的用户
通用的用户
请求授权
定制登录行为
SpringBoot 的支持
自动配置了一个内存中的用户
忽略 /cssfavicon.ico 等静态文件的拦截
自动配置的 securityFilterChainRegistration 的Bean.
2.批处理 SpringBatch
SpringBatch 快速入门
什么是 Spring Batch
Spring Batch是用来处理大量数据操作的一个框架,主要用来读取大量数据,然后进行一定处理后输出称指定的形式.
Spring Batch 主要组成
JobRepository : 用来注册Job的容器
JobLauncher : 用来启动Job的接口
Job : 我们要实际执行的任务,包含一个或多个Step
Step : Step步骤包含ItemReader,ItemProcessor,ItemWriter
ItemReader : 用来读取数据的接口
ItemProcessor : 用来处理数据的接口
ItemWriter : 用来输出数据的接口
Job 监听
实现 JobExecutionListener : implements JobExecutionListener
数据读取
数据处理及校验
数据处理
数据校验
数据输出
计划任务
参数后置绑定
SpringBoot 的支持
3.异步消息
异步消息
主要目的:是为了系统与系统之间的通信。所谓异步消息即消息发送者无须等待消息接收者的处理及返回,甚至无须关心消息是否发送成功。
在异步消息中有两个很重要的概念,即消息代理和目的地。当消息发送者发送消息后,消息将由消息代理接管,消息代理保证消息传递到指定的目的地。
异步消息主要有两种形式的目的地:队列(queue)和主题(topic)。队列用于点对点式(point-to-point)的消息通信;主题用于发布/订阅式
(publish/subscribe) 的消息通信。
企业级消息代理
JMS:即 Java 消息服务,是基于 JVM 消息代理的规范。而 ActiveMQ,HornetQ是一个 JMS 消息代理的实现。
AMQP:一个消息代理的规范,但它不仅兼容 JMS,还支持跨语言和平台.AMQP 的主要实现有 RabbitMQ.
Spring 的支持
SpringBoot 的支持
JMS 实战
AMQP 实战
4.系统集成 SpringIntegration
SpringIntegration 快速入门
Message
Channel
顶级接口
MessageChannel
PollableChannel : 轮询
SubscribaleChannel : 订阅
常用消息通道
PublishSubscribeChannel
QueueChannel
PriorityChannel
RendezvousChannel
DirectChannel
ExecutorChannel
通道拦截器
MessageEndPoint
Channel Adapter :
通道适配器(Channel Adapter)是一种连接外部系统或者传输协议的端点(EndPoint),可以分为入站(inbound)和出站(outbound).
通道适配器是单向的,入站通道适配器只支持接收消息,出站通道适配器只支持输出消息.
Gateway
消息网关(Gateway) 类似与Adapter,但是提供了双向请求/返回集成方式,也分为入站(inbound)和出站(outbound).
Service Activeator
Service Activator 可调用Spring的Bean 来处理消息,并将处理后的结果输出到指定的消息通道.
Router
路由(Router)可根据消息体类型(Payload Type Router) 消息头的值(Header Value Router)以及定义好的
接收表(Recipient List Router)作为条件,来决定消息传递到的通道.
Filter
过滤器(Filter) 类似于路由(Router),不通的是过滤器不决定消息路由到哪里,而是决定消息是否可以传递给消息通道.
Splitter
拆分起(Splitter)将消息拆分为几个部分单独处理,拆分器处理的返回值是一个集合或者数组.
Aggregator
据和气(Aggregator)与拆分器相反,它接收一个java.util.List作为参数,将多个消息合并为一个消息.
Enricher
当我们从外部获得消息后,需要增加额外的消息到已有的消息中,这时就需要使用消息增强器(Enricher).
消息增强器主要有消息体增强器(Payload Enricher)和消息头增强器(Header Enricher)两种
Transformer
转换器(Transformer)是对获得的消息进行一定的逻辑转换处理(如数据格式转换).
Bridge
使用连接桥(Bridge)可以简单地将两个消息通道连接起来
Spring Integration Java DSL
十.SpringBoot开发部署与测试
1.开发热部署
模板热部署
在Spring Boot里,模板引擎的页面默认是开启缓存的,如果修改了页面的内容,
则刷新页面是得不到修改后的页面的,因此我们可以在application.properties中关闭模板引擎的缓存.
Thymeleaf : spring.thyeleaf.cache=false
FreeMarker : spring.freemarker.cache=false
Groovy : spring.groovy.cache=false
Velocity : spring.velocity.cache=false
SpringLoaded
SpringLoaded 可实现修改类文件的热部署
JRebel
Spring-boot-devtools
2.常规部署
jar 形式:
打包 : mvn package
运行 : java -jar xx.jar
注册为 Linux 的服务
war 新式
打包方式为 war 时 : mvn package
打包方式为 jar 时 : jar 修改为 war 增加 ServletInitializer
3.云部署——基于 Docker 的部署
Dockerfile
FROM 指令 :
FROM指令指明了当前镜像继承的基镜像.
编译当前镜像时会自动下载基镜像
FROM ubuntu
MAINTAINER 指令
MAINTAINER指令指明了当前镜像的作者
MAINTAINER name
RUN 指令
RUN指令可以在当前镜像上执行Linux命令并形成一个新的层.
RUN是编译时(build)的动作
RUN /bin/bash -c "echo helloworld"
或
RUN["/bin/bash","-c","echo hello"]
CMD 指令
CMD指令指明了启动那个镜像容器时的默认行为.
一个Dockerfile里只能有一个CMD指令.
CMD指令里设定的命令可以在运行镜像时使用参数覆盖.
CMD echo "this is a test"
可被 docker run -d image_name echo "this is not a test" 覆盖
EXPOSE 指令
EXPOSE 指明了镜像运行时的容器必须监听指定的端口.
EXPOSE 8080
ENV 指令
ENV指令可用来设置环境变量
ENV myName=name
或 ENV myname name
ADD 指令
ADD指令是从当前工作目录复制文件到镜像目录中去
ADD test.txt /mydir/
ENTRYPOINT 指令
ENTRYPOINT指令可让容器像一个可执行程序一样运行,这样镜像运行时可以像软件一样接口参数执行.
ENTRYPOINT ["/bin/echo"]
我们可以向镜像传递参数运行
docker run -d image_name "this is not a test"
安装 Docker
安装Docker
yum install docker
启动Docker 并保持开机启动
systemctl start docker
systemctl enable docker
项目目录及文件
编译镜像
docker build -t wisely/ch10docker .
wisely/ch10docker 为镜像名称,我们设置wisely作为前缀,这也是Docker镜像的一种命名习惯.
注意,最后还有一个".",这是用来指明Dockerfile路径的,"."表示Dockerfile在当前路径下
运行
docker run -d --name ch10 -p 8080:8080 wisely/ch10docker
4.SpringBoot 的测试
Spring Boot为我们提供了一个@SpringApplicationConfiguration来替代@ContextConfiguration,用来配置 Application Context.
十一.应用监控
Spring Boot 提供了运行时的应用监控和管理的功能.
我们可以通过http JMX SSH协议来进行操作.
*actuator 所有EndPoint的列表,需加入spring HATEOAS支持
* autoconfig 当前应用的所有自动配置
* beans 当前应用中所有Bean的信息
* configprops 当前应用中所有的配置属性
* dump 显示当前应用线程状态信息
* env 显示当前应用当前环境信息
* health 显示当前应用健康状况
* info 显示当前应用信息
* metrics 显示当前应用的各项指标信息
* mappings 显示所有的@RequestMapping映射的路径
* shutdown 关闭当前应用(默认关闭)
* trace 显示追踪信息(默认最新的http请求)
1.http
新建 SpringBoot 项目
引入依赖 : web,actuator,hateoas
测试端点:
actuator
autoconfig
beans
dump
configprops
health
info
metrics
mappings
shutdown
shutdown端点默认是关闭的,我们可以在application.properties中开启:
endpoints.shutdown.enabled=true
shutdown端点不支持GET提交,不可以直接在浏览器上访问地址,所以我们使用PostMan来测试
trace
定制端点
修改端点 id : endpoints.beans.id=mybeans
开启端点 : endpoints.shutdown.enabled=true
关闭端点 : endpoints.beans.enabled=false
只开启所需端点 :
若只开启所需端点的话,我们可以通过关闭所有的端点,然后再开启所需端点来实现.
endpoints.enabled=false
endpoints.beans.enabled=true
定制端点访问路径
默认的端点访问路径是在根目录下的
http://localhost:8080/beans
management.context-path=/manage
http://localhost:8080/manage/beans
定制端点访问端口
当我们基于安全的考虑,不暴露端点的端口到外部时,就需要应用本身的业务端口和端点锁用的端口使用不通的端口.
我们可以通过如下配置改变端点访问的端口
management.port=8081
关闭 http 端点
management.port=-1
自定义端点
状态服务
自定义端点
注册端点并定义演示控制器
自定义 HealthIndicator
2.JMX
3.SSH
新建项目
运行
常用命令
定制登录用户
扩展命令
十二.分布式系统开发
微服务/原生云应用
微服务(Microservice)是近两年来非常火的概念,它的含义是:使用定义好边界的小的独立组建来做好一件事情.
微服务是相对于传统单块式架构而言的.
单块架构是一份代码,部署和伸缩都是基于单个单元进行的.
优点:易于部署
缺点:可用性低,可伸缩性差,集中发布的声明周期,违反单一功能原则
SpringCloud 快速入门
配置服务
服务发现
路由网关
负载均衡
断路由
实战:
项目构建
服务发现 Discovery(Eureka Server)
配置 Config(ConfigServer)
服务模块 Person 服务
服务模块 some 服务
界面模块UI(Ribbon,Feign)
断路器监控 Minitor(DashBoard)
运行
基于 Docker 部署
Dockerfile编写
runboot.sh 脚本的编写
位于src/main/docker
sleep 10
java -Djava.security.egd=file:/dev/./urandom -jar /app/app.jar
Dockerfile 编写
位于src/main/docker
FROM java:8
VOLUME /tmp
RUN mkdir /app
ADD config-1.0.0-SNAPSHOT.jar /app/app.jar
ADD runboot.sh /app/
RUN bash -c 'touch /app/app.jar'
WORKDIR /app
RUN chmod a+x runboot.sh
EXPOSE 8888
CMD /app/runboot.sh
为不同的微服务我们只需要修改
ADD config-1.0.0-SNAPSHOT.jar /app/app.jar
以及端口
EXPOSE 8888
Docker 的 maven 插件
编译镜像
DockerCompose
Docker-compose.yml 编写
运行