SpringBoot基础学习笔记
阅读原文时间:2023年07月08日阅读:1

springboot官网参考

Sringboot是整合spring技术栈的一站式框架,其简化配置,实现了自动化配置

1、pom.xml文件:

springboot的父工程、GAV坐标、编译版本、所需依赖、项目打包编译插件等

(依赖方式可采用maven的继承机制与聚合机制)

注:

starter场景启动器:

(1)、spring-boot-starter-*:官方提供

(2)、*-spring-boot-starter:第三方提供

2、java目录下:

@SpringBootApplication注解使用参考

(1)、main主类,作为SpringBoot项目的启动入口类,项目代码必须放到Application类(即主类)所在的同级目录或下级目录(默认扫描)

(2)、可改变主类的扫描包的路径:

1)、方式一:

@SpringBootApplication(scanBasePackages="包名")

2)、方式二:

@ComponentScan(指定扫描路径)
@SpringBootApplication

3、resources目录下:

(1)、/static:存放静态资源,如图片、CSS、JavaScript 等

(2)、/templates:存放Web页面的模板文件,例springboot官方推荐的前端模板引擎Thymeleaf,Java 生态下的模板引擎有 Thymeleaf 、Freemaker、Velocity、Beetl(国产)等

(3)、application.properties/application.yml :springboot的核心配置文件,用于存放程序的各种依赖模块的配置信息,比如服务端口,数据库连接配置等

(当两种格式的配置文件同时存在使用的是application.properties)

(4)、多环境的核心配置文件:

(命名规则:application-环境标识.properties/yml):

可将开发环境分为:

1)、总配置文件:application.properties

(用于激活所使用的环境:spring.profiles.active=环境标识)

2)、开发环境配置文件(环境标识:dev):application-dev.properties(配置端口、上下文根)

3)、测试环境配置文件(环境标识:test):application-test.properties(配置端口、上下文根)

4)、生产环境配置文件(环境标识:product):application-product.properties(配置端口、上下文根)

#总配置文件
#配置内嵌Tomcat端口号:
server.port=8080
#配置项目的上下文根:
server.servlet.context-path=/dev

1、@Configuration详解:

@Configuation等价于spring中XML的标签

参数

描述

proxyBeanMethods=true

Full模式,保证每个@Bean方法被调用多少次返回的组件都是单实例的(默认)

proxyBeanMethods=false

Lite模式,每个@Bean方法被调用多少次返回的组件都是新创建的

2、@Bean详解:

@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里,等价于spring中XML的标签

参数

描述

value

用来修改被标注bean在IOC容器中的id属性

name

用来修改被标注bean在IOC容器中的id属性

autowire

表示自动装配的类型,返回一个Autowire类型的枚举,默认值为No

initMethod

指定初始化调用方法

destroyMethod

指定销毁时调用方法,当存在close()或shutdown()方法时,单实例的 bean 才会调用该方法

3、@Import详解:

@Import注解参考

引入外部类或给容器中导入组件

参数

描述

value

(默认)全类名=包名+类名

三种用法:

(1)、.class数组方式:

@Import({TestA.class, TestB.class})

(2)、ImportSelector方式:

需要写个类实现ImportSelector接口,重写其selectImports()方法,@Import返回的是要导入到容器中的这个类的全类名数组。

(3)、ImportBeanDefinitionRegistrar方式:

需要写个类实现ImportBeanDefinitionRegistrar接口,重写registerBeanDefinitions()方法,不过这种方式可以自定义Bean在容器中的名称。

4、@ImportResource详解:

用于导入Spring的xml配置文件,让该配置文件中定义的bean对象加载到Spring容器中

@ImportResource("classpath:配置文件.xml")

注:

该注解只能使用配置类注解(@Configuration)或者组件注解(@Component)中使用,否则无效。

5、@Conditional详解:

满足Conditional指定的条件,则进行组件注入(即按条件给容器注册不同的bean)

