Spring Boot知识点详解
打包部署
<!‐‐ 这个插件,可以将应用打包成一个可执行的jar包;‐‐>
<build><plugins> <plugin> <groupId>org.springframework.boot</groupId><artifactId>spring‐boot‐maven‐plugin</artifactId></plugin></plugins>
</build>
将这个应用打成jar包,直接使用java -jar的命令进行执行;
POM文件(父项目)
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring‐boot‐starter‐parent</artifactId> <version>1.5.9.RELEASE</version>
</parent> <!--他的父项目是-->
<parent> <groupId>org.springframework.boot</groupId><artifactId>spring‐boot‐dependencies</artifactId> <version>1.5.9.RELEASE</version> <relativePath>../../spring‐boot‐dependencies</relativePath>
</parent>
<!--他来真正管理Spring Boot应用里面的所有依赖版本-->
Spring Boot的版本仲裁中心;
以后我们导入依赖默认是不需要写版本;(没有在dependencies里面管理的依赖自然需要声明版本号)
启动器【starter】
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
**spring-boot-starter-web: **
spring-boot-starter:spring-boot场景启动器;帮我们导入了web模块正常运行所依赖的组件;
里面所包含的依赖:
Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter,相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器 。
主程序类(入口)
//@SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
@SpringBootApplication
public class HystrixApplication {public static void main(String[] args) {// Spring应用启动起来SpringApplication.run(HystrixApplication.class, args);}
}
@SpringBootApplication: Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用;
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}
1、@SpringBootConfifiguration
@SpringBootConfifiguration:Spring Boot的配置类; 标注在某个类上,表示这是一个Spring Boot的配置类;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
@Confifiguration:配置类上来标注这个注解; 配置类 ----- 配置文件;配置类也是容器中的一个组件;@Component 。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface Configuration {
}
2、EnableAutoConfiguration
@EnableAutoConfiguration:开启自动配置功能;
以前我们需要配置的东西,现在Spring Boot帮我们自动配置;@EnableAutoConfifiguration告诉SpringBoot开启自动配置功能;这样自动配置才能生效;
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}
- @AutoConfifigurationPackage:自动配置包
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
}
@Import(AutoConfifigurationPackages.Registrar.class):
Spring的底层注解@Import,给容器中导入一个组件;导入的组件AutoConfifigurationPackages.Registrar.class;
扫描启动类下所在的包,以及下面的子包。
将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器;
- @Import(EnableAutoConfigurationImportSelector.class); 给容器中导入组件?
EnableAutoConfigurationImportSelector:导入哪些组件的选择器;
将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中;
会给容器中导入非常多的自动配置类(xxxAutoConfifiguration);就是给容器中导入这个场景需要的所有组件, 并配置好这些组件;
有了自动配置类,免去了我们手动编写配置注入功能组件等的工作;
Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获EnableAutoConfifiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作;
以前我们需要自己配置的东 西,自动配置类都帮我们;
J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfifigure-1.5.9.RELEASE.jar;
YAML
1、基本语法
k:(空格)v:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
属性和值也是大小写敏感;
2、值的写法
- **字面量:普通的值(数字,字符串,布尔) **
k: v:字面直接来写;
字符串默认不用加上单引号或者双引号;
“”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name: “zhangsan \n lisi”:输出;zhangsan 换行 lisi
user:diy:name: "zhangsan \n lisi"
‘’:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi
user:diy:name: 'zhangsan \n lisi'
- **对象、Map(属性和值)(键值对): **
k: v:在下一行来写对象的属性和值的关系;注意缩进
对象还是k: v的方式
myuser:friends:lastName: zhangsanage: 20
行内写法:
myuser:friends: {lastName: zhangsan,age: 20}
- 数组(List、Set)
用- 值表示数组中的一个元素
pets: ‐ cat‐ dog‐ pig
行内写法
pets: [cat,dog,pig]
person.last-name-张三
person.age=18
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.1ists=a,b,c
person.dog.name=dog
person.dog.age=15
3、配置文件值注入
配置文件
person:lastName: helloage: 18boss: falsebirth: 2017/12/12maps: {k1: v1,k2: 12}lists:- cat- pigdog:name: 小狗age: 12
JavaBean
/**
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
*/
@Data
@Component
@ConfigurationProperties(prefix = "person")
public class MyPerson {private String lastName;private Integer age;private Boolean boss;private Date birth;private Map<String,Object> maps;private List<Object> lists;private Dog dog;
}
导入配置文件处理器,以后编写配置就有提示了
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>
properties配置文件在idea中默认utf-8****可能会乱码
4、@Value获取值和@ConfifigurationProperties获取值比较
@ConfifigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
配置文件yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfifigurationProperties;
5、@PropertySource&@ImportResource&@Bean
@PropertySource:加载指定的配置文件;
@Data
@Component
@PropertySource(value = {"classpath:person.properties"})
@ConfigurationProperties(prefix = "person1")
public class MyUser {private String name;private String address;
}
@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上
@ImportResource(locations = {"classpath:beans.xml"})
//导入Spring的配置文件让其生效
Profifile
1、多Profifile文件
我们在主配置文件编写的时候,文件名可以是 application-{profifile}.properties/yml
默认使用application.properties的配置;
2、yml支持多文档块方式
server: port: 8081
spring: profiles: active: prod #指定属于哪个环境
‐‐‐
server: port: 8083
spring: profiles: dev
---
server: port: 8084
spring:profiles: prod
3、激活指定profifile
1、在配置文件中指定
spring.profifiles.active=dev
2、命令行:
java -jar upload-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
可以直接在测试的时候,配置传入命令行参数
3、虚拟机参数;
-Dspring.profifiles.active=dev
配置文件加载位置
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文
件
–fifile:./confifig/
–fifile:./
–classpath:/confifig/
–classpath:/
优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载主配置文件;互补配置;
我们还可以通过spring.confifig.location来改变默认的配置文件位置
**项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置; **
java -jar webupload.jar --spring.confifig.location=G:/application.properties
外部配置加载顺序
SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会 形成互补配置****。
1.命令行参数
所有的配置都可以在命令行上进行指定
java -jar webupload.jar --server.port=8087 --server.context-path=/abc
多个配置用空格分开; --配置项=值
2.来自java:comp/env的JNDI属性
3.Java系统属性(System.getProperties())
4.操作系统环境变量
5.RandomValuePropertySource配置的random.*属性值
**由jar包外向jar包内进行寻找; **
**优先加载带profifile **
**6.jar包外部的application-{profifile}.properties或application.yml(带spring.profifile)配置文件 **
**7.jar包内部的application-{profifile}.properties或application.yml(带spring.profifile)配置文件 **
**再来加载不带profifile **
**8.jar包外部的application.properties或application.yml(不带spring.profifile)配置文件 **
**9.jar包内部的application.properties或application.yml(不带spring.profifile)配置文件 **
10.@Confifiguration注解类上的@PropertySource
11.通过SpringApplication.setDefaultProperties指定的默认属性
静态资源的映射规则
1)所有 /webjars/** ,都去 classpath:/META-INF/resources/webjars/ 找资源;
2)“/**” 访问当前项目的任何资源,都去(静态资源的文件夹)找映射
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/","classpath:/resources/", "classpath:/static/", "classpath:/public/" };
3)欢迎页; 静态资源文件夹下的所有index.html页面;被"/**"映射;
localhost:8080/ 找index页面
4)所有的 **/favicon.ico 都是在静态资源文件下找;
配置嵌入式Servlet容器
SpringBoot默认使用Tomcat作为嵌入式的Servlet容器;
如何定制和修改Servlet容器的相关配置** **
- 修改和server有关的配置(ServerProperties【也是EmbeddedServletContainerCustomizer】)
server.port=8081
server.context‐path=/crud
server.tomcat.uri‐encoding=UTF‐8 /
/通用的Servlet容器设置
server.xxx
//Tomcat的设置
server.tomcat.xxx
- 编写一个EmbeddedServletContainerCustomizer:嵌入式的Servlet容器的定制器;来修改Servlet容器的配置
@Configuration
public class TomcatConfig {@Beanpublic WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> webServerFactoryCustomizer(){return new WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>() {@Overridepublic void customize(ConfigurableServletWebServerFactory factory) {factory.setPort(8888);}};}
}
注册Servlet三大组件【Servlet、Filter、Listener】
public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("hello");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("hello");}
}public class MyListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("contextInitialized应用启动....");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("contextInitialized应用销毁");}}public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("filter");chain.doFilter(request,response);}@Overridepublic void destroy() {}
}
注册ServletRegistrationBean 、FilterRegistrationBean 、ServletListenerRegistrationBean
@Configuration
public class MvcConfig {//注册三大组件之Servlet@Beanpublic ServletRegistrationBean myServlet() {ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new MyServlet(),"/myServlet");return servletRegistrationBean;}//注册三大组件之Filter@Beanpublic FilterRegistrationBean myFilter() {FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();filterRegistrationBean.setFilter(new MyFilter());//拦截指定的接口filterRegistrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));return filterRegistrationBean;}//注册三大组件之Listener@Beanpublic ServletListenerRegistrationBean myListener() {ServletListenerRegistrationBean<MyListener> myListenerServletListenerRegistrationBean = new ServletListenerRegistrationBean<>(new MyListener());myListenerServletListenerRegistrationBean.setOrder(1);return myListenerServletListenerRegistrationBean;}
}
相关文章:

