SpringBoot初学者学习记录

前言

本笔记只记录Springboot学习中,个人认为以后会用到的东西,进行总结

编写时间:2025/03/01

目录

前言

1.Springboot的作用

2.使用idea自带的脚手架

3.为什么以继承方式引入Springboot而不是引入依赖

4.@SpringBootApplication注解

5.使用单元测试

6.外部化配置

7.YAML/YML配置文件

8.yml嵌套配置bean

9.yml配置数组、集合

10.springboot中加入aop

11.lombok的主要注解

12.整合ssm

13.**自动配置源码核心**

总结自动配置原理

14.springboot的web自动配置

总结(关键)

15.静态资源处理

静态资源的path pattern(访问路径)和static-locations(文件存储位置)是两个东西

16.常用的手动配置静态资源方式

1.配置文件方式

2.编写代码的方式

方式一:编写一个类添加@Configuration注释,并实现WebMvcConfigurer接口

方式二:采用@Bean注解提供一个WebMvcConfigurer组件

17.内容协商

1.什么是内容协商

2.实现内容协商的两种方式

3.实现内容协商的接口HttpMessageConverter

4.了解这些,是为了定义自己的消息转换器HttpMessageConverter

18.thymeleaf(以后基本不用,忽略)

19.异常处理(重点了解spirngmvc的错误处理)

20.国际化(了解)

21.切换web服务器(优化web配置)

22.开发实用技术整合(关键)

1.logo设置(了解)

2.整合pagehelper

3.web响应结果封装(重要)

4.事务管理(重要)

5.打包成war包(了解)

6.日志处理(重要)

6.1.日志框架分为抽象日志框架和具体日志框架

6.2.springboot默认日志级别为INFO

6.4日志输出到文件

6.5滚动日志(关键)


1.Springboot的作用

让程序员只关注业务逻辑,环境配置那些就交给Springboot。倡导约定优于配置,将简化开发发挥到极致

springboot两大核心:1.启动器 2.自动配置

2.使用idea自带的脚手架

其实就是帮你搭建好初始的Springboot架构

3.为什么以继承方式引入Springboot而不是引入依赖

继承方式的好处是,所有继承同一个父类版本的项目,所共享同一个配置,一些版本号,属性配置都是统一的

如果只是单纯想引入某个项目/包的代码,那么直接引入依赖也是可以的

4.@SpringBootApplication注解

Springboot主入口的注解

这个注解里面包括3个注解

1.@SpringBootConfiguration注解

这个注解的被@Configuration标注,说明主入口程序是一个配置类。也就是说主入口中的方法可以被@Bean注解标注,被@Bean注解的标注的方法会被Spring容器自动调用,并且将该方法的返回对象纳入IoC容器的管理。

2.@EnableAutoConfiguration注解

该注解表示启用自动配置

Spring Boot 会根据你引入的依赖自动为你配置好一系列的 Bean,无需手动编写复杂的配置代码。

3.@ComponentScan注解

负责组件扫描的。代替的xml配置是:<context:component-scan base-packages="com.powernode.springboot" /> 这个注解出现在springboot主入口类上,因此组件扫描默认扫描的包是主入口程序所在的包以及该包下的所有子包。

5.使用单元测试

将Service纳入ioc管理,直接在测试类中@Autowire自动注入,然后方法调用即可

6.外部化配置

优点:使用SpringBoot框架的外部化配置后,修改配置后,不需要对应用重新打包,也不需要重新部署,最多重启一下服务即可。

Spring Boot 框架在启动时会尝试从以下位置加载 application.properties 配置文件:

1.file:./config/:首先在Spring Boot 当前工作目录下的 config 文件夹中查找。

注意:如果没有找到**application.properties**会继续找**application.yml**,如果这两个都没有找到,才会进入以下位置查找,以此类推。

2.file:./:如果在当前工作目录下config目录中找不到时,再从当前工作目录中查找。

3.classpath:/config/:如果从工作目录中找不到,会从类路径中找,先从类路径的 /config/ 目录下寻找配置文件。

4.classpath:/:如果在 /config/ 下没有找到,它会在类路径的根目录下查找。

使用@Value注解

把配置文件的数据配置到Service类的属性上