(1)、@Conditional家族:

其中相关注释

描述

@ConditionalOnBean

仅在当前上下文中存在某个对象时,才会实例化一个Bean

@ConditionalOnClass

某个class位于类路径上,才会实例化一个Bean

@ConditionalOnExpression

当表达式为true的时候,才会实例化一个Bean。如:@ConditionalOnExpression("true")

@ConditionalOnMissingBean

仅在当前上下文中不存在某个对象时,才会实例化一个Bean

@ConditionalOnMissingClass

某个class类路径上不存在的时候,才会实例化一个Bean

@ConditionalOnNotWebApplication

不是web应用

@ConditionalOnProperty

@ConditionalOnProperty注解来控制@Configuration是否生效

(2)、@Conditional简单使用:

6、@ConfigurationProperties详解:

使用Java读取到.properties文件中的配置内容,并且把它封装到JavaBean中,以供随时使用

Springboot的配置绑定方式:

(1)、@ConfigurationProperties + @Component

(2)、@EnableConfigurationProperties + @ConfigurationProperties

7、@PathVariable详解:

接收请求路径中占位符的值

RESTFul:一种互联网软件架构设计的风格

(1)、@PathVariable(路径变量)

(2)、@RequestHeader(获取请求头)

(3)、@RequestParam(获取请求参数)

(4)、@MatrixVariable(矩阵变量)

(5)、@CookieValue(获取cookie值)

(6)、@RequestBody(获取请求体)

8、@Scheduled详解:

定时器方式参考

为了减少服务器、数据库的压力使用@Scheduled创建定时任务去完成某些业务逻辑

(1)、@Scheduled参数:

1)、各个参数:

参数

描述

cron

定时任务执行的cron表达式

zone

cron表达时解析使用的时区,默认为服务器的本地时区,使用:

java.util.TimeZone#getTimeZone(String)方法解析

fixedDelay

上一次任务执行结束到下一次执行开始的间隔时间,单位为ms

fixedDelayString

上一次任务执行结束到下一次执行开始的间隔时间,使用:

java.time.Duration#parse解析

fixedRate

以固定间隔执行任务,即上一次任务执行开始到下一次执行开始的间隔时间,单位为ms,若在调度任务执行时,上一次任务还未执行完毕,会加入worker队列,等待上一次执行完成后立即执行下一次任务

fixedRateString

与fixedRate逻辑一致,只是使用java.time.Duration#parse解析

initialDelay

首次任务执行的延迟时间

initialDelayString

首次任务执行的延迟时间,使用java.time.Duration#parse解析

2)、cron参数的使用:

cron表达式语法:

[秒] [分] [小时] [日] [月] [周] [年]

说明

必填

允许填写范围

允许的通配符

0-59

, - * /

0-59

, - * /

0-23

, - * /

1-31

, - * ? / L W

1-12 / JAN-DEC

, - * /

1-7 or SUN-SAT

, - * ? / L #

1970-2099

, - * /

示例:

表达式

描述

0 */1 * * * ?

每隔1分钟执行一次

0 0 23 * * ?

每天23点执行一次

3)、通配符说明:

通配符

说明

*

表示所有值

?

表示不指定值。使用的场景为不需要关心当前设置这个字段的值

-

表示区间

,

表示指定多个值

/

用于递增触发

L

表示最后的意思。如在日字段设置上,表示当月的最后一天

W

表示离指定日期的最近那个工作日(周一至周五)

#

序号(表示每月的第几个周几)

(2)、@Scheduled的使用:

要使用@Scheduled注解,首先需要在启动类添加@EnableScheduling,启用Spring的计划任务执行功能,这样可以在容器中的任何Spring管理的bean上检测@Scheduled注解,执行计划任务

注:

