SpringBoot实战学习记录

第一章 入门

1.1 Spring学习

1.1.1 重识Spring

假设你受命用Spring开发一个简单的Hello World Web应用程序。该做什么?

1、一个项目结构,其中有一个包含必要依赖的Maven或者Gradle构建文件,最起码要有Spring MVC和Servlet API这些依赖。

2、一个web.xml文件(或者一个WebApplicationInitializer实现),其中声明了Spring的DispatcherServlet。

3、一个启用了Spring MVC的Spring配置。

4、一个控制器类,以“Hello World”响应HTTP请求。

5、一个用于部署应用程序的Web应用服务器,比如Tomcat。

最让人难以接受的是,这份清单里只有一个东西是和Hello World功能相关的,即控制器,剩下的都是Spring开发的Web应用程序必需的通用样板。既然所有Spring Web应用程序都要用到它
们,那为什么还要你来提供这些东西呢?

假设这里只需要控制器。SpringBoot会搞定执行应用程序的各种后勤工作,不需要配置、web.xml、构建说明、甚至没有应用服务器。

1.1.2 Spring Boot 精要

Spring Boot的四个核心

  • 自动配置:针对很多Spring应用程序常见的应用功能,SpringBoot能自动提供相关配置。
  • 起步依赖:告诉Spring Boot需要什么功能,它就能引入需要的库。
  • 命令行界面:SpringBoot的可选特性,你只需要写代码就能完成完整的应用程序,无需传统项目构建。
  • Actuator:让人能深入运行中的Spring Boot应用程序。

1、自动配置

Spring Boot会为这些常见配置场景进行自动配置。如果Spring Boot在应用程序的Classpath里发现H2数据库的库,那么它就自动配置一个嵌入式H2数据库。如果在Classpath 里发现
JdbcTemplate,那么它还会为你配置一个JdbcTemplate的Bean。你无需操心那些Bean的配置,Spring Boot会做好准备,随时都能将其注入到你的Bean里。Spring Boot的自动配置远不止嵌入式数据库和JdbcTemplate,它有大把的办法帮你减轻配置负担,这些自动配置涉及Java持久化API( Java Persistence API, JPA)、 Thymeleaf模板、安全和Spring MVC。

2、起步依赖

Spring Boot通过起步依赖为项目的依赖管理提供帮助。起步依赖其实就是特殊的Maven依赖和Gradle依赖,利用了传递依赖解析,把常用库聚合在一起,组成了几个为特定功能而定制
的依赖。简而言之就是,你导入了一个依赖A,依赖A会根据依赖传递把其它所需依赖引入到项目里,除了减少依赖数量,一个依赖就能代替一类依赖以外,SpringBoot的起步依赖还会自动解决版本不兼容引起的冲突问题。

3、命令行界面

SpringBoot CLI能自动检测你的程序中使用了哪些类,自动向Classpath中添加起步依赖。这种开发模式相较于传统开发模式比较特别,只需要写代码即可实现应用程序。

4、Actuator

Spring Boot的前三个部分都是旨在简化Spring开发,而Actuator则要提供运行时检视应用程序内部情况的能力。安装了Actuator就能窥探应用程序的内部情况,包括:

        1)Spring应用程序上下文里配置的Bean

        2)Spring Boot的自动配置做的决策

        3)应用程序取到的环境变量、系统属性、配置属性和命令行参数

        4)应用程序里线程的当前状态

        5)应用程序最近处理过的HTTP请求的追踪情况

        6)各种内存和内存用量、垃圾回收、Web请求以及数据源用量相关的指标

Actuator通过Web断点和shell界面向外界提供信息。如果要借助shell界面,可以打开SSH(Secure Shell),登入运行中的应用程序,发送指令查看它的情况。

1.2 Spring Boot入门

1.2.1 使用Spring Initializr初始化 Spring Boot项目

Spring Initializr从本质上来说就是一个Web应用程序,它能为你生成Spring Boot项目结构,能提供一个基本的项目机构和用于构建代码的Maven或Gradle构建说明文件。

