SpringBoot
springboot概述
SpringBoot基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程
另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决
SpringBoot框架中还有两个非常重要的策略:**开箱即用 **和 约定优于配置
开箱即用(Outofbox)
- 是指在开发过程中,通过在MAVEN项目的pom.xml文件中添加相关依赖包,然后使用对应注解来代替繁琐的XML配置文件以管理对象的生命周期
约定优于配置(Convention over configuration)
是一种由SpringBoot本身来配置目标结构,由开发者在结构中添加信息的软件设计范式
这一特点虽降低了部分灵活性,增加了BUG定位的复杂性,但减少了开发人员需要做出决定的数量,同时减少了大量的XML配置,并且可以将代码编译、测试和打包等工作自动化
Spring Boot 是所有基于 Spring 开发的项目的起点。Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置文件
回顾我们之前的 SSM 项目,搭建过程还是比较繁琐的,而使用 Spring Boot 来开发项目则只需要非常少的几个配置就可以搭建起来一个 Web 项目,并且利用 IDEA 可以自动生成生成
只需要在springboot中导入对应的场景启动器(starter)即可使用
springboot装配包原理
@RestController注解
相当于Controller注解加ResponseBody注解
同样可以将实例装载进spring核心容器中
application.properties文件
springboot配置文件
修改端口
server.port=8081
springboot底层封装的是spring
spring可以完成的功能:首先会有核心容器,然后将所有组件交由核心容器管理
1、spring中创建核心容器的方式:
基于xml的方式创建核心容器对象
基于核心配置类的方式来创建核心容器对象
2、springboot是如何创建核心容器对象?
springboot框架的目的就是简化spring的开发,尽量避免去写配置文件
springboot是基于核心配置类的方式来创建核心容器对象
@Bean 如果用该注解修饰了一个方法,那么该方法的返回值会作为一份实例存进容器中
3、springboot自动装配包:
springboot不能基于xml的方式创建容器对象,除了像mybatis中那种核心配置文件以外,springboot不能通过配置
的方式来注册实例 springboot只能够通过注解的方式来将一份实例装载到容器里,springboot会指定一个固定的包(包下有一个入口类Application或者叫启动类)
我们把程序所需要的资源放在这个包下,springboot在启动的时候会扫描这个包下面所有的组件
@SpringBootApplication注解
自动装配包注解,声明当前工程是一个springboot工程,在入口类Application上由idea生成springboot工程时自动生成,能够起到自动扫描包的作用(内置ComponentScan注解)
总结:springboot中的自动装配包跟@SpringBootApplication注解有关:
也是springboot中的约定大于配置:入口类所在的包就是springboot指定的资源包
同包或者子包的资源才能被扫描到!
springboot是通过启动类的方式来导入资源,springboot默认会存在一个包叫autoconfiguration,它会存放所有需要被装配类的全类名,通过反射机制创建实例,自动装配到核心容器中
springboot整合mybatis
springboot的pom文件中存在一个版本仲裁中心,会帮助我们去管理资源的版本,但是在导入mysql驱动的时候就不能交由springboot管理,需要根据我们自己安装的数据库版本去导入对应驱动
1、需要引入相关坐标
<!--数据源相关-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<!--spring整合mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
2、需要在application.properties文件中注册数据源信息
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/web_test?serverTimezone=GMT&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
将mybatis通过代理模式创建的持久层接口实例通过springboot装配进核心容器中
3、在Application类上加**@MapperScan注解**
mybatis扫描器,类似于spring中的扫描器标签,扫描持久层接口
需要提供持久层接口所在包的全类名
@MapperScan("com.os467.demo.mapper")
4、在application.properties文件中添加映射xml文件所在位置
mybatis.mapper-locations=classpath:com/os467/demo/mapper/*.xml
springboot视图跳转jsp
由于springboot内置的tomcat不支持jsp所以需要有插件的支持
- 在java同级目录下创建一个webapp文件,使得与java文件同级
- 在webapp文件中创建jsp目录,存放jsp文件
配置视图解析器
#配置视图解析器
spring.mvc.view.prefix=/jsp/
spring.mvc.view.suffix=.jsp
需要导入必要插件坐标
springboot支持jsp
<!--要返回jsp页面需要以下配置-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
以后我们会使用freemark模板,在springboot项目不会使用jsp模板
在springboot中引入静态资源
通常我们会在本地static文件中存放需要的css,js资源等,我们需要在前端访问这些资源
但是springboot会默认拦截前端的资源访问,因此我们可以通过配置类的方式配置资源路径
实现WebMvcConfigurer接口,使用@Configuration注解
addResourceHandler()
需要拦截的资源路径
addResourceLocations()
定位到的后端资源路径
package com.os467.demo.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
}
freemarker模板
导入maven坐标
<!--模板引擎-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
创建一个freemarker文件
在templates文件下创建一个list.ftl
配置视图解析器
#配置freemark视图的位置
spring.freemarker.template-loader-path=classpath:/templates/
#设置freemark的后缀
spring.freemarker.suffix=.ftl
学习模板引擎的目的就是为了渲染数据,要学习对应的语法
freemarker相关配置
# 是否允许HttpServletRequest属性覆盖(隐藏)控制器生成的同名模型属性。
spring.freemarker.allow-request-override=false
# 是否允许HttpSession属性覆盖(隐藏)控制器生成的同名模型属性。
spring.freemarker.allow-session-override=false
# 是否启用模板缓存。
spring.freemarker.cache=false
# 模板编码。
spring.freemarker.charset=UTF-8
# 是否检查模板位置是否存在。
spring.freemarker.check-template-location=true
# Content-Type value.
spring.freemarker.content-type=text/html
# 是否启用freemarker
spring.freemarker.enabled=true
# 设定所有request的属性在merge到模板的时候,是否要都添加到model中.
spring.freemarker.expose-request-attributes=false
# 是否在merge模板的时候,将HttpSession属性都添加到model中
spring.freemarker.expose-session-attributes=false
# 设定是否以springMacroRequestContext的形式暴露RequestContext给Spring’s macro library使用
spring.freemarker.expose-spring-macro-helpers=true
# 是否优先从文件系统加载template,以支持热加载,默认为true
spring.freemarker.prefer-file-system-access=true
# 设定模板的后缀.
spring.freemarker.suffix=.ftl
# 设定模板的加载路径,多个以逗号分隔,默认:
spring.freemarker.template-loader-path=classpath:/templates/
# 设定FreeMarker keys.
spring.freemarker.settings.template_update_delay=0
spring.freemarker.settings.default_encoding=UTF-8
spring.freemarker.settings.classic_compatible=true
freemarker基础语法
参考博客
遍历集合
<html>
<head>
</head>
<body>
<#--通过freemarker来遍历集合中的对象-->
<#list empList as emp >
${emp}
</#list>
</body>
</html>
条件判断
<td>
<#if (emp.sex == 1)>
男
<#elseIf (emp.sex == 0)>
女
</#if>
</td>
字符串处理函数
格式:字符串值 ?
方法
${student.location ? replace("-","")}
freemarker判空处理
${name} 假如name为空就会报错, ${user.name} user对象或者name为空也会报错
<#if name??>
假如name不为空则执行这段代码
<#else>
假如name为空则执行这段代码
</#if>
- 也可以使用 ${name!} 来避免这个对象或者属性为空而引起报错
- 默认显示空字符串(当然赋予默认值也行 例如:
${name!"tom"}
当name为空默认显示tom)
但是 ${user.name}这个情况比较特殊,user对象 和name属性都可能为空
${user.name!}
只能处理name可能为空引起的错误,当user为空的时候还是会报错
所以 ${(user.name)!}
用()
括起来 这样不管哪个为空 就都不会报错了
user或者name为null,都显示为空
<#if (user.name)??>
</#if>
拓展知识
Springboot启动预处理
果希望在SpringBoot应用启动时进行一些初始化操作可以选择使用CommandLineRunner来进行处理
实现CommandLineRunner,将实现类注入容器,实现run方法即可
@Component
public class TestRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("程序初始化");
}
}
SpringBoot定时任务
在启动类上加上**@EnableScheduling**注解
@EnableScheduling
@SpringBootApplication
@MapperScan("com.os467.mapper")
public class Os467FrontApplication {
public static void main(String[] args) {
SpringApplication.run(Os467FrontApplication.class,args);
}
}
为定时任务方法加上**@Scheduled**注解
指定cron表达式来设置任务触发规则
cron表达式在线测试:https://www.bejson.com/othertools/cron/
@Component
public class BlogScheduleJob {
@Scheduled(cron = "0/5 * * * * ?")
public void scheduleJob(){
System.out.println("定时任务执行了");
}
}
如上我们用到的 0/5 * * * * ? *,cron表达式由七部分组成,中间由空格分隔,这七部分从左往右依次是:
秒(0
59),分钟(059),小时(0~23),日期(1- 月最后一天),月份(1-12),星期几(1-7,1表示星期日),年份(一般该项不设置,直接忽略掉,即可为空值,spring在3.5版本后不支持7位cron)
cron表达式
通用特殊字符, - * /
可以在任意部分使用
*
代表任意值* * * * * ?
表示 每年每月每天每时每秒
,
可以用来定义列表1,2,3 * * * * ?
表示每年每月每天每时每分的第1秒,第2秒,第3秒
-
定义范围1-3 * * * * ?
表示每年每月每天每秒的第1到3秒
/
每隔多少时间 从多少开始/每隔几秒5/10 * * * * ?
每年每月每天每时每分的第五秒开始每隔10秒执行一次
特殊字符:
日期部分可用特殊字符? L W
?
只可用在日期和星期部分,表示没有具体的值,使用?
要注意冲突,日期和星期两个部分如果其中一个部分设置了值,则另一个必须设置为?
0\* * * 2 * ?
和0\* * * ? * 2
- 同时使用?和同时不使用?都是不对的
W
只能用在日期中,表示当月中最接近某天的工作日0 0 0 31W * ?
表示最接近31号的工作日,如果31号是星期六,则表示30号,即星期五,如果31号是星期天,则表示29号,即星期五,如果31号是星期三,则表示31号本身,即星期三
L
只能用在日期和星期中,在日期中表示每月最后一天,也可以表示每月倒数第N天 例如 L-2表示每个月倒数第二天LW
可以连起来用,表示每个月最后一个工作日,即每月最后一个星期五L
在星期中则表示7,即星期六,6L
(6为星期五)则表示每个月最后一个星期五
#
只能使用在星期部分,表示第几个星期几6#3
表示第三个星期五
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 1300452403@qq.com