构建项目

从技术角度来看,我们要用Spring MVC来处理Web请求,用Thymeleaf来定义Web视图,用
Spring Data JPA来把阅读列表持久化到数据库里,姑且先用嵌入式的H2数据库。

1、项目搭建

Spring IO 官网搭建

我们可以进入到Spring 的官网:start.spring.io/
进入官网后,可以快速的构建Spring boot 的基础项目,这里可以选择Maven 项目或者Gradle 项目,然后设置项目相关的配置。

在选择Generate Project 进行项目下载后,会生成对应的zip 文件。后续只需要将Zip 文件解压,添加到IDE 中即可。

IDEA 快速构建

除了在SpringIO 官网进行项目初始化外,还可以通过IDEA 进行项目的搭建。如下图所示,项目的搭建也是引用了 start.spring.io/

在后续的页面中,我们可以设置相关的配置信息,一些常用的依赖,也可以进行初始化。

Spring Boot CLI

除了以上常用的项目创建方法以外,我们还可以通过CLI 进行项目的创建:

spring init -dweb,data-jpa,h2,thymeleaf --build gradle readinglist

CLI的init命令是不能指定项目根包名和项目名的。包名默认是demo,项目名默认是Demo。

2、目录结构

不管我们采用哪种方式进行项目的创建,在将项目导入IDE之后,我们可以看到整个项目结构遵循传统Maven或Gradle项目的布局,即主要应用程序代码位于src/main/java目录里,资源都在src/main/resources目录里,测试代码则在src/test/java目录里。此刻还没有测试资源,但如果有的话,要放在src/test/resources里。

文件介绍:

  • SpringBootWebApplication: 应用程序的启动引导类(bootstrap class),也是主要的Spring 配置类。
  • appliction.properties:用于配置应用程序和Spring boot 的属性
  • SpringBootWebApplicationTests:一个基本的集成测试类。
  • pom.xml:项目依赖文件

3、文件介绍

SpringBootWebApplication

Application 类在Spring boot应用程序中有两个作用:配置和启动引导。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication --开启组件扫描和自动配置
public class SpringBootWebApplication {public static void main(String[] args) {SpringApplication.run(SpringBootWebApplication.class, args); -- 负责启动引导应用程序}
}

我们在使用Spring boot 进行开发时,Application 类是我们启动服务的入口,起到关键作用的是 @SpringBootApplication 这一注解,实际上 @SpringBootApplication 包含了三个有用的注解:

  • @Configuration:标明该类使用Spring 基于Java 的配置。
  • @ComponentScan:启用组件扫描,这样你写的Web控制器类和其他组件才能被自动发现并注册为Spring 应用程序上下文中的Bean。
  • @EnableAutoConfiguration:这一个配置开启了Spring boot 的自动配置。

这里使用到main 方法是需要提供一个@EnableAutoConfiguration 注解的引导类,来引导整个应用程序的启动。

SpringBootWebApplicationTests

项目创建时问我们创建了一个带有上下文的测试类。

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)
@SpringBootTest -- 通过SpringBoot 加载上下文
public class SpringBootWebApplicationTests {@Testpublic void contextLoads() {-- 测试加载的上下文}}

application.properties

实际上,这个文件是可选的,你可以删掉它而不影响应用程序的运行。
我们可以通过向application.properties 中添加变量,从而改变程序的默认配置。例如:

server.port=8000
server.contextPath=SpringBootWeb

在上述代码中,我们将程序的默认端口(8080) 修改成为使用 8000 端口,并且将应用程序的项目名修改为 SpringBootWeb。

原访问地址:
http://127.0.0.1:8080/

修改后:
http://127.0.0.1:8000/SpringBootWeb/

除此之外 还可以配置多环境的变量设置等一系列的设置:

spring.profiles.active = dev

pom.xml

在代码清单中,我们引用了 spring-boot-starter-parent 作为上一级,这样一来就能利用到Maven 的依赖管理功能,集成很多常用库的依赖,并且不需要知道版本。除此之外,也使用到了开篇所提到过的起步依赖,我们只需要引入 spring-boot-starter-web 这一依赖,就可以使用到Web 中常用的包。

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.7.RELEASE</version><relativePath/> <!-- lookup parent from repository -->
</parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>...</dependencies>

