springboot初步1
SpringBoot 是基于 Spring 框架的快速开发脚手架可以帮开发者更简单、高效地搭建 Java 后端项目。它把 Spring 框架里复杂的配置比如 XML 配置、依赖管理了可以自动配置让你不用写一堆配置就能快速跑起一个后端服务。一、快速入门springboot二、配置文件注解类SpringBootConfiguration : springboot的配置Configuration: spring配置类Component: 说明这也是一个spring的组件EnableAutoConfiguration : 自动配置AutoConfigurationPackage : 自动配置包Import(AutoConfigurationPackages.Registrar.class) : 自动配置包注册 Import(AutoConfigurationImportSelector.class): 自动配置导入选择1.YAML数据格式对象 (map)键值对的集合。person: name: zhangsan 行内写法 person: {name: zhangsan}数组一组按次序排列的值address: -beijing -shanghai 行内写法 address: [beijing, shanghai]纯量单个的、不可再分的值msg1: hello \n world # 单引忽略转义字符 msg2: hello \n world # 双引识别转义字符2.yml配置1. 服务器核心配置项目运行的基础# 服务器配置 #优先级propertiesymlyaml server: port: 8082 #必须带空格分隔符以数据为核心有缩进 servlet: context-path: /bootserver.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.port90002.激活的环境块如 prod、dev 块3.全局块第一个配置块所以现在会用8084加载# 1. 服务端口 server: port: 8080 # 2. 数据库配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/数据库名?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 123456 # 3. MyBatis-Plus 或 MyBatis mybatis-plus: configuration: map-underscore-to-camel-case: true # 下划线转驼峰 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印SQL mapper-locations: classpath:mapper/*.xml # mapper.xml路径 type-aliases-package: com.xxx.entity # 别名包 //下面选择可以不写 # 日志级别 logging: level: com.xxx.mapper: debug # 打印SQL root: info # Spring 应用名微服务必须写单体可选 spring: application: name: my-project # Redis 配置有缓存就写 redis: host: localhost port: 6379 password: database: 0 # 文件上传大小限制 spring: servlet: multipart: max-file-size: 100MB max-request-size: 100MB # 分页配置MyBatis-Plus mybatis-plus: global-config: db-config: logic-delete-field: is_deleted # 逻辑删除字段 logic-delete-value: 1 logic-not-delete-value: 04.配置文件注入和参数校验①value赋值/** 读取单个配置值Value一个值注入一个对象对象少的时候用 Value(${person.lastName}) private String lastName; 读取默认值如果配置中没有该key就用默认值 Value(${person.gender:男}) private String gender; value适合读取单个、零散的配置项 支持默认值语法${key:默认值} 不支持复杂类型如 Map、List、嵌套对象 配置项变化时需要重启项目才能生效**/②environment赋值/** Environment是spring核心环境抽象接口 * 全局获取配置信息可以读取所有配置包括系统环境变量、配置文件、命令行参数等。 * 只需要注入一个对象就可以获取值 Autowired private Environment env; GetMapping(/env) public String getEnv() { // 读取配置项 String age env.getProperty(person.age); // 读取配置项并指定默认值 String email env.getProperty(person.email, defaultxxx.com); // 判断配置是否存在 boolean hasPort env.containsProperty(server.port);**/③ConfigurationPropertiesComponent将当前类注册为Spring容器组件必须 作用只有Spring容器中的Bean才能被ConfigurationProperties绑定 在主启动类添加EnableConfigurationProperties(Person.class) ConfigurationProperties批量绑定配置文件属性核心知识点Component // 交给Spring管理 ConfigurationProperties(prefix person)//表示属性一一注入 PropertySource(value {classpath:person.properties}) //加载指定的配置文件person.propertiesConfigurationProperties可以从这些文件中取值而不局限于全局配置。④参数校验ValidatedValidated// 开启数据校验 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验证对象是否为 nullNotNull验证对象是否不为 null无法查检长度为 0 的字符串NotBlank检查约束字符串是不是 Null 还有被 Trim 的长度是否大于 0只对字符串且会去掉前后空格NotEmpty检查约束元素是否为 NULL 或者是 EMPTYBoolean 检查AssertTrue验证 Boolean 对象是否为 trueAssertFalse验证 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里的config4. classpath:/classpath的根目录resources根目录加载顺序为上文的排列顺序高优先级配置的属性会生效②典型场景验证假设四个位置都有application.yml且都配置了server.portfile:./config/application.yml→server.port8081file:./application.yml→server.port8082resources:/config/application.yml→server.port8083resources:/application.yml→server.port8084✅ 最终生效端口是8081因为file:./config/优先级最高③自定义配置位置如果需要完全自定义配置文件路径可以在启动时指定java -jar your-project.jar --spring.config.location/opt/config/application.yml这个指定的路径优先级会高于默认的四个位置四、外部配置加载顺序 最高优先级命令行参数启动时通过--keyvalue传入的参数优先级最高会覆盖所有其他配置。java -jar your-app.jar --server.port8080 --person.name张三 外部文件配置加载顺序从高到低file:./config/项目根目录下的config文件夹与 Jar 包同级生产环境最常用无需修改 Jar 包即可更新配置file:./项目根目录与 Jar 包同级适合测试环境快速验证配置classpath:/config/类路径resources下的config文件夹内置配置开发环境常用配置随代码提交classpath:/类路径根目录resources根目录内置配置默认的application.yml存放位置五、自动配置原理1.EnableAutoConfiguration// 表示这是一个配置类 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注解。Configuration public class MyWebConfig { Bean public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter new CharacterEncodingFilter(); filter.setEncoding(UTF-8); filter.setForceEncoding(true); return filter; } }这个自定义的CharacterEncodingFilter会覆盖自动配置的默认过滤器。