Java学习笔记整理: 关于SpringBoot 2024/7/12;
SpringBoot
springboot也是spring公司开发的一款框架。为了简化spring项目的初始化搭建的。
特点specialty:
springboot的特点:
1) 自动配置
Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是SpringBoot自动完成的。
2) 起步依赖
起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。
简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
3) 辅助功能
提供了一些大型项目中常见的非功能性特性,如嵌入式服务器tomcat、安全、指标,健康检测、外部配置等。
创建Create:
搭建springboot的项目
新建>
选择Spring Boot
|Spring Initializr
SpringBoot版本3.0以上使用java17
>选择Web中SpringWeb包
(剩下的看需求) Java8配置------------------------------------ <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><!--springboot3.0以上必须使用jdk17--><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.ykq</groupId><artifactId>qy174-demo01</artifactId><version>0.0.1-SNAPSHOT</version><name>qy174-demo01</name><description>qy174-demo01</description> <properties><!--java使用版本--><java.version>8</java.version></properties><dependencies><!--web依赖jar--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> <!--单元测试jar--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><!--如果下方出现红色可以删除--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build> </project> ```
环境|文件配置:
关于SpringBoot的配置文件和框架使用
常用的配置文件种类:
springboot提供了两种配置文件。不管是哪种他们的前缀都是application
第一种
application.properties
第二种:
application.yml
|application.yaml
如果两个文件同时存在,
properties
优先级更高。#.yml | .yaml文件写入格式(":"后务必跟空格然后再写入值,字符串无须+"") #key: # value: hhh # key2: value server:port: 8088servlet:context-path: /bbb#properties写入格式(字符串无须+"") #key=value #key.key2=value server.port=8080 server.servlet.context-path=/aaa
*包扫描的原理
ssm项目必须加包扫描。而现在
springboot
没有在写包扫描了。自带了包扫描的功能。核心在主类上@SpringBootApplication
上,它是一个复合注解。里面包含:
@EnableAutoConfiguration
开启自动配置,里面包含:
@AutoConfigurationPackage
,
@Import({AutoConfigurationPackages.Registrar.class})
需要导入一个自动配置包的类。加载主类所在的包,并按照该包进行扫描。
@SpringBootApplication @ComponentScan(basePackages = {"com.gzx.demo1.config","com.gzx.demo1.controller"}) //不写该注释默认扫描该文件所在的包,加上该注释指定扫描的包,默认扫描消失; public class Demo1Application { public static void main(String[] args) {SpringApplication.run(Demo1Application.class, args);} }
自动装配原理:
我们原来ssm项目,都需要加载前端控制器
DispatcherServlet
. 而现在的springboot
并没有加载DispatcherServlet
。springboot
具备自动装配的功能。127个自动装配
springboot
启动时,加载了使用@SpringbootApplication
注解的类,该注解是一个符合注解,包含@EnableAutoConfiguration
该注解开启了自动装配功能,该注解也是一个符合注解里面包含@Import({AutoConfigurationImportSelector.class})
,导入AutoConfigurationImportSelector
该类自动装配选择器类,该类会自动加载很多自动装配。每个自动装配会完成对于的自动装配功能protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata){if(!this.isEnabled(annotationMetadata)){return EMPTY_ENTRY;} eles {AnnotationAttrbutes attributes = this. getAttributes(annotationMetadata);//获取所有的自动装配类List<String> configurations = this.getCandidateConfigurations(annotationMetadata,attrbutes);//移除重复的自动装配类configurations= this.removeDuplicates(configurations); Set<String> exclusions = this.getExclusions(annotationMetadata,attributes); this.checkExcludedClasses(configurations,exclusions);//移除排除的自动配置类configurations.removeAll(exclusions);//过滤掉没有使用的starter自动配置configurations = this.getConfigurationClassFilter().filter(configurations); this.fireAutoConfigurationImporEvents(configurations,exclusions); return new AutoConfigurationEntry(configurations,exclusion);} }
*读取配置文件中的内容
我们习惯把一些自己的信息放入配置文件中,便于修改。比如OSS. 支付。 我们还希望通过java代码能够读取到配置文件中自己的信息。
springboot提供了两种方式用于读取springboot配置文件中信息的方式。
第一种: @ConfigurationProperties
使用在类上
@ConfigurationProperties(prefix="前缀")
#配置文件 users.name=hhh users.age=123 users.hobby=swim,basketball@ConfigurationProperties(prefix = "users")//定义读取属性名 @Component//该类的创建spring,而且创建时自动读取配置文件为users的属性 @Data public class User {private String name;private int age;private List<String> hobby; }第二种: @Value
使用在变量上
@Value("${类名.变量名}")
(只能读取基本类型和字符串类型)@RestController public class TestController {//将属性文件中变量给予注释变量@Value("${users.name}")private String name; //访问地址@GetMapping("/user")public String test(){System.out.println(name);return name;} }
*profile多环境配置
自理解:
通过不同的配置文件切换spring配置,再主配置文件中进行便捷切换;
我们在开发Spring Boot应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库地址、服务器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的。
profile配置文件
多profile文件方式,yml多文档方式
profile激活方式
配置文件|命令行参数
常用命名方式:
application-(命名).properties [自定义的配置文件]
相同配置依然还是放在application.properties中
application-dev.properties [开发环境的配置文件] application-test.properties [测试环境的配置文件] application-pro.properties [生产环境的配置文件]
激活对应配置文件:
第一种:配置文件内
#激活对应环境的配置文件spring.profiles.active="命名" spring.profiles.active=dev第二种:命令行使用
java –jar xxx.jar --spring.profiles.active=dev
注册web组件|过滤器
自理解
将ssm的xml配置文件改为类中声明使用
web组件表示的就是servlet,filter组件。
创建一个Servlet
public class MyServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("经过MyServlet");} } public class MyFilter implements javax.servlet.Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("经过DoFilter");} }
创建一个配置类
@Configuration //表示该类为配置类,等价于之前的xml配置文件 public class MyConfig { @Bean //等价于<bean标签.public ServletRegistrationBean myServlet(){ServletRegistrationBean bean=new ServletRegistrationBean();bean.setServlet(new MyServlet());bean.setName("my");bean.setLoadOnStartup(1);bean.addUrlMappings("/my");return bean;} @Beanpublic FilterRegistrationBean myFilter() {FilterRegistrationBean bean = new FilterRegistrationBean();bean.setFilter(new MyFilter());bean.setName("filter");bean.addUrlPatterns("/*");return bean;} }
整合第三方框架:
整合mybatis
引入依赖
<dependencies> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <!--mysql的驱动依赖 3.--> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId> </dependency> <!--mybatis和springboot整合的jar.--> <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version> </dependency> <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope> </dependency> </dependencies> 配置文件
spring.application.name=qy174-springboot-mybatis #数据源的信息 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/qy174-springboot?serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root #配置mybatis映射文件的路径 mybatis.mapper-locations=classpath:mapper/*.xml实体类
@Data public class User { private Integer userid; private String username; private String sex; private Integer age; }dao
public interface UserDao { int insert(User user); int delete(Integer id); int update(User user); User select(Integer id); List<User> selectAll(); }映射文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ykq.dao.UserDao"> <insert id="insert">insert into user(username,age,sex) values(#{username},#{age},#{sex}) </insert> <update id="update">update user set username=#{username},age=#{age},sex=#{sex} where userid=#{userid} </update> <delete id="delete">delete from user where userid=#{id} </delete> <select id="selectById" resultType="com.ykq.entity.User">select * from user where userid=#{id} </select> <select id="selectAll" resultType="com.ykq.entity.User">select * from user </select> </mapper>service
@Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public R selectAll() {List<User> users = userDao.selectAll();return new R(200,"查询成功",users); } @Override public R selectById(Integer id) {User user = userDao.selectById(id);if(user==null){return new R(500,"查询失败",null);}else{return new R(200,"查询成功",user);} } @Override public R insert(User user) {int i = userDao.insert(user);if(i>0){return new R(200,"添加成功",null);}return new R(500,"添加失败",null); } @Override public R update(User user) {int update = userDao.update(user);if (update>0){return new R(200,"修改成功",null);}return new R(500,"修改失败",null); } @Override public R delete(Integer id) {int i = userDao.delete(id);if (i>0){return new R(200,"删除成功",null);}return new R(500,"删除失败",null); } } controller
@RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping("/list") public R list() {return userService.selectAll(); } //getById/1 @GetMapping("/getById") public R getById(Integer id) {return userService.selectById(id); } @DeleteMapping("/deleteById") public R deleteById(Integer id) {return userService.delete(id); } @PostMapping("/insert") public R insert(@RequestBody User user) {return userService.insert(user); } @PutMapping("/update") public R update(@RequestBody User user) {return userService.update(user); } } 问题集:
没有为dao生成代理实现类
方法1:
@SpringBootApplication //使用该注释为dao包类内的mapper类生成代理实现类 @MapperScan(basePackages = {"com.gzx.dao"}) public class Demo1Application { public static void main(String[] args) {SpringApplication.run(Demo1Application.class, args);} }方法2:
//在需要生成的mapper类代理实现类中写该注释 @MappingNoClassDefFoundError: 导包异常
java,lang.
NoClassDefFoundError
:org/springframework/aot/AoDetecormybatis和springboot整合的版本太高。
DispatcherServletAutoConfiguration类:
//创建Servlet注册器-[DispatchServlet以及路径] DispatcherServletRegistrationBean registration = new DispatcherServletRegistrationBean(dispatcherServlet,webMvcPrpert...)
相关文章:
Java学习笔记整理: 关于SpringBoot 2024/7/12;
SpringBoot springboot也是spring公司开发的一款框架。为了简化spring项目的初始化搭建的。 特点specialty: springboot的特点: 1) 自动配置 Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程&a…...

ASP.NET MVC Lock锁的测试
思路:我们让后台Thread.Sleep一段时间,来模拟一个耗时操作,而这个时间可以由前台提供。 我们开启两个或以上的页面,第一个耗时5秒(提交5000),第二个耗时1秒(提交1000)。 期望的测试结果: 不加Lock锁&…...

Hadoop3:HDFS-通过配置黑白名单对集群进行扩缩容,并实现数据均衡(实用)
一、集群情况介绍 我的本地虚拟机,一共有三个节点,hadoop102、hadoop103、hadoop104 二、白名单 创建白名单文件whitelist,通过白名单的配置,只允许集群包含102和103两台机器可以存储数据,104无法存储数据。 需求 …...

TensorFlow系列:第五讲:移动端部署模型
项目地址:https://github.com/LionJackson/imageClassification Flutter项目地址:https://github.com/LionJackson/flutter_image 一. 模型转换 编写tflite模型工具类: import osimport PIL import tensorflow as tf import keras import …...

深度学习DeepLearning二元分类 学习笔记
文章目录 类别区分变量与概念逻辑回归Sigmoid函数公式决策边逻辑损失函数和代价函数逻辑回归的梯度下降泛化过拟合的解决方案正则化 类别区分 变量与概念 决策边置信度阈值threshold过拟合欠拟合正则化高偏差lambda(λ) 线性回归受个别极端值影响&…...
Eureka 介绍与使用
Eureka 是一个开源的服务发现框架,它主要用于在分布式系统中管理和发现服务实例。它由 Netflix 开发并开源,是 Netflix OSS 中的一部分。 使用 Eureka 可以方便地将新的服务实例注册到 Eureka 服务器,并且让其他服务通过 Eureka 服务器来发现…...

Java异常体系、UncaughtExceptionHandler、Spring MVC统一异常处理、Spring Boot统一异常处理
概述 所有异常都是继承自java.lang.Throwable类,Throwable有两个直接子类,Error和Exception。 Error用来表示程序底层或硬件有关的错误,这种错误和程序本身无关,如常见的NoClassDefFoundError。这种异常和程序本身无关࿰…...
bash终端快捷键
快捷键作用ShiftCtrlC复制ShiftCtrlV粘贴CtrlAltT新建终端ShiftPgUp/PgDn终端上下翻页滚动CtrlC终止命令CtrlD关闭终端CtrlA光标移动到最开始为止CtrlE光标移动到最末尾CtrlK删除此处到末尾的所有内容CtrlU删除此处至开始的所有内容CtrlD删除当前字符CtrlH删除当前字符的前一个…...
【Visual Studio】Visual Studio报错合集及解决办法
目录 Visual Studio报错:error LNK2001 Visual Studio报错:error C2061 Visual Studio报错:error C1075 Visual Studio报错:error C4430 Visual Studio报错error C3867 概述 持续更细Visual Studio报错及解决方法 Visual Studio报错:error LNK2001 问题 : error LNK2001…...

【微信小程序知识点】转发功能的实现
转发功能,主要帮助用户更流畅地与好友分享内容与服务。 想实现转发功能,有两种方式: 1.页面js文件必须声明onShareAppMessage事件监听函数,并自定义转发内容。只有定义了此事件处理函数,右上角菜单才会显示“转发”按…...

用python识别二维码(python实例二十三)
目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.识别二维码 3.1 代码构思 3.2 代码实例 3.3 运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性&…...

电脑文件夹怎么设置密码?让你的文件更安全!
在日常使用电脑的过程中,我们常常会有一些需要保护的个人文件或资料。为了防止这些文件被他人未经授权访问,对重要文件夹设置密码是一种有效的保护措施,可是电脑文件夹怎么设置密码呢?本文将介绍2种简单有效的方法帮助您为电脑文件…...

paddla模型转gguf
在使用ollama配置本地模型时,只支持gguf格式的模型,所以我们首先需要把自己的模型转化为bin格式,本文为paddle,onnx,pytorch格式的模型提供说明,safetensors格式比较简单请参考官方文档,或其它教…...
Memcached vs Redis——Java项目缓存选择
在Java项目开发中,缓存系统作为提升性能、优化资源利用的关键技术之一,扮演着至关重要的角色。Memcached和Redis作为两种流行的缓存解决方案,各有其独特的优势和应用场景。本文旨在通过分析项目大小、用户访问量、业务复杂度以及服务器部署情…...

大模型最新黑书:基于GPT-3、ChatGPT、GPT-4等Transformer架构的自然语言处理 PDF
今天给大家推荐一本丹尼斯罗斯曼(Denis Rothman)编写的关于大语言模型(LLM)权威教程<<大模型应用解决方案> 基于GPT-3、ChatGPT、GPT-4等Transformer架构的自然语言处理>!Google工程总监Antonio Gulli作序,这含金量不…...
【电子数据取证】电子数据司法鉴定
文章关键词:电子数据取证、司法鉴定服务、司法鉴定流程 一、定义 什么是司法鉴定? 在诉讼活动中鉴定人运用科学技术或者专业知识对诉讼涉及的专门性问题进行鉴别和判断并提供鉴定意见的活动。 电子数据司法鉴定 那么电子数据司法鉴定,就…...
使用 OpenCV 的 inRange 函数进行颜色分割
使用 OpenCV 的 inRange 函数进行颜色分割 在图像处理领域,颜色分割是一个常见的任务,常用于识别和提取图像中的特定颜色区域。OpenCV 提供了一个非常方便的函数 inRange 来实现这一功能。在这篇博客中,我们将详细介绍 inRange 函数的用法&a…...

OpenAI终止对中国提供API服务,对国内AI市场产生重大冲击?
6月25日,OpenAI突然宣布终止向包括中国在内的国家地区提供API服务,本月9日这一政策已经正式生效了! 有人说,这个事件给中国AI行业带来很大冲击!是这样吗?在展开讨论前,我们先来看看什么是API服务…...

JavaDS —— 栈 Stack 和 队列 Queue
栈的概念 栈是一种先进后出的线性表,只允许在固定的一端进行插入和删除操作。 进行插入和删除操作的一端被称为栈顶,另一端被称为栈底 栈的插入操作叫做进栈/压栈/入栈 栈的删除操作叫做出栈 现实生活中栈的例子: 栈的模拟实现 下面是Jav…...

C++进阶:继承和多态
文章目录 ❤️继承🩷继承与友元🧡继承和静态成员💛菱形继承及菱形虚拟继承💚继承和组合 ❤️多态🩷什么是多态?🧡多态的定义以及实现💛虚函数💚虚函数的重写💙…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...