Spring Boot 学习(1)

文 by / 林本托

Tip
开一个毕生学习之人。

NoSQL 1

代码地址:
https://github.com/iqcz/Springbootdemo

Spring Boot 初体验

Spring Boot 包含了众 start(Spring boot 中
的叫法,就是一个模块,后文统一称模块,便于理解),这些模块其实早已是
Spring Boot 大家庭的积极分子。这回要介绍http://start.spring.io/,Spring
Boot 提供的可用的组建,通过之链接我们好长足增加建筑一个种。

立回重点包括以下内容:

  1. 运 Spring Boot 模板与模块;
  2. 创立一个简的以;
  3. 以 Gradle 启动一个采取;
  4. 使命令行命令;
  5. 装数据库连接;
  6. 建一个数据库;
  7. 计划执行。

Spring Boot 介绍

每当今软件开发快节奏的社会风气面临,应用程序创建的速度与高速原型的需要正更换得越来越重要。
如果您在采取 JVM 语言开发软件,那么 Spring Boot
就是一致种植能为汝提供灵活性的框架,从而使你能以高速的速生产大质量的软件。
所以,让我们来看望 Spring Boot 如何援助您兑现而的应用程序。

一. 使用 Spring Boot 模板与模块

Spring Boot
提供了跨40种不同的模块,它们也众多例外之框架提供即用型集成库,例如关系型和
NoSQL 的数据库连接,Web 服务,社交网络并,监控库,日志记录,模板渲染,
而且这个名单一直在扩张。
虽然覆盖这些组件中之各一个功能不是实际上可行之,但是咱将会晤要介绍部分重要和被欢迎之零件,以便了解
Spring Boot 为咱提供的可能性和易用性。

咱以由创立一个主干的大概项目框架初步,Spring Boot 将救助我们:

  1. 拜链接http://start.spring.io/;
  2. 填写一个简单易行的表单关于我们怀念如果的品种细节;
  3. 接下来点击“Generate Project” 按钮,然后便会下蛋充斥我们预定义的种原型。

网站的截图如下:

NoSQL 2

每当地方截图中,你见面视“Project
Dependencies”部分,如果您的品类要连接数据库,要出 Web
接口,计划而跟另外的张罗网络进行重整并,需要提供周转时运营支撑的力,等等。在此间你可以根据你的色要选择不同的作用。通过甄选所急需的技艺,相应的模块将自行添加至我们先行先生化作的型模板的借助列表中。

以我们累支付品种事先,让咱们来拘禁一下 Spring Boot
的模块的成效与她呢咱提供的便宜。

Spring Boot 旨在简化应用程序创建入门的进程。 Spring Boot
模块是引导库,其中涵盖启动特定功能所要的有所相关传递依赖关系之聚集。
每个启动器都生一个特定文件,其中带有有提供的依赖性关系之列表——
spring.provides。
我们来拘禁一下spring-boot-starter-test定义之链接:spring.provides。

NoSQL 3

俺们看来此文件的情也:

provides: spring-test, spring-boot, junit, mockito, hamcrest-library

旋即告诉我们,通过在咱们的构建中涵盖 spring-boot-starter-test
作为依靠,我们以自动取 spring-test,spring-boot,junit,mockito 同
hamcrest-library。
这些库将为我们提供所有必要的事情,以便开始也咱开之软件编写应用程序测试,而不论是需手动将这些靠关系手动添加到构建文件被。

乘机40差不多单模块的供以及社区的随地追加,我们非常可能发现自己需要和一个一定常见要流行的框架进行整治并,所以我们得使中的模块。

下表列举了较显赫的模块,以便了解每个模块的使:

模块 描述
spring-boot-starter Spring Boot 核心模块,提供所有的基础功能。 其他模块都要依赖它,所以没有必要明确声明。
spring-boot-starter-actuator 提供了监视,管理应用程序和审核的功能。
spring-boot-starter-jdbc 提供了连接和使用JDBC数据库,连接池等的支持。
spring-boot-starter-data-jpa 为使用Java Persistence API(如Hibernate等)提供了必要的类库。
spring-boot-starter-data-* 带有“data-*”的集合组件为诸如MongoDB,Data-Rest或Solr之类的数据存储提供支持。
spring-boot-starter-security 为Spring-security提供所有必需的依赖。
spring-boot-starter-social-* 提供了与Facebook, Twitter, 和 LinkedIn 整合的功能。
spring-boot-starter-test 包含Spring-test和各种测试框架(如JUnit和Mockito等)的依赖。
spring-boot-starter-web 提供了Web应用程序开发所需的所有依赖。作为spring-boot-starter-hateoas, spring-boot-starter-websocket, spring-boot-starter-mobile, 和 spring-boot-starter-ws 的补充。以及各种模板渲染模块sping-boot-starter-thymeleaf和spring-boot-starter-mustache。

