springboot学习笔记

springboot学习笔记

spring基础

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 Cloud
      • 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

Spring项目快速搭建

  • Maven简介

  • Maven安装

  • Maven的pom.xml

    • dependencies
    • dependency
    • 变量定义
    • 编译插件
  • Spring项目的搭建

    • Spring Tool Suite

      • https://spring.io/tools/sts/all
    • IntelliJ IDEA

    • NetBeans

      • https://netbeans.org/downloads/

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的不足.

    • @Aspect 声明是一个切面

      面向切面编程,相对于OOP面向对象编程
      Spring的AOP的存在目的是为了解耦.
      AOP可以让一组类共享相同的行为.
      在OOP中只能通过继承类和实现接口,来使代码的耦合度增强,且类继承智能为单继承,阻碍更多行为添加到一组类上,AOP弥补了OOP的不足.

    • 拦截规则@After @Before @Around

    • PointCut

    • JoinPoint

Spring常用配置

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实例.

SpringEL和资源调用

commons-io 将file转换称字符串

  • 注入普通字符
  • 注入操作系统属性
  • 注入表达式云算结果
  • 注入其他Bean的属性
  • 注入文件内容
  • 注入网址内容
  • 注入属性文件

Bean的初始化和销毁

  • Java配置方式

    @Bean的initMethod和destroyMethod

  • 注解方式

    jsr250-api

    利用JSR-250的@PostConstruct和@PreDestroy

Profile

Profile为在不同环境下使用不通的配置提供了支持

  • @Profile
  • 通过设定jvm的spring.profiles.active参数
  • web项目设置在Servlet的context parameter中

事件Application Event

为Bean与Bean之间的消息通信提供了支持.
当一个Bean处理完一个任务之后,希望另一个Bean知道并能做相应的处理,这时我们就需要让另外一个Bean监听当前Bean所发送的事件.

  • 自定义事件,集成ApplicationEvent
  • 定义事件监听器,实现ApplicationListener
  • 使用容器发布事件

Spring高级话题

Spring Aware

  • BeanNameAware

    获得到容器中Bean的名称

  • BeanFactoryAware

    获得当前bean factory,这样可以调用容器的服务

  • ApplicationContextAware

    当前的Application context, 这样可以调用容器的服务

  • MessageSourceAware

    获得Message source,这样可以获得文本信息

  • ApplicationEventPublisherAware

    应用时间发布器,可以发布时间,

  • ResourceLoaderAware

    获得资源加载器,可以获得外部资源文件

多线程

Sprinng 通过任务执行器(TaskExecutor)来实现多线程和并发编程.
使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor.
而实际开发中任务一般是非阻碍的,即异步的,所以我们要在配置类中通过@EnableAsync开启对异步任务的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务.

计划任务

计划任务在Spring中的实现变得异常的简单.
首先通过在配置类注解@EnableScheduling来开启对计划任务的支持,然后在要执行计划任务的方法上注解@Scheduled,声明这是一个计划任务

  • cron
  • fixDelay
  • fixRate

条件注解@Conditional

@Conditional 根据满足某一个特定条件创建一个特定的Bean
当某一个jar包在一个类路径下的时候,自动配置一个或多个Bean:或者只有某个Bean被创建才会创建另外一个Bean.总的来说,就是根据特定条件来控制Bean的创建行为,这样我们可以利用这个特性进行一些自动的配置.

组合注解与元注解

@Enable*注解的工作原理

  • 直接导入配置类
  • 依据条件选择配置类
  • 动态注册Bean

测试

测试是开发工作中不可缺少的部分.
单元测试只针对当前开发的类和方法进行测试,可以简单通过模拟依赖来实现,对运行环境没有依赖;但是仅仅进行单元测试是不够的,它智能验证当前类或方法能否正常工作,而我们降妖知道系统的各个部分组合在一起是否能正常工作,这就是集成测试才能在的意义.
集成测试一般需要来自不同层的不通对象交互,如数据库,网络连接,Ioc容器等.

  • Spring TestContext Framework集成测试

SpringMVC基础

Spring MVC概述

SpringMVC项目快速搭建

  • 构建Maven项目
  • 日志配置
  • 演示页面
  • Spring MVC配置
  • Web配置
  • 简单控制器
  • 运行

Spring MVC的常用注解

  • @Controller
  • @RequestMapping
  • @ResponseBody
  • @RequestBody
  • @PathVariable
  • @RestController

