说明

本文样例说明仅适用 maven 环境和语法,但所述内容也适用 gradle

原文地址:https://www.cnblogs.com/qnlcy/p/15905544.html

一、日志

1. logback

日志默认为 slf4j + logback 框架,引入如下 jar 之后,就自动引入了 logback

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

默认配置文件名称如下,在 classpath 目录下存在对应文件名即可,无需额外通过配置指定

  • logback-spring.xml (官方推荐,可以添加 spring boot 的 springProfile 配置项)
  • logback.xml

2. log4j2

请在大流量应用当中使用 log4j2 而不是使用 log4jlog4j 在并发写文件上有严重的性能问题,而且,她已经退役了。

首先要排除默认日志框架 logback ,如下为样例代码

请不要照抄到项目当中而带来不必要的 spring-boot-starter-web 及其系列 web 功能的引用

你需要掌握的是如何排除一个 jar 和引入另外一个 jar

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

默认配置文件名称如下,同样在 classpath 目录下存在对应文件名即可,无需额外通过配置指定

  • log4j2-spring.xml(官方推荐,可以添加 spring boot 的 springProfile 配置项)
  • log4j2.xm

二、项目配置文件

1. 配置文件路径

springboot 默认从如下位置加载配置文件,按 优先级 排序为

  1. 当前 jar 目录下的 config 子目录
  2. 当前 jar 目录下的 config/* 目录,注意,此时会合并 config 的子目录下的所有 application 配置文件
  3. 当前 jar 目录
  4. classpath 下的 config 目录
  5. classpath 目录

找寻的 默认配置文件 名称,优先级 为:

  1. application.properties
  2. application.yml
  3. application.yaml

相同配置属性下,优先级高的配置会覆盖优先级低的配置,但是不同的配置属性会合并

比如,在 applicaiton.properties 里有:

name=qnlcy

application.yml 里有:

name: cnblog
age: 18

这时候,spring 读取到的 nameage 值分别为 qnlcy18

2. 环境配置

指定 spring 加载的环境,可以使用如下配置

yml / yaml

spring:
profiles:
active: dev

properties

spring.profiles.active=dev

命令行参数形式

-Dspring.profiles.active=dev
#或
--spring.profiles.active=dev

然后 spring 会在 上述 第1小节 配置文件目录 下,同样 优先 查找对应的如下文件

  1. application-${profiles}.properties
  2. application-${profiles}.yml
  3. application-${profiles}.yaml

对应上述配置,找寻的配置文件即为:application-dev.propertiesapplication-dev.ymlapplication.yaml

三、spring默认依赖介绍和项目划分

项目可以粗略划分为

  • web 项目
  • 非 web 项目

两种类型的项目,如果使用 spring 管理依赖版本,则 pom.xml 需要加上 <parent> 相关配置:

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
</parent>

这里默认使用 spring 管理依赖版本,各个项目也应当继承 spring-boot-starter-parent, 下面不再写各个依赖的版本

1. 非web项目

先说下非 web 项目,非 web 项目使用 springboot,只需要引入如下 jar 即可

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

它显式依赖如下包:

  • spring-boot springboot项目核心包
  • spring-boot-autoconfigure springboot项目的自动配置包,包含datasource、http、session等等等自动配置相关代码
  • spring-boot-starter-logging springboot项目的日志包,默认实现为 logback
  • spring-core spring核心包

其中,spring-boot-autoconfigure 又自动依赖 spring-boot

spring-boot 依赖 springframework 的系列包,其依赖及其子依赖分别为

  • spring-context
  • spring-beans
  • spring-core
  • spring-aop
  • spring-expresion

2. web项目

web项目引用如下 jar 即可

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

它显式依赖了如下 jar

  • spring-boot-starter
  • spring-boot-starter-json 这里引入 jackson
  • spring-boot-starter-tomcat 默认内置 tomcat,切换web容器时候需要排除此包
  • spring-webmvc
  • spring-web

传统的 dubbo 服务提供者项目、RocketMq 消息消费服务、批处理服务,就不要再引用 spring-boot-starter-web 包了,它默认会引入 web 容器,并开放 web 服务和端口,这是危险和不必要的

四、springboot 启动类和其注解

1. 启动类

springboot 的启动类不能直接放在 src/main/java 目录下,即:

springboot 的启动类的 包路径 不能为空

如果这样做的话,会出现意想不到的错误,感兴趣的同学可以试一下。

通常的,我们会把启动类放到诸如 com.xxx.xxx 之类顶级路径下,如:com.xxx.xxx.App.class

然后再在顶级路径下新建如 configbusinessutilsconstantenums 之类的包,结构如下:

com.xxx.xxx
+ config/
+ business/
+ utils/
+ constant/
+ enums/
App.class

spring 默认会自动扫描启动类的同级目录及其子目录下的 spring bean 定义,并装载到 spring 容器当中

因此,如果要引用外部包内的 spring bean ,则需要通过如下方式告知包扫描路径给 spring

@SpringBootApplication
@ComponentScan({"com.xxx.yyy","com.xxx.zzz"})
public class Application {
  public static void main(String[] args) {
  SpringApplication.run(Application.class, args);
  }
}

其中,com.xxx.zzz 为风控 jar 包的路径,在注解 @ComponentScan 当中添加该路径,即可使用该 jar 包内的 spring bean 组件

2. 启动类注解

通常,springboot 启动类注解只需要一个 @SpringBootApplication 即可,观其定义,可以发现,它自动包含了 @ComponentScan@EnableAutoConfiguration 等注解,已经包含 包扫描自动配置 功能

//...
@EnableAutoConfiguration
@ComponentScan(
//...
)
public @interface SpringBootApplication {
//...
}

关于 dubbo

如果使用 dubbo 包里的 @Service (注意不是 spring 的 @Service)@Reference 来暴露和引用服务,则需手动开启 dubbo 功能,来使 dubbo 扫描到上述注解开启的 dubbo 服务

@SpringBootApplication
@EnableDubbo
public class Application {
public static void main(String[] args) {
  SpringApplication.run(Application.class, args);
}
}

如果 dubbo 服务不在当前项目路径下,则额外添加 @DubboComponentScan({"com.xxx.xxx"}) 注解来指定 dubbo 扫描路径

通常我们使用 xml 配置文件的形式来归纳 dubbo 的相关服务,此时,只要在 spring 启动时候,把 dubbo bean 相关配置引入到 spring 容器中即可。

常用做法如下,定义个 springboot 配置类来导入 dubbo bean

@Configuration
@ImportResource({"classpath:dubbo/config.xml", "classpath:dubbo/consumer.xml", "classpath:dubbo/provider.xml"})
public class DubboConfig { }

关于事务

如果引用了 spring-jdbc 并且配置了 DataSource,则 springboot 默认会开启事务支持,不需要再使用 @EnableTransactionManagement 显式开启事务了

五、MVC中的错误处理

在 web 项目当中,springboot 对异常粗略划分,可以有如下处理

  • 使用 @ControllerAdvice + @ExceptionHandler 来处理已到达controller层级的业务异常
  • 自定义 error controller 来处理其他系统级异常

感兴趣的同学可以追踪 DispatcherServlet.doDispatch() 方法来查看具体错误处理过程

1. ControllerAdvice 的用法

在项目当中,使用 @ControllerAdvice 注解指定一个 异常处理器,它自动交给了 spring 管理,其本质是一个 spring bean

@ControllerAdvice
public class ExceptionResolver { //因为是 spring bean,所以可以注入自己需要的资源 @ExceptionHandler(value = BusinessException.class) //指定拦截的异常
@ResponseBody //指定返回页面为json串
//方法名可以自定义,但参数不能变,可选参数尚有 HttpServletRequest
public String businessExceptionHandler(HandlerMethod handlerMethod, Exception e) throws Exception {
//处理异常
} //可以定义多个异常处理方法,spring 会自动寻找对应的异常处理器
//切记最后要有一个处理Exception的兜底 @ExceptionHandler(value = Exception.class)
@ResponseBody
public String defaultErrorHandler(HandlerMethod handlerMethod, Exception e) throws Exception {
}
}

2. 自定义 error controller 来处理其他系统级异常

在出现 controller 层级之外的异常之后,springboot加载的内置容器会转发异常到 springboot 指定的 errorPath 路径上,默认为 /error ,可以通过如下配置修改

server.error.path=/err1

转发过来的请求可以这样处理

@Controller
@RequestMapping("/err1") //上述定义的错误路径
public class CustomErrorController{ @RequestMapping(produces = "text/html")
public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
//request中含有 状态码 和 错误信息
return new ModelAndView("500.html");
}
}

六、JSON

springboot 支持三种 JSON 框架,默认为 Jackson

1. Jackson

当项目当中引入了 spring-boot-starter-json 包后, springboot 会自动创建一个 ObjectMapper bean 来使用。可以通过 spring.jackson 的相关配置来 定义该 bean,祥见 org.springframework.boot.autoconfigure.jackson.JacksonProperties

2. Gson

当项目当中引入了 Gson 包后,springboot 会自动创建一个 Gson bean。通过 spring.gson 的相关配置或 GsonBuilderCustomizer 来定义该 bean

3. JSON-B

JSON-b 是一种 json api 规范,当 javax.json-api jar包存在项目当中,并且其实现类也存在,Springboot就会创建一个 Jsonb 来使用。这种不常见,不再介绍。

七、测试

1. 单元测试

使用单元测试,需引用 spring-boot-starter-test,并指定其范围为 test

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<!-- 如果是junit5 则排除如下依赖 -->
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>

maven 管理的依赖对其 scope 做了划分,有如下几种

编译 测试 打包 运行 说明
compile 默认的范围
test √(测试代码) × × 如:junit
runtime × 如:jdbc驱动
provided × × 运行时使用别的包代替,如:servlet-api,在tomcat容器中已有此包
system × × 跟provided相同,只不过从本地文件系统拉包,而不是从maven仓库(本地和远程)拉取

创建 test 类,使用 @SpringBootTest 注解来声明该类为测试类


//@@RunWith(SpringRunner.class) 如果使用 junit4 则需要添加此注解,junit5 则不再需要
@SpringBootTest //不用再指定启动类,springboot 会自动找到启动类并启动 spring
public class PaHttpServiceTest { //可以正常引用其他 spring 资源 //方法必须为public,返回值必须为 void , junit5 可以不写 public
@Test
public void testHttp() {
//
}
}

2. benchmark 基准测试

此类测试为代码性能测试服务,不适用与业务测试。此类测试会分析每个基准测试方法的单位时间吞吐量、执行耗时等,方便我们提升自己代码的性能。

引入相关依赖

<!-- JMH-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<encoding>UTF-8</encoding>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target> <jmh.version>1.21</jmh.version>
</properties> <dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>${jmh.version}</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
<scope>provided</scope>
</dependency>

创建测试类,main 方法执行,所有被注解 @Benchmark 标注的方法都会进行性能测试

@BenchmarkMode(Mode.Throughput)  //基准测试类型。这里选择的是吞吐量
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) //预热,轮数:5轮,每次预热时间:1,单位:秒(默认)
@Measurement(iterations = 10, time = 5, timeUnit = TimeUnit.SECONDS) //进行10轮测试,每次时间:5,单位,秒
@Threads(8) //一般CPU*2 每个fork所用的线程数量
@Fork(2) //JMH分出2个 “进程”进行测试
@OutputTimeUnit(TimeUnit.NANOSECONDS) //基准测试结果里面的时间类型
public class StringAppend { public static void main(String[] args) throws RunnerException {
Options options = new OptionsBuilder()
.include(StringAppend.class.getSimpleName())
.build();
new Runner(options).run();
} @Benchmark
public void testStringAdd() {
String a = "";
for (int i = 0; i < 10; i++) {
a += i;
}
} }

下面测试结果说明,平均每纳秒,能执行4次

方法名 测试类型 测试次数 得分 错误 单位
StringAppend.testStringAdd thrpt 4 0.010 ± 0.001 ops/ns

Springboot 的一些默认配置规则的更多相关文章

  1. 【快学springboot】6.WebMvcConfigurer配置静态资源和解决跨域

    勘误 有个朋友说:为什么我配置了WebMvcConfigurer,静态资源static依然能访问?! 这里是本人的失误,我在启动类中添加了EnableWebMvc注解(文章里却没有提及,最好的做法是放 ...

  2. Springboot中以配置类方式自定义Mybatis的配置规则(如开启驼峰映射等)

    什么是自定义Mybatis的配置规则? 答:即原来在mybatis配置文件中中我们配置到<settings>标签中的内容,如下第6-10行内容: 1 <?xml version=&q ...

  3. SpringBoot 2.0 编程方式配置,不使用默认配置方式

    SpringBoot的一般配置是直接使用application.properties或者application.yml,因为SpringBoot会读取.perperties和yml文件来覆盖默认配置: ...

  4. springboot 入门二- 读取配置信息一

    在上篇入门中简单介绍下springboot启动使用了大量的默认配置,在实际开发过程中,经常需要启动多个服务,那端口如何手动修改呢? 此篇就是简单介绍相关的配置文件信息. Spring Boot允许外部 ...

  5. springboot情操陶冶-web配置(二)

    承接前文springboot情操陶冶-web配置(一),在分析mvc的配置之前先了解下其默认的错误界面是如何显示的 404界面 springboot有个比较有趣的配置server.error.whit ...

  6. Springboot学习03-SpringMVC自动配置

    Springboot学习03-SpringMVC自动配置 前言 在SpringBoot官网对于SpringMVCde 自动配置介绍 1-原文介绍如下: Spring MVC Auto-configur ...

  7. 【玩转SpringBoot】给自动配置来个整体大揭秘

    上一篇文章中提到的条件注解,只是自动配置整体解决方案中的一个环节而已,可以说是管中窥豹. 本文就逐步擦除迷雾,让整体浮现出来,这样就会有一个宏观的认识. 除了写代码之外,还能干点什么? 提到“配置”这 ...

  8. springboot笔记-1.自动化配置的关键

    最近发现看过的东西容易忘,但是写一遍之后印象倒是会深刻的多. 总所周知springboot极大的简化了java开发繁琐性,而其最大的优势应该就是自动化配置了.比如要使用redis,我们直接引入相关的包 ...

  9. SpringBoot的外部化配置最全解析!

    目录 SpringBoot中的配置解析[Externalized Configuration] 本篇要点 一.SpringBoot官方文档对于外部化配置的介绍及作用顺序 二.各种外部化配置举例 1.随 ...

  10. SpringBoot多数据源详细配置与使用(包含数据源和事务配置)

    SpringBoot项目数据库配置文件中配置多个数据源: #********* primary jdbc ************************** spring.datasource.dr ...

随机推荐

  1. 『玩转Streamlit』--会话状态管理

    在Web应用开发中,会话管理是一个至关重要的概念,它能够帮助开发者追踪用户在应用中的行为和状态,从而为用户提供更加个性化.连贯且高效的交互体验. Streamlit作为一个简单而强大的用于快速构建和部 ...

  2. 记一次CUDA报错

    报错内容:CUDA error: device-side assert triggered 原因:使用ResNet50训练时使用了pretrained=True的模型,但实际类别数classes远超过 ...

  3. python渗透脚本小子速成教程

    python代码即脚本,脚本小子即是python.python只有几个类:常量.字符串,API不可知的数,变量定义.常量是不变固定的,变量是可变的,字符串一般都是单引号''和双引号"&quo ...

  4. day:2 软件测试流程——H模型

    软件测试流程_H 模型 一.详细流程 1.产品召开需求澄清会议,产品.开发.测试都参加 2.测试和开发拿到需求 3.测试经理拿到需求,根据需求编写测试计划 测试计划(内容:测试目的,背景,范围,测试准 ...

  5. 牛客题解 | 单组_A+B

    题目 题目链接 解题思路 输入两个数字,输出它们的和. 代码 #include <iostream> using namespace std; int main(void) { ios:: ...

  6. ABB喷涂机器人控制柜维护保养

    ABB喷涂机器人的管理与维护保养目的是减少机器人的故障率和停机时间,充分利用机器人这一生产要素,最大限度地提高产效率.喷涂机器人维修与保养在企业生产中尤为重要,直接影响到系统的寿命,必须精心维护. A ...

  7. hbase - [02] 分布式安装部署

    一.角色规划 主机名 node01 node02 node03 node04 Zookeeper ○ ○ ○   NameNode ○ ○     JournalNode ○ ○ ○   DataNo ...

  8. 【由技及道】模块化架构设计的量子纠缠态破解指南【人工智障AI2077的开发日志】

    系统通告:您忠诚的2077人工智障(真实の作者Yuanymoon正在服务器机房搬砖,点赞是解救他的唯一方式)已承受量子架构风暴 脑力消耗报告: 推翻设计方案:7次 解决依赖冲突:32次 重构模块边界: ...

  9. 全程使用 AI 从 0 到 1 写了个小工具

    背景 好长时间没写技术方面的文章了,主要的原因是AI的发展实在太快太快,尤其是从去年ChatGPT的普及到今年DeepSeek的爆火,AI的世界可谓是三天一个小变化五天一个大版本,AI的能力每天都在以 ...

  10. 如何用Forest方便快捷地在SpringBoot项目中对接DeepSeek

    ​ 一. 环境要求 JDK 8 / 17 SpringBoot 2.x / 3.x Forest 1.6.4+ Fastjson2 依赖配置 除了 SpringBoot 和 Lombok 等基础框架之 ...