springboot初步1

SpringBoot 是基于 Spring 框架的快速开发脚手架 ,可以帮开发者更简单、高效地搭建 Java 后端项目。它把 Spring 框架里复杂的配置(比如 XML 配置、依赖管理)了可以自动配置,让你不用写一堆配置就能快速跑起一个后端服务。

一、快速入门springboot

二、配置文件

1.YAML:数据格式

对象 (map):键值对的集合。

XML 复制代码
person:

name: zhangsan
行内写法
person: {name: zhangsan}

数组:一组按次序排列的值

java 复制代码
address:

-beijing

-shanghai

行内写法
address: [beijing, shanghai]

纯量:单个的、不可再分的值

java 复制代码
msg1: 'hello \n world' # 单引忽略转义字符

msg2: "hello \n world" # 双引识别转义字符

2.yml配置

  1. 服务器核心配置(项目运行的基础)
java 复制代码
# 服务器配置
#优先级properties>yml>yaml
server:
  port: 8082 #必须带空格,分隔符,以数据为核心有缩进
  servlet:
    context-path: /boot
  • server.port: 8082:指定项目启动后占用的端口号(默认是 8080)。✅ 为什么要写:如果你的电脑上同时运行多个 Spring Boot 项目,8080 端口可能被占用,改个端口(比如 8082)就能避免冲突。
  • server.servlet.context-path: /boot:指定项目的访问根路径。✅ 为什么要写:默认访问路径是 http://localhost:8082/,加了这个配置后,必须用 http://localhost:8082/boot/ 才能访问项目接口,避免不同项目的接口路径冲突。
  • 注释里的 "必须带空格、有缩进":YAML 格式的规则 ------ 冒号后必须加空格,层级靠缩进(2 个空格)区分,这是 YAML 的语法要求,写错了配置会失效。

2.参数引用

3.profile配置多文档模块

多文档块(Multi-document)写法,它的核心作用是:

在同一个 application.yml 文件里,把多个环境(开发、测试、生产)的配置都写在一起,
用 --- 分隔,不用再单独创建多个配置文件。

完整优先级顺序(从高到低)

1.命令行参数(比如启动时加 --server.port=9000)

2.激活的环境块(如 prod、dev 块)

3.全局块(第一个配置块)所以现在会用8084加载

java 复制代码
#全局配置端口号8081
server:
  port: 8081
spring:
  profiles:
    active: prod

---
#spring.profiles: dev 标记这个块属于 dev 环境。
# 当激活 dev 时,端口会被覆盖为 8083。

server:
  port: 8083
spring:
  profiles: dev

---
  #这个块属于 prod 环境。
  #当激活 prod 时,端口会被覆盖为 8084。
server:
  port: 8084
spring:
  profiles: prod  #指定属于哪个环境

4.配置文件注入和参数校验

①value赋值

bash 复制代码
 /** 读取单个配置值@Value一个值注入一个对象,对象少的时候用
     @Value("${person.lastName}")
     private String lastName;

    读取默认值(如果配置中没有该key,就用默认值)
    @Value("${person.gender:男}")
    private String gender;

     value:适合读取单个、零散的配置项
    支持默认值语法:${key:默认值}
    不支持复杂类型(如 Map、List、嵌套对象)
    配置项变化时,需要重启项目才能生效**/

②environment赋值

bash 复制代码
 /** Environment是spring核心环境抽象接口
    * 全局获取配置信息,可以读取所有配置(包括系统环境变量、配置文件、命令行参数等)。
    * 只需要注入一个对象就可以获取值
    @Autowired
    private Environment env;

    @GetMapping("/env")
    public String getEnv() {
        // 读取配置项
        String age = env.getProperty("person.age");
        // 读取配置项并指定默认值
        String email = env.getProperty("person.email", "default@xxx.com");
        // 判断配置是否存在
        boolean hasPort = env.containsProperty("server.port");**/

③@ConfigurationProperties

复制代码
@Component:将当前类注册为Spring容器组件(必须)
作用:只有Spring容器中的Bean,才能被@ConfigurationProperties绑定
在主启动类添加@EnableConfigurationProperties(Person.class)
@ConfigurationProperties:批量绑定配置文件属性(核心知识点)
bash 复制代码
@Component // 交给Spring管理
@ConfigurationProperties(prefix = "person")//表示属性一一注入
@PropertySource(value = {"classpath:person.properties"})
//加载指定的配置文件person.properties,@ConfigurationProperties可以从这些文件中取值,而不局限于全局配置。

④参数校验@Validated

css 复制代码
@Validated// 开启数据校验
public class Person {
     // @Email:校验lastName必须为邮箱格式
    @Email(message = "lastName必须是合法邮箱格式")
    @NotEmpty(message = "lastName不能为空") // 非空校验
    private String lastName;
    // @Min:校验age最小值为18(核心知识点)
    // 作用:确保age≥18,否则启动报错
    @Min(value = 18, message = "年龄不能小于18岁")

js303校验


空检查

  • @Null:验证对象是否为 null
  • @NotNull:验证对象是否不为 null,无法查检长度为 0 的字符串
  • @NotBlank:检查约束字符串是不是 Null 还有被 Trim 的长度是否大于 0,只对字符串,且会去掉前后空格
  • @NotEmpty:检查约束元素是否为 NULL 或者是 EMPTY

Boolean 检查

  • @AssertTrue:验证 Boolean 对象是否为 true
  • @AssertFalse:验证 Boolean 对象是否为 false

长度检查

