SpringBoot

文章目录

一、 Spring Boot简介

SpringBoot本质是Spring Framework,Spring Framework主要作用就是整合其他技术。所以学习Spring Boot就是在学习如何整合其他技术。

二、 第一个基于Spring Boot的Spring MVC项目

1 配置依赖

在pom.xml中添加一个继承(主要目的:1. 配置文件 2. 插件3.依赖jar)
引入springmvc启动器

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.10.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

1.1 注意
在公司中可能会出现必须继承某个项目,如果Spring Boot用了继承就不能继承别的项目了。所以Spring Boot还提供了依赖的方式。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.1.10.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
2 新建启动类

必须在包中新建这个类,不能直接放入到java文件夹。在com.bjsxt下新建自定义名称的类(规范:XXXXApplication)

//启动类
//可以自动扫描当前类所在包及子包的注解
//注意:此类要放入到包中
@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class,args);
    }
}
3 新建控制器

在com.bjsxt包下新建 controller.DemoController(保证这个类在启动类子包中(或同级包中))

@Controller
public class DemoController {
    @RequestMapping("/show")
    @ResponseBody
    public String show(){
        return "hello";
    }
}
4 启动项目

运行主方法。
默认tomcat端口为8080端口
在这里插入图片描述

三、 Spring Boot配置文件

在官方文档中查询所有SpringBoot已经整合的技术的属性
https://docs.spring.io/spring-boot/docs/2.1.9.RELEASE/reference/html/common-application-properties.html

1 application.properties配置(一般用application.yml)

属性名=属性值

2 application.yml

把属性名根据点进行拆分。例如server.port=8080应该写成

server:
  port: 8080

优点:

有层次感
配置写的更少的了

properties的写法:

spring.datasource.url=xxxx
spring.datasource.username=mmmm

yml写法:

spring:
  datasource:
url: xxx
username: mmmm

还有一个先于application.yml加载的配置文件叫做bootstrap.yml。这个配置用来程序引导的,后面学习SpringCloud时会使用。

四、 Spring Boot项目结构

在这里插入图片描述

五、 Spring Boot整合MyBatis

1 依赖启动器

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.48</version>
</dependency>

1 配置配置文件
在application.yml中添加

# mybatis 配置
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/maven
    username: root
    password: smallming
    driver-class-name: com.mysql.jdbc.Driver
