生活加油,

我来不及认真地年轻,待明白过来时,只能选择认真地老去。——三毛

第一章,入门:

Spring概述,虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置, 而且是很多XML配置。Spring 2.5引入了基于注解的组件扫描,Spring 3.0引入了基于Java的配置,这是一种类型安全的可重构配置方式, 可以代替XML:

  1. Spring 1.x 时代,第一阶段:xml配置,

  2. Spring 2.x时代,注解配置.

  3. Spring 3.x时代 Java配置,

Spring框架是一个轻量级的企业级开发的一站式解决方案,即基于Spring解决Java EE开发的所有问题,Spring框架主要提供了IoC容器,AOP,数据访问,Web开发,消息测试等相关的技术的支持.

Spring使用简单的POJO来进行企业级开发,被Spring管理的对象都被称为Bean,使用Spring提供的Ioc容器来初始化对象,解决对象的依赖管理和对象的使用.

为啥要有Springboot:

Spring虽然提供了基于Java的配置,但是在使用的时候,比如springMVC中配置核心控制器(本质是一个Servlet),事务管理,已及第三方库,过滤器等,还是需要使用xml配置,这些配置开发浪费了逻辑开发时间.

项目的管理依赖问题,不同的版本对于不同库直接会造成版本冲突,版本不兼容的问题.

内嵌了tomcat服务器.

Spring框架本身有四大原则:

  1. 使用POJO

  2. 进行轻量级和最小侵入式开发.

  3. 通过依赖注入和基于接口编程实现松耦合

  4. 通过AOP和默认习惯进行声明式编程

  5. 使用Aop和模板减少模块化代码

Spring Framework已有十余年的历史了,已成为Java应用程序开发框架的事实标准。

Spring诞生时是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。无需 开发重量级的Enterprise JavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通 过依赖注入和面向切面编程,用简单的Java对象(Plain Old Java Object,POJO)实现了EJB的功能。

Spring Boot精要 :

  • 自动配置:针对很多Spring应用程序常见的应用功能,Spring Boot能自动提供相关配置,比如DataSource的配置,。

  • 起步依赖:告诉Spring Boot需要什么功能,引入需要的库。基于父子工程的基础,Springboot定义好了版本号. 不必担心版本依赖的问题.

  •  命令行界面:这是Spring Boot的可选特性,借此你只需写代码就能完成完整的应用程序, 无需传统项目构建。Spring Boot CLI利用了起步依赖和自动配置,CLI能检测到你使用了哪些类,它知道要向Classpath中添加哪些起步依赖才 能让它运转起来。一旦那些依赖出现在Classpath中,一系列自动配置就会接踵而来,确保启用 DispatcherServlet和Spring MVC,这样控制器就能响应HTTP请求了。 

  • Actuator:让你能够深入运行中的Spring Boot应用程序,一探究竟。 

Spring Boot不是什么 :

Spring Boot可以把Web应用程 序变为可自执行的JAR文件,不用部署到传统Java应用服务器里就能在命令行里运行。Spring Boot 在应用程序里嵌入了一个Servlet容器(Tomcat、Jetty或Undertow)

Spring Boot也没有实现诸如JPA或JMS(Java Message Service,Java消息服务)之 类的企业级Java规范。它的确支持不少企业级Java规范,但是要在Spring里自动配置支持那些特 性的Bean。例如,Spring Boot没有实现JPA,不过它自动配置了某个JPA实现(比如Hibernate)的 Bean,以此支持JPA.

安装Spring Boot CLI :

使用Spring Initializr初始化 Spring Boot项目 :Spring Initializr从本质上来说就是一个Web应用程序,它能为你生成Spring Boot项目结构。虽 然不能生成应用程序代码,但它能为你提供一个基本的项目结构,以及一个用于构建代码的 Maven或Gradle构建说明文件。你只需要写应用程序的代码就好了.

第二章,开发一个SpringBoot应用

目录结构:

启动引导HrosApplication在Spring Boot应用程序里有两个作用:配置和启动引导(启动类)。