定时任务执行默认是单线程模式,会创建一个本地线程池,线程池大小为1。当项目中有多个定时任务时,任务之间会相互等待,同步执行(定时任务异步执行参考

9、@Async详解:

@Async异步注解参考一

@Async异步注解参考二

在Spring中,基于@Async标注的方法,称之为异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。(异步调用)

(1)、@Async的异步线程池获取顺序:

(2)、@EnableAsync注解:

(3)、@Async失效情况:

1)、异步方法使用static修饰

2)、异步类没有使用@Component注解(或其他注解)导致spring无法扫描到异步类

3)、异步方法不能与被调用的异步方法在同一个类中,因为无法产生切面

4)、类中需要使用@Autowired或@Resource等注解自动注入,不能自己手动new对象

5)、如果使用SpringBoot框架必须在启动类中增加@EnableAsync注解

(4)、自定义线程池配置:

@Async("自定义线程池bean name")

代码实现:

@Configuration
public class AsyncConfig {

private static final int MAX\_POOL\_SIZE = 50;//最大线程数  
public static final int CORE\_POOL\_SIZE = 20;//核心线程数

@Bean("asyncExecutor")  
public AsyncTaskExecutor asyncTaskExecutor() {  
    ThreadPoolTaskExecutor async = new ThreadPoolTaskExecutor();

    async.setMaxPoolSize(MAX\_POOL\_SIZE);  
    async.setCorePoolSize(CORE\_POOL\_SIZE);  
    async.setThreadNamePrefix("async-thread");//线程名称  
    async.setWaitForTasksToCompleteOnShutdown(false);  
    async.setQueueCapacity(100);//队列容量

    //1. 当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常  
    async.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());//拒绝策略

    //2. 当任务添加到线程池中被拒绝时,会在线程池当前正在运行的Thread线程池中处理被拒绝的任务  
    //async.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

    //3. 当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。  
    //async.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy());

    //4. 当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。  
    //async.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());

    return async;  
}  

}

.properties/yml两种格式的配置文件同时存在使用的是.properties格式

1、YAML的基本语法

(1)、key: value;

注:kv之间存有空格

(2)、大小写敏感

(3)、使用缩进表示层级关系

(4)、缩进不允许使用tab,只允许空格

(5)、缩进的空格数不重要,只要相同层级的元素左对齐即可

(6)、'#'表示注释

(7)、字符串无需加引号,

注:如果要加,''与""表示字符串内容会被转义/不转义

2、YAML的数据类型

(1)、字面量(k: v):单个的、不可再分的值。date、boolean、string、number、null

(2)、对象:键值对的集合。map、hash、set、object

(3)、数组:一组按次序排列的值。array、list、queue

1、热部署:

热部署:当应用程序正在运行的时候升级软件或修改某一部分代码、配置文件时,无需重新启动应用,即可使升级的软件和修改后的代码、配置文件生效。

2、原理:

