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.ymlserver.port=8081
  • file:./application.ymlserver.port=8082
  • resources:/config/application.ymlserver.port=8083
  • resources:/application.ymlserver.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 会覆盖自动配置的默认过滤器。


相关推荐
程序猿20232 小时前
Java Thread
java·开发语言·python
jason.zeng@15022072 小时前
POM构造Spring boot多模块项目
java·spring boot·后端
星辰_mya2 小时前
nginx之待续-没写完
前端
indexsunny2 小时前
互联网大厂Java面试实录:Spring Boot微服务在电商场景中的应用与挑战
java·spring boot·redis·mysql·security·microservices·interview
编程彩机2 小时前
互联网大厂Java面试:从分布式缓存到微服务架构的技术场景解析
java·redis·微服务·分布式事务·分布式缓存·面试解析
独自破碎E2 小时前
【字节面试手撕】大数加法
java·算法
鱼跃鹰飞2 小时前
LeetCode热题100: 49.字母异位词分组
java·数据结构·算法·leetcode
studyForMokey2 小时前
【Android面试】Java & Kotlin语言
android·java·面试
GISer_Jing2 小时前
大语言模型Agent入门指南
前端·数据库·人工智能