二. 创建一个简约的动

本我们错过http://start.spring.io错开创造一个着力的使用。这里要留意的是,我们要展开更多选择项。如下图:

NoSQL 4

咱俩要创建的应用程序是一个图书目录管理网。
它用保存出版的书,作者,评论者,出版社等之笔录。 我们以项目命名吧
BookPub,具体步骤如下:

  1. 以一个推介的 Group 名字:org.test;
  2. 于 Artifact 输入框内输入“bookput”;
  3. 下的名为:BookPub;
  4. 包名为:org.test.bookpub;
  5. 选择 Gradle Project;
  6. 装进方式选择 jar;
  7. 使用 Java 的版也1.8;
  8. 于 Project Dependencies 里面,输入
    H2,这时会自动唤醒,然后选取即可,还要选择 JDBC,JPA。这里我们采取
    H2 数据库。
  9. 最终单击“Generate Project”按钮下充斥包装文件。
    现实选项如下截图:

NoSQL 5

咱俩下充斥 bookpub.zip 后并解压,会生成 bookpub
目录,在这目录下你见面看到build.gradle
文件来定义项目之构建,它曾先行布置了天经地义版本的 Spring Boot
插件与库房,甚至席卷我们摘的额外的模块。

build.gradle 文件里的一些内容如下:

dependencies {
  compile("org.springframework.boot:spring-boot-starter-data-jpa")
  compile("org.springframework.boot:spring-boot-starter-jdbc")
  runtime("com.h2database:h2")
  testCompile("org.springframework.boot:spring-boot-starter-test") 
}

俺们已选择了之类模块:

  • org.springframework.boot:spring-boot-starter-data-jpa:加入 JPA
    的依赖;
  • org.springframework.boot:spring-boot-starter-jdbc:加入 JDBC
    支持之类库;
  • com.h2database:h2:特定类型的数据库实现,名字啊 H2。

于方的文书被,你晤面发现,只来一个周转时指:runtime(“com.h2database:h2”)。这是盖我们不需,甚至无思要理解在编译时我们拿连续的数据库的适龄品种。
一旦她在起步应用程序时检测到接近路径中之org.h2.Driver 类的留存,Spring
Boot 将自动配置所需要的装置并创建适当的bean。

data-jpa 和 jdbc 是 Spring Boot 模块的artifact。 如果我们在 Gradle
本地下载,或应用 Maven Central
在线文件存储库的下翻这些靠项,我们会发觉它们不分包其他实际的类,只含各种头条数据。
我们特地感谢兴趣的有限独文件是 Manven 的 pom.xml 和 Gradle
的spring.provides。 我们先行来拘禁一下 spring-boot-starter-jdbc.jar 中的
spring.provides 文件,其中富含以下内容:

provides: spring-jdbc,spring-tx,tomcat-jdbc

立刻告诉我们,通过将此模块做吧我们的靠关系,我们将以构建中传递地获得
spring-jdbc,spring-tx 和 tomcat-jdbc 依赖库。 pom.xml
文件包含对的因关系声明,将由 Gradle 或 Maven
用来当构建中解析所要的指关系。
这也适用于我们的次只模块:spring-boot-starter-data-jpa。
这个模块将会于我们提供 spring-orm,hibernate-entity-manager 和
spring-data-jpa 类库。

于就一点达,我们当应用程序类路径中发生足的库/类,以便让 Spring Boot
一个想如果运行的应用程序的想法,以及 Spring Boot
需要活动配置的工具和框架类型把这些模块拼装在并。

早些时候,我们干类路径中的 org.h2.Driver 类,在触发 Spring Boot
时也咱的应用程序自动配置 H2 数据库连接。
要询问该原理,我们率先来探视我们新创造的应用程序模板,位于项目根本目录下之
src/main/java/org/test/ bookpub 目录中的
BookPubApplication.java,如下所示:

package org.test.bookpub;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class BookPubApplication {

    public static void main(String[] args) {
        SpringApplication.run(BookPubApplication.class, args);
    }
}