# 加载MyBatis的mapper.xml
mybatis:
  mapper-locations: classpath:mybatis/*.xml

如果希望设置实体类包别名

mybatis:
  mapper-locations: classpath:mybatis/*.xml
  type-aliases-package: com.bjsxt.pojo

2 添加注解
在启动类上添加注解,表示mapper接口所在位置

@SpringBootApplication
@MapperScan("com.bjsxt.mapper")
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class,args);
    }
}

3 编写Mapper接口
在com.bjsxt.mapper下新建接口

public interface UserMapper {
    List<User> selectAll();
}

3.1 在mapper上添加注解
如果不在MyApplication启动类上添加@MapperScan必须在UserMapper接口上添加@Mapper注解。

@Mapper
public interface UserMapper {

4 编写mapper.xml
在resource下新建mybatis文件夹,mapper.xml文件名没有要求了,不需要和接口名完全对应了,是根据namespace去找接口。
在这里插入图片描述

六、 Spring Boot整合Druid

1 数据库连接池回顾

在内存中一块空间,空间中放置N多个数据库连接对象。对象可以是处于活动状态,也可以是空闲(Idle)状态的。数据库获取连接对象时不在从数据库中获取连接对象,而是从数据库连接池中获取到连接对象,当获取到连接对象后,对象处于活动状态(Active),当连接对象使用完成后,在代码中进行连接关闭,实际上是把连接对象从活动状态变为空闲状态,不是真正的关闭。
在频繁访问数据库(访问频率特别高的)的应用中,使用数据库连接池效率高。

2 Druid

Druid是由阿里巴巴推出的数据库连接池。它结合了C3P0、DBCP、PROXOOL等数据库连接池的优点。之所以从众多数据库连接池中脱颖而出,还有一个重要的原因就是它包含控制台。

3 代码实现

3.1 添加依赖
此依赖版本一定不能太高,否则和数据库驱动不匹配,无法访问控制台页面。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.1.9.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.10</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.1.0</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
</dependencies>

3.2 编写配置文件
其中spring.datasource.type就告诉程序使用druid连接池。

spring:
  datasource:
    # 使用阿里的Druid连接池
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    # 填写你数据库的url、登录名、密码和数据库名
    url: jdbc:mysql://localhost:3306/maven?useSSL=false&characterEncoding=utf8
    username: root
    password: root
    druid:
      # 连接池的配置信息
      # 初始化大小,最小,最大
      initial-size: 5
      min-idle: 5
      maxActive: 20
      # 配置获取连接等待超时的时间
      maxWait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      validationQuery: SELECT 1
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      # 打开PSCache,并且指定每个连接上PSCache的大小
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
      filters: stat,wall,slf4j
      # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
      connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
      # 配置DruidStatFilter
      web-stat-filter:
        enabled: true
        url-pattern: "/*"
        exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
      # 配置DruidStatViewServlet
      stat-view-servlet:
        url-pattern: "/druid/*"
        # IP白名单(没有配置或者为空,则允许所有访问)
        allow: 127.0.0.1,192.168.163.1
        # IP黑名单 (存在共同时,deny优先于allow)
        deny: 192.168.1.188
        #  禁用HTML页面上的“Reset All”功能
        reset-enable: false
        # 登录名
        login-username: admin
        # 登录密码
        login-password: 123456
mybatis:
  mapper-locations: classpath:mybatis/*.xml

七、 Spring Boot整合PageHelper

Spring Boot整合PageHelper不需要做任何配置文件的配置,添加依赖后就可以直接使用。
1 添加依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.12</version>
</dependency>

2 编写代码
代码中一定要注意,要把PageHelper.startPage()写在上面。

//pageNumber为当前页码 pageSize为页大小
PageHelper.startPage(pageNumber,pageSize);
//查询全部
List<POJO> list = tbItemMapper.selectAll();
// 构造方法参数必须是查询全部的结果。否则无法知道给哪个sql后面拼接limit
//PageInfo是分页查询所有查询结果封装的类,所有的结果都从这个类取
PageInfo<TbItem> pi = new PageInfo<>(list);
System.out.println(pi.getList());
System.out.println(pi.getTotal());

八、 Spring Boot整合logback

Spring Boot推荐使用logback作为日志工具。
直接把logback放在resources就可以生效了。

九、 Spring Boot整合JSP

1添加依赖

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

2 在项目中创建webapp目录并将其设置为资源目录
在项目中新建webapp/WEB-INF目录
在这里插入图片描述

设置工作目录
在这里插入图片描述

3 在 yml配置文件中配置视图解析器参数
在这里插入图片描述

4 在控制类中声明单元方法请求转发jsp资源
在这里插入图片描述

十、 SpringBoot整合Thymeleaf

Thymeleaf视图显示技术。是Spring Boot官方推荐使用的视图显示技术。
Thymeleaf就是HTML页面,在HTML页面中嵌入Thymeleaf语法标签(HTML标签的属性),效果和JSTL等效。
Thymeleaf在Spring Boot项目中放入到resources/templates中。这个文件夹中的内容是无法通过浏览器URL直接访问的(和WEB-INF效果一样),所有Thymeleaf页面必须先走控制器。

1 步骤

1.1 在pom.xml中添加Thymeleaf启动器

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

1.2 在resources下新建templates文件夹。新建index.html
html页面随意写句话,以免访问index.html是空白页。

1.3 新建控制器
此处方法返回值为页面名称。
在这里插入图片描述

@RequestMapping("/showIndex")
public String showIndex(){
    System.out.println("执行index");
    return "index";
}
2 Thymeleaf语法

为了有提示,修改html页面中标签为

<html xmlns:th="http://www.thymeleaf.org" >

2.1 th:text属性
向HTML标签内部输出信息。

<!--直接向标签内部填充内容,清空原有内容 -->
<span th:text="jqk"></span>
<!-- 从作用于中获取name输入到标签内部 -->
<span th:text="${name}"></span>
<!-- 获取session作用域内容-->
<span th:text="${session.name}"></span>

2.2 th:value
表单元素,设置HTML标签中表单元素value属性时使用。

<input type="text" th:value="${name}"/>

2.3 th:if
进行逻辑判断。如果成立该标签生效(显示),如果不成立,此标签无效(不显示)。
注意:判断条件中逻辑判断符号写在${}外面的

<span th:if="${name}!='张三'">会显示</span>

2.4 th:each

循环遍历.
示例中u为迭代遍历。
th:each=”u,i 😒{list}” 其中i表示迭代状态。
1,index:当前迭代器的索引 从0开始
2,count:当前迭代对象的计数 从1开始
3,size:被迭代对象的长度
4,even/odd:布尔值,当前循环是否是偶数/奇数 从0开始
5,first:布尔值,当前循环的是否是第一条,如果是返回true否则返回false
6,last:布尔值,当前循环的是否是最后一条,如果是则返回true否则返回false

<table border="1" width="500">
    <tr>
        <td>编号</td>
        <td>姓名</td>
    </tr>
    <tr th:each="u : ${list}">
        <td th:text="${u.id}" ></td>
        <td th:text="${u.name}"></td>
    </tr>
</table>

2.5 th:href
设置href属性的。取值使用@{}取值

<a th:href="@{/getParam(id=1,name='bjsxt')}" >跳转</a>
<!-- 获取作用域值-->
<a th:href="@{/getParam(name=${name})}">跳转二</a>

十一、 Spring Boot 开发者工具(电脑性能不好不推荐使用)

使用开发者工具包不需要重启。监听内容改变。

1 在pom.xml中添加依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>
2 导入SpringBoot打包插件
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <fork>true</fork>
            </configuration>
        </plugin>
    </plugins>
</build>

注意:需要配置继承父项目,统一版本号

<!--配置项目继承-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.10.RELEASE</version>
</parent>
3 设置IDEA自动编译

菜单 File --> settings
在这里插入图片描述

4 修改Registry

Ctrl+Shift+Alt+/ 点击弹出框中Registry…
在这里插入图片描述

勾选
在这里插入图片描述

十二、 Spring Boot项目打包部署

SpringBoot项目可以是jar类型的maven项目,也可以是一个war
类型的maven项目,取决于我们要不要整合jsp使用。但是不管 是哪种项目类型, 已经不是我们传统意义上的项目结构了,在本 地使用SpringBoot的启动器即可 访问我们开发的项目。如果我们将项目功能开发完成后,需要使用SpringBoot的打包 功能来将项目进行打包。
SpringBoot项目打包在linux服务器中运行:
①jar类型项目会打成jar包:
jar类型项目使用SpringBoot打包插件打包时,会在打成的jar中内置一个tomcat 的jar。所以我们可以使用jdk直接运行该jar项目即可,jar项目中有一个功能, 将功能代码放到其内置的tomcat中运行。我们直接使用浏览器访问即可。
②war类型项目会打成war包:
在打包时需要将内置的tomcat插件排除,配置servlet的依赖。
将war正常的放到tomcat服务器中运行即可。

1 SpringBoot项目打包插件

必须保证项目中包含SpringBoot打包插件。pom.xml中检查

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <fork>true</fork>
            </configuration>
        </plugin>
    </plugins>
</build>
2 SpringBoot项目打包成jar包

点击IDEA右侧Maven – > Lifecycle --> install
在这里插入图片描述

打包后的内容出现在target根目录
在这里插入图片描述

2.1运行jar包项目

① 在本地windows系统中运行
把此jar粘贴到任意目录,示例粘贴到D根目录下
启动windows命令行。依次输入:

# d:
# java-jar 文件名.jar

也可以新建一个批处理文件,例如:run.bat,在文件中添加

d:
java -jar 文件名.jar

② 部署到linux
1、和windows步骤一样。把jar上传到linux后放入到任意目录中,进入到jar所在目录 后执行java -jar 文件.jar 就可以运行。
2、也可以在jar所在文件夹中新建一个文件,执行运行文件。

# vim startup.sh
文件中输入java -jar 文件.jar
# chmod a+x startup.sh
# ./startup
3.SpringBoot项目打包成war包

① 如果我们当前的maven项目本身就是war类型的项目,直接打包即可
但是如果我们当前的maven项目是jar类型的项目,我们需要将项目修改
为war类型,修改项目的pom文件,使用packaging标签设置值为war
并且需要在项目中创建webApp文件夹,并设置为资源文件夹。
在这里插入图片描述

② 在SpringBoot的pom文件中将web启动器中的tomcat依赖排除
因为我们打包的war项目要放在自己的tomcat服务器中运行,需要
排出SpringBoot项目内置的tomcat。然后再手动的将tomcat插件
依赖过来,并设置其scope值为provided。

<!--配置SpringBoot的web启动器-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!--排除web启动中自动依赖的tomcat插件-->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!--
    手动依赖tomcat插件,但是表明项目打包时该依赖不会被打进去,目的主要是保证开发阶段本地SpringBoot
    项目可以正常运行
-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <!--打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。
        相当于compile,但是打包阶段做了exclude操作-->
    <scope>provided</scope>
</dependency>

③ SpringBoot的启动类继承SpringBootServletInitializer,并重写configure

@SpringBootApplication
@MapperScan("com.bjsxt.mapper")
public class MyApplication extends SpringBootServletInitializer {
    //重写配置方法
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MyApplication.class);
    }
    public static void main(String[] args) {
        //启动SpringBoot
        SpringApplication.run(MyApplication.class,args);
    }
}

④ 使用install命令打包项目,并将war包放到tomcat下的webapps下,启动
tomcat即可。
在这里插入图片描述

⑤如果我们使用的是tomcat7则需要将javax.el-api-3.0.0.jar包放到tomcat下 的lib目录中。

十三、 异常显示页面

默认情况,Spring Boot项目错误页面如下。
在这里插入图片描述

当项目实际上线,如果给用户显示这个页面就不是很友好。当系统出现异常时应该给用户显示更加友好的错误页面。

1 设置具体的状态码页面

在templates/下新建error文件夹,在error中新建:状态.html的页面。例如当出现500时显示的页面为500.html

1 使用x进行模糊匹配

当出现5开头状态码的错误时,显示页面可以命名为5xx.html
当出现50开头状态码的错误时,显示页面可以命名为50x.html

2 统一错误显示页面

在templates下新建error.html。如果项目中不存在具体状态码的页面或没有使用x成功匹配的页面时,显示error.html作为错误显示页面。

十四、 异常处理

在Spring Boot项目中除了设置错误页面,还可以通过注解实现错误处理。
常见方式有两种:
1、在控制器类中添加一个方法,结合@ExceptionHandler。但是只能对当前控制器中方法出现异常进行解决。
2、新建全局异常类,通过@ControllerAdvice结合@ExceptionHandler。当全局异常处理和局部处理同时存在时,局部生效(就近原则)

1 局部异常处理

@Controller
public class DemoController {
    @RequestMapping("/demo1")
    @ResponseBody
    public String demo1(){
        int i = 5/0;
        return "demo1";
    }

    @ExceptionHandler(ArithmeticException.class)
    @ResponseBody
    public String ArithmeticException(){
        return "出错了";
    }
}

2 全局异常处理类

@ControllerAdvice
public class ExceptionController {
    @ExceptionHandler(ArithmeticException.class)
    @ResponseBody
    public String AriExceptioin(){
        return "执行全局";
    }
}

十五、 Spring整合Junit5

1 添加启动器
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>
2 编写测试类

在src/main/test里面新建com.bjsxt.MyTest
注意:

  1. 测试类不能叫做Test
  2. 测试方法必须是public
  3. 测试方法返回值必须是void
  4. 测试方法必须没有参数
//告诉SpringBoot使用哪个单元测试工具
@ExtendWith(SpringExtension.class)
@WebAppConfiguration
//当前类为测试类,classes指定哪个类为启动类
@SpringBootTest(classes = MyApplication.class)
public class MyTest {
    @Autowired
    UserMapper userMapper;
    @Autowired
    private UserService userService;
    @Test
    public void test(){
        User user = userMapper.selectById(1L);
        System.out.println(user);
        System.out.println(userService.test());
    }
}

十六、 Spring Boot整合Quartz

1 scheduled简介

Scheduled是Spring3.0后内置的定时任务器。通过Scheduled可以完成周期的执行一些功能。存在于spring-conext-support.jar中。
在SpringBoot中使用Scheduled非常简单,只需要在对应的方法上添加@Scheduled注解在配置对应的参数就可以完成。

2 SpringBoot中Scheduled代码实现

新建Maven项目SpringQuartz。
2.1 添加依赖
由于spring-boot-starter-web并没有依赖spring-conext-support,所以需要单独添加此依赖。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.10.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
    </dependency>
</dependencies>

2.2 创建启动类
新建com.bjsxt.QuartzApplication启动类

@SpringBootApplication
@EnableScheduling
public class QuartzApplication {
    public static void main(String[] args) {
        SpringApplication.run(QuartzApplication.class,args);
    }
}

2.3 新建定时任务
新建com.bjsxt.scheduled.DemoScheduled类。
注意类上有@Component注解,启动项目就需要加载类及类中的@Scheduled注解。

@Component
public class DemoScheduled {
    @Scheduled(cron="0/2 * * * * *")
    public void testScheduled(){
        System.out.println("test scheduled");
    }
}
3 cron表达式

Cron表达式是一个字符串,分为6或7个域,每一个域代表一个含义
Cron有如下两种语法格式:
(1) Seconds Minutes Hours Day Month Week Year
(2)Seconds Minutes Hours Day Month Week
3.1 结构
corn从左到右(用空格隔开):
秒 分 小时 月份中的日期 月份 星期中的日期 年份
3.2 各字段的含义
在这里插入图片描述

Cron表达式的时间字段除允许设置数值外,还可使用一些特殊的字符,提供列表、范围、通配符等功能,细说如下:

●星号(*):可用在所有字段中,表示对应时间域的每一个时刻,例如,在分钟字段时,表示“每分钟”;
●问号(?):该字符只在日期和星期字段中使用,它通常指定为“无意义的值”,相当于占位符;
●减号(-):表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12;
●逗号(,):表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五;
●斜杠(/):x/y表达一个等步长序列,x为起始值,y为增量步长值。如在分钟字段中使用0/15,则表示为0,15,30和45秒,而5/15在分钟字段中表示5,20,35,50,你也可以使用
/y,它等同于0/y;
●L:该字符只在日期和星期字段中使用,代表“Last”的意思,但它在两个字段中意思不同。L在日期字段中,表示这个月份的最后一天,如一月的31号,非闰年二月的28号;如果L用在星期中,则表示星期六,等同于7。但是,如果L出现在星期字段里,而且在前面有一个数值X,则表示“这个月的最后X天”,例如,6L表示该月的最后星期五;
●W:该字符只能出现在日期字段里,是对前导日期的修饰,表示离该日期最近的工作日。例如15W表示离该月15号最近的工作日,如果该月15号是星期六,则匹配14号星期五;如果15日是星期日,则匹配16号星期一;如果15号是星期二,那结果就是15号星期二。但必须注意关联的匹配日期不能够跨月,如你指定1W,如果1号是星期六,结果匹配的是3号星期一,而非上个月最后的那天。W字符串只能指定单一日期,而不能指定日期范围;
●LW组合:在日期字段可以组合使用LW,它的意思是当月的最后一个工作日;
●井号(#):该字符只能在星期字段中使用,表示当月某个工作日。如6#3表示当月的第三个星期五(6表示星期五,#3表示当前的第三个),而4#5表示当月的第五个星期三,假设当月没有第五个星期三,忽略不触发;
● C:该字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。
Cron表达式对特殊字符的大小写不敏感,对代表星期的缩写英文大小写也不敏感。

例子:

@Scheduled(cron = “0 0 1 1 1 ?”)//每年一月的一号的1:00:00 执行一次
@Scheduled(cron = “0 0 1 1 1,6 ?”) //一月和六月的一号的1:00:00 执行一次
@Scheduled(cron = “0 0 1 1 1,4,7,10 ?”) //每个季度的第一个月的一号的1:00:00 执行一次
@Scheduled(cron = “0 0 1 1 * ?”)//每月一号 1:00:00 执行一次
@Scheduled(cron=“0 0 1 * * *”) //每天凌晨1点执行一次

4 Quartz
4.1 简介

官方解释
在这里插入图片描述

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目。可以方便的继承在Java项目中完成任务调度功能。总体功能和java.util.Timer很像,但是要比Timer功能更加强大。且不像Scheduler执行一个固定的任务,在Quartz可以对任务进行操作,新增任务,删除任务等。

例如:
每天固定时间执行任务!
每隔2天执行一次任务!
这些都是任务调度。Quartz都可以轻松地完整这些事情。

4.2 核心

Quartz核心包含四个概念。
4.2.1 Job

表示一个工作,要执行的具体内容。

4.2.2 JobDetail

表示一个具体的可执行的调度任务。JobDetail除了包含Job还包含了任务调度和策略。

4.2.3 Trigger

触发器。配置调度参数,定义什么时候去调用。

4.2.4 Scheduler

表示调度容器。Scheduler可以包含多个JobDetail和Trigger。

5 SpringBoot整合Quartz

新建Maven项目SpringQuartz

5.1 新建数据库导入数据

在MySQL中新建数据库quartz。
运行quartz.sql文件,导入数据文件(在当前版本中使用数据库初始化文件属性always不生效。)

5.2 添加依赖
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.1.9.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-quartz</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.48</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
</dependencies>
5.3 配置配置文件

新建application.yml,并配置数据源

spring:
  datasource:
    username: root
    driver-class-name: com.mysql.jdbc.Driver
    password: root
    url: jdbc:mysql://localhost:3306/quartz?useSSL=false
 quartz:
      jdbc:
        initialize-schema: never
      job-store-type: jdbc
5.4 新建静态类

新建com.bjsxt.statics.QuartzStatic。为了记录每次执行Job的时间,定义一个静态常量。

public class QuartzStatic {
    public static long preTime=0L;
}
5.5 新建Job

新建com.bjsxt.job.MyJob定义Job的内容。

public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        long currTime = System.currentTimeMillis();
        if(QuartzStatic.preTime==0L){
            QuartzStatic.preTime = currTime;
        }
        System.out.println("execute执行-- MyJob"+(currTime- QuartzStatic.preTime));
        QuartzStatic.preTime = currTime;
    }
}
5.6 新建启动类

新建com.bjsxt.QuartzApplication

@SpringBootApplication
public class QuartzApplication {
    public static void main(String[] args) {
        SpringApplication.run(QuartzApplication.class,args);
    }
}
5.7 新建测试类

新建测试类com.bjsxt.MyTest。
在测试类中测试Quartz中新增、修改、删除、暂停、恢复、查询等功能。在每个功能执行完成后要注意数据库中数据的变化。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class MyTest {

    @Autowired
    private Scheduler scheduler;
    @Test
    public void testRun(){
        try {
            Thread.sleep(50000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    @Test
    public void testAdd() {
        System.out.println("scheduler:" + scheduler);
        JobDetail jobDetais = JobBuilder.newJob(MyJob.class).withIdentity("job-name", "job-group").build();
        jobDetais.getJobDataMap().put("data-key","data-value");
        Trigger trigger = TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")).withIdentity("trigger-name", "trigger-value").build();
        try {
            Date date = scheduler.scheduleJob(jobDetais, trigger);
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }

        try {
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }



    public void update(){
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey("trigger-name", "trigger-value");
            CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
            trigger= trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")).build();
            scheduler.rescheduleJob(triggerKey,trigger);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }


    public void testDeleteJob(){
        try {
            boolean result = scheduler.deleteJob(new JobKey("job-name", "job-group"));
            System.out.println("执行结果:"+result);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }


    public void testPauseJob(){
        try {
            JobKey jobKey = new JobKey("job-name", "job-group");
            scheduler.pauseJob(jobKey);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
    @Test
    public void testResumeJob(){
        try {
            JobKey jobKey = new JobKey("job-name", "job-group");
            scheduler.resumeJob(jobKey);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
    @Test
    public void testQueryJobs(){
        try {
            GroupMatcher<JobKey> groupMatcher = GroupMatcher.anyJobGroup();
            Set<JobKey> jobKeySet = scheduler.getJobKeys(groupMatcher);
            for(JobKey jobKey : jobKeySet){
                List<? extends Trigger> listTriggers = scheduler.getTriggersOfJob(jobKey);
                System.out.println("=========================================");
                for(Trigger trigger : listTriggers){
                    System.out.println(jobKey.getName());
                    System.out.println(jobKey.getGroup());
                    System.out.println(scheduler.getTriggerState(trigger.getKey()));
                    System.out.println(((CronTrigger) trigger).getCronExpression());
                }
                System.out.println("==========================================");
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
        }

    }
}

十七、 Spring Boot中Bean管理

Spring Boot 由于没有XML文件,所以所有的Bean管理都放入在一个配置类中实现。
配置类就是类上具有@Configuration的类。这个类就相当于之前的applicationContext.xml

1 创建同类型Bean的实现方式

1.1 新建配置类
com.bjsxt.config.MyConfig , 规范都是放入到config文件夹中。
注意:
配置类要有@Configuration
方法要有@Bean

@Configuration
public class MyConfig {
    //访问权限修饰符没有强制要求,一般是protected
    //返回值就是注入到Spring容器中实例类型。
    // 方法名没有强制要求,相当于<bean >中id属性。
    @Bean
    protected User jqk(){
        User user = new User();
        user.setId(1L);
        user.setName("张三");
        return user;
    }
    //自定义bean名称
    @Bean("nml")
    protected  User abc(){
        User user = new User();
        user.setId(2L);
        user.setName("李四");
        return user;
    }
}

1.2 新建测试类
如果Spring容器中存在同类型的Bean通过Bean的名称获取到Bean对象。或结合@Qualifier使用

@SpringBootTest(classes = BeanApplication.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class test {
    @Autowired
    @Qualifier("jqk")
    private User abc;
    @Test
    public void test(){
        System.out.println(abc);
    }
}
2 配置类中获取容器对象

在配置类的方法中通过方法参数让Spring容器把对象注入。

//自定义bean名称
@Bean("nml")
protected  User abc(){
    User user = new User();
    user.setId(2L);
    user.setName("李四");
    return user;
}

@Bean
//可以直接从方法参数中取到。
public People peo(User nml){
    People p = new People();
    p.setUser(nml);
    return p;
}

十八、 SpringBoot整合拦截器

1 新建拦截器类。

注意:
不要忘记类上注解@Component

@Component
public class DemoInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行拦截器");
        return false;
    }
}
2 配置拦截器

注意:
类上有注解@Configuration。此类相当于SpringMVC配置文件。
addPathPattern(): 拦截哪些URL。 /** 拦截全部
excludePathPatterns(): 不拦截哪些URL。当和addPathPattern()冲突时, excludePathPatterns()生效。

@Configuration
public class MyConfig implements WebMvcConfigurer {
    @Autowired
    private DemoInterceptor demoInterceptor;
    //配置拦截器的映射
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(demoInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
    }


}

十九、 Spring框架提供的MD5加密工具类

String md5 = DigestUtils.md5DigestAsHex("smallming".getBytes());
System.out.println(md5);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AloneDrifters

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值