配置到Bean

这里只写最常用的方式:

@Configuration和@Component一样,可以把这个Bean纳入ioc管理,同时也标注这个类为配置类

@ConfigurationProperties是用来指定配置文件里key的前缀

7.YAML/YML配置文件

yml支持多种数据结构,语法如下

8.yml嵌套配置bean

一个UserBean里面有一个Address的Bean属性

Address的Bean中包含city、street、zipcode属性

yml配置如下

9.yml配置数组、集合

10.springboot中加入aop

1.引入aop启动器

2.编写Service和实现类

3.编写切面(关键)

编写切面的知识点在spring里面详细看

11.lombok的主要注解

@Data

  • 等价于 @ToString, @EqualsAndHashCode, @Getter@Setter, @RequiredArgsConstructor.

  • 用于生成:必要参数的构造方法、getter、setter、toString、equals 和 hashcode 方法。

@Getter / @Setter

  • 分别用于生成所有的 getter 和 setter 方法。

  • 可以作用于整个类,也可以作用于特定的字段。

@NoArgsConstructor

  • 生成一个无参构造方法。

@AllArgsConstructor

  • 生成一个包含所有实例变量的构造器。

@RequiredArgsConstructor

  • 生成包含所有被 final 修饰符修饰的实例变量的构造方法。

  • 如果没有**final**的实例变量,则自动生成无参数构造方法。

@ToString / @EqualsAndHashCode

  • 用于生成 toString 和 equals/hashCode 方法。

  • 这两个注解都有**exclude**属性,通过这个属性可以定制toString、hashCode、equals方法。

一般加个@Data就完事了

@Value

该注解会给所有属性添加final,给所有属性提供getter方法,自动生成toStringhashCodeequals

@Builder

该注解可以直接帮助我们生成建造模式的bean代码。

建造模式:

简单来说就是,对于这个Bean的参数,如果有很多,传统的构造方法只能一次性构造完,建造模式的核心就是可以自定义构造方法构造参数的个数

@Singular

辅助@Builder注解的。

当被建造的对象的属性是一个集合,这个集合属性使用@Singular注解进行标注的话,可以连续调用集合属性对应的方法完成多个元素的添加。如果没有这个注解,则无法连续调用方法完成多个元素的添加。代码如下:

@Slf4j

自动生成一个org.slf4j.Logger 对象

可以直接使用log.info("")输入日志信息

12.整合ssm

主要是逆向生成Mybatis

1.用idea自带的工具逆向生成

2.在主入口类上配置@MapperScan(basePackages = "mapper的路径")