就实则是咱们凡事与完全而运行的应用程序。
这里没有过多之代码,也从未提及其他地方的布或者数据库。 但关键是
@SpringBootApplication 注解。
为了打探其实发生的情状,我们可以望这注解代码,这里找到该注解的笺注,它们会如
Spring Boot 自动安装有些事情:

@Configuration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {…}

通下,让咱们看一下端几乎独注解的意图:
@Configuration: 告诉 Spring(不特是Spring Boot,因为她是一个 Spring
框架核心注释),注解类富含 Spring
配置定义声明,例如@Bean@Component@Service 等。
@ComponentScan:告诉 Spring,我们若扫描我们的应用程序包 ——
从我们的注解类的包作为默认的绝望路径始于扫描 – 可以运用
@Configuration@Controller 和其余符合之诠释,Spring
将机关引入,作为上下文配置的一模一样有。
@EnableAutoConfiguration:是 Spring Boot
注解的均等片,它是友好之正注解。 它导入
EnableAutoConfigurationImportSelector
AutoConfigurationPackages.Registrar 类,它们中地指示 Spring
根据类路径中可用之近乎活动配置原则bean。

上面代码中的SpringApplication.run(BookPubApplication.class,args);,
main方式被开创了一个 Spring
应用程序上下文,它读取BookPubApplication.class
中的注解,并实例化,这与眼前早已做到的计类似,而非是采用 Spring
Boot,我们鞭长莫及解脱 Spring 框架。

三. 使用 Gradle 启动一个采取

便情况下,创建任何应用程序的第一步是创办一个基本的架,然后可以及时启动。
由于 Spring Boot
模块已也咱创建了应用程序模板,所以我们所设开的就是提代码,构建和履行其。
现在叫咱们失去令行控制台,并就此 Gradle 启动应用程序。因为我的操作系统是
macOS,所以我下 Terminal 控制高来举行。

第一,我们当指令行控制台中跻身我们已经解压好的 bookpub.zip
的目录下,然后实施下的命:

 ./gradlew clean bootRun

下载了的状态是这般的,中间要等高达会儿。

NoSQL 6

正要使我辈所盼的,应用程序启动正常,但鉴于我们没有长任何效果要布外劳动,它便随即停止了。无论如何,从启动日志总可以看看,自动配置确实有了。让咱们来探望下面的情:

Building JPA container EntityManagerFactory for persistence unit 'default'
HHH000412: Hibernate Core {4.3.8.Final}
HHH000400: Using dialect: org.hibernate.dialect.H2Dialect

上述信息认证,因为咱们增加了 jdbc 和 data-jpa 的模块,JPA
容器被创造并下 h2dialect 方式管理持久层 Hibernate
4.3.8.final版本。这吗是为我们在 classpath 中配置了科学的近乎。

四. 使用命令行命令

趁着我们的着力使用骨架准备好了,让咱们添加效果,使我们的应用程序做有工作。

先是我们创建一个近似,类名为StartupRunner,它实现 CommandLineRunner
接口,这个接口中就供了一个艺术
public void run(String… args),这个法将以应用程序启动以后被 Spring
Boot 调用同一破。

我们在 bookpub 目录的 src/main/java/org/test/bookpub/
路径下,创建StartupRunner.java,具体代码为:

package org.test.bookpub;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.boot.CommandLineRunner;

public class StartupRunner implements CommandLineRunner {
    protected final Log logger = LogFactory.getLog(getClass());

    @Override
    public void run(String... args) throws Exception {
        logger.info("Hello");
    }
}

属下去当 BookPubApplication.java 文件中,把上面的类标记 @Bean
注解用来注入,具体如下:

package org.test.bookpub;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class BookPubApplication {

    public static void main(String[] args) {
        SpringApplication.run(BookPubApplication.class, args);
    }

    @Bean
    public StartupRunner schedulerRunner() {
        return new StartupRunner();
    }
}

就,在命令行中执行./gradlew clean bootRun,

NoSQL 7

在起步过程遭到的日志里输出了 “Hello” 字符串。

就算程序用为停执行,至少我们深受它们举行有从事!

命令行的周转是一个有效之法力,用来实施各种类型的代码,只待周转一软后,应用程序启动。有些人乎可以动用是当一如既往种启动各种执行器线程的法,但
Spring 启动提供了一个双重好点子解决是职责。CommandLineRunner接口由
Spring Boot 启动后扫描改接口所有的实现,调用的每个实例的隐含启动参数的
run 方法。我们呢得采用 @Order 注解或实现 Ordered
接口,以便定义我们怀念使 Spring Boot 来施行其的适用顺序。例如,Spring
批处理依赖 runner 类以便触发 job 的实行。

