借助Spring Boot 简化 Spring 开发

Posted hoo334

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了借助Spring Boot 简化 Spring 开发相关的知识,希望对你有一定的参考价值。

Spring Boot 是令人兴奋的新项目,它提供了四个主要的特性,能够改变开发Spring应用程序的方式。

1、Spring Boot Starter: 他将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建中。

2、自动配置: Spring Boot 的自动配置特性利用了Spring 4对条件化配置的支持,合理地推测应用所需的bean 并自动化配置它们。

3、命令行接口: Spring 的 CLI 发挥了Groovy 编程语言的优势,并结合自动配置进一步简化 Spring 应用的开发。

4、Actuator: 它为Spring Boot 应用添加了一定的管理特性。

 

我们要从头开始编写一个新的 Spring 应用。这是一个 Web 项目,所以需要 Spring MVC 。同时还要有 REST API 将资源暴露为 JSON ,所以在构建中需要包含Jackson JSON 库

首先让我们从添加依赖开始,新建一个 Gradle 项目,在 build.gradle dependency 添加以下内容:

    compile("org.springframework.boot:spring-boot-starter-web:1.1.4.RELEASE")
    compile("org.springframework.boot:spring-boot-starter-jdbc:1.1.4.RELEASE")
    compile("org.thymeleaf:thymeleaf-spring4:2.1.2.RELEASE")
    compile("com.h2database:h2:1.3.174")

Spring Boot 的 Starter 减少了构建中的依赖列表的长度,而 Spring Boot 的自动配置功能则缩减了 Spring 配置的数量。它在实现时,会考虑应用中的其他因素并推断你所需要的 Spring 配置。

Spring Boot Starter 也会触发自动配置。例如在 Spring Boot 应用中,如果我们想使用 Spring MVC 的话,所需要做的仅仅是将 Web Starter 作为依赖放入到构建中。将 Web Starter 放入到构建中以后,它会自动添加 Spring MVC 依赖。如果 Spring Boot 的 Web 自动配置探测到 Spring MVC 位于类路径下,它将会自动配置支持 Spring MVC 的多个 bean,包括视图解析器、资源处理器、以及消息转换器等等。

 

Spring Boot CLI 充分利用了Spring Boot Starter 和自动配置的魔力,并添加了一些 Groovy 的功能,它简化了 Spring 的开发流程,通过 CLI ,我们能够运行一个或多个 Groovy 脚本,并查看它是如何运行的。在应用的运行过程中,CLI 能够自动导入 Spring 类型并解析依赖。

 

Spring Boot Actuator 为 Spring Boot 项目带来了很多有用的特性,包括:

1、管理端点;

2、合理的异常处理以及默认的“/error”映射端点;

3、获取应用信息的“Info”端点;

4、当启用Spring Security 时,会有一个审计事件框架。

 

这里我们开发一个 Contacts 应用。

ContactController 为 Contacts 应用处理基本的 Web 请求。

package contacts;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/")
public class ContactController {

    private ContactRepository contactRepo;

    @Autowired
    public ContactController(ContactRepository contactRepo) {
        this.contactRepo = contactRepo;
    }

    @RequestMapping(method = RequestMethod.GET)
    public String home(Map<String,Object> model){
        List<Contact> contacts = contactRepo.findAll();
        model.put("contacts",contacts);
        return "home";
    }

    @RequestMapping(method = RequestMethod.POST)
    public String submit(Contact contact){
        contactRepo.save(contact);
        return "redirect:/";
    }


}

home()方法使用注入的 ContactRepository 来获取所有 Contact 对象的列表,并将它们放到模型当中,然后把请求转交给home视图。这个视图将会展现联系人的列表以及添加新的Contact 表单。submit()方法将会处理表单提交的POST请求,保存Contact,并重定向到首页。

Contact 是一个简单的POJO

 

package contacts;

public class Contact {
    private Long id;
    private String firstName;
    private String lastName;
    private String phoneNumber;
    private String emailAddress;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public String getEmailAddress() {
        return emailAddress;
    }

    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }
}

 