package com.liruilong.hros;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.amqp.core.Queue;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;@SpringBootApplication//开启组件扫描和自动配置
@MapperScan(basePackages ="com.liruilong.hros.mapper" )public class HrosApplication {public static void main(String[] args) {// 负责启动引导应用程序SpringApplication.run(HrosApplication.class, args);}
}

@SpringBootApplication将三个有用的注解组合在了一起。

  • Spring的@Configuration:标明该类使用Spring基于Java的配置。

  • Spring的@ComponentScan:启用组件扫描,这样你写的Web控制器类和其他组件才能被 自动发现并注册为Spring应用程序上下文里的Bean。

  • Spring Boot的@EnableAutoConfiguration:这个不起眼的小注解也可以称为 @Abracadabra,就是这一行配置开启了Spring Boot自动配置

使用起步依赖 

指定基于功能的依赖

Spring Boot通过提供众多起步依赖降低项目依赖的复杂度。起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即 支持某项功能。很多起步依赖的命名都暗示了它们提供的某种或某类功能。

覆盖起步依赖引入的传递依赖 

比如你在使用Springboot中Web起步依赖,他会传递依赖Jackson JSON库,但是你做的是一个前后端不分离的项目,可能不用JSON,把他排除掉,可以为项目瘦身.

在maven里使用:可以用<exclusions>元素来排除传递依赖。<dependency>增加了<exclusions>元素去除Jackson:

<dependency>  <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion><groupId>com.fasterxml.jackson.core</groupId></exclusion></exclusions>
</dependency> 

可以显示选择合适的版本

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.4.3</version>
</dependency> 

使用自动配置 :

专注于应用程序功能 :

我们构建一个简单的应用之后,,有个名为spring-boot-autoconfigure的JAR文件,其中包含了 很多配置类。每个配置类都在应用程序的Classpath里,都有机会为应用程序的配置添砖加瓦

利用了Spring的条件化配置,这是Spring 4.0引入 的新特性。条件化配置允许配置存在于应用程序中,但在满足某些特定条件之前都忽略这个配置。在Spring里可以很方便地编写你自己的条件,你所要做的就是实现Condition接口,覆盖它 的matches()方法。举例来说,下面这个简单的条件类只有在Classpath里存在JdbcTemplate时 才会生效

package readinglist;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata; public class JdbcTemplateCondition implements Condition {  @Override
public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata){  try {    context.getClassLoader().loadClass( "org.springframework.jdbc.core.JdbcTemplate");return true;} catch (Exception e) {return false;}}
}
//当你用Java来声明Bean的时候,可以使用这个自定义条件类:
@Conditional(JdbcTemplateCondition.class) public MyService myService() {     ... } 

只有当JdbcTemplateCondition类的条件成立时才会创建MyService这个 Bean。也就是说MyService Bean创建的条件是Classpath里有JdbcTemplate.

DataSourceAutoConfiguration中的配置:

@Configuration@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@EnableConfigurationProperties(DataSourceProperties.class)@Import({ Registrar.class, DataSourcePoolMetadataProvidersConfiguration.class })
public class DataSourceAutoConfiguration { ... } 

DataSourceAutoConfiguration上添加了@ConditionalOnClass注解,要求Classpath里必须要有DataSource和 EmbeddedDatabaseType。如果它们不存在,条件就不成立,DataSourceAutoConfiguration 提供的配置都会被忽略掉。 DataSourceAutoConfiguration里嵌入了一个JdbcTemplateConfiguration类,自动 配置了一个JdbcTemplate Bean:

@Configuration
@Conditional(DataSourceAutoConfiguration.DataSourceAvailableCondition.class)
protected static class JdbcTemplateConfiguration { @Autowired(required = false)private DataSource dataSource; @Bean@ConditionalOnMissingBean(JdbcOperations.class)public JdbcTemplate jdbcTemplate() {     return new JdbcTemplate(this.dataSource);   } ... } 

这个方法上还加了@ConditionalOnMissingBean注解,因此只有在不存在JdbcOperations(即JdbcTemplate实现的接口)类型的Bean时,才会创建JdbcTemplate Bean。

自动配置,配置决策:

  • 因为Classpath里有Spring MVC(归功于Web 起步依赖),所以会配置Spring的 DispatcherServlet并启用Spring MVC。

  • 因为这是一个Spring MVC Web应用程序,所以会注册一个资源处理器,把相对于Classpath 根目录的/static目录里的静态内容提供出来。(这个资源处理器还能处理/public、/resources 和/META-INF/resources的静态内容。)

  • 因为Classpath里有Tomcat(通过Web起步依赖传递引用),所以会启动一个嵌入式的Tomcat 容器,监听8080端口

  • .........