Spring MVC的基本配置

  • 静态资源映射

  • 拦截器配置

  • @ControllerAdivce

    • @ExceptionHandler

      用于全局处理控制器里的异常

    • @InitBinder

      用来设置WebDataBinder,WebDataBinder用来自动绑定前台请求参数到Model中

    • @ModelAttribute

      @ModelAttribute本来的作用是绑定键值对到Model里,此处是让全局的@RequestMapping都能获得在此处设置的键值对

  • 其他配置

    • ViewController
    • 路径匹配参数配置
    • WebMvcConfigurerAdapter
    • WebMvcConfigurer

Spring MVC的高级配置

  • 文件上传配置

    commons-fileupload
    文件上传是一个项目里经常要用的功能,Spring MVC通过配置一个MultipartResolver来上传文件
    在Spring的控制器中,通过MultipartFile来接收文件,通过MultupartFile[] files接收多个文件上传.

  • 自定义HttpMessageConverter

    HttpMessageConverter是用来处理request和response里的数据的.

    • MappingJackson2HttpMessageConverter
    • StringHttpMessageConverter
  • 服务器端推送技术

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

    • SSE

      SSE(Server Send Event 服务端发送事件)的服务器端推送和基于Servlet3.0+的异步方法特性,其中第一种方式需要新式浏览器的支持,第二种方式是跨浏览器的.

    • Servlet3.0+异步方法处理

Spring MVC的测试

测试驱动开发(Test Driven Development,TDD),我们(设计人员)按照需求先写一个自己预期结果的测试用例,这个测试用例刚开始肯定是失败的测试,随着不断的编码和重构,最终让测试用例通过测试,这样才能保证软件的质量和可控性.

  • MockMVC
  • MockHttpServlerRequest
  • MockHttpServletResponse
  • MockHttpSession

SpringBoot基础

SpringBoot概述

  • 什么是SpringBoot

    随着动态语言的流行,Java的开发显得格外的笨重:繁多的配置,低下的开发效率,复杂的部署流程以及第三方技术集成难度大.
    SpringBoot应运而生.
    它使用"习惯优于配置"(项目中存在大量的配置,此外还内置一个习惯性配置,让你无需手动进行配置)的理念让你的项目快速运行起来.使用SpringBoot很容易创建一个独立运行(运行Jar内嵌Servlet容器)准生产级别的基于Spring框架的项目,使用SpringBoot你可以不用或者只需要很少的Spring配置.

  • SpringBoot核心功能

    • 独立运行的Spring项目

      Spring Boot可以以Jar包的形式独立运行,运行一个Spring Boot项目只需通过 java -jar xx.jar来运行

    • 内嵌Servlet容器

      Spring Boot可选择内嵌 Tomcat Jetty或者Undertow,这样我们无须以war包形式部署项目

    • 提供Starter简化Maven配置

    • 自动配置Spring

    • 准生产的应用监控

    • 无代码声称和xml配置

      注解

  • SpringBoot的优缺点

    • 优点

      • 快速构建项目
      • 对主流开发框架的无配置集成
      • 项目可独立运行,无需外部依赖Servlet容器
      • 提供运行时的应用监控
      • 极大地提高了开发,部署效率
      • 与云计算的天然集成
    • 缺点

      • 书籍文档较少,且不够深入
  • SpringBoot版本

SpringBoot快速搭建

  • http://start.spring.io
  • SpringToolSuite
  • InterlliJIDEA
  • SpringBootCLI
  • Maven手工构建
  • 简单演示

SpringBoot核心

基本配置

  • 入口类和@SpringBootApplication

    • @Configuration
    • @EnableAutoConfiguration
    • @ComponentScan
  • 关闭特定的自动配置

    关闭特定的自动配置应该使用@SpringBootApplication注解的exclude参数
    例如:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})

  • 定制Banner

    • 修改Banner

      src/main/resources 新建一个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

        Spring Boot 核心starter,包含自动配置,日志,yaml配置文件的支持

      • 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-data-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)
      • Actitivi
  • 使用XML配置

    • @ImportResource

外部配置

  • 命令行参数配置
  • 常规属性配置
  • 类型安全的配置(基于properties)

日志配置

Profile配置

SpringBoot运行原理

java -jar xx.jar --debug