Spring Boot知识点详解
打包部署 <!‐‐ 这个插件,可以将应用打包成一个可执行的jar包;‐‐> <build><plugins> <plugin> <groupId>org.springframework.boot</groupId><artifactId>spring‐boot‐maven‐plugin</artifactId&g…...
LangChain与图数据库Neo4j LLMGraphTransformer融合:医疗辅助诊断、金融风控领域垂直领域、法律咨询场景问答系统的技术实践
LangChain与图数据库融合:垂直领域问答系统的技术实践 一、技术背景与核心价值 在垂直领域(如金融、医疗、法律)的问答场景中,传统RAG系统常面临实体关系推理不足和专业术语理解偏差的痛点。LangChain通过集成图数据库与知识图谱…...

DNS主从同步及解析
DNS 域名解析原理 域名系统的层次结构 :DNS 采用分层树状结构,顶级域名(如.com、.org、.net 等)位于顶层,下面是二级域名、三级域名等。例如,在域名 “www.example.com” 中,“com” 是顶级域名…...

在Windows11上用wsl配置docker register 镜像地址
一、下载软件 1、下载wsl:安装 WSL | Microsoft Learn,先按照旧版 WSL 的手动安装步骤 | Microsoft Learn的步骤走 注:如果wsl2怎么都安装不下来,可能是Hyper-V没有打开,打开控制面板->程序和功能->启用或关闭Windows功能,勾选Hyper-V 如果Windows功能里面没有Hyp…...
Spring—循环依赖与三级缓存
Spring中存在三级缓存: 第一层缓存(singletonObjects):单例对象缓存池,已经实例化并且属性赋值,这里的对象是成熟对象;第二层缓存(earlySingletonObjects):单…...

