SpringBoot建立在现有Spring框架至上。使用spring启动,我们避免了之前我们必须做的所有样板代码和配置。因此,SpringBoot可以帮助我们以最少的工作量,更加健壮地使用现有的Spring功能
一.独立运行
SpringBoot内嵌了各种servlet容器,Tomecat等,不需要达成war包部署到容器中,SpringBoot只要打成一个可执行jar包就能独立运行,所有依赖都在一个jar包内
二.减少配置
spring-boot-starter-web启动器自动依赖其他组件,减少maven配置
三.自动配置
springboot可以根据jar包自动配置bean,如添加一个spring-boot-starter-web启动器就能拥有web功能,无需其他配置
四.无代码生产和xml配置
springboot配置过程中无代码生成,也无需xml配置文件就能完成所有配置工作,这一切都用注解完成的。
五.应用监控
springboot提供一系列端点可以监控服务及应用,做健康检测
1.减少开发 2.使用javaConfig有助于避免使用XML 3.避免大量的Maven导入和各种版本冲突 4.需要更少的配置文件,只需要注解来完成
核心注解@SpringBootApplication,由以下三个注解组成
1.@SpringBootConfiguration:组合@Configuration注解,实现配置文件的功能
2.@EnableAotoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能
3.@Components Can:Spring组件扫描
1.打包用命令或者放到容器中运行
2.使用maven插件运行
3.直接执行main方法运行
Starters是什么:
Starters可以理解为启动器,包含集成到应用里面的依赖包,Starters包含了许多项目中需要用到的依赖
Starters命名:
springboot启动器都是以spring-boot-starter-命名的
Starters分类:
1.springboot应用类启动器
启动器名称 | 功能描述 |
---|---|
spring-boot-starte | 包含自动配置,日志,yaml的支持 |
spring-boot-starte-web | 使用SpringMVC构建web工程,默认使用Tomcat容器 |
2.SpringBoot生产启动器
启动器名称 | 功能描述 |
---|---|
spring-boot-starter-actuator | 提供生产环境特性,能监控管理应用 |
3.springboot技术类启动器
启动器名称 | 功能描述 |
---|---|
spring-boot-starter-json | 提供对json的读写支持 |
spring-boot-starter-logging | 默认的日志启动器,默认使用Logback |
4.其他第三方启动器
可以实现接口ApplicationRunner或者CommandLineRunner,这俩个接口实现方式一样,他们都提供一个run方法。CommandLineRunner:启动获取命令行参数
不需要,内种Tomact容器
SpringBoot acruator(阿克斯维ter)是spring启动框架中的重要功能之一。springboot监视器可帮助您访问生态环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务来相关人员触发警报消息。监视器模块公开了一组可直接作为Http URl访问的REST端点来检查状态
通过实现ControllerAdvice类,来处理控制器抛出所有异常
spring-boot-starter-web:嵌入Tomcat和web开发需要servlet与jsp支持
spring-boot-starter-data-jpa:数据库支持
spring-boot-starter-data-redis:redis数据库支持
spring-boot-starter-data-solr:solr支持
mybatis-spring-boot-starter:第三方的mybatis集成starter
Spring Loaded
Spirng-boot-devtolls
在Springboot里面,可以使用以下几种方式来加载配置
1.properites文件
2.yaml文件
3.系统环境变量
4.命令行参数
SpringBoot的核心配置文件是application和bootstrap配置文件
application用于springboot项目的自动配置
bootstrap配置文件有以下几个应用场景
1.使用springcloud config配置中心时,这时需要在bootstrap配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息。
2.一些固定的不能被覆盖的属性
3.一些加密/解密的场景
使用spring-boot-starter-activemq依赖关系
springjavaConfig是spring社区的产品,提供配置spring loc容器的纯java方法。有助于避免使用xml配置。
javaConfig优点:
1.面向对象的配置。由于配置被定于为javaConfig中的类,因此用户可以充分利用java中的面向对象功能。一个配置类可以继承另一个,重写他的@Bean方法等
2.减少xml配置。
3.类型安全和重构友好。javaConfig提供了一种类型安全的方法来配置Spirng容器。由于java5.0对泛型的支持,现在可以按类型而不是按名称捡索bean,不需要任何强制转换或基于字符串查找
热部署
org.springframework.boot spring-boot-devtools true
默认情况下,所有敏感的http端点都是安全的,只有具有actuator角色的用户才能访问他们。安全性是使用标准的httpServletRequest.isUserInRole方法实施的。我们可以使用来禁用安全性。只有在执行机构端点在防火墙后访问时,才建议禁用安全性
yaml是一种人类可读的数据序列化语言。它通常用于配置文件。
与属性文件相比,如果我们想要配置文件中添加复杂的属性,yaml文件就更加结构化,而且更少混淆。可以看出taml具有分层配置数据
使用spring-boot-starter-security(四k瑞尔停)依赖项,添加安全配置
使用spring Data-JPA可以实现将分页的传递给存储库方法
swagger是一个规范和完整的框架,用于生成,描述,调用和可视化RESTful风格的web服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步
作用:
接口文档在线自动生成
功能测试
springprofiles允许用户根据配置文件(dev,test,prod)来注册bean。因此,应用程序在开发中运行时,只有某些bean可以加载,而在production中,某些其他bean可以加载。假设我们的要求是swagger文档仅适用于QA环境,并且禁用所有其他文档。这可以使用配置文件来完成。springboot使得使用配置文件非常简单
springbootBatch提供可重用的函数,这些函数处理大量记录,包含日志跟踪,事务管理,作业处理统计信息,作业重新启动,跳过和资源管理。它还提供更先进的技术服务和功能,通过优化和区分技术,可以实现极高批量和高性能批处理作业。简单以及复杂的大批量批处理作业可以高度可扩展的方式利用框架处理重要大量的信息
freemarker是一个基于java模板引擎,专注于mvc软件架构进行动态网页生产。优点表示层和业务层的完全分离
使用ControllerAdvice类,来处理控制器类抛出所有异常
spring-boot-starter-activemq
spring-boot-starter-security
有助于增加更少的依赖关系,减少版本冲突
csrf代表跨站请求伪造。这是一种攻击,迫使最终用户在当前通过身份验证的web应用程序上执行不需要的操作。csrf攻击专门针对状态改变请求,而不是数据窃取,因为攻击者无法查看对伪造请求的响应。这有助于增加更少的依赖关系,并减少版本的冲突
websockets(玩不 扫key吃)是一种计算机通信协议,通过单个TCP连接提供全双工通信信道
1.websocket是双向的 使用websocket客户端或服务器可以发起消息发送
2.websocket是全双工的 客户端和服务器通信是相互独立的
3.单个TCP连接 初始连接使用Http,然后将连接升级到基于套接字的连接。然后这个单一连接用于所有未来的通信
4.Light 与 http 相比,websocket消息数据交换要轻的多
AOP就是通过动态为项目中某些类在运行过程中动态创建代理对象,在对象中完成附加功能,保证在处理业务时更加专注于自己的业务逻辑开发。 有以下几个概念: 1.通知(Advice)——给目标方法添加额外操作称之为通知,也可以称为增强 2.连接点(Joinpoint)——就是可以增强的地方(方法的前后某个阶段) 3.切入点(Pointcut)——实际增强的地方 4.切面(Aspect)——封装了通知和切入点用来横向插入的类 5.代理(Proxy)——将通知应用到目标类动态创建的对象 6.织入(Weaving)——将切面插入到目标从而生成代理对象的过程
Apache Kafka是一个分布式发布-订阅消息系统。他是一个可扩展的,容错的发布-订阅消息系统,它使我们能够构建分布式应用程序。这是一个Apache顶级项目。kafka适合离线和在线消息消费
Spring Boot 提供监视器端点以监控各个微服务的度量。这些端点对于获取有关应 用程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否正常运 行很有帮助。但是,使用监视器的一个主要缺点或困难是,我们必须单独打开应 用程序的知识点以了解其状态或健康状况。想象一下涉及 50 个应用程序的微服务,管理员将不得不击中所有 50 个应用程序的执行终端。为了帮助我们处理这种情况,我们将使用位于 的开源项目。
它建立在 Spring Boot Actuator 之上,它提供了一个 Web UI,使 我们能够可视化多个应用程序的度量。
继承spring-boot-starter-parent父项目
导入spring-boot-dependencites项目依赖
@EnableAutoConfiguration,@Configuration,@ConditionalOnClass就是自动配置的核心
springboot可以通过@PropertySource,@Value,@Environment,@ConfigurationProperties来绑定变量
springboot支持java Util Logging,Log4j2,Lockback作为日志框架,使用starters启动器,将使用Logback作为默认日志框架
application.properties application-dev.properties application-test.properties application-prod.properties
可以,使用@ImportResource注解导入老Spring项目配置文件
1.在生产中使用https
2.使用snyk检查你的依赖关系
3.升级到最新版本
4.启用csrf保护
5.使用内容安全策略防止XXS攻击
1.配置变更
2.JDK版本升级
3.第三方类库升级
4.响应式spring编程支持
5.http/2支持
6.配置属性绑定
7.更多改进与加强......
添加mybatis的starter maven依赖
在mybatis的接口中添加@Mapper注解
在application.yml配置数据源
springframe
springframework最重要的特征依赖注入,所有springmodules不是依赖注入就IOC控制反转
当我们恰当的使用DI或者是IOC的时候,我们可以开发松耦合应用。松耦合应用的单元测试可以很容易的进行。
springmvc
springmvc提供了一种分离式的方法来开发web应用。通过运用像DispatcherServelet,MoudlAndView和ViewResolver等一些简单的概念,开发web应用将会变得非常简单
springboot
spring和SpringMVC的问题在于需要配置大量的参数
/WEB-INF/views/ .jsp
springboot 通过一个自动配置解决这个问题。为了更快的构建产品就绪应用程序,springboot提供了一些非功能性特征
springboot 也提供了其他的启动器项目,包括用于开发特定类型应用程序的典型依赖项。
spring-boot-starter-web-services- SOAP WEB Services
spring-boot-starter-web- Web和RESTful应用程序
spring-boot-starter-test- 单元测试和集成测试
spring-boot-starter-jdbc- 传统的JDBC
spring-boot-starter-hateoas- 微服务添加HATEOAS功能
spring-boot-starter-security- 使用springsecurity进行身份验证和授权
spring-boot-starter-data-jpa- 带有Hibeernate的Spring Data JPA
spring-boot-starter-data-rest- 使用spring Data Rest 公布简单的REST服务
springboot致力于快速产品就绪应用程序。为此,它提供了一些譬如高速缓存,日志记录,监控和嵌入式服务器等开箱即用的非功能性特征。
spring-boot-starter-acutator- 监控和跟踪应用的高级功能
spring-boot-starter-undertow,spring-boot-starter-jetty,spring-boot-starter-tomcat- 嵌入式servlet容器
spring-boot-starter-logging- 使用logback进行日志记录
spring-boot-starter-cache- 启用spring framework的缓存支持
不是。
Spring Initiatlizer让创建SpringBoot项目变的很容易,但是,你也可以通过设置一个maven项目并添加正确的依赖项来开始一个项目。
在我们的spring课程中,我们使用俩种方法来创建项目
第一种方法是 start.spring.io
另一种方法是在项目的标题为“Basic Web Application”处进行手动设置
手动设置一个maven项目
这里有几个重要步骤:
1.在 idea中,使用文件 - 新建 Maven 项目来创建一个新项目
添加依赖项。
添加 maven 插件。
添加 Spring Boot 应用程序类。
在你的虚拟机上部署应用程序需要些什么。
第一步:安装java
第二部:安装web或者是应用程序的服务器(Tomaat等等)
第三部:部署应用程序war包
如果我们想简化这些步骤,应该如何做呢?
你只需要一个安装java的虚拟机,就可以直接在上面部署应用了, 是不是很爽?
这个想法是嵌入式服务器的起源。
当我们创建一个部署的应用程序的时候,我们将会把服务器(例如,Tomcat)嵌入到可部署的服务器中。
列如,对于一个springboot 应用程序来说,你可以生成一个包含Embedded Tomcat的应用程序jar。你就可以想运行正常java应用程序一样来运行web应用程序了。
嵌入式服务器就是我们的可执行单元包含服务器的二进制文件(列如,tomcat.jar)
在源文件夹下,创建一个名为static的文件夹。然后,你可以把你的静态的内容放在这里面。
例如,myapp.js的路径是 resources\static\js\myapp.js
你可以参考它在jsp中的使用方法
错误:HAL browser gives me unauthorized error - Full authenticaition is required to access this resource.
该如何来修复这个错误呢?
{ "timestamp": 1488656019562, "status": 401, "error": "Unauthorized", "message": "Full authentication is required to access this resource.", "path": "/beans" }
俩种方法:方法一:关闭安全验证
application.properties
management.security.enabled:FALSE
方法二:在日志中搜索密码并传递至请求标头中
spring Data的使命是在保证底层数据存储特殊性的前提下,为数据访问提供一个熟悉的,一致的,基于spring的编程模型。这使得使用数据访问的技术,关系数据库和非关系数据库,map-reduce框架以及基于云的数据服务变的很容易
为了让它更简单一些,spring Data提供了不受底层数据源限制的Abstractions接口
举个列子
interface TodoRepository extends CrudRepository{}
你可以定义一简单的库,用来插入,更新,删除和检索代办事项,而不需要编写大量的代码。
Spting Dta TEST可以用来发布关于spring数据库的Hateoas RESTful资源。
下面是一个使用JPA的列子
@RepositoryRestResource(collectionResourceRel = "todos", path = "todos") public interface TodoRepository extends PagingAndSortingRepository{ }
下面展示关于TEST服务器的列子
POST
URL:http://localhost:8080/todos
Use Header:Content-Type:Type:application/json
Request Content
代码如下
{ "user":"jill", "desc":"Learn Hibernate", "done":false }
响应内容
{ "user": "Jill", "desc": "Learn Hibernate", "done": false, "_links": { "self": { "href": "http://localhost:8080/todos/1" }, "todo": { "href": "http://localhost:8080/todos/1" } } }
响应包含新创建资源的href
@RepositoryRestResource(collectionResourceRel = "users", path = "users") public interface UserRestRepository extends PagingAndSortingRepository
path- 这个资源到导出路径段
collectionResourceRel- 生成指向集合资源的链接时使用的rel值。在生成Hateoas链接时使用。
如果你使用Eclipse IDE,Eclipse maven 插件确保依赖项或者类文件的改变一经添加,就会被编译并在目标文件中准备好!在这之后,就和其它的java应用程序一样了。
当你启动java应用程序的时候,springboot自动配置文件就会自动的启动了。
当springboot应用程序检测到你正在开发一个web应用程序的时候,它就会启动tomcat。
RequestMapping具有类属性的,可以进行GET,POST,PUT或者其他的注释中具有的请求方法。
GetMapping是Get请求方法中的一个特例。它只是ResquestMapping的一个延伸,目的是为了提高清晰度。
JPA是一个规范或者接口
Hibernate是JPA的一个实现
当我们使用JPA的时候,我们使用javax.persistence包中的注释和接口时,不需要使用hibernate的导入包。
我们建议使用JPA注释,因为我们没有将其绑定到Hibernate做为实现。后来,我们可以使用另一种JPA实现
在springboot项目中,当你确保下面的依赖项都在类路里面的时候,你可以加载H2控制台。
web启动器
h2
jpa数据启动器
其他的依赖项在下面:
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-data-jpa com.h2database h2 runtime
因为springboot自动配置
添加依赖项
org.springframework.boot spring-boot-starter-data-jpa
spring-boot-stater-data-jpa对于Hibernate和JPA有过渡依赖性。
当springboot在类路径中检测到Hibernate中,将会自动配置它为默认的JPA实现。
以mysql为列
第一步 -把mysql连接器的依赖添加到pom.xml
mysql mysql-connector-java
第二步:从pom.xml中移除H2依赖项
第三步 安装mysql数据库
第四步:配置mysql数据库连接
配置application.properties
spring.jpa.hibernate.ddl-auto=none spring.datasource.url=jdbc:mysql://localhost:3306/todo_example spring.datasource.username=todouser spring.datasource.password=YOUR_PASSWORD
第五步:重新启动
Cannot determine embedded database driver class for database type NONE
把H2添加到pom.xml中,然后重启服务器
com.h2database h2 runtime
当你从数据库读取内容的时候,你想把事物中的用户描述或者是其他描述设置为只读模式,以便于Hebernate不需要再次检查实体的变化,非常高效
@ConfigurationProperties定义一个配置组件
企业应用程序的开发是复杂的,你需要混合的环境:
Dev
QA
Stage
Production
配置文件不是设置环境的关键。
在下面的例子中,我们就会用到俩个配置文件
dev
prod
缺省的应用程序配置在application.properties中。让我们来看下面的列子:
application.properties
basic.value=true basic.message=Dynamic Message basic.number=100
我们想要为dev文件自定义application.properites属性。我们需要创建一个名为application-dev.properties的文件,并且重写我们想要自定义的属性
application-dev.properties
basic.message:Dynamic Messgae in DEV
一旦你特定配置了配置文件,你需要在环境中设定一个活动的配置文件。
有多种方法可以做到这一点:
在vm参数中使用Dspring.profiles.active=prod
在application.properties中使用spring.profiles.active=prod
我们可以像在任何其他库中一样在Maven项目中包含springboot。但是,最好的方法是从spring-boot-starter-parent项目继承并声明依赖于springboot启动器。这样做可以让我们的项目重用springboot默认值。继承spring-boot-starter-parent项目非常简单 我们只需要在pom.xml中指定一个parent元素:
org.springframework.boot spring-boot-starter-parent 2.1.6.RELEASE
我们可以在maven中央仓库找到最新版本的spring-boot-starter-parent。上面的方式很方便但是并不一定符合实际需要。例如公司要求所有项目依赖构建从一个标准BOM开始,我们就不能按上面的方式进行。 在这种情况下,我们可以进行如下引用:
org.springframework.boot spring-boot-dependecies 2.1.6.RELEASE pom import
如果我们要禁用特定的自动配置,我们可以使用 @EnableAutoConfiguration 注解的 exclude 属性来指示它。如下禁用了数据源自动配置
DataSourceAutoConfiguration :
@EnableAutoConfiguration(exclude=DataSourceAutoConfiguration.class) pubic class MyConfiguration{}
如果我们使用@SpringBootApplication注解。它具有@EnableAutoConfiguration作为元注解 我们同样可以配置exclude
属性来禁用
自动配置:
@SpringBootApplication(exclude=DataSourceAutoCOnfiguration.class) public class MyConfiguration{}
我们还可以使用spring.autoconfigure.exclude环境属性禁用自动配置。在application.properties(也可以是application.yml)配置文件设置如下也可以达到同样的目的:
Spring Boot支持外部配置,允许我们在各种环境中运行相同的应用程序。我们可以使用 properties 文件, YAML文件 ,环境变量,系统属性和命令行选项参数来指定配置属性。 然后,我们可以访问使用这些属性@Value注释,经由绑定对象 的 @ConfigurationProperties 注释或 Environment 环境抽象类注入。 以下是最常见的外部配置来源:
命令行属性:命令行选项参数是以双连字符开头的程序参数,例如server.port=8080。springboot将所有参数转换为属性,并将它们添加到环境属性集中。
应用程序属性:应用程序属性是从application.properties文件或其yaml对应文件加载的属性。默认情况下,springboot会在当前目录,类路径根或其config子目录中搜索此文件。特定于配置文件的属性:特定于配置文件的属性从application{profile}.properties文件或其yaml对应文件加载。{profile}占位符是指活性轮廓。这些文件与非特定属性文件位于相同位置,并且优先与非特定属性文件
在为Spring应用程序运行集成测试时,我们必须有一个 ApplicationContext 。 为了简化测试,Spring Boot为测试提供了一个特殊的注释@SpringBootTest 。此批注从其 classes 属性指示的配置类创建 ApplicationContext 。 如果未设置classes属性,Spring Boot将搜索主配置类。搜索从包含测试的包开始,直到找到使用@SpringBootApplication或@SpringBootConfifiguration注释的类。 请注意,如果我们使用 JUnit 4 ,我们必须用 @RunWith(SpringRunner.class) 装饰测试类。
可以直接映射,将index.html放入下面的位置:
classpath:/META-INF/resources/index.html classpath:/resources/index.html classpath:/static/index.html classpath:/public/index.html
springboot静态资源直接映射为/**,可以通过根目录来访问。/META-INF/resources/webjars/映射为/webjars/,通过访问/webjar访问。优先级顺序为:META-INF/resources>resources>static>public。
WebMvcConfifigurerAdapter 实现 WebMvcConfifigurer 接口,常用的可能需要重写的方法有下面几个:
/** 解决跨域问题 **/ public void addCorsMappings(CorsRegistry registry) ; /** 添加拦截器 **/ void addInterceptors(InterceptorRegistry registry); /** 这里配置视图解析器 **/ void configureViewResolvers(ViewResolverRegistry registry); /** 配置内容裁决的一些选项 **/ void configureContentNegotiation(ContentNegotiationConfigurer configurer); /** 视图跳转控制器 **/ void addViewControllers(ViewControllerRegistry registry); /** 静态资源处理 **/ void addResourceHandlers(ResourceHandlerRegistry registry); /** 默认静态资源处理器 **/ void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)
@SpringBootConfifiguration、@EnableAutoConfifiguration、@ComponentScan
Spring Boot Actuator 可以帮助你监控和管理Spring Boot应用,比如健康检查、审计、统计和HTTP追踪等。所有的这些特性可以通过JMX 或者 HTTP endpoints 来获得。 Actuator同时还可以与外部应用监控系统整合,比如 Prometheus , Graphite , DataDog , Influx , Wavefront , New Relic 等。这些系统提供了非常好的仪表盘、图标、分析和告警等功能,使得你可以通过统一的接口轻松的监控和管理你的应用。 Actuator 使用 Micrometer 来整合上面提到的外部应用监控系统。这使得只要通过非常小的配置就可以集成任何应用监控系统。将Spring Boot Actuator集成到一个项目中非常简单。我们需要做的就是在 pom.xml 文件中包含 spring-boot-starter-actuator 启动器:
org.springframework.boot spring-boot-starter-actuator
Spring Boot Actuator 可以使用 HTTP 或 JMX 端点公开操作信息。但是,大多数应用程序都使用 HTTP ,其中端点的标识和/执行器前缀形
成 URL 路径。 以下是Actuator提供的一些最常见的内置端点:
auditevents : 公开审计事件信息
env : 公开环境属性
health : 显示应用程序运行状况信息
httptrace : 显示HTTP跟踪信息
info : 显示任意应用程序信息
metrics : 显示指标信息
mappings : 显示所有@RequestMapping路径的列表
scheduledtasks : 显示应用程序中的计划任务
threaddump : 执行线程转储
beans :所有加载的spring bean