当令行运行器在应用程序启动后实例化并尽时,我们好采取依赖注的优势来绑定我们所要之靠(例如数据源、服务同其余零件)。当当落实run(String... args)道后来使。

Tips
欲注意的是,如果以run(String… args)艺术外产生良抛来,这将致上下文和应用程序的关门。为了避免这种情形有,建议用
try/catch 包装有风险的代码块。

五. 设置数据库连接

以每个应用程序中,需要拜访一些数并针对那个进行部分操作。最广大的,这个数据源是某种数据存储,即数据库。Spring
Boot 采取了非常简单容易之不二法门,以便连接至数据库,并应用 JPA
来访问与操作数据。

于眼前的演示中,我们创建了中心应用程序,在命令行中启动以并于日记中打印一久消息。接下来,我们提高这个利用,给他添加数据库连接的效益。

以前,我们已经增长必要之 jdbc 和 data-jpa 模块,以及 H2
数据库的乘构建文件。现在,我们以配备 H2 数据库的内存实例。

Tips
当使用嵌入式数据库时,如H2,HSQL,或者
Derby,没有真正必需的布置,此外包括以构建文件被的倚重关系。当这些数据库在类似路径中检测到DataSource
bean 的依赖性在代码里声称时,Spring Boot 会自动为您创造一个。

为演示这等同动静,现在只有包括于近似路径中的 H2
之仗,我们将电动取一个默认数据库,下面修改我们前的StartupRunner.java文件:

package org.test.bookpub;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.boot.CommandLineRunner;

public class StartupRunner implements CommandLineRunner {
    protected final Log logger = LogFactory.getLog(getClass());

    @Autowired
    private DataSource ds;

    @Override
    public void run(String... args) throws Exception {
        logger.info("DataSource: " + ds.toString());
    }
}

今日,我们后续应用程序的运作,我们当日记里看数据源的称号,如下:

NoSQL 8

因此,在框架引擎下,Spring
会意识及机关装配数据源的依靠并自动创建一个初始化内存 H2
数据库。这所有看起还不错,但仅是当早期原型阶段要测试目的,其他场景并无是不行有因此。一旦应用程序关闭,内存数据库的多少以会所有消,不见面保留。

这就是说什么样才会坚持不懈保留数据吧?可以再改默认值,以创造一个嵌入式 H2
数据库,它不会见将数据存储在内存中,而是使一个文件来在应用程序重开之间保持数据。

在src/main/resources目录下打开application.properties文件,添加以下内容:

spring.datasource.url = jdbc:h2:~/test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username = sa
spring.datasource.password =

接通下去执行./gradlew clean bootRun。执行下,就会当公的体系主目录下生成test.mv.db文件。

Tips
什么你下的是 Linux 系统,test.mv.db会转移于/home/<username>下。
如果是 macOS,则在/Users/<username>下。

默认情况下,Spring Boot
通过检查类路径支持的数据库驱动程序的是叫对数据库配置进行一定的设,通过配备文件被的spring.datasource.*属性组,从而提供了非常容易的部署选来调整数据库的访。

咱得以安排 url, username, password, driver-class-name
等选。如果您想使JNDI方式访数据源,创建应用程序之外的数据源实例,例如通过一个容器,如
JBoss、Tomcat、和通过 JNDI 共享,可以配备 spring.datasource.jndiname。

Tips
以配备文件的性能名字被,例如,driver-class-name,和
driverClassName,两者都是支持的,Spring Boot
会把它转换成同一种办法。

使您想连接到一个正规(非嵌入式)数据库,除了以近似路径中补充加适量的驱动程序库,我们得指定的布中甄选驱动程序。下面的一对是
MySQL 的部署信息:

spring.datasource.driver-class-name: com.mysql.jdbc.Driver
spring.datasource.url: jdbc:mysql://localhost:3306/springbootcookbook
spring.datasource.username: root
spring.datasource.password:

假若我们期望 Hibernate 基于我们的实体类,自动创建
schema,需要丰富底下的配置属性:

spring.jpa.hibernate.ddl-auto=create-drop

Tips
在方的安排属性被,不要当产环境面临动用,否则在启动时,所有的表模式和多少还见面让删!而是基于需要,使用
update 或 validate 属性值。