第三章,自定义配置

覆盖Spring Boot自动配置 :

应用程序添加Spring Security:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency> 

创建自定义的安全配置

在Spring Security的场景下,这意味着写 一个扩展了WebSecurityConfigurerAdapter的配置类,重写该类的configure,和方法.

package com.liruilong.hros.config;import com.fasterxml.jackson.databind.ObjectMapper;
import com.liruilong.hros.filter.VerifyCodeFilter;
import com.liruilong.hros.model.Hr;
import com.liruilong.hros.model.RespBean;
import com.liruilong.hros.service.HrService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.*;
import org.springframework.security.config.annotation.ObjectPostProcessor;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;/*** @Description :* @Author: Liruilong* @Date: 2019/12/18 19:11*/@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@AutowiredHrService hrService;@AutowiredCustomFilterInvocationSecurityMetadataSource customFilterInvocationSecurityMetadataSource;@AutowiredCustomUrlDecisionManager customUrlDecisionManager;@AutowiredVerifyCodeFilter verifyCodeFilter ;@AutowiredMyAuthenticationFailureHandler myAuthenticationFailureHandler;@Overrideprotected void configure(HttpSecurity http) throws Exception {http.addFilterBefore(verifyCodeFilter, UsernamePasswordAuthenticationFilter.class).authorizeRequests()//.anyRequest().authenticated()//所有请求的都会经过这进行鉴权处理。返回当前请求需要的角色。.withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {@Overridepublic <O extends FilterSecurityInterceptor> O postProcess(O object) {object.setSecurityMetadataSource(customFilterInvocationSecurityMetadataSource);object.setAccessDecisionManager(customUrlDecisionManager);return object;}}).and().formLogin().usernameParameter("username").passwordParameter("password")//设置登录请求的url路径.loginProcessingUrl("/doLogin")/*需要身份验证时,将浏览器重定向到/ login我们负责在请求/ login时呈现登录页面当身份验证尝试失败时,将浏览器重定向到/ login?error(因为我们没有另外指定)当请求/ login?error时,我们负责呈现失败页面成功注销后,将浏览器重定向到/ login?logout(因为我们没有另外指定)我们负责在请求/ login?logout时呈现注销确认页面*/.loginPage("/login")//登录成功回调.successHandler(new AuthenticationSuccessHandler() {@Overridepublic void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {httpServletResponse.setContentType("application/json;charset=utf-8");PrintWriter out = httpServletResponse.getWriter();Hr hr = (Hr) authentication.getPrincipal();//密码不回传hr.setPassword(null);RespBean ok = RespBean.ok("登录成功!", hr);//将hr转化为StingString s = new ObjectMapper().writeValueAsString(ok);out.write(s);out.flush();out.close();}})//登失败回调.failureHandler(myAuthenticationFailureHandler)//相关的接口直接返回.permitAll().and().logout()//注销登录.logoutSuccessHandler(new LogoutSuccessHandler() {@Overridepublic void onLogoutSuccess(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,Authentication authentication) throws IOException, ServletException {httpServletResponse.setContentType("application/json;charset=utf-8");PrintWriter out = httpServletResponse.getWriter();out.write(new ObjectMapper().writeValueAsString(RespBean.ok("注销成功!")));out.flush();out.close();}}).permitAll().and().csrf().disable().exceptionHandling()//没有认证时,在这里处理结果,不要重定向.authenticationEntryPoint(//myAuthenticationEntryPoint;new AuthenticationEntryPoint() {@Overridepublic void commence(HttpServletRequest req, HttpServletResponse resp, AuthenticationException authException) throws IOException, ServletException {resp.setContentType("application/json;charset=utf-8");resp.setStatus(401);PrintWriter out = resp.getWriter();RespBean respBean = RespBean.error("访问失败!");if (authException instanceof InsufficientAuthenticationException) {respBean.setMsg("请求失败,请联系管理员!");}out.write(new ObjectMapper().writeValueAsString(respBean));out.flush();out.close();}});}@BeanPasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(hrService);}/*** @Author Liruilong* @Description  放行的请求路径* @Date 19:25 2020/2/7* @Param [web]* @return void**/@Overridepublic void configure(WebSecurity web) throws Exception {web.ignoring().antMatchers("/auth/code","/login","/css/**","/js/**", "/index.html", "/img/**", "/fonts/**","/favicon.ico");}
}