如下图所示,我们使用到的 spring-boot-starter-web 依赖中,已经集成了常用的mvc json 等相关依赖。

org.springframework.boot:spring-boot-starter-web:jar:1.5.7.RELEASE:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter-tomcat:jar:1.5.7.RELEASE:compile
[INFO] |  |  +- org.apache.tomcat.embed:tomcat-embed-core:jar:8.5.20:compile
[INFO] |  |  +- org.apache.tomcat.embed:tomcat-embed-el:jar:8.5.20:compile
[INFO] |  |  \- org.apache.tomcat.embed:tomcat-embed-websocket:jar:8.5.20:compile
[INFO] |  +- org.hibernate:hibernate-validator:jar:5.3.5.Final:compile
[INFO] |  |  +- javax.validation:validation-api:jar:1.1.0.Final:compile
[INFO] |  |  \- com.fasterxml:classmate:jar:1.3.4:compile
[INFO] |  +- com.fasterxml.jackson.core:jackson-databind:jar:2.8.10:compile
[INFO] |  |  +- com.fasterxml.jackson.core:jackson-annotations:jar:2.8.0:compile
[INFO] |  |  \- com.fasterxml.jackson.core:jackson-core:jar:2.8.10:compile
[INFO] |  +- org.springframework:spring-web:jar:4.3.11.RELEASE:compile
[INFO] |  \- org.springframework:spring-webmvc:jar:4.3.11.RELEASE:compile
[INFO] |     \- org.springframework:spring-expression:jar:4.3.11.RELEASE:compile

4、开发功能

4.1 定义实体类 Book

如你所见,Book类就是简单的Java对象,其中有些描述书的属性,还有必要的访问方法。
@Entity注解表明它是一个JPA实体,id属性加了@Id和@GeneratedValue注解,说明这个字段
是实体的唯一标识,并且这个字段的值是自动生成的。

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;/*** Created by weijie_huang on 2017/9/20.*/@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Book {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Long id;private String reader;private String isbn;private String title;private String author;private String description;
}

4.2 定义仓库接口 ReadRepository

通过扩展JpaRepository,ReadingListRepository直接继承了18个执行常用持久化操作
的方法。JpaRepository是个泛型接口,有两个参数:仓库操作的领域对象类型,及其ID属性的
类型。此外,我还增加了一个findByReader()方法,可以根据读者的用户名来查找阅读列表。

import com.jaycekon.demo.domain.Book;
import org.springframework.data.jpa.repository.JpaRepository;import java.util.List;/*** Created by weijie_huang on 2017/9/20.*/
public interface ReadRepository extends JpaRepository<Book,Long> {List<Book> findByReader(String reader);
}

4.3 定义控制层 ReadController

在定义好了应用程序的实体类,持久化接口后。我们还需要创建一个MVC 控制器来处理HTTP请求。

import com.jaycekon.demo.dao.ReadRepository;
import com.jaycekon.demo.domain.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;import java.util.List;/*** Created by weijie_huang on 2017/9/20.*/
@Controller
public class ReadController {@Autowiredprivate ReadRepository readRepository;@RequestMapping(value="/{reader}", method= RequestMethod.GET)public String readersBooks(@PathVariable("reader") String reader,Model model) {List<Book> readingList =readRepository.findByReader(reader);if (readingList != null) {model.addAttribute("books", readingList);}return "readingList";}@RequestMapping(value="/{reader}", method=RequestMethod.POST)public String addToReadingList(@PathVariable("reader") String reader, Book book) {book.setReader(reader);readRepository.save(book);return "redirect:/{reader}";}}

使用了@Controller注解,这样组件扫描会自动将其注册为
Spring应用程序上下文里的一个Bean。通过@Autowired 将仓库接口注入到控制类中。

4.4 启动服务

在开发完成后,我们去到Application 类下,启动main 方法。即可将应用程序启动,然后进入到下述页面(html 文件不细述,可通过查看源码进行了解)。可以看到,我们的服务已经成功启动。

4.5 流程分析

大家可能会很疑惑,为什么我们没有配置数据库信息,却没有报异常。我们明明创建了 ReadRepository 数据库接口,如果没有DataSource 的话,应该是会报异常的。但是Spring boot 却巧妙的避开了这种问题。

首先我们需要来了解一下Spring-boot-autoconfigure 这个依赖包。这个Jar包下包含了很多的配置类。例如Thymeleaf,JPA以及Mvc的相关配置。