application.properties
debug=true

  • 运作原理

  • 核心注解

    • @ConditionalOnBean

      当容器里有指定的Bean的条件下

    • @ConditionalOnClass

      当类路径下有指定的类的条件下

    • @ConditionalOnExpression

      基于SpEL表达式作为判断条件

    • @ConditionalOnJava

      基于JVM版本作为判断条件

    • @ConditionalOnJndi

      在JNDI存在的条件下查找指定的位置

    • ConditionalOnMissingBean

      当容器里没有指定Bean的情况下

    • ConditionalOnMissingClass

      当类路径下没有指定的类的条件下

    • ConditionalOnNotWebApplication

      当前项目不是Web项目的条件下

    • ConditionalOnProperty

      指定的属性是否有指定的值

    • ConditionalOnResource

      类路径是否有指定的值

    • ConditionalOnSingleCandidate

      当指定Bean在容器中只有一个,或者虽然有多个但是指定首选的Bean

    • ConditionalOnWebApplication

      当前项目是Web项目的条件下

  • 实例分析

    • 配置参数
    • 配置Bean
  • 实战

Springboot的Web开发

SpringBoot的Web开发支持

  • ServerPropertiesAutoConfiguration和ServerProperties

    自动配置内嵌Servlet容器

  • HttpEncodingAutoConfiguration和HttpEncodingProperties

    用来自动配置http的编码

  • MultipartAutoConfiguration和MultipartProperties

    用来自动配置上传文件的属性

  • JacksonHttpMessageConvertersConfiguration

    用来自动配置mappingJackson2HttpMessageConverter和mappingJackson2XmlHttpMessage Converter

  • WebMvcAutoConfiguration和WebMvcProperties

    配置SpringMVC

Thymeleaf模板引擎

  • Thymeleaf基础知识

    Thymeleaf是一个Java类库,它是一个xml/xhtml/html5的模版引擎,可以作为MVC的Web应用的View层.
    Thymeleaf还提供了额外的模块与Sping MVC集成,所以我们可以使用Thymeleaf完全替代JSP

    • 引入Thymeleaf

    • 访问model中的数据

    • model中的数据迭代

    • 数据判断

    • 在javaScript中访问model

    • 其他知识

      http://www.thymeleaf.org

  • 与SpringMVC集成

  • SpringBoot的Thymeleaf支持

  • 实战

    • 新建Spring Boot项目
    • 示例JavaBean
    • 脚本样式静态文件
    • 演示页面
    • 数据准备
    • 运行

Web相关配置

  • SpringBoot提供的自动配置

    • 自动配置的ViewResolver

      • ContentNegotiatingViewResolver
      • BeanNameViewResolver
      • InternalResourceViewResolver
    • 自动配置的静态资源

      • 类路径文件
      • webjar
    • 自动配置的Formatter和Conventer

    • 自动配置的HttpMessageConverters

    • 静态首页的支持

  • 接管SpringBoot的Web配置

  • 注册Servlet,Filter,Listener

Tomcat配置

  • 配置Tomcat

    配置Servlet容器
    server.port
    配置Tomcat
    server.tomcat.uri-encoding

  • 代码配置Tomcat

    • 通用配置

      • 新建类的配置
      • 当前配置文件内配置
    • 特定配置

  • 替换Tomcat

    • 替换为Jetty
    • 替换为Undertow
  • SSL配置

    • 生成证书

      keytool

      keytool -genkey -alias tomcat

    • Spring Boot配置SSL

    • http转向https

Favicon配置

  • 默认的Favicon

  • 关闭Favicon

    spring.mvc.favicon.enabled=false

  • 设置自己的Favicon

    favicon.ico放置在src/main/resources/static

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

基于Bootstrap和AnglarJS的现代Web应用

单页面应用(single-page application, 简称SPA)指的是一种类似于原生客户端软件的更流畅的用户体验的页面.

响应式设计(Responseive web design,简称RWD)指的是不通的设备(电脑,平板,手机)访问相同的页面的时候,得到不同的页面视图,而得到视图是适应当前屏幕的.

数据导向是对于页面导向而言的,页面上的数据获得是通过消费后台的REST服务来实现的,而不是通过服务器渲染的动态页面来实现的,一般数据交换使用的格式是JSON

  • Bootstrap

    • 什么是Bootstrap
    • 下载并引入Bootstrap
    • CSS支持
    • 页面组件支持
    • Javascript支持
  • AngularJS

    • 什么是AngularJS

    • 下载并引入AngularJS

    • 模块,控制器和数据绑定

    • Scope和Event

      • Scope

      • Event

        • 冒泡事件
        • 广播事件
    • 多视图和路由

    • 依赖注入

    • Service和Factory

    • 自定义指令

  • 实战