覆盖Spring Boot的自动配置,你所要做的仅仅是编写一个显式的配置。 Spring Boot会发现你的配置,随后降低自动配置的优先级,以你的配置为准。

在SecurityConfig里,第一个configure()方法指明, “/”(ReadingListController 的方法映射到了该路径)的请求只有经过身份认证且拥有READER角色的用户才能访问。其他的 所有请求路径向所有用户开放了访问权限。

第二个 configure()方法设置了一个自定义的UserDetailsService,这个服务可以是任意实现了 UserDetailsService的类,用于查找指定用户名的用户。

用户需要实现了UserDetails接口以及其中的方法,这样Reader就能代表 Spring Security里的用户了。getAuthorities()方法被覆盖过了,始终会为用户授予READER 权限。isAccountNonExpired()、 isAccountNonLocked()、isCredentialsNonExpired() 和isEnabled()方法都返回true,这样读者账户就不会过期,不会被锁定,也不会被撤销。

关于Spring Security,自动配置会考虑几个配置类。在这里讨论每个配置类的细节是不切实 际的,但覆盖Spring Boot自动配置的安全配置时,重要的一个类是SpringBootWebSecurity- Configuration。以下是其中的一个代码片段:

@Configuration@EnableConfigurationProperties@ConditionalOnClass({ EnableWebSecurity.class })
@ConditionalOnMissingBean(WebSecurityConfiguration.class)
@ConditionalOnWebApplicationpublic class SpringBootWebSecurityConfiguration { ... }

SpringBootWebSecurityConfiguration上加了好几个注解。

  • @Condi- tionalOnClass注解后,你就应该知道Classpath里必须要有@EnableWebSecurity注解。
  • @ConditionalOnWebApplication 说明这必须是个Web 应用程序。
  • @ConditionalOn- MissingBean注解才是我们的安全配置类代替SpringBootWebSecurityConfiguration的关 键所在。
  • @ConditionalOnMissingBean注解要求当下没有WebSecurityConfiguration类型的 Bean。虽然表面上我们并没有这么一个Bean,但通过在SecurityConfig上添加@EnableWeb- Security注解,我们实际上间接创建了一个WebSecurityConfiguration Bean。所以在自动 配置时,这个Bean就已经存在了,@ConditionalOnMissingBean条件不成立,SpringBoot- WebSecurityConfiguration提供的配置就被跳过了。

通过属性文件外置配置

Spring Boot自动配置的Bean提供了300多个用于微调的属性。当你调整设置时,只 要在环境变量、Java系统属性、JNDI(Java Naming and Directory Interface)、命令行参数或者属 性文件里进行指定就好了

比如你想禁用Banner有以下方法:

  1. 命令行方式:$ java -jar readinglist-0.0.1-SNAPSHOT.jar --spring.main.show-banner=false

  2. application.properties的文件:spring.main.show-banner=false

  3. 为application.yml的YAML文件:spring:   main:     show-banner: false

  4. 将属性设置为环境变量:$ export spring_main_show_banner=false

Spring Boot应用程序有多种设置途径。Spring Boot能从多种属性源获得属性,

  • (1) 命令行参数

  • (2) java:comp/env里的JNDI属性

  • (3) JVM系统属性

  • (4) 操作系统环境变量

  • (5) 随机生成的带random.*前缀的属性(在设置其他属性时,可以引用它们,比如${random. long})

  • (6) 应用程序以外的application.properties或者appliaction.yml文件

  • (7) 打包在应用程序内的application.properties或者appliaction.yml文件

  • (8) 通过@PropertySource标注的属性源

  • (9) 默认属性 这个列表按照优先级排序,也就是说,任何在高优先级属性源里设置的属性都会覆盖低优先 级的相同属性。例如,命令行参数会覆盖其他属性源里的属性。

  • application.properties和application.yml文件能放在以下四个位置。

    • (1) 外置,在相对于应用程序运行目录的/config子目录里。

    • (2) 外置,在应用程序运行的目录里。

    • (3) 内置,在config包内。

    • (4) 内置,在Classpath根目录

自动配置微调 :

配置嵌入式服务器 ;