  • @Size(min=, max=):验证对象(Array, Collection, Map, String)长度是否在给定的范围之内
  • @Length(min=, max=):Validates that the annotated string is between min and max included.

日期检查

  • @Past:验证 Date 和 Calendar 对象是否在当前时间之前
  • @Future:验证 Date 和 Calendar 对象是否在当前时间之后
  • @Pattern:验证 String 对象是否符合正则表达式的规则

三、内部配置加载顺序

高优先级覆盖低优先级

①内部配置加载顺序

Springboot程序启动时,会从以下位置加载配置文件:

1. file:./config/:当前项目下的/config目录下

2. file:./:当前项目的根目录

3. classpath:/config/:classpath的/config目录(resources里的config )

4. classpath:/:classpath的根目录(resources 根目录**)**

加载顺序为上文的排列顺序,高优先级配置的属性会生效

②典型场景验证

假设四个位置都有 application.yml,且都配置了 server.port:

  • file:./config/application.yml → server.port=8081
  • file:./application.yml → server.port=8082
  • resources:/config/application.yml → server.port=8083
  • resources:/application.yml → server.port=8084

✅ 最终生效端口是 8081(因为 file:./config/ 优先级最高)

③自定义配置位置

如果需要完全自定义配置文件路径,可以在启动时指定:

bash 复制代码
java -jar your-project.jar --spring.config.location=/opt/config/application.yml

这个指定的路径优先级会高于默认的四个位置

四、外部配置加载顺序

🔝 最高优先级:命令行参数

启动时通过 --key=value 传入的参数,优先级最高,会覆盖所有其他配置。

bash 复制代码
java -jar your-app.jar --server.port=8080 --person.name=张三

📂 外部文件配置加载顺序(从高到低)

  1. file:./config/
    • 项目根目录下的 config 文件夹(与 Jar 包同级)
    • 生产环境最常用,无需修改 Jar 包即可更新配置
  2. file:./
    • 项目根目录(与 Jar 包同级)
    • 适合测试环境快速验证配置
  3. classpath:/config/
    • 类路径(resources)下的 config 文件夹(内置配置)
    • 开发环境常用,配置随代码提交
  4. classpath:/
    • 类路径根目录(resources 根目录,内置配置)
    • 默认的 application.yml 存放位置

五、自动配置原理

1.@EnableAutoConfiguration

css 复制代码
// 表示这是一个配置类
@Configuration(proxyBeanMethods = false)
//自动配置属性:HttpProperties
@EnableConfigurationProperties(HttpProperties.class)

//spring的底层注解:根据不同条件,判断当前配置或者类是否生效
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)

@ConditionalOnClass(CharacterEncodingFilter.class)

@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {

    private final HttpProperties.Encoding properties;

    public HttpEncodingAutoConfiguration(HttpProperties properties) {
        this.properties = properties.getEncoding();
    }
}

自动配置类上的 @ConditionalOnXXX 系列注解会检查条件是否满足:

  • @ConditionalOnClass:类路径下存在指定类时生效。
  • @ConditionalOnMissingBean:容器中不存在指定 Bean 时生效。
  • @ConditionalOnProperty:配置文件中存在指定属性时生效。

2. 自定义配置:覆盖默认行为

自动配置并非不可修改,你可以通过以下方式自定义:

①配置文件修改

在 application.yml 中配置自动配置类对应的属性,比如修改 HTTP 编码:

复制代码
spring:
  http:
    encoding:
      charset: UTF-8
      force: true

这些配置会绑定到**HttpProperties**类,从而修改自动配置的行为。

②手动注册 Bean 覆盖自动配置

如果容器中存在你手动注册的 Bean,自动配置会优先使用你的 Bean(因为多数自动配置类有 @ConditionalOnMissingBean 注解)。

css 复制代码
@Configuration
public class MyWebConfig {
    @Bean
    public CharacterEncodingFilter characterEncodingFilter() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        filter.setForceEncoding(true);
        return filter;
    }
}

这个自定义的 CharacterEncodingFilter 会覆盖自动配置的默认过滤器。


相关推荐
RuoyiOffice31 分钟前
固定资产维修管理:从报修、审批到办结,原资产卡怎么回查?
spring boot·固定资产·ruoyi office·资产维修·维修审批·维修办结·资产履历
噢,我明白了33 分钟前
JAVA中的一些基础应用知识点
java·开发语言
miss38 分钟前
AI 改完不敢上线?OpenSpec 规约驱动开发实战
前端·代码规范·前端工程化
招风的黑耳41 分钟前
SpringBoot+Vue+MySQL 民宿在线预定平台 完整可运行版(源码+文档)
vue.js·spring boot·mysql
SL_staff1 小时前
私有化低代码不是妥协,而是企业级数字化的自主可控主航道
java
装不满的克莱因瓶1 小时前
【SpringAI Alibaba】ReactAgent结构化输出OutputType与OutputSchema实战
java·人工智能·ai·springai·springaialibaba
AiMan1 小时前
腾讯ima还是不可以导出左侧所有对话,只能单条导出,方法不对吗
前端
去伪存真1 小时前
并发量一高就装死?Agent 全链路“防猝死”手册
前端·agent
Moment1 小时前
AI 编程时代,聊聊我的 Mac mini 双屏桌面
前端·后端
AiMan2 小时前
先确认能不能一次把Microsofat Copilot所有内容打包一个文件导出
前端