SpringBoot的数据访问

引入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 -q)

    • 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

        删除所有容器
        docker 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

SpringDataJPA

  • SpringDataJPA

    • 什么是Spring Data JPA

    • 定义数据访问层

      继承JpaRepository
      public interface PersonRepository extends JpaRepository<Person,Long>{
      //定义数据访问操作方法
      }

    • 配置使用Spring Data JPA

      @EnableJpaRepositories

    • 定义查询方法

      • 根据属性名查询

        • 常规查询

          select p from person p wehere p.name=?1
          List

        • 限制结果数量

          List

      • 使用JPA的NamedQuery

      • 使用@Query查询

        • 使用参数索引

        • 使用命名参数

        • 更新查询

        • Specification

        • 排序与分页

          • 定义
          • 使用排序
          • 使用分页
    • 自定义Repository的实现

      • 定义自定义Repository接口
      • 定义接口实现
      • 自定义ReposityFactoryBean
      • 开启自定义支持使用@EnableJpaRepositories的repositoryFactoryBeanClass来指定FactoryBean即可
  • SpringBoot的支持

    • JDBC的自动配置
    • 对JPA的自动配置
    • 对Spring Data JPA的自动配置
    • Spring Boot下的Spring Data JPA
  • 实例

    • 安装Oracle XE

      • 非Docker 安装

      • Docker 安装

        运行一个oracle容器
        docker run -d -p 9090:8080 -p 1521:1521 我那么less/oracle-xe-11g

      • 端口映射

      • 管理

    • 新建Spring Boot 项目

    • 配置基本属性

      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

    • 定义映射实体类

    • 定义数据访问接口

    • 运行

SpringDataREST

  • Spring Data REST

    • 什么是Spring Data REST

    • Spring MVC中配置使用Spring Data REST

      • 继承方式

        RepositoryRestMvcConfiguration

      • 导入方式

        @Configuration
        @Import(RepositoryRestMvcConfiguration.class)

  • SpringBoot的支持

  • 实例

    • 新建Spring Boot项目

    • 实体类

    • 实体类的Repository

    • Postman

    • REST服务测试

      • jQuery
      • AngularJS
      • 列表
      • 获取单一对象
      • 查询
      • 分页
      • 排序
      • 保存
      • 更新
      • 删除
    • 定制

      • 定制根路径

        spring.data.rest.base-path= /api

      • 定制节点路径

        @RepositoryRestResource(path=“people”)

声明式事务

  • Spring的事务机制

    提供一个PlatformTransactionManager接口,不同的数据访问技术的事务使用不通的接口实现

    • JDBC

      • DataSourceTransactionManager
    • JPA

      • JpaTransactionManger
    • Hibernate

      • HibernateTransactionManger
    • JDO

      • JdoTransactionManger
    • 分布式事务

      • JtaTransactionManager
  • 声明式事务

    @Transactional

  • 注解事务行为

  • 类级别使用@Transactional

  • SpringDataJPA的事务支持

  • SpringBoot的事务支持

    • 自动配置的事务管理器
    • 自动开启注解事务的支持
  • 实例

数据缓存Cache

内存速度大于硬盘速度.
当我们需要重复地获取相同的数据的时候,我们一次又一次的请求数据库或者远程服务,导致大量的时间耗费在数据库查询或者远程方法调用上,导致程序性能的恶化,这便是数据缓存要解决的问题.

  • 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

  • SpringBoot的事务支持

  • 实例

  • 切换缓存技术

    • EhCache
    • Guava
    • Redis

非关系型数据库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企业级开发

安全控制SpringSecurity

  • SpringSecurity快速入门

    • 什么是Spring Security

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

    • Spring Security的配置

      • DelegatingFilterProxy

      • 配置

      • 用户认证

        • 内存中的用户
        • JDBC中的用户
        • 通用的用户
        • 请求授权
        • 定制登录行为
  • SpringBoot的支持

    • 自动配置了一个内存中的用户
    • 忽略/css/** /js/** /images/** /**/favicon.ico等静态文件的拦截
    • 自动配置的securityFilterChainRegistration的Bean
  • 实例