使用两个ClassLoader,一个Classloader加载那些不会改变的类(第三方jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader。这样在有代码更改时,原来的restart ClassLoader被丢弃,重新创建一个restart ClassLoader。

3、实现流程:

(1)、POM文件添加依赖:


org.springframework.boot spring-boot-devtools runtime true

(2)、POM文件添加配置:

org.springframework.boot spring-boot-maven-plugin true true

(3)、开启自动构建:

(4)、设置更新:

快捷键:Ctrl+Shift+Alt+/

选择:Registry

勾选:compiler.automake.allow.when.app.running

springboot自动配置原理参考

Springboot启动的时候会通过@EnableAutoConfiguration注解找到配置文件中的所有自动配置类(XxxxAutoConfiguration类),并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。

springboot静态资源配置原理参考

springboot静态资源配置流程参考

SpringBoot启动会默认加载xxxAutoConfiguration自动配置类,而关于静态资源的配置是在WebMvcAutoConfiguration自动配置类中进行的,在该类中又有一个WebMvcAutoConfigurationAdapter静态内部类,这个静态内部类的构造器方法从容器中获取了所有关于静态资源配置的配置类如ResourceProperties等,在一个名为addResourceHandlers方法中规定了静态资源配置的规则,而ResourceProperties配置类与application.yaml配置文件中的属性相关联,来达到修改静态资源配置的目的。而关于欢迎页的处理在EnableWebMvcConfiguration内部类的welcomePageHandlerMapping()方法中,该方法实例化了WelcomePageHandlerMapping对象,在WelcomePageHandlerMapping类中定义了对欢迎页跳转到index.html的规定。

SpringBoot的请求映射与SpringMVC是相同的,根据DispatcherServlet(中央调度器)完成请求映射的功能。请求首先到HttpServlet的doGet()方法,然后这个方法被FrameworkServlet类重写了,在该方法内又调用了该类的processRequest()方法,然后又调用了DispatcherServlet实现的doService()方法,最终交由doDispatcher()方法进行处理。

请求进来,会挨个尝试所有的HandlerMapping查看是否有相应的请求信息,

(1)、若有则找到这个请求对应的handler,

(2)、若无则继续向下查看HandlerMapping

(3)、若请求为空,即"/",则循环到下一个控制器WelcomePageHandlerMapping,根据其处理,转发到index.html欢迎页中。

通过参数解析器(HandlerMethodArgumentResolver)对写入的参数进行解析,能否解析取决于参数解析器的种类是否支持(使用supportsParameter判断)写入的参数,如果支持就调用参数解析器的resolveArgument方法解析。

1、返回值处理器(HandlerMethodReturnValueHandler类)调用supportsReturnType方法判断返回值类型是否支持,再调用handleReturnValue方法对返回值进行处理。

2、RequestResponseBodyMethodProcessor类可以处理标有@ResponseBody注解的返回值。

(1)、SpringMVC会挨个遍历所有容器底层的HttpMessageConverter可以将对象写为json

1)、得到MappingJackson2HttpMessageConverter可以将对象写为json

2)、利用MappingJackson2HttpMessageConverter将对象转为json再写出去

1、starter场景启动器:

SpringBoot-starter是一个集成接合器,主要完成两件事:

(1)、引入模块所需的相关jar包

(2)、自动配置各自模块所需的属性

注:

spring-boot-starter-*:官方提供

*-spring-boot-starter:第三方提供

2、starter实现原理:

手写starter参考

(1)、首先,SpringBoot在启动时会先去依赖的starter包中寻找 resources/META-INF/spring.factories 文件,然后根据文件中配置的Jar包去扫描项目所依赖的Jar包

(2)、然后,根据 spring.factories 配置加载自动配置类。

(3)、最后,根据 @Conditional 注解的条件,进行自动配置,并将Bean注入Spring Context上下文当中。

springboot启动原理参考一

springboot启动原理参考二

SpringBoot整个启动流程分为两个步骤:

1、初始化一个SpringApplication对象

通过SpringFactoriesLoader找到spring.factories文件中配置的ApplicationContextInitializer和ApplicationListener两个接口的实现类名称,以便后期构造相应的实例

2、执行该对象的run方法。

SpringApplication.run方法中,本质上其实是在spring的基础之上做了封装

Lombok常用注解:

注解

描述

@Getter/@Setter

自动产生getter/setter

@ToString

自动重写toString() 方法

@EqualsAndHashCode

自动生成 equals(Object other) 和 hashcode() 方法,包括所有非静态变量和非 transient 的变量

@NoArgsConstructor

生成一个没有参数的构造器

@AllArgsConstructor

生成一个包含所有参数的构造器

@RequiredArgsConstructor

生成一个包含 "特定参数" 的构造器,特定参数指的是那些有加上final修饰词的变量

@Builder

自动生成流式set值写法

@Slf4j

自动生成该类的log静态常量,不用再手动new log创建静态常量

@Value

整合包,会把所有的变量都设成final的,是以下注解的集合:@Getter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor

@Data

整合包,是以下注解的集合:@Getter/@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor

搜索

复制