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++进阶:继承和多态
文章目录 ❤️继承🩷继承与友元🧡继承和静态成员💛菱形继承及菱形虚拟继承💚继承和组合 ❤️多态🩷什么是多态?🧡多态的定义以及实现💛虚函数💚虚函数的重写💙…...

【八大排序】java版(上)(冒泡、快排、堆排、选择排序)
文章目录 一、冒泡排序(重点)思路代码 二、快排(面试重点)思路代码 三、堆排序(面试重点)思路代码 四、选择排序思路代码 一、冒泡排序(重点) 思路 前后两两数据进行比较,小的数据往前走,大的数据往后走,每一轮结束之后,最大的数…...

.Net Core 微服务之Consul(二)-集群搭建
引言: 集合上一期.Net Core 微服务之Consul(一)(.Net Core 微服务之Consul(一)-CSDN博客) 。 目录 一、 Consul集群搭建 1. 高可用 1.1 高可用性概念 1.2 高可用集群的基本原理 1.3 高可用集群的架构设计 1.3.1 主从复制架构 1.3.2 共享存储架构 1.3.3 负载均衡…...

C++ --> 类和对象(二)
前言 在前面简单的介绍了OOP,什么是类,在类中的this指针。接下来就深入理解类和对象。 默认成员函数 默认构造函数:用于在创建对象时初始化对象的成员变量。默认拷贝构造函数:用于使用已存在的对象来初始化新创建的对象。默认析构…...

利用宝塔安装一套linux开发环境
更新yum,并且更换阿里镜像源 删除yum文件 cd /etc/yum.repos.d/ 进入yum核心目录 ls sun.repo rm -rf * 删除之前配置的本地源 ls 配置阿里镜像源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 配置扩展包 wge…...

VB 实例:掌握 Visual Basic 编程的精髓
VB 实例:掌握 Visual Basic 编程的精髓 引言 Visual Basic(简称VB)是一种由微软开发的高级编程语言,它结合了易于使用的界面和强大的编程功能,使得初学者和专业人士都能快速开发Windows桌面应用程序。本文将通过一系列实例,深入探讨VB编程的基础知识和高级技巧,帮助读…...

层次分析法:matlab代码实现
计算权重: 一、算术平均法 关于矩阵: 1、矩阵的输入写法 [ ; ; ]同行用空格或逗号隔开,不同行用分号间隔 2、矩阵求和 默认按列求和 asum(E) 等同于 asum(E,1) 得到行向量 按行求和 asum(E,2) 得到列向量 对整个矩阵求和 asum(E,"all&…...

07-7.5.3 处理冲突的方法
👋 Hi, I’m Beast Cheng 👀 I’m interested in photography, hiking, landscape… 🌱 I’m currently learning python, javascript, kotlin… 📫 How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…...

几何距离与函数距离:解锁数据空间中的奥秘
几何距离:直观的空间度量 几何距离,顾名思义,是我们在几何学中熟悉的距离概念,如欧几里得距离、曼哈顿距离和切比雪夫距离等。这些距离度量直接反映了数据点在多维空间中的位置关系。 欧几里得距离:最为人熟知的几何距…...

LabVIEW的Actor Framework (AF) 结构介绍
LabVIEW的Actor Framework (AF) 是一种高级架构,用于开发并发、可扩展和模块化的应用程序。通过面向对象编程(OOP)和消息传递机制,AF结构实现了高效的任务管理和数据处理。其主要特点包括并发执行、动态可扩展性和强大的错误处理能…...

gitlab 搭建使用
1. 硬件要求 ##CPU 4 核心500用户 8 核心1000用户 ##内存 4 G内存500用户 8 G内存1000用户 2. 下载 链接 3. 安装依赖 yum -y install curl openssh-server postfix wget 4. 安装gitlab组件 yum -y localinstall gitlab-ce-15.9.3-ce.0.el7.x86_64.rpm 5. 修改配置文…...