3.在配置文件里面编写数据源和Mybatis的配置

 # 数据源
 spring.datasource.type=com.zaxxer.hikari.HikariDataSource
 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
 spring.datasource.url=jdbc:mysql://localhost:3306/springboot
 spring.datasource.username=root
 spring.datasource.password=828417
 ​
 # mybatis配置
 mybatis.type-aliases-package=com.hfut.ssm.bean
 mybatis.mapper-locations=classpath:/mapper/*.xml
 mybatis.configuration.map-underscore-to-camel-case=true

4.感觉有点麻烦,我感觉后面应该有一键解决的好办法

13.**自动配置源码核心**

这一章讲的是偏八股文的东西,讲的是底层自动配置原理,暂时没看,后面补

总结自动配置原理

1.运行环境准备阶段

a.引入web启动器

b.最终传递引入了自动配置的jar包

c.自动配置的jar包中有152个自动配置类,到此运行环境准备完毕。

2.运行阶段

a.@EnableAutoConfiguration 启用自动配置,将152个自动配置类全部加载到IoC容器中,然后根据开发场景筛选出必须的自动配置类。

b.自动配置类加载了一堆组件。

c.每个组件需要的数据来自属性类。

d.属性类又和配置文件绑定在一起。

3.因此,最终一句话:导入启动器,修改配置文件,就可以完成对应功能的开发。

14.springboot的web自动配置

具体看文档,这些了解即可

最后总结为三种情况

1.完全使用springboot的自动配置

2.完全不使用自动配置

编写一个类,添加@EnableWebMvc和@Configuration注解

3.使用自动配置,但自己额外扩展配置

编写一个类,添加@Configuration注释,并实现WebMvcConfigurer接口

web自动配置的核心配置类WebMvcAutoConfiguration自动配置类

WebMvcConfigurer接口的实现类WebMvcAutoConfigurationAdapter

总结(关键)

1.WebMvcConfigurer接口:这个是springmvc提供的,作用是允许开发者通过实现这个接口来定制Spring MVC的行为

也就是第三种情况:使用自动配置,但自己额外扩展配置,这也是最常用的

2.WebMvcAutoConfigurationAdapter实现类:这个是springboot提供的,WebMvcConfigurer接口的实现类,对springmvc默认的行为进行了配置

因此可以理解为,想要自己额外拓展配置,有几种方式

1.编写一个类继承WebMvcAutoConfigurationAdatper这个类,重写这个类的方法

2.编写一个类添加@Configuration注释,并实现WebMvcConfigurer接口

3.在配置文件中使用以下前缀的配置

  • spring.mvc:主要用于配置 Spring MVC 的相关行为,例如路径匹配、视图解析、静态资源处理等

  • spring.web:通常用于配置一些通用的 Web 层设置,如资源处理、安全性配置等。

这三种方式都可以用来对Spring MVC的行为进行自定义和扩展

15.静态资源处理

首先要搞清楚一个概念!!!

静态资源的path pattern(访问路径)和static-locations(文件存储位置)是两个东西

path pattern:指的是你输入对应的url,跳转到配置好的static-location

举个例子,原本的文件存储位置为:classpath:/static/,path-pattern为:/static/**

意思是,输入localhost:8080/static/xxxx这个url会跳转到classpath:/static/这个地址去寻找资源

如果修改path pattern为/sta/**,只改变了输入url的格式,但还是跳转到classpath:/static/这个地址

static-locations:指的是静态资源的存储位置,也就是输入url之后,去对应的地址寻找资源

总结:

path pattern修改的是输入url的格式

static-locations修改的是存储静态资源的地址

16.常用的手动配置静态资源方式

1.配置文件方式

需要注意的是:

存储在classpath:/META-INF/resources/位置的静态资源会被默认加载,不受手动配置的影响。

 # 让springboot的静态资源处理失效
 spring.web.resources.add-mappings=false
 spring.web.resources.add-mappings=true
 ​
 # 配置静态资源webjars的path pattern
 #spring.mvc.webjars-path-pattern=/wjs/**
 ​
 # 配置普通静态资源的path pattern
 spring.mvc.static-path-pattern=/abc/**
 ​
 # 配置普通静态资源文件存储位置
 spring.web.resources.static-locations=classpath:/static1/,classpath:/static2/
 ​
 # 静态资源缓存设置
 # 缓存有效期设置
 spring.web.resources.cache.period=100
 # 缓存控制设置
 spring.web.resources.cache.cachecontrol.max-age=20
 spring.web.resources.cache.cachecontrol.cache-public=true
 # 是否启用最后一次修改时间的比对
 spring.web.resources.cache.use-last-modified=true

2.编写代码的方式

方式一:编写一个类添加@Configuration注释,并实现WebMvcConfigurer接口

编写配置类,对于web开发来说,配置类一般起名为:WebConfig。配置类一般存放到config包下,因此在SpringBoot主入口程序同级目录下新建config包,在config包下新建WebConfig

 // 这里的这种配置:在springboot默认的自动配置基础之上进行扩展配置。也就是说springboot之前的配置仍然生效。
 @Configuration
 public class WebConfig implements WebMvcConfigurer {
 ​
     // 静态资源处理,需要重写的方法是:addResourceHandlers
     @Override
     public void addResourceHandlers(ResourceHandlerRegistry registry) {
         // 使用注册器 registry 绑定path pattern以及真实的静态资源文件存储路径
         registry.addResourceHandler("/abc/**") // 配置路径访问模式
                 .addResourceLocations("classpath:/static1/", "classpath:/static2/"); // 配置静态资源路径
     }
 ​
 }

这种方式是保存自动配置哦,拓展新配置

如果不想保存自动配置,在类上添加@EnableWebMvc注解

方式二:采用@Bean注解提供一个WebMvcConfigurer组件

 @Configuration
 public class WebConfig2 {
 ​
     @Bean
     public WebMvcConfigurer aaa(){
         return new WebMvcConfigurer() {
             @Override
             public void addResourceHandlers(ResourceHandlerRegistry registry) {
                 registry.addResourceHandler("/xyz/**")
                         .addResourceLocations("classpath:/static1/", "classpath:/static2/");
             }
         };
     }
 ​
     @Bean
     public WebMvcConfigurer bbb(){
         return new WebMvcConfigurer() {
             @Override
             public void addInterceptors(InterceptorRegistry registry) {
                 registry.addInterceptor(new HandlerInterceptor() {
                     @Override
                     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                         System.out.println("拦截器的preHandle");
                         return true;
                     }
 ​
                     @Override
                     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
                         System.out.println("拦截器的postHandle");
                     }
 ​
                     @Override
                     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
                         System.out.println("拦截器的afterCompletion");
                     }
                 });
             }
         };
     }
 }

17.内容协商

1.什么是内容协商

客户端要什么格式的数据,咱后端就应该返回什么格式的数据

2.实现内容协商的两种方式

方式一:通过HTTP请求头,如Accept

设置请求头可以通过代码、工具,具体看文档

方式二:通过请求参数,如format

具体看文档

3.实现内容协商的接口HttpMessageConverter

系统默认提供的6个消息转换器

4.了解这些,是为了定义自己的消息转换器HttpMessageConverter

第一步:引入能够处理yaml格式的依赖

 <!--这个依赖也是jackson家族提供的,可以将java对象转换成yaml格式的字符串。-->
 <dependency>
     <groupId>com.fasterxml.jackson.dataformat</groupId>
     <artifactId>jackson-dataformat-yaml</artifactId>
 </dependency>

第二步:新增一种媒体类型yaml

默认支持xml和json两种媒体类型,要支持yaml格式的,需要新增一个yaml媒体类型,在springboot的配置文件中进行如下配置:

 spring.mvc.contentnegotiation.media-types.yaml=text/yaml

注意,以上types后面的yaml是媒体类型的名字,名字随意,如果媒体类型起名为xyz,那么发送请求时的路径应该是这样的:http://localhost:8080/detail?format=xyz

第三步:自定义HttpMessageConverter

编写类YamlHttpMessageConverter继承AbstractHttpMessageConverter

第四步:配置消息转换器

重写WebMvcConfigurer接口的configureMessageConverters方法

18.thymeleaf(以后基本不用,忽略)

19.异常处理(重点了解spirngmvc的错误处理)

重点:如果程序员使用了SpringMVC的错误处理方案,SpringBoot的错误处理方案不生效。

统一使用SpringMVC的错误处理方案,定义全局的异常处理机制:@ControllerAdvice + @ExceptionHandler

20.国际化(了解)

代码敲出来了没作用,不知道为什么

21.切换web服务器(优化web配置)

默认是Tomcat,可以切换成jetty

配置pom文件就好了

以后开发中常见的对Tomcat服务器的优化配置有:

复制去文档

22.开发实用技术整合(关键)

1.logo设置(了解)

2.整合pagehelper

第一步:引入依赖

 <!--pagehelper依赖-->
 <dependency>
     <groupId>com.github.pagehelper</groupId>
     <artifactId>pagehelper-spring-boot-starter</artifactId>
     <version>2.1.0</version>
 </dependency>

第二步:编写代码

 @RestController
 public class VipController {
 ​
     @Autowired
     private VipService vipService;
 ​
     @GetMapping("/list/{pageNo}")
     public PageInfo<Vip> list(@PathVariable("pageNo") int pageNo){
 ​
         // 1.设置当前页码和每页显示的记录条数,这个设置会自动给xml文件里面的sql语句添加limit
         PageHelper.startPage(pageNo, Constant.PAGE_SIZE);
         // 2.获取数据(PageHelper会自动给SQL语句添加limit)
         List<Vip> vips = vipService.findAll();
         // 3.将分页数据封装到PageInfo
         PageInfo<Vip> vipPageInfo = new PageInfo<>(vips);
         return vipPageInfo;
 ​
     }
 ​
 }

3.web响应结果封装(重要)

对于前后端分离的系统来说,为了降低沟通成本,我们有必要给前端系统开发人员返回统一格式的JSON数据。多数开发团队一般都会封装一个R对象来解决统一响应格式的问题。

这个封装代码是通用的,每个项目都可以用同一个

第一步:编写封装R对象

R对象里面固定三个属性,状态码、消息、数据泛型

自定义不同场景下的方法:成功、失败(失败又分别对应不同异常)

因此需要改进

编写一个枚举类,来枚举方法中需要用的code和meg的组合情况

 // 专门维护code+msg的一个枚举类型
 //@Data
 @NoArgsConstructor
 @AllArgsConstructor
 //@Setter
 public enum CodeEnum {
 ​
     //这地方没有写枚举值,那么由于后面有其他代码,这里至少要写一个“;”
     OK(200, "成功"),
     FAIL(400, "失败"),
     BAD_REQUEST(400, "请求错误"),
     NOT_FOUND(404, "Not Found"),
     INTERNAL_ERROR(500, "内部服务器错误"),
     MODIFICATION_FAILED(400, "修改失败"),
     DELETION_FAILED(400, "删除失败"),
     CREATION_FAILED(400, "创建失败");;
 ​
     // javase当中详细讲过枚举类型
     // 枚举类型当中可以有属性
     // 枚举类型当中可以有构造方法
     // 枚举类型当中可以有setter和getter方法。
     // 在枚举类型当中有一个语法要求,枚举的大括号一开始的位置必须编写枚举值。
     // 每一个枚举值就是一个枚举类型的实例。
 ​
 ​
     @Setter
     @Getter
     private int code;
 ​
     @Setter
     @Getter
     private String msg;
 }

第二步:在Controller的方法上,返回封装对象R

 @GetMapping("/list/{pageNo}")
 public R<PageInfo<Vip>> list(@PathVariable int pageNo) {
     PageHelper.startPage(pageNo, Constant.PAGE_SIZE);
     List<Vip> vips = vipService.findAll();
     PageInfo<Vip> vipPageInfo = new PageInfo<>(vips);
     return R.OK(vipPageInfo);
 }

其实就是把原本直接返回的数据,传入R类的方法,然后以统一的code+msg+data的格式输出

4.事务管理(重要)

在springboot里面进行事务管理就很简单了

@Transactional注解标注需要控制事务的方法即可

一般是加在某个业务方法,也就是ServiceImpl类上

5.打包成war包(了解)

看文档

6.日志处理(重要)

具体见文档,这里只写关键的

6.1.日志框架分为抽象日志框架和具体日志框架

常用:

抽象日志框架:SLF4J

具体日志框架:LogBack

springboot默认使用LogBack

6.2.springboot默认日志级别为INFO

修改日志级别,通过以下配置:

logging.level.root=DEBUG

6.3.日志的粗细粒度(关键)

 设置根日志级别为 INFO(整个项目都使用INFO日志级别,这是粗粒度的配置。)
 logging.level.root=INFO
 ​
 为特定的包设置日志级别为 DEBUG
 logging.level.com.powernode=DEBUG
 ​
 为特定的类设置日志级别为 TRACE
 logging.level.com.powernode.MyService=TRACE
 

具体应用:希望在进行CRUD的时候打印日志信息

进行以下配置

 #整个项目默认使用INFO日志级别
 logging.level.root=INFO
 #对于mapper包下的方法,也就是Mybatis进行CRUD的方法使用DEBUG的日志级别
 logging.level.com.powernode.mapper=DEBUG

6.4日志输出到文件

两种方式,且两种方式不能共存!!

方式一:logging.file.path=./log/

以上配置表示将日志文件输出到当前工程根目录下的log目录当中,文件名默认叫做spring.log。并且文件名不可设置。

方式二:logging.file.name=my.log

以上的配置表示在工程的根目录下直接生成my.log文件。并且路径不可设置。

两个配置同时存在时,只有logging.file.name生效。

6.5滚动日志(关键)

简单来说就是一个大的持续项目,每天都会生成很多日志,可以设置多大的文件就打一个压缩包下来存着,然后记录其时间

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值