【Linux网络】构建UDP服务器与字典翻译系统
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...

【PGCCC】Postgres 故障排除:修复重复的主键行
如何从表中删除不需要的重复行。这些重复行之所以“不需要”,是因为同一个值在指定为主键的列中出现多次。自从 glibc 好心地改变了排序方式后,我们发现这个问题有所增加。当用户升级操作系统并修改底层 glibc 库时,这可能会导致无效索引。 唯…...

DeepSeek+Cursor+Devbox+Sealos项目实战
黑马程序员DeepSeekCursorDevboxSealos带你零代码搞定实战项目开发部署视频教程,基于AI完成项目的设计、开发、测试、联调、部署全流程 原视频地址视频选的项目非常基础,基本就是过了个web开发流程,但我在实际跟着操作时,ai依然会…...

996引擎-拓展变量:物品变量
996引擎-拓展变量:物品变量 测试代码参考资料对于Lua来说,只有能保存数据库的变量才有意义。 至于临时变量,不像TXT那么束手束脚,通常使用Lua变量就能完成。 SELECT * FROM dbo.TBL_ITEM_EX_ABIL WHERE FLD_MAKEINDEX = 28620 <...
Java 设计模式心法之第3篇 - 总纲:三大流派与导航地图
前两章,我们修炼了 SOLID 这套强大的“内功心法”,为构建高质量软件打下了坚实根基。现在,是时候鸟瞰整个设计模式的“武林”了!本文将为您展开一幅由 GoF 四人帮精心绘制的 23 种经典设计模式的“全景导航地图”。我们将探索这些…...
【OpenCV图像处理实战】从基础操作到工业级应用
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现(6个案例)案例1:图像基本操作案例2:边缘检测案例3&…...
如何识别金融欺诈行为并进行分析预警
金融行业以其高效便捷的服务深刻改变了人们的生活方式。然而,伴随技术进步而来的,是金融欺诈行为的日益猖獗。从信用卡盗刷到复杂的庞氏骗局,再到网络钓鱼和洗钱活动,金融欺诈的形式层出不穷,其规模和影响也在不断扩大。根据全球反欺诈组织(ACFE)的最新报告,仅2022年,…...