君得当应用程序的抽象层再进一步,不再自动装配 DataSource
对象,而是直接用 jdbcTemplate。这将指令 Spring Boot
自动创建一个数据源,然后创建一个JdbcTemplate
对象包装数据源,从而为而提供更便于之艺术跟数据库安全的互。JdbcTemplate的代码如下:

@Autowired
private JdbcTemplate jdbcTemplate;

使您对此间保持好奇的心怀,可以查 spring-boot-autoconfigure 模块下之
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration仿佛,就会豁然开朗。

六. 树立一个数据库

连续至数据库,然后实施好的SQL语句,这是简约和直接的道,而休是无与伦比便利的计操作数据,而又好之措施是投在同样组世界对象,并决定关系之始末。这就是是胡出现了无数框架实现了用数据由表及目标的照,也尽管是大家常常说之
ORM(Object Relational Mapping)。其中一个极著名的框架就是 Hibernate。

于前头的事例中,我们介绍了何等建立一个连续到数据库与安排安装的用户称,密码,使用谁驱动程序,等等。我们拿增强应用程序,根据数据库中数据结构的概念,添加对应的实体对象,
使用 crudrepository 接口访问数。

冲我们应用程序的应用场景,是一个书籍查找分类的系统,所以会席卷Book,,Author,,Reviewers,和
Publisher 这些实体对象。

接下来,在 src/main/java/org/test/bookpub 目录下,创建 entity 包;

在 entity 包下,创建 Book.java 文件,代码如下:

package org.test.bookpub.entity;

import javax.persistence.*;
import java.util.List;

@Entity
public class Book {
    @Id
    @GeneratedValue
    private Long id;
    private String isbn;
    private String title;
    private String description;

    @ManyToOne
    private Author author;

    @ManyToOne
    private Publisher publisher;

    @ManyToMany
    private List<Reviewer> reviewers;

    protected Book() {}

    public Book(String isbn, String title, Author author, Publisher publisher) {
        this.isbn = isbn;
        this.title = title;
        this.author = author;
        this.publisher = publisher;
    }

   // 省略属性的 getter 和 setter 方法
}

另外一样本书都见面时有发生一个作者及出版社,还见面发生很多评论者,所以,
我们啊要创这些对应的实体对象,在 Book.java 同目录下,创建
Author.java

@Entity
public class Author {
  @Id
  @GeneratedValue
  private Long id;
  private String firstName;
  private String lastName;
  @OneToMany(mappedBy = "author")
  private List<Book> books;

  protected Author() {}

  public Author(String firstName, String lastName) {...}
    // 省略购房方法属性赋值
}

// 省略 属性 getter 和 setter 方法

同样,创建 Publisher.javaReviewer.java 文件。

@Entity
public class Publisher {
  @Id
  @GeneratedValue
  private Long id;
  private String name;
  @OneToMany(mappedBy = "publisher")
  private List<Book> books;

  protected Publisher() {}

  public Publisher(String name) {...}
}

@Entity
  public class Reviewer {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;

    protected Reviewer() {}

    public Reviewer(String firstName, String lastName) {
      ...
    }
}

生一样步,我们当 src/main/java/org/test/bookpub/repository 目录下创造
BookRepository.java ,并继承 Spring 的CrudRepository 父类,

package org.test.bookpub.repository;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import org.test.bookpub.entity.Book;

@Repository
public interface BookRepository extends CrudRepository<Book, Long> {
    public Book findBookByIsbn(String isbn);
}

最后,修改 StartupRunner.java 文件,用来打印图书的数,通过机关装配
BookRepository 接口的实例,并调用 .count() 方法。

package org.test.bookpub;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.scheduling.annotation.Scheduled;
import org.test.bookpub.repository.BookRepository;

public class StartupRunner implements CommandLineRunner {
    protected final Log logger = LogFactory.getLog(getClass());

    @Autowired private BookRepository bookRepository;

    @Override
    public void run(String... args) throws Exception {
        logger.info("Welcome to the Book Catalog System!");
    }

    public void run() {
        logger.info("Number of books: " + bookRepository.count());
    }
}

你或许已经注意到,我们没有写一行SQL,甚至没有干任何有关数据库连接,构建查询或类似的事务。
我们处理数据库支持之数码的绝无仅有提示是我们的代码中之近乎与特性注解:@Entity,@Repository,@Id,@GeneratedValue
和 @ManyToOne以及 @ ManyToMany 和 @OneToMany。 这些注解是 Java
Persistance API的同样部分,以及 CrudRepository 接口的扩充,我们以及 Spring
通信的方式是拿我们的对象映射到数据库中相应的申及字段,并往我们提供编程与这些数量交互的能力。