第一步就是用JDK的 keytool工具来创建一个密钥存储(keystore)

$ keytool -keystore mykeys.jks -genkey -alias tomcat -keyalg RSA
server.port=8443
server.ssl.key-password=liruilong
server.ssl.key-store-password=liruilong
server.ssl.key-store=file:///hros/mykeys.jks

 禁用模板缓存 :

Thymeleaf模板的变更是不会生效的。这是因为Thymeleaf模板默认缓存。这有助于改善应用程序 的性能,因为模板只需编译一次,但在开发过程中就不能实时看到变更的效果了

spring.thymeleaf.cache=false

其他模板:

 spring.freemarker.cache(Freemarker)  spring.groovy.template.cache(Groovy模板)  spring.velocity.cache(Velocity)

 配置日志 :

要设置日志级别,你可以创建以logging.level开头的属性,后面是要日志名称。如果根 日志级别要设置为WARN,但Spring Security的日志要用DEBUG级别,

logging.level.com.liruilong.hros.mapper=debug
logging.level.root=WARN
logging.level.org.springframework.security=DEBUG

可以把日志写到指定的文件夹:logging. path和loggin.file属性.

logging.config属性指定自定义的名字

logging.config.classpath=logging-config.xml 

配置数据源 

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.password=mysql
spring.datasource.url=jdbc:mysql://39.97.241.18:3306/vhr?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai

server.port=8443
server.ssl.key-password=liruilong
server.ssl.key-store-password=liruilong
server.ssl.key-store=file:///hros/mykeys.jks#数据源配置
#MySQL配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.password=mysql
spring.datasource.url=jdbc:mysql://39.97.241.18:3306/vhr?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaispring.security.user.name=user1
spring.security.user.password=password1#日志处理
# 打印sql语句
logging.level.com.liruilong.hros.mapper=debug
logging.level.root=WARN
logging.level.org.springframework.security=DEBUG# 指定映射文件的位置
mybatis.mapper-locations=classpath:com/liruilong/hros/mapper/*Mapper.xmlspring.servlet.multipart.max-file-size=64000MB
spring.servlet.multipart.max-request-size=-1Redis
Redisspring.redis.host=localhost
spring,redis.database  = 0
spring.redis.port=6379
spring.redis.password=liruilongspring.mail.host=smtp.qq.com
spring.mail.protocol=smtp
spring.mail.default-encoding=UTF-8
spring.mail.password=dfssxgsqfiilcbef
spring.mail.username=1654687517@qq.com
spring.mail.port=465
spring.mail.properties.mail.stmp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.smtp.socketFactory.port=465
spring.mail.properties.mail.smtp.socketFactory.fallback=falsespring.mail.properties.mail.debug=truespring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.host=39.97.241.18
spring.rabbitmq.port=5672

应用程序 Bean的配置外置

amazon.associateId=habuma-20

在一个类里收集属性

package readinglist;  import org.springframework.boot.context.properties.                               ConfigurationProperties;import org.springframework.stereotype.Component; @Component
//注入带amazon 前缀的属性 @ConfigurationProperties("amazon")public class AmazonProperties { private String associateId; public void setAssociateId(String associateId) {      this.associateId = associateId;   } public String getAssociateId() {     return associateId;   } } 

使用Profile进行配置

为不同的部署环境配置不同的属性

Spring Framework从 Spring 3.1开始支持基于Profile的配置。Profile是一种条件化配置,基于运行时激活的Profile,会 使用或者忽略不同的Bean或配置类

安全配置是针对生产环境的,而自动配置的安全配置用在开发环境刚刚好,所以我们需要在开发环境下,屏蔽SecurityConfig

@Profile("production")@Configuration@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter { ... }

spring.profiles.active=production

使用特定于Profile的属性文件 

如果你正在使用application.properties,可以创建额外的属性文件,遵循application-{profile}. properties这种命名格式,这样就能提供特定于Profile的属性了

  1. 开发环境的配置可以放在名为application-development.properties的文件 
  2. 对于生产环境,application-production.properties会将日志级别设置为WARN或更高级别

使用多Profile YAML文件进行配置

logging:level:root: INFO --- spring:profiles: development logging:level:root: DEBUG --- spring:profiles: production logging:path: /tmp/file: BookWorm.loglevel:root: WARN 

application.yml文件分为三个部分,使用一组三个连字符(---)作为分隔符。

  • 第二段中定义的属性应用于开发环境,因为spring.profiles设置为 development。
  • 第三段的spring.profile设置为production,在production Profile被激活时生效。
  • 第一段并未指定spring.profiles,因此这里的属性对全部Profile都生效,或 者对那些未设置该属性的激活Profile生效。

定制应用程序错误页面 :

Spring Boot默认提供这个“白标”(whitelabel)错误页,这是自动配置的一部分。

Spring Boot自动配置的默认错误处理器会查找名为error的视图,如果找不到就用默认的白标 错误视图,创建一个自定义视图,让解析出的视图名为 error。

 
 取决于错误视图解析时的视图解析器。

  •  实现了Spring的View接口的Bean,其 ID为error(由Spring的BeanNameViewResolver 所解析)。
  •  如果配置了Thymeleaf,则有名为error.html的Thymeleaf模板。
  •  如果配置了FreeMarker,则有名为error.ftl的FreeMarker模板。
  •  如果配置了Velocity,则有名为error.vm的Velocity模板。
  •  如果是用JSP视图,则有名为error.jsp的JSP模板。 

把该文件放在src/main/resources/ templates中,运行时它就在Classpath的根目录里。

Spring Boot会为错误视图提供如下错误属性。

  •  timestamp:错误发生的时间。
  •  status:HTTP状态码。
  •  error:错误原因。
  •  exception:异常的类名。
  •  message:异常消息(如果这个错误是由异常引起的)。
  •  errors:BindingResult异常里的各种错误(如果这个错误是由异常引起的)。
  •  trace:异常跟踪信息(如果这个错误是由异常引起的)。
  •  path:错误发生时请求的URL路径。

Spring Boot消除了Spring应用程序中经常要用到的很多样板式配置。让Spring Boot处理全部配置,你可以仰仗它来配置那些适合你的应用程序的组件。当自动配置无法满足需求时,Spring Boot允许你覆盖并微调它提供的配置。 

覆盖自动配置其实很简单,就是显式地编写那些没有Spring Boot时你要做的Spring配置。 Spring Boot的自动配置被设计为优先使用应用程序提供的配置,然后才轮到自己的自动配置。 

第四章,测试,

嗯,以后再看啦!

第五章,Groovy与Spring Boot CLI

Spring Boot CLI。这是一个命令行工具,将强大的Spring Boot和Groovy 结合到一起,针对Spring应用程序形成了一套简单而又强大的开发工具。为了演示Spring Boot

第6章,在Spring Boot中使用Grails

第7章,深入Actuator

Spring Boot的Actuator。它提供了很多生产级的特性,比如监控和度 量Spring Boot应用程序。Actuator的这些特性可以通过众多REST端点、远程shell和JMX获得。我 们先来看看Actuator的REST端点,

揭秘Actuator的端点

端点可以分为三大类:配置端点、度量端点和其他端点。

查看配置明细

第八章,部署Spring Boot应用程序

常规部署: Java -jar xx.jar

云部署:基于Docker

嗯嗯,有时间在看,生活加油.

《SpringBoot实战》读书笔记相关推荐

  1. 读书笔记 | 墨菲定律

    1. 有些事,你现在不做,永远也不会去做. 2. 能轻易实现的梦想都不叫梦想. 3.所有的事都会比你预计的时间长.(做事要有耐心,要经得起前期的枯燥.) 4. 当我们的才华还撑不起梦想时,更要耐下心来 ...

  2. 读书笔记 | 墨菲定律(一)

    1. 有些事,你现在不做,永远也不会去做. 2. 能轻易实现的梦想都不叫梦想. 3.所有的事都会比你预计的时间长.(做事要有耐心,要经得起前期的枯燥.) 4. 当我们的才华还撑不起梦想时,更要耐下心来 ...

  3. 洛克菲勒的38封信pdf下载_《洛克菲勒写给孩子的38封信》读书笔记

    <洛克菲勒写给孩子的38封信>读书笔记 洛克菲勒写给孩子的38封信 第1封信:起点不决定终点 人人生而平等,但这种平等是权利与法律意义上的平等,与经济和文化优势无关 第2封信:运气靠策划 ...

  4. 股神大家了解多少?深度剖析股神巴菲特

    股神巴菲特是金融界里的传奇,大家是否都对股神巴菲特感兴趣呢?大家对股神了解多少?小编最近在QR社区发现了<阿尔法狗与巴菲特>,里面记载了许多股神巴菲特的人生经历,今天小编简单说一说关于股神 ...

  5. 2014巴菲特股东大会及巴菲特创业分享

     沃伦·巴菲特,这位传奇人物.在美国,巴菲特被称为"先知".在中国,他更多的被喻为"股神",巴菲特在11岁时第一次购买股票以来,白手起家缔造了一个千亿规模的 ...

  6. 《成为沃伦·巴菲特》笔记与感想

    本文首发于微信公众帐号: 一界码农(The_hard_the_luckier) 无需授权即可转载: 甚至无需保留以上版权声明-- 沃伦·巴菲特传记的纪录片 http://www.bilibili.co ...

  7. 读书笔记002:托尼.巴赞之快速阅读

    读书笔记002:托尼.巴赞之快速阅读 托尼.巴赞是放射性思维与思维导图的提倡者.读完他的<快速阅读>之后,我们就可以可以快速提高阅读速度,保持并改善理解嗯嗯管理,通过增进了解眼睛和大脑功能 ...

  8. 读书笔记001:托尼.巴赞之开动大脑

    读书笔记001:托尼.巴赞之开动大脑 托尼.巴赞是放射性思维与思维导图的提倡者.读完他的<开动大脑>之后,我们就可以对我们的大脑有更多的了解:大脑可以进行比我们预期多得多的工作:我们可以最 ...

  9. 读书笔记003:托尼.巴赞之思维导图

    读书笔记003:托尼.巴赞之思维导图 托尼.巴赞的<思维导图>一书,详细的介绍了思维发展的新概念--放射性思维:如何利用思维导图实施你的放射性思维,实现你的创造性思维,从而给出一种深刻的智 ...

  10. 产品读书《滚雪球:巴菲特和他的财富人生》

    作者简介 艾丽斯.施罗德,曾经担任世界知名投行摩根士丹利的董事总经理,因为撰写研究报告与巴菲特相识.业务上的往来使得施罗德有更多的机会与巴菲特亲密接触,她不仅是巴菲特别的忘年交,她也是第一个向巴菲特建 ...

最新文章

  1. 「镁客·请讲」智加科技刘万千:技术与生态的成熟将推动自动驾驶的落地应用...
  2. lottie 导出html,Lottie Web动效基本原理
  3. 4-8岁那些最难的数学概念,美国老师用一套绘本让孩子秒懂
  4. jzoj4671-World Tour【图论,bfs】
  5. 软件工程:汇编语言和C语言在软件工程的应用,计算机学生必看!
  6. MapReduce入门和优化方案
  7. 力扣110. 平衡二叉树(JavaScript)
  8. cf 165 div2 解题报告
  9. Atitit 在线支付系统功能设计原理与解决方案 与目录
  10. Python新闻网站项目-3.Gerapy爬虫分布式部署
  11. 统计过程控制图SPC(2)
  12. Android之布局详解
  13. spring boot + Spring Security 入门
  14. ardupiolt AP_AHRS库类的分析(一)AP_AHRS_NavEKF
  15. 公共数据库介绍~google公共数据
  16. vc 键盘按键KeyValue值
  17. 英语词源基础之后缀-ion详解: -ion,-tion,-ction,-ption,-ation,-ition的区别
  18. .net对Excel表数据读写操作
  19. 全球及中国组织工程医疗产品行业深度分析及十四五前景预测报告2022年版
  20. CentOS 7 下Kubernetes 1.16.4安装

热门文章

  1. java计算机毕业设计html5健身房信息管理系统源码+数据库+系统+lw文档
  2. 通俗理解ROC曲线(Receiver Operating Characteristic Curve)
  3. 共享充电宝的终局:金钱游戏
  4. 不占广告位增加网站收入揭秘
  5. 多功能Python键盘记录工具Radium
  6. 将selinux=enforing设置好过后,重启Linux管理员账号不能登陆
  7. C++的游戏--贪吃蛇
  8. String与Date的类型转换
  9. 你是外包,麻烦不要偷吃零食。。注意素质!
  10. 教你从0开始部署华为云服务器_华为云服务器搭建