SpringBoot

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基础语法

参考博客

语法参考1

语法参考2

遍历集合

<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表达式由七部分组成,中间由空格分隔,这七部分从左往右依次是:

秒(059),分钟(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

文章标题:SpringBoot

字数:3.1k

本文作者:Os467

发布时间:2022-08-12, 12:15:35

最后更新:2022-10-05, 00:52:06

原始链接:https://os467.github.io/2022/08/12/springboot/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

×

喜欢就点赞,疼爱就打赏