这里主要涉及到了Condition 接口,该接口的作用是,只有到某个条件达成后,才回对这个Bean 进行实例化。

注解:
@ConditionalOnBean 配置了某个特定Bean
@ConditionalOnMissingBean 没有配置特定的Bean
@ConditionalOnClass Classpath里有指定的类
@ConditionalOnMissingClass Classpath里缺少指定的类
@ConditionalOnExpression 给定的Spring Expression Language(SpEL)表达式计算结果为true
@ConditionalOnJava Java的版本匹配特定值或者一个范围值
@ConditionalOnJndi 参数中给定的JNDI位置必须存在一个,如果没有给参数,则要有JNDI
@ConditionalOnProperty 指定的配置属性要有一个明确的值
@ConditionalOnResource Classpath里有指定的资源

上述程序之所有没有进行数据库操作,主要可以参考 DataSourceAutoConfiguratio 这个类的相应配置。

@Configuration
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
@EnableConfigurationProperties({DataSourceProperties.class})
@Import({Registrar.class, DataSourcePoolMetadataProvidersConfiguration.class})
public class DataSourceAutoConfiguration

可以看到,只有DataSource 这个类实例化之后,这个Bean才会进行实例化。我们再往下观察可以看到 JdbcTemplateConfiguratio 也有想类似的情况。

此处看到的只是DataSourceAutoConfiguration的冰山一角,Spring Boot提供的其他自
动配置类也有很多知识没有提到。但这已经足以说明SpringBoot如何利用条件化配置实现自动配置。

自动配置会做出以下配置决策,它们和之前的例子息息相关。

  • 因为Classpath 里有H2 , 所以会创建一个嵌入式的H2 数据库Bean , 它的类型是
    javax.sql.DataSource,JPA实现(Hibernate)需要它来访问数据库。

  • 因为Classpath里有Hibernate(Spring Data JPA传递引入的)的实体管理器,所以自动配置
    会配置与Hibernate 相关的Bean , 包括Spring 的LocalContainerEntityManager-
    FactoryBean和JpaVendorAdapter。

  • 因为Classpath里有Spring Data JPA,所以它会自动配置为根据仓库的接口创建仓库实现。

  • 因为Classpath里有Thymeleaf,所以Thymeleaf会配置为Spring MVC的视图,包括一个
    Thymeleaf的模板解析器、模板引擎及视图解析器。视图解析器会解析相对于Classpath根
    目录的/templates目录里的模板。

  • 因为Classpath 里有Spring MVC ( 归功于Web 起步依赖), 所以会配置Spring 的
    DispatcherServlet并启用Spring MVC。

  • 因为这是一个Spring MVC Web应用程序,所以会注册一个资源处理器,把相对于Classpath
    根目录的/static目录里的静态内容提供出来。(这个资源处理器还能处理/public、/resources
    和/META-INF/resources的静态内容。)

  • 因为Classpath里有Tomcat(通过Web起步依赖传递引用),所以会启动一个嵌入式的Tomcat
    容器,监听8080端口。

总结

通过Spring Boot的起步依赖和自动配置,你可以更加快速、便捷地开发Spring应用程序。起步依赖帮助你专注于应用程序需要的功能类型,而非提供该功能的具体库和版本。与此同时,自动配置把你从样板式的配置中解放了出来。这些配置在没有Spring Boot的Spring应用程序里非常常见。

虽然自动配置很方便,但在开发Spring应用程序时其中的一些用法也有点武断。要是你在配置Spring时希望或者需要有所不同,该怎么办?在第3章,我们将会看到如何覆盖Spring Boot自动配置,借此达成应用程序的一些目标,还有如何运用类似的技术来配置自己的应用程序组件。

github 地址:github.com/jaycekon/Sp…