【踩坑记录】stm32 jlink程序烧录不进去
最近通过Jlink给STM32烧写程序时一直报错,但是换一个其他工程就可以烧录,对比了一下jink配置,发现是速率选太高了“SW Device”,将烧录速率调整到10MHz以下就可以了...
SpringSecurity源码解读AbstractAuthenticationProcessingFilter
一、介绍 AbstractAuthenticationProcessingFilter 是 Spring Security 框架里的一个抽象过滤器,它在处理基于表单的认证等认证流程时起着关键作用。它继承自 GenericFilterBean,并实现了 javax.servlet.Filter 接口。此过滤器的主要功能是拦截客户端发送的认证请求,对请求…...

RISC-V低功耗MCU动态时钟门控技术详解
我来分享一下RISC-V核低功耗MCU的动态时钟门控技术实现: 这款MCU通过硬件级时钟门控电路实现了模块级的功耗管理。当外设(如UART、SPI)处于闲置状态时,系统会自动切断其时钟信号,减少无效翻转功耗。同时支持多电压域协…...
网络设备配置实战:交换机与路由器的入门到精通
引言:网络设备——构建数字世界的基石 想象一下走进一个现代化的数据中心,成千上万的线缆如同神经网络般连接着各种设备,而交换机和路由器就是这些网络连接的智能枢纽。作为网络工程师,熟练掌握这些核心网络设备的配置与管理,就如同建筑师精通各种建筑工具和材料一样重要…...
移动通信行业术语
英文缩写英文全称中文名称解释/上下文举例IMSIP Multimedia SubsystemIP多媒体子系统SIPSession Initiation Protocol会话初始化协议常见小写sip同。ePDG/EPDGEvolved Packet Data Gateway演进分组数据网关 EPDG是LTE(4G)和后续蜂窝网络架构(…...

工厂模式:解耦对象创建与使用的设计模式
工厂模式:解耦对象创建与使用的设计模式 一、模式核心:封装对象创建逻辑,客户端无需关心具体实现 在软件开发中,当创建对象的逻辑复杂或频繁变化时,直接在客户端代码中 new 对象会导致耦合度高、难以维护。例如&…...

Python爬虫学习:高校数据爬取与可视化
本项目实现了从中国教育在线(eol.cn)的公开 API 接口爬取高校相关数据,并对数据进行清洗、分析与可视化展示。主要包括以下功能: 爬取高校基础信息及访问量数据数据清洗与格式转换多维度数据分析与可视化,如高校数量分…...
linux 手动触发崩溃
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、如何手动触发linux崩溃?二、内核相关panic和oops的cmdline(启动参数)总结 前言 提示:这里可以添加本文要记…...

触觉智能RK3506核心板,工业应用之RK3506 RT-Linux实时性测试
在工业自动化、机械臂控制等高实时性场景中,系统响应速度与稳定性直接决定设备效能。触觉智能RK3506核心板基于瑞芯微三核Cortex-A7架构深度优化,搭载Linux 6.1内核并支持Linux-RT实时系统,提供实时性能的高性价比解决方案。 RK3506与RT-Linu…...
AI日报 - 2025年04月21日
🌟 今日概览(60秒速览) ▎🤖 AGI突破 | O3模型性能引热议,Rich Sutton提出「体验时代」新范式,自递归AI构建仍存挑战。 新模型如O3展示高IQ,但AGI定义与实现路径讨论加剧,强调自主生成数据与体验学习。 ▎&…...

基于SpringBoot的高校体育馆场地预约管理系统-项目分享
基于SpringBoot的高校体育馆场地预约管理系统-项目分享 项目介绍项目摘要目录总体功能图用户实体图赛事实体图项目预览用户个人中心医生信息管理用户管理场地信息管理登录 最后 项目介绍 使用者:管理员 开发技术:MySQLJavaSpringBootVue 项目摘要 随着…...

华为云获取IAM用户Token的方式及适用分析
🧠 一、为什么要获取 IAM 用户 Token? 我们用一个生活中的比喻来解释👇: 🏢 比喻场景: 你要去一个 高级写字楼(华为云物联网平台) 办事(调用接口管理设备)&…...

如何利用快照与备份快速恢复服务器的数据
在服务器上利用**快照(Snapshot)**和**备份(Backup)**快速恢复数据,可显著减少停机时间并确保业务连续性。以下是具体操作步骤和最佳实践: --- ### **1. 快照(Snapshot)恢复** **适…...

Git 详细使用说明文档(适合小白)
Git 详细使用说明文档(适合小白) 1. 什么是 Git? Git 是一个版本控制系统,帮助你管理和跟踪代码的变更。无论是个人项目还是团队协作,Git 都能帮助你记录代码的历史版本,方便回溯和协作。 2. 安装 Git …...
Spring JDBC 的开发步骤(非注解方式)
以下是使用 非注解方式(纯 XML 配置)实现 Spring JDBC 的完整示例: 1. 项目依赖(不变) <!-- pom.xml --> <dependencies><!-- Spring JDBC --><dependency><groupId>org.springframewo…...

Graph Database Self-Managed Neo4j 知识图谱存储实践1:安装和基础知识学习
Neo4j 是一个原生图数据库,这意味着它在存储层实现了真正的图模型。它不是在其他技术之上使用“图抽象”,而是以您在白板上绘制想法的相同方式在Neo4j中存储数据。 自2007年以来,Neo4j已经发展成为一个丰富的工具、应用程序和库的生态系统。…...

一天学完Servlet!!!(万字总结)
文章目录 前言Servlet打印Hello ServletServlet生命周期 HttpServletRequest对象常用api方法请求乱码问题请求转发request域对象 HttpServletResponse对象响应数据响应乱码问题请求重定向请求转发与重定向区别 Cookie对象Cookie的创建与获取Cookie设置到期时间Cookie注意点Cook…...

E3650工具链生态再增强,IAR全面支持芯驰科技新一代旗舰智控MCU
近日,全球嵌入式软件开发解决方案领导者IAR与全场景智能车芯引领者芯驰科技正式宣布,IAR Embedded Workbench for Arm已全面支持芯驰E3650,为这一旗舰智控MCU提供开发和调试一站式服务,进一步丰富芯驰E3系列智控芯片工具链生态&am…...