Spring Initializr几种用法:

  • 通过Web界面使用。
  • 通过Spring Tool Suite使用。
  • 通过IntelliJ IDEA使用。
  • 使用Spring Boot CLI使用。

1、使用Spring Initializr的Web界面

浏览器打开http://start.spring.io,即可看到一个类似表单的页面。表单的头两个问题是,是用Maven构建还是Gradle来构建项目,以及使用Spring Boot的哪个版本。表单的左侧是需要指定项目的一些基本信息,如:Group和Artifact,点击“Switch to the full version”链接,还可以指定额外的信息,比如版本号和基础包名,这些信息是用来生成Maven的Pom.xml文件(或Gradle的build.gradle文件)。

dependencies是指项目中需要指定的依赖,最简单的方法就是在文本框里键入依赖的名称,选中后依赖就会加入项目。填完表单,选好依赖,点击“Generate Project”按钮,Spring Initializr就会为你生成一个项目。浏览器将会以ZIP文件的形式(文件名取决于Artifact字段的内容)。点击生成后,会生成你一个如下所示的目录:

                                                                       

目录中,build.gradle:Gradle构建说明文件,如果选择Maven项目,这里就是Pom.xml。

  • Application.java:一个带有main()方法的类,用于引导启动应用程序。
  • ApplicationTests.java:一个空的JUnit测试类,它加载了一个使用SpringBoot自动配置功能的Spring应用程序上下文。
  • application.properties:一个空的properties文件,可以根据需要添加配置属性。
  • static目录:放置的是Web应用程序的静态内容(JavaScript、样式表、图片等等)。
  • templates目录:用于呈现模型数据的模板。

1.2.2 在Spring Tool Suite里创建Spring Boot项目

暂留。

1.2.3 在IntelliJ IDEA里创建Spring Boot项目

网上资料很多也很简单。

1.2.4 在Spring Boot CLI里使用Intializr

暂留。

 第二章 开发第一个应用程序

2.1 运用Spring Boot

首先创建好一个Spring Boot项目,得到一个类似图2.1的项目结构:

                                      