按照传统的方式,Java Web 应用会使用JSP作为视图层的技术。但是,Thymeleaf 的原生模板比 JSP 更加便于使用,而且它能够让我们以 html 的形式编写模板。鉴于此,我们会使用Thymeleaf 来定义 Contacts 应用的home视图。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <title>Spring Boot Contacts</title>
    <link rel="stylesheet" th:href="@{/style.css}" />
  </head>

  <body>
    <h2>Spring Boot Contacts</h2>
    <form method="POST">
      <label for="firstName">First Name:</label>
      <input type="text" name="firstName"></input><br/>
      <label for="lastName">Last Name:</label>
      <input type="text" name="lastName"></input><br/>
      <label for="phoneNumber">Phone #:</label>
      <input type="text" name="phoneNumber"></input><br/>
      <label for="emailAddress">Email:</label>
      <input type="text" name="emailAddress"></input><br/>
      <input type="submit"></input>
    </form>

    <ul th:each="contact : ${contacts}">
      <li>
        <span th:text="${contact.firstName}">First</span>
        <span th:text="${contact.lastName}">Last</span> :
        <span th:text="${contact.phoneNumber}">phoneNumber</span>,
        <span th:text="${contact.emailAddress}">emailAddress</span>
      </li>
    </ul>
  </body>
</html>

只要我们将 Thymeleaf 添加到项目的类路径下,就启用了 Spring Boot 的自动配置。当应用运行时,Spring Boot 将会探测到类路径中的Thymeleaf,然后会自动配置视图解析器,模板解析器以及模板引擎,这些都是在 Spring MVC 中使用 Thymeleaf所需要的。因此,在我们的应用中,不需要使用显示 Spring 配置的方式来定义 Thymeleaf。

 

ContactController 中 home() 方法返回的逻辑视图名为 home ,因此模板文件名为 home.html,自动配置的模板解析器会在指定的目录下查找Thymeleaf模板,这个目录也就是相对根类目录下的templates目录下  ,所以在Maven或Gradle项目中,我们需要将home.html放到“src / main / resources / templates” 中。这个模板中使用了style.css文件,我们倾向于将静态资源放入“src / main / resources / public”目录下。

style.css

body {
  background-color: #eeeeee;
  font-family: sans-serif;
}

label {
  display: inline-block;
  width: 120px;
  text-align: right;
}

 

持久化数据

ContactRepository 能够从数据库中存取 Contact

package contacts;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

@Repository
public class ContactRepository {


    private JdbcTemplate jdbc;

    @Autowired
    public ContactRepository(JdbcTemplate jdbc) {
        this.jdbc = jdbc;
    }

    public List<Contact> findAll(){
        return jdbc.query("select id, firstName, lastName, phoneNumber, emailAddress from contacts order by lastName",
                new RowMapper<Contact>() {
                    @Override
                    public Contact mapRow(ResultSet rs, int rowNum) throws SQLException {
                        Contact c = new Contact();
                        c.setId(rs.getLong(1));
                        c.setFirstName(rs.getString(2));
                        c.setLastName(rs.getString(3));
                        c.setPhoneNumber(rs.getString(4));
                        c.setEmailAddress(rs.getString(5));
                        return c;
                    }
                });
    }

    public void save(Contact contact){
        jdbc.update("insert into contacts(firstName,lastName,phoneNumber,emailAddress) values(?,?,?,?)",
                contact.getFirstName(),contact.getLastName(),contact.getPhoneNumber(),contact.getEmailAddress());
    }
}

ContactRepository使用了@Repository注解,在组件扫描的时候他会被发现并创建为 Spring 应用上下文中的 bean。

JdbcTemplate 呢?我们难道不用再Spring应用上下文中声明JdbcTemplate bean 吗?为了声明它, 我们是不是需要声明一个H2 DataSource?

一切都不需要!!当 Spring Boot 嗅探到 Spring 的 JDBC 模块和H2 在类路径下的时候,自动配置就会发挥作用,将会自动配置 JdbcTemplate bean 和 H2 DataSource bean。

我们需要自己创建contacts表的模式,Spring Boot 可不会知道 contacts 表会是什么样子。

我们将一个名为schema.sql的脚本文件放入类路径根下,也就是Maven或Gradle项目目录下的”src/main/resources“目录下。

create table contacts (
    id identity,
    firstName varchar(30) not null,
    lastName varchar(50) not null,
    phoneNumber varchar(13),
    emailAddress varchar(30)
);

 

我们需要一个特定的类来启动Spring Boot 项目。

package contacts;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan
@EnableAutoConfiguration
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

点击运行,打开浏览器输入localhost:8080就能进入Contacts应用。

 技术图片

以上是关于借助Spring Boot 简化 Spring 开发的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot

Spring Boot 2.0.1 入门教程

Spring Boot整合分布式锁

Spring Boot:简化Spring应用初始搭建以及开发过程(转)

笔记:Spring Boot 监控与管理

《01.Spring Boot连载:Spring Boot入门介绍》