批处理SpringBatch

  • SpringBatch快速入门

    • 什么是Spring Batch

      Spring Batch是用来处理大量数据操作的一个框架,主要用来读取大量数据,然后进行一定处理后输出称指定的形式.

    • Spring Batch主要组成

      • JobRepository

        用来注册Job的容器

      • JobLauncher

        用来启动Job的接口

      • Job

        我们要实际执行的任务,包含一个或多个Step

      • Step

        Step步骤包含ItemReader,ItemProcessor,ItemWriter

      • ItemReader

        用来读取数据的接口

      • ItemProcessor

        用来处理数据的接口

      • ItemWriter

        用来输出数据的接口

    • Job监听

      implements JobExecutionListener

    • 数据读取

    • 数据处理及校验

      • 数据处理
      • 数据校验
    • 数据输出

    • 计划任务

    • 参数后置绑定

  • SpringBoot的支持

  • 实例

异步消息

异步消息主要目的是为了系统与系统之间的通信.
所谓异步消息即消息发送者无须等待消息接收者的处理及返回,甚至无须关心消息是否发送成功.

在异步消息中有两个很重要的概念,即消息代理(message broker) 和目的地(destination).
当消息发送者发送消息后,消息将由消息代理接管,消息代理保证消息传递到指定的目的地.

异步消息主要有两种形式的目的地:队列(queue)和主题(topic).队列用于点对点式(point-to-point)的消息通信; 主题用于发布/订阅式(publish/subscribe)的消息通信.

  • 企业级消息代理

    JMS(java Message Service)即Java消息服务,是基于JVM消息代理的规范.而ActiveMQ,HornetQ是一个JMS消息代理的实现.

    AMQP(Advanced Message Queuing Protocol)也是一个消息代理的规范,但它不仅兼容JMS,还支持跨语言和平台.AMQP的主要实现有RabbitMQ

  • Spring的支持

  • SpringBoot的支持

  • JMS实战

  • AMQP实战

系统集成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开发部署与测试

开发的热部署

  • 模板热部署

    在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

    Spring loaded 可实现修改类文件的热部署

  • JRebel

  • spring-boot-devtools

常规部署

  • jar形式

    • 打包

      mvn package

    • 运行

      java -jar xx.jar

    • 注册为Linux的服务

  • war形式

    • 打包方式为war时

      mvn package

    • 打包方式为jar时

云部署–基于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

SpringBoot的测试

Spring Boot为我们提供了一个@SpringApplicationConfiguration来替代@ContextConfiguration,用来配置 Application Context.

  • 新建SpringBoot项目
  • 业务代码
  • 测试用例
  • 执行测试

应用监控

Spring Boot 提供了运行时的应用监控和管理的功能.
我们可以通过http JMX SSH协议来进行操作.

*actuator 所有EndPoint的列表,需加入spring HATEOAS支持

  • autoconfig 当前应用的所有自动配置
  • beans 当前应用中所有Bean的信息
  • configprops 当前应用中所有的配置属性
  • dump 显示当前应用线程状态信息
  • env 显示当前应用当前环境信息
  • health 显示当前应用健康状况
  • info 显示当前应用信息
  • metrics 显示当前应用的各项指标信息
  • mappings 显示所有的@RequestMapping映射的路径
  • shutdown 关闭当前应用(默认关闭)
  • trace 显示追踪信息(默认最新的http请求)

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

  • 自定义端点

    • 状态服务
    • 自定义端点
    • 注册端点并定义演示控制器
  • 自定义HealthIndicatior

JMX

SSH

  • 新建SpringBoot项目
  • 运行
  • 常用命令
  • 定制登录用户
  • 扩展命令

分布式系统开发

微服务/原生云应用

微服务(Microservice)是近两年来非常火的概念,它的含义是:使用定义好边界的小的独立组建来做好一件事情.
微服务是相对于传统单块式架构而言的.

单块架构是一份代码,部署和伸缩都是基于单个单元进行的.
优点:易于部署
缺点:可用性低,可伸缩性差,集中发布的声明周期,违反单一功能原则

SpringCloud快速入门

  • 配置服务
  • 服务发现
  • 路由网关
  • 负载均衡
  • 断路由

实战

  • 项目构建
  • 服务发现Discovery(Eureka Server)
  • 配置Config(ConfigServer)
  • 服务模块Person服务
  • 服务模块Some服务
  • 界面模块UI(Ribbon,Feign)
  • 断路器监控Monitor(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的Mean插件

    • 编译镜像

  • DockerCompose

  • Docker-compose.yml编写

  • 运行

附录

基于JHipster的代码生成

常用应用属性配置列表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值