2.1.1 查看初始化的Spring Boot新项目(初始化

图2.1中,整个项目结构都遵循传统的Maven或Gradle项目布局,即主要应用程序代码位于src/main/java目录里,资源都在src/main/resources目录里,测试代码都在src/test/java目录里,测试资源如果有的话,放在src/test/resources里。

  • build.gradle:Gradle构建说明文件。
  • ReadingListApplication.java:应用程序的启动引导类(bootstrap class),也是主要的Spring配置类。
  • application.properties:用于配置应用程序和Spring Boot的属性。
  • ReadingListApplicationTests.java:一个基本的集成测试类。

下面我们首先来看ReadingListApplication.java:

1、启动引导Spring

ReadingListApplication在Spring Boot应用中有两个作用:配置和启动引导。首先,这是主要的Spring配置类,虽然Spring Boot自动免除了很多Spring配置,但是还是需要少量配置来启用自动配置。如代码清单2.1所示:

@SpringBootApplication开启了Spring的组件扫描和Spring Boot的自动配置功能,实际上@SpringBootApplication将三个有用的注解组合在了一起。

  • Spring的@Configuration:标明该类使用Spring基于Java的配置,这本书倾向基于java而不是XML的配置。
  • Spring的@ComponentScan:启用组件扫描,这样你写的Web控制器类和其他组件才能被自动发现并注册未Spring应用程序上下文里的Bean。
  • Spring Boot的@EnableAutoConfiguration:这个注解也可以称为@Abracadabra——咒语的意思,开启Spring Boot自动配置。

在Spring Boot的早期版本中,需要在ReadingListApplication类中同时标上这三个注解,但从Spring Boot 1.2.0开始,只需要@SpringBootApplication就行了。

ReadingListApplication还是一个启动引导类。要运行Spring Boot应用程序有几种方式,其中包含传统的WAR文件部署。但这里的main()方法可以在命令行里把该应用程序当作一个可执行JAR文件来运行。这里向SpringApplication.run()传递了一个ReadingListApplication类的引用,还有命令行参数,通过这些东西启动应用程序。

2、测试Spring Boot应用程序

Initializr 还提供了一个测试类的骨架,可以基于它为你的应用程序编写测试。该测试类不仅是个占位符,还是一个例子,如代码清单2-2所示:

一个典型的Spring集成测试会用@ContextConfiguration注解标识如何加载Spring的应用程序上下文。但是,为了充分发挥Spring Boot,这里应该用@SpringApplicationConfiguration注解。正如代码清单2-2,使用的是该注解从ReadingListApplication配置类里加载Spring应用程序上下文。

清单2-2的测试方法中还有一个测试方法,即contextLoads(),它是一个空方法,这个空方法足以证明应用程序上下文的加载没问题。如果ReadingListApplication里定义的配置是好的,就能通过测试。如果有问题,就会测试失败。

3、配置应用程序属性

Initializr会自动为项目生成一个application.properties文件,该文件是可选的也可以删掉,不会对应用程序有任何影响;此外该配置文件还可以细粒度的调整SpringBoot自动配置。

2.1.2 Spring Boot项目构建过程解析

Spring Boot为Gradle和Maven提供了构建插件,以便辅助构建Spring Boot项目。代码清单2-3是Initializr创建的build.gradle文件,其中应用了Spring Boot的Gradle插件。

要是使用Maven来构建应用程序,Initializr会自动生成一个pom.xml文件,其中使用了SpringBoot的Maven插件,如代码清单2-4所示:

无论是Gradle还是Maven,Spring Boot的构建插件都对构建过程有所帮助。Gradle的bootRun任务可以运行程序。Spring Boot的Maven插件与之类似,提供了一个spring-boot:run目标。

构建插件的主要功能是把项目打包成一个可执行的JAR(uber-JAR),包括把应用程序的所有依赖打入JAR文件内,可以以java - jar来执行JAR添加一个描述文件。

除了构建插件,代码清单2-4里的Maven构建说明还将spring-boot-starter-parent作为上一级,这样就能利用Maven的依赖管理功能,继承很多常用库的依赖版本,在再次声明依赖时就不用再去指定版本号了。注意:这里的pom.xml中都没有指定版本。

2.2 使用起步依赖

如果没有起步依赖,即使是开发一个简单的Spring Web程序,也得需要Thymeleaf视图,通过JPA进行数据持久化等。而且还有版本的兼容等等各种问题。Spring Boot的起步依赖正是解决这些问题。

2.2.1 指定基于功能的依赖

Spring Boot通过提供众多起步依赖降低项目依赖的复杂度。起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。很多起步依赖的命名都暗示了它们提供的某种或某类功能。例如,你打算把某个程序做成一个Web程序,直接添加Spring Boot的Web起步依赖就好。添加这些依赖最简单的方法就是在Initializr里选中Web、Thymeleaf和JPA复选框。通过传递依赖,添加依赖就等价于加了一大把独立的库,这些传递依赖涵盖了Spring MVC、Spring Data JPA、Thymeleaf等内容,它们声明的依赖也会被传递进来。附录B罗列出了全部起步依赖,并简要描述了一下它们向项目构建引入了什么。

起步依赖会由SPring Boot版本决定,并决定传递依赖的版本。所以我们不需要指定版本号,但是如果想知道版本号,在Maven里使用dependency插件的tree目标会显示一个依赖树,包含项目所用的每一个库及版本。$mvn dependency:tree

大部分情况都不需要关系每个Spring Boot起步依赖分别声明了什么东西。Web起步依赖能够构建Web应用程序,Thymeleaf起步依赖能够使用Thymeleaf模板,Spring Data JPA起步依赖能够让数据持久化到数据库里。但是,假如起步依赖选的库有问题,如何覆盖起步依赖?

2.2.2 覆盖起步依赖引入的传递依赖

起步依赖和项目中的其它依赖没什么区别,可以通过构建工具的功能,选择性的覆盖它们引入的传递依赖的版本号,排除传递依赖,还可以为那些Spring Boot起步依赖没有涵盖的库指定依赖。以Web起步依赖为例,它传递依赖了Jaskson JSON库,一般构建面向人类用户的Web应用程序可能用不到Jackson,就可以排除掉它的传递依赖,为项目进行瘦身。如下:

在Gradle中,排除依赖方式:略。在Maven中,可以用<exclusions>元素来排除传递依赖:

Maven总是会用最近的依赖,在项目构建说明文件里增加的这个依赖会覆盖传递依赖引入的另一个依赖。

2.3 使用自动配置

Spring Boot的自动配置是一个运行时(更准确的说,是应用程序启动时)的过程,考虑了众多因素才决定Spring配置应该用哪个,不该用哪个。

2.3.1 专注于应用程序功能

    1、定义领域模型

我们应用程序里的核心领域概念是读者阅读列表上的书。因此我们需要定义一个实体类来表示这个概念。代码清单2-5演示了如何定义一本书。

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
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;
public Long getId(){
    return id;
}
public void setId(Long id){
    this.id = id;
}
......

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

2、定义仓库接口

接下来,我们就要定义用于把Book对象持久化到数据库的仓库了。因为用了Spring Data JPA,所以我们要做的就是简单地定义一个接口,扩展一下Spring Data JPA的JpaRepository接口:

import com.example.springboottest.springboottest.entity.Book;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface ReadingListRepository extends JpaRepository<Book,Long> {
    List<Book> findByReader(String reader);
}

通过扩展JpaRepository, ReadingListRepository直接继承了18个执行常用持久化操作的方法。 JpaRepository是个泛型接口,有两个参数:仓库操作的领域对象类型,及其ID属性的
类型。此外,这里还增加了一个findByReader()方法,可以根据读者的用户名来查找阅读列表。如果你好奇谁来实现这个ReadingListRepository及其继承的18个方法,请不用担心,
Spring Data提供了很神奇的魔法,只需定义仓库接口,在应用程序启动后,该接口在运行时会自动实现。

3、创建web界面

现在,我们定义好了应用程序的领域模型,还有把领域对象持久化到数据库里的仓库接口,剩下的就是创建Web前端了。代码清单2-6的Spring MVC控制器就能为应用程序处理HTTP请求。
 

package com.example.springboottest.springboottest.controller;

import com.example.springboottest.springboottest.entity.Book;
import com.example.springboottest.springboottest.service.ReadingListRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;


import java.util.List;



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

    private ReadingListRepository readingListRepository;

    @Autowired
    public ReadingListController(ReadingListRepository readingListRepository){
        this.readingListRepository = readingListRepository;
    }

    @RequestMapping(value = "/{reader}",method = RequestMethod.GET)
    public String readerBooks(@PathVariable("reader") String reader, Model model){
        List<Book> readingList = readingListRepository.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);
        readingListRepository.save(book);
        return "redirect:/{reader}";
    }
}

ReadingListController使用了@Controller注解,这样组件扫描会自动将其注册为Spring应用程序上下文里的一个Bean。它还用了@RequestMapping注解,将其中所有的处理器方法都映射到了“/”这个URL路径上。该控制器有两个方法:

  • readersBooks():处理/{reader}上的HTTP GET请求,根据路径里指定的读者,从(通过控制器的构造器注入的)仓库获取Book列表。随后将这个列表塞入模型,用的键是books,最后返回readingList作为呈现模型的视图逻辑名称。
  • addToReadingList():处理/{reader}上的HTTP POST请求,将请求正文里的数据绑定到一个Book对象上。该方法把Book对象的reader属性设置为读者的姓名,随后通过仓库的save()方法保存修改后的Book对象,最后重定向到/{reader}(控制器中的另一个方法会处理该请求)。

readersBooks()方法最后返回readingList作为逻辑视图名,为此必须创建该视图。因为在项目开始之初我就决定要用Thymeleaf来定义应用程序的视图,所以接下来就在src/main/resources/templates里创建一个名为readingList.html的文件,内容如代码清单2-7所示。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值