Spring-02:构建并运行基础Spring应用

承接上一篇随笔,我们使用IDEA创建了第一个Spring项目,现在来进行Spring项目的构建和运行

Spring-01:初学资源准备及初始化spring项目

1 初始化Spring应用

Spring项目结构

①pom.xml

maven的构建规范

②mvnw和mvnw.cmd

这是Maven包装器脚本,借助它,即使没有安装maven也可以构建项目。

③TacoCloudApplicationTests

这是简单的测试类,确保Spring应用上下文可以成功加载

④application.properties

提供指定配置属性的地方

⑤templates

渲染内容到浏览器的模板文件,如thymeleaf

⑥static

这个文件夹可以存放为浏览器提供服务的静态内容。css、js、图片等

⑦TacoCloudApplication.java

这是SpringBoot的主类,它会启动本项目

pom.xml

初始的Maven构建规范

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>tacos</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
​
    <name>taco-cloud</name>
    <description>taco-cloud</description>
​
    <properties>
        <project.build.sourceEncoding>
            UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>
            UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
​
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
​
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-test</artifactId>
            <version>2.5.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.3.8</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
​
    <build>
        <plugins>
​
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.7.3</version>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
​
</project>

①spring-boot-starter依赖

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.3</version> <relativePath/> <!-- lookup parent from repository --> </parent>

本项目以spring-boot-starter-parent作为其父POM,为Spring项目常见的一些库提供了依赖管理,无需指定他们的版本。

三个包含starter单词的依赖,它们本身并不包含库代码,而是传递性地拉去其他的库。

②问题:Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found

添加和上方一致的版本号即可

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.3</version>

③springboot插件的作用

提供maven goal,允许我们使用maven运行应用

确保依赖的库包含在可执行的jar中

将引导类TacoCloudApplication.java,声明为可执行jar的主类

主类中的结构

package com.example.tacos;
​
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
​
@SpringBootApplication
public class TacoCloudApplication {
​
    public static void main(String[] args) {
        SpringApplication.run(TacoCloudApplication.class, args);
    }
​
}

@SpingBootApplication注解

@SpingBootApplication包含

①@SpingBootConfiguration

将该类声明为配置类

后续可以按需添加spring款加配置(是@Configuration的特殊形式)

②@EnableAutoConfiguration

启用SpingBoot的自动配置

③@ComponentScan

启用组件扫描。扫描@Controller、@Service这些组件,自动注册为Spring应用中的上下文组件。

.run()方法

SpringApplication中的run方法被调用后,会创建Spring的上下文,它有两个参数:

TacoCloudApplication.class:配置类TacoCloudApplication对象

args:命令行参数

2 开始编写Spring应用

开始前需了解

现在,我们需要创建:

一个控制器类,用来处理主页相关请求

一个视图模板,用来界面层的展示

一个简单的测试类,用来测试主页

创建各组件

①主页控制器Controller

package com.example.tacos;
​
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
​
@Controller
public class HomeController {
​
    @GetMapping("/")
    public String home(){
        return "home";
    }
}

@Controller,标明此类为控制器组件。Spring的组件扫描功能会发现它并创建一个HomeController实例作为Spring上下文中的bean

@GetMapping("/")处理前端传来的根路径为"/"的请求:比如针对"/"发送的HTTP GET请求,这个方法将会处理请求,返回String类型的“home”值

关于返回的“home”值

这个值会被解析为视图的逻辑名,使用到了thymeleaf。

之前在Javaweb的学习中,在web.xml中配置过上下文参数

<!-- 配置上下文参数 -->
<context-param>
    <param-name>view-prefix</param-name>
    <param-value>/</param-value>
</context-param>
<context-param>
    <param-name>view-suffix</param-name>
    <param-value>.html</param-value>
</context-param>

现在的前缀是“/template/”,后缀还是“.html”

②定义视图层

home.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:th="http://www.thymeleaf.org">
  <head>
    <title>Taco Cloud</title>
  </head>
  
  <body>
    <h1>Welcome to...</h1>
    <img th:src="@{/images/TacoCloud.png}"/>
  </body>
</html>

③创建测试控制器

@RunWith(SpringRunner.class)
@WebMvcTest(HomeController.class)   // <1>
public class HomeControllerTest {
​
  @Autowired
  private MockMvc mockMvc;   // <2>
​
  @Test
  public void testHomePage() throws Exception {
    mockMvc.perform(get("/"))    // <3>
    
      .andExpect(status().isOk())  // <4>
      
      .andExpect(view().name("home"))  // <5>
      
      .andExpect(content().string(           // <6>
          containsString("Welcome to...")));  
  }
​
}

<1>针对controller的web测试

<2>注入mockMvc,可以让测试实现mockup

<3>发起对“/”的GET请求

<4>期望的状态是200

<5>跳转home页面视图

<6>期望包含“Welcome to..."

该测试类若通过测试,证明我们刚才写的视图层和控制层的组件都完成了预期任务。

3 运行Spring应用

通过以上内容我们已经编写好了一个简单的Spring的应用,现在使用IDEA来运行它。运行后如下图所示:

①在左上方IDEA的运行工具中,点击edit configuration来配置我们要运行的应用;

②可以看到我们选择的应用程序名称和我们的主类(引导类)TacoCloudApplication名称是相同的;

③为什么没有显示我们之前学习Javaweb时,启动项目都会出现的Tomcat图标?因为Spring Boot应用里已经包含了Tomcat,现在我们启动Spring项目,里面就启动了Tomcat,图中显示Tomcat已经在端口8080启动的日志,它是我们应用的一部分;

④在浏览器中通过访问http://localhost:8080/,看到我们的home页面,就表示运行成功了。


以上我们完成了一个简单的Spring应用,并成功运行了它。

  • 接下来我们还会介绍③中使用的Devtools工具;
  • 对接数据库来访问持久层的数据;
  • 不断丰富扩展我们的应用,学习更多Spring知识。

参考资料:

《Spring实战第5版》

posted @ 2022-09-24 15:48  Fancy[love]  阅读(47)  评论(0编辑  收藏  举报