咱俩来拘禁一下切实可行注解的以:NoSQL

  • @Entity:表示实体对象映射到数码库表的注解类。
    表的称号将起接近的称呼派生,但要是需要,可以开展安排。
    重要之凡使注意,每个实体类都应当有一个默认的护的构造函数,这是自动实例化和Hibernate交互所用之。
  • @Repository:表示该接口旨在提供对数据库的多少的访同操作。
    它吗足以看做组件扫描中 Spring 的一个指示,即该实例可以用作一个
    bean 创建,并拿那个注入应用程序中之别 bean 中。
  • CrudRepository接口:定义了由数量存储库读取,创建,更新与去数据的核心常用方法。
    我们拿当 BookRepository 扩展中定义之脑门儿外方法
    public Book findBookByIsbn(String isbn),表示 Spring JPA
    应该自行将本着拖欠措施的调用转换为经过其 ISBN 字段选择 Book 的 SQL
    查询。 这是一个预约命名的照,将方名称转换为 SQL 查询。
    这是一个那个有力的效能,允许构建查询,如
    `findByNameIgnoringCase(String name)等另外的计。
  • @Id 和
    @GeneratedValue:这有限单注解提供了一个记,即注解属性应映射到数据库被的主键字段上,并且应生成者字段的价值,而非需要显式地输入。
  • @ManyToOne 和
    @ManyToMany:这点儿个注解定义了援存储在外表中的多少的字段关联关系。
    在我们的使用被,多比照图书属于一个作者,许多评论者都见面评价多遵循书籍。
    @OneToMany 注解声明中之 mappedBy 属性定义了反朝关系映射。 它表示
    Hibernate 的实际的映射源在 Book 类中,在 Author 或 Reviewer
    字段中定义。Author 和 Reviewer 类中之 Book 引用仅仅是倒往关系。

Tips
关于Spring
Data的有着功能的双重多信息,请访问http://docs.spring.io/spring-data/data-commons/docs/current/reference/html/。

七. 计划实施

当本章之前,我们谈谈了哪些采取命令执行运行程序作为启动计划之行程序线程池的计,用来间隔运行工作线程。
虽然这是一个可能,但 Spring
提供了重复简明的部署来落实平等之目的:@EnableScheduling注解。

我们用加强我们的应用程序,以便她每10秒在咱们的蕴藏库中打印一些书籍数量。
为了落实就或多或少,我们用对准 BookPubApplicationStartupRunner
类进行必要的改。

先是,我们得以 BookPubApplication 类上补偿加 @EnableScheduling
注解,

@SpringBootApplication
@EnableScheduling
public class BookPubApplication {…}

出于 @Scheduled 注解只能放于尚未参数的道上,所以我们将一个初的
run() 方法添加到 StartupRunne r类中,并应用 @Scheduled
注解,如下所示:

package org.test.bookpub;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.scheduling.annotation.Scheduled;
import org.test.bookpub.repository.BookRepository;

public class StartupRunner implements CommandLineRunner {
    protected final Log logger = LogFactory.getLog(getClass());

    @Autowired private BookRepository bookRepository;

    @Override
    public void run(String... args) throws Exception {
        logger.info("Welcome to the Book Catalog System!");
    }

    @Scheduled(initialDelay = 1000, fixedRate = 10000)
    public void run() {
        logger.info("Number of books: " + bookRepository.count());
    }
}

连下去,在命令行中执行./gradlew clean bootRun,在日记被即见面各间隔10秒打印出
“Number of books: 0” 的音讯。

NoSQL 9

例如咱于本章中讨论的一些别注解一样,@EnableScheduling 不是 Spring
Boot里之笺注,而是一个 Spring Context 模块里的注释。 类似于
@SpringBootApplication 和 @EnableAutoConfiguration
注解,它们都是首位注释,并通过
@Import(SchedulingConfiguration.class)指令在里边导入
SchedulingConfiguration,如果以 @EnableScheduling
注解类的代码中寻找,可以望它。

用出于导入的布置创造的 ScheduledAnnotationBeanPostProcessor
类扫描都扬言的 Spring Bean 的 @Scheduled 注解。
对于每个没有参数的诠释方法,将会创造适当的尽程序线程池。
它用管理都上加注方法的计划调用。

网站地图xml地图