说明

本文样例说明仅适用 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. SQLServer--NOLOCK

    介绍 NOLOCK从字面意思可以看出就是没有锁,表示这段sql不去考虑目前table的transaction lock,就是说加上NOLOCK后不受锁的限制读取数据,包括已修改未提交的数据,概念上类似 ...

  2. Magnet AXIOM使用+2024獬豸杯实战

    Magnet AXIOM+2024獬豸杯实战 百度网盘链接 2024獬豸杯:https://pan.baidu.com/s/1t_6Fwl6RgmEtF0UXRfVD1A?pwd=j583#list/ ...

  3. ruoyi-vue 界面框架构造

    界面框架: 我采用了flex布局,先分左右,然后右侧再分上下. 步骤: 1. 首先实现简单的菜单 1.1 菜单是个菜单项数组 [] 1.2 菜单项结构 例子 { id:'001', name: '历史 ...

  4. Typecho美化之网页底部增加好久不见的底部样式

    好久不见之本站同款网站底部样式,效果见本站. 1.修改footer.php首先,在页脚文件footer.php文件的最下面放入以下代码: <!-- 好久不见 --> <div cla ...

  5. DW - 数据仓库原理

    2023年5月31日 01:13:14,刷B站的时候,刷到了李鹏程大佬的B站作品. 数据仓库的诞生原因 数据仓库的基本概述 数据仓库的特点 数据仓库 vs 数据库 MPP架构 vs 分布式架构 数据仓 ...

  6. 别再混淆了!JVM内存模型和Java内存模型的本质区别

    JVM 内存模型(JVM Memory Model)和 Java 内存模型(Java Memory Model, JMM)是 Java 开发中两个非常重要的概念,但这两个概念很容易被搞混,所以本文就来 ...

  7. 朝花夕拾,帮三年前的自己改bug

    三年前,滨海之边马上毕业的老少年 经过几天半死不活的思考之后决定干前端 那个时候为了面试各种css属性js API背的是滚瓜烂熟 然后投简历,企业要项目经验, 我没有工作我哪来的项目经验啊 没人会管你 ...

  8. arco-design-pro-vite项目配置参考

    参考地址 配置源码地址:https://github.com/arco-design/arco-design-pro-vue/blob/main/arco-design-pro-vite/ 按钮组件 ...

  9. 四大AI编程工具组合测评

     在当今数字化浪潮中,AI 编程工具如雨后春笋般涌现,极大地提升了编程效率与体验.本文将详细剖析四类 AI 编程工具组合,从开发工具.大模型.插件搭配,到编程能力.费用体系及综合评价,为开发者提供全面 ...

  10. SSH远程神器—Termius

    简介 Termius是一款非常好用而且漂亮的SSH客户端,能快速远程控制服务器,可以定制自己喜欢的主题.Termius不仅涵盖了PC端的Windows.Linux.Mac,还支持手机端的Android ...