Spring-Boot:5分钟掌握SpringBoot开发相关推荐

  1. Spring Boot——2分钟构建spring web mvc REST风格HelloWorld

    Spring Boot--2分钟构建spring web mvc REST风格HelloWorld 之前有一篇<5分钟构建spring web mvc REST风格HelloWorld>介 ...

  2. 使用Spring Boot和React进行Bootiful开发

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 在过去的 ...

  3. Spring Boot:(四)开发Web应用之JSP篇

    Spring Boot:(四)开发Web应用之JSP篇 前言 上一篇介绍了Spring Boot中使用Thymeleaf模板引擎,今天来介绍一下如何使用SpringBoot官方不推荐的jsp,虽然难度 ...

  4. Spring Boot:(三)开发Web应用之Thymeleaf篇

    Spring Boot:(三)开发Web应用之Thymeleaf篇 前言 Web开发是我们平时开发中至关重要的,这里就来介绍一下Spring Boot对Web开发的支持. 正文 Spring Boot ...

  5. Spring Boot(3) Web开发(1)静态资源处理

    Spring Boot(3) Web开发(1)静态资源处理 基于spring boot 2.4.3版本 1.静态资源访问 1.1 静态资源目录 把静态资源放在类路径下的以下目录:/static; /p ...

  6. 基于Spring Boot和Kotlin的联合开发

    基于Spring Boot和Kotlin的联合开发 版权声明:本文为博主chszs的原创文章,未获得博主授权均不能转载,否则视为侵权. 一.概述 Spring官方最近宣布,将在Spring Frame ...

  7. spring boot + vue + element-ui全栈开发入门——基于Electron桌面应用开发

     前言 Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库. Electron通过将Chromium和Node.js合并到同一个运行时环 ...

  8. spring boot + vue + element-ui全栈开发入门

    今天想弄弄element-ui  然后就在网上找了个例子 感觉还是可以用的  第一步是完成了  果断 拿过来  放到我这里这  下面直接是连接  点进去 就可以用啊 本想着不用vue   直接导入连接 ...

  9. 《Spring Boot极简教程》第8章 Spring Boot集成Groovy,Grails开发

    第8章 Spring Boot集成Groovy,Grails开发 本章介绍Spring Boot集成Groovy,Grails开发.我们将开发一个极简版的pms(项目管理系统). Groovy和Gra ...

  10. Spring Boot——2分钟构建springweb mvc REST风格HelloWorld

    转载自:http://http://jinnianshilongnian.iteye.com/blog/1997192 Spring Boot使我们更容易去创建基于Spring的独立和产品级的可以&q ...

最新文章

  1. 报名 | “AI Time”系列论道知识图谱:知识赋能智能与智能产生知识
  2. win下配置cmder
  3. mac睡眠快捷键_告别Mac新手,MacOS电脑高手不得不会的10个使用技巧!
  4. Spring3 + JPA2 + Java EE6 App Server =配置混乱
  5. Spring IoC、DI、Bean和自动装配的理解
  6. linux设置web服务器配置,Linux下配置功能完善的Web服务器
  7. Windows下开源截屏工具软件Free Shooter
  8. 基于JavaSwing开发医院信息管理系统 毕业设计 课程设计 大作业
  9. 简易上手的开源校园小程序源码
  10. 视频会议系统架构和开源解决系统
  11. pytorch中F.avg_pool1d()和F.avg_pool2d()
  12. 优达(Udacity)customer_segments
  13. Halcon 算子 complement
  14. 基于gibbsLDA的文本分类
  15. 支付宝企业账户单笔支付到个人账户
  16. 纯css实现向上箭头动画显示
  17. mencoder 和ffmpeg常用命令
  18. 五:.net core(.NET 6)使用Autofac实现依赖注入
  19. JavaScript 整分或者指定时间执行操作
  20. 福建师范大学 “挑战杯”校赛金银奖分析文档

热门文章

  1. 恶意软件伪装成系统更新,通杀Win Mac Linux三大系统,隐藏半年才被发现
  2. 牛津大学入学面试就这?组队选个颜色?背后的逻辑水深得很
  3. 让AI说话告别三观不正,OpenAI只用80个文本就做到了
  4. 中国首档程序员真人秀,20位选手找bug做模型,结果一开场主办方就惨遭攻击...
  5. 137% YOLOv3加速、10倍搜索性能提升!这样的惊喜,最新版PaddleSlim有10个
  6. Momenta完全无人驾驶首次曝光!城区道路混行无接管,遭遇逆行也不怕,特斯拉Waymo路线二合一...
  7. 加盟依图科技后,颜水成首篇顶会论文提出“高效多人体姿态检测SPM”
  8. 第二篇:salt-api使用填坑指南
  9. call( )、apply( )
  10. centos系统查看资源使用情况的工具