SpringBoot基础学习笔记
Springboot框架:
Sringboot是整合spring技术栈的一站式框架,其简化配置,实现了自动化配置
Springboot基础结构:
1、pom.xml文件:
springboot的父工程、GAV坐标、编译版本、所需依赖、项目打包编译插件等
(依赖方式可采用maven的继承机制与聚合机制)
注:
starter场景启动器:
(1)、spring-boot-starter-*:官方提供
(2)、*-spring-boot-starter:第三方提供
2、java目录下:
(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
Springboot注解式开发(常见):
1、@Configuration详解:
@Configuation等价于spring中XML的<Beans></Beans>标签
参数 |
描述 |
proxyBeanMethods=true |
Full模式,保证每个@Bean方法被调用多少次返回的组件都是单实例的(默认) |
proxyBeanMethods=false |
Lite模式,每个@Bean方法被调用多少次返回的组件都是新创建的 |
2、@Bean详解:
@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里,等价于spring中XML的<Bean></Bean>标签
参数 |
描述 |
value |
用来修改被标注bean在IOC容器中的id属性 |
name |
用来修改被标注bean在IOC容器中的id属性 |
autowire |
表示自动装配的类型,返回一个Autowire类型的枚举,默认值为No |
initMethod |
指定初始化调用方法 |
destroyMethod |
指定销毁时调用方法,当存在close()或shutdown()方法时,单实例的 bean 才会调用该方法 |
3、@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详解:
在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;
}
}
Springboot配置文件. yml格式的使用:
当.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
Springboot的热部署:
1、热部署:
热部署:当应用程序正在运行的时候升级软件或修改某一部分代码、配置文件时,无需重新启动应用,即可使升级的软件和修改后的代码、配置文件生效。
2、原理:
使用两个ClassLoader,一个Classloader加载那些不会改变的类(第三方jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader。这样在有代码更改时,原来的restart ClassLoader被丢弃,重新创建一个restart ClassLoader。
3、实现流程:
(1)、POM文件添加依赖:
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
(2)、POM文件添加配置:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
(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启动会默认加载xxxAutoConfiguration自动配置类,而关于静态资源的配置是在WebMvcAutoConfiguration自动配置类中进行的,在该类中又有一个WebMvcAutoConfigurationAdapter静态内部类,这个静态内部类的构造器方法从容器中获取了所有关于静态资源配置的配置类如ResourceProperties等,在一个名为addResourceHandlers方法中规定了静态资源配置的规则,而ResourceProperties配置类与application.yaml配置文件中的属性相关联,来达到修改静态资源配置的目的。而关于欢迎页的处理在EnableWebMvcConfiguration内部类的welcomePageHandlerMapping()方法中,该方法实例化了WelcomePageHandlerMapping对象,在WelcomePageHandlerMapping类中定义了对欢迎页跳转到index.html的规定。
Springboot请求映射原理:
SpringBoot的请求映射与SpringMVC是相同的,根据DispatcherServlet(中央调度器)完成请求映射的功能。请求首先到HttpServlet的doGet()方法,然后这个方法被FrameworkServlet类重写了,在该方法内又调用了该类的processRequest()方法,然后又调用了DispatcherServlet实现的doService()方法,最终交由doDispatcher()方法进行处理。
请求进来,会挨个尝试所有的HandlerMapping查看是否有相应的请求信息,
(1)、若有则找到这个请求对应的handler,
(2)、若无则继续向下查看HandlerMapping
(3)、若请求为空,即"/",则循环到下一个控制器WelcomePageHandlerMapping,根据其处理,转发到index.html欢迎页中。
Springboot参数解析原理:
通过参数解析器(HandlerMethodArgumentResolver)对写入的参数进行解析,能否解析取决于参数解析器的种类是否支持(使用supportsParameter判断)写入的参数,如果支持就调用参数解析器的resolveArgument方法解析。
Springboot返回值解析器原理:
1、返回值处理器(HandlerMethodReturnValueHandler类)调用supportsReturnType方法判断返回值类型是否支持,再调用handleReturnValue方法对返回值进行处理。
2、RequestResponseBodyMethodProcessor类可以处理标有@ResponseBody注解的返回值。
(1)、SpringMVC会挨个遍历所有容器底层的HttpMessageConverter可以将对象写为json
1)、得到MappingJackson2HttpMessageConverter可以将对象写为json
2)、利用MappingJackson2HttpMessageConverter将对象转为json再写出去
SpringBoot-starte详解:
1、starter场景启动器:
SpringBoot-starter是一个集成接合器,主要完成两件事:
(1)、引入模块所需的相关jar包
(2)、自动配置各自模块所需的属性
注:
spring-boot-starter-*:官方提供
*-spring-boot-starter:第三方提供
2、starter实现原理:
(1)、首先,SpringBoot在启动时会先去依赖的starter包中寻找 resources/META-INF/spring.factories 文件,然后根据文件中配置的Jar包去扫描项目所依赖的Jar包
(2)、然后,根据 spring.factories 配置加载自动配置类。
(3)、最后,根据 @Conditional 注解的条件,进行自动配置,并将Bean注入Spring Context上下文当中。
Springboot启动原理:
SpringBoot整个启动流程分为两个步骤:
1、初始化一个SpringApplication对象
通过SpringFactoriesLoader找到spring.factories文件中配置的ApplicationContextInitializer和ApplicationListener两个接口的实现类名称,以便后期构造相应的实例
2、执行该对象的run方法。
SpringApplication.run方法中,本质上其实是在spring的基础之上做了封装
Lombok插件:
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 |
搜索
复制
SpringBoot基础学习笔记的更多相关文章
- SpringBoot -基础学习笔记 - 01
SpringBoot个人笔记-szs 一.使用thymeleaf模板引擎来指定所需资源的位置 可以做到当项目名进行更改后,模板引擎也会进行更新相关的路径;如下图展示,会自动添加crud根目录! < ...
- 【C#编程基础学习笔记】4---Convert类型转换
2013/7/24 技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]4---Convert类型转换 ...
- 【C#编程基础学习笔记】6---变量的命名
2013/7/24 技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]6---变量的命名 ----- ...
- 1.C#基础学习笔记3---C#字符串(转义符和内存存储无关)
技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com ------------------------------------- ...
- Java基础学习笔记总结
Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...
- Mysql数据库基础学习笔记
Mysql数据库基础学习笔记 1.mysql查看当前登录的账户名以及数据库 一.单表查询 1.创建数据库yuzly,创建表fruits 创建表 ) ) ,) NOT NULL,PRIMARY KEY( ...
- 0003.5-20180422-自动化第四章-python基础学习笔记--脚本
0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...
- Java基础学习笔记(一)
Java基础学习笔记(一) Hello World 基础代码学习 代码编写基础结构 class :类,一个类即一个java代码,形成一个class文件,写于每个代码的前端(注意无大写字母) XxxYy ...
- C#RabbitMQ基础学习笔记
RabbitMQ基础学习笔记(C#代码示例) 一.定义: MQ是MessageQueue,消息队列的简称(是流行的开源消息队列系统,利用erlang语言开发).MQ是一种应用程序对应用程序的通信方法. ...
随机推荐
- 华为云ubunbu部署.NetCore3.1项目(DDD商城)
提前项目打包发布,文件传输工具Filezilla,注意是选择sftp协议,将publish文件传到/home文件夹下 第一步 .NetCoreSDK安装 微软官方的文档https://docs.mi ...
- C语言小白刷题
1.有n个评委,他们给出score个分数,请用代码写出平均值,ave代表平均值 2022-10-15 13:17:10 int main() { int n, i =1, score, sum = 0 ...
- ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)
ASCII(American Standard Code for Information Interchange,美国标准信息交换代码) ASCII简介 ASCII(American Standard ...
- composer 报错 The "https://mirrors.aliyun.com/composer/p....json" file could not be downloaded (HTTP/1.1 404 Not Found)
[Composer\Downloader\TransportException] The "https://mirrors.aliyun.com/composer/p/provider-20 ...
- HTML+CSS基础知识(5)相对定位、绝对定位、固定定位
文章目录 1.相对定位 1.1 代码 1.2 测试结果 2.绝对定位 2.1 代码 2.2 测试 3.固定定位 3.1 代码 3.2 测试结果 1.相对定位 1.1 代码 <!DOCTYPE h ...
- 利用nginx自带的反向代理以及轮询功能实现应用的负载均衡
针对中间件部署的应用(war包),可使用nginx自带的反向代理以及轮询功能,实现应用的负载均衡. 一.架构图 二.环境准备 准备2套环境,如19.1.0.18:7001,19.1.0.16:7001 ...
- Java注解和反射笔记
Java注解和反射笔记 1 注解 1.1 定义 Annotation是从JDK1.5开始引入的技术 作用 不是程序本身,可以对程序作出解释 可以被其他程序(编译器等)读取 格式 @注释名,可以添加一些 ...
- 镜像制作工具diskimage-builder介绍
简介 diskimage-builder(简称dib)是一款用于构建系统镜像的工具,它被设计用于OpenStack的TripleO项目,支持qocw2.vhd.raw等主流镜像格式. 在众多系统镜像构 ...
- zabbix-钉钉报警部署
zabbix-钉钉报警部署 1. 流程说明 申请钉钉机器人 获取Webhook配置安全设置 获取钉钉号 使用脚本(shell/python)调用钉钉接口: python 输入收件人 信息 配置发件人 ...
- Containerd 如何配置 Proxy?
前言 在某些 air gap 场景中,往往需要离线或使用代理 (Proxy), 例如: 需要通过 Proxy pull 容器镜像: Docker Hub: docker.io Quay: quay.i ...