Spring Boot 项目结构

2023-10-30

简介

Spring Boot 根据实际的项目可以有不同的文件结构,比如使用maven还是使用gradle构建工具,开发Web项目还是控制台项目,使用JPA文件结构和使用Mybatis的文件结构,前后端分离项目它们采用的目录结构是不同的,但它们包含一个通用文件结构,这些文件是在Spring Boot中约定配置的。

学习环境

  • Spring Boot 2.2.7.RELEASE
  • Maven 3.6.0

Demo的项目结构

Demo创建了一个HelloWorld的项目,项目使用创建RESTful风格的接口,并在单元测试中测试该接口。
在IDEA中项目的结构

在IDEA中可以通过 File -> Project Structure -> Modules (Windows快捷键 Ctrl + Alt + Shift + s)来配置Sources。

pom.xml

POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。参考
在Spring Boot 项目中pom文件为以spring-boot-starter-parent为父项目对一些常用包的版本进行管理,同时也提供了方便将项目打包成jar包的插件spring-boot-maven-plugin。

<?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">
    <!--指定当前pom版本-->
    <modelVersion>4.0.0</modelVersion>
    <!--父项目标签。spring-boot-starter-parent 是一个特殊的starter,它用来提供相关的Maven默认依赖。使用它之后,常用的包依赖可以省去version标签-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.7.RELEASE</version>
        <!--父项目的pom.xml文件的相对路径。本地有多个仓库相对路径允许你选择一个不同的路径。默认值是../pom.xml,在多模块项目中子模块可以使用默认值。Maven在构建时首先会在当前项目的地方寻找父项目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom-->
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <!--项目打包类型,jar、war、pom、ejb、ear、rar、par、maven-plugin, 默认是jar类型-->
    <packaging>jar</packaging>

    <!--项目相关信息-->
    <groupId>cn.makerknz</groupId>
    <artifactId>hello-world</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>hello-world</name>
    <description>Demo project for Spring Boot</description>

    <!--为pom定义一些常量,在pom中的其它地方可以直接引用-->
    <properties>
        <!--jdk版本-->
        <java.version>1.8</java.version>
    </properties>

    <!--项目开发过程中需要使用到外部包,包括Spring Boot项目包和第三方包-->
    <dependencies>
        <!--Spring Boot的核心启动器,包含了自动配置、日志和YAML-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <!--junit5不需要配置junit-vintage-engine-->
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!--spring-boot-maven-plugin插件在打Jar包时会引入依赖包,当运行“mvn package”进行打包时,会打包成一个可以直接运行的 JAR 文件,使用“Java -jar”命令就可以直接运行。-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Sources

开发的源码是放在Source Folder(src\main\java)中包路径(groupId + artifactId)下,必须要包含HelloWorldApplication启动类作为程序的入口,启动类通过@SpringBootApplication可以自动扫描项目中加载的包并根据配置将Bean及其所依赖的对象注入Spring容器中。调用run方法过程中执行了计时程序的启动时间,Spring 运行时事件监听,始化输入参数、配置环境,输出banner,创建上下文,预处理上下文,刷新上下文,再刷新上下文、发布应用已经启动事件、发布应用启动完成事件一系列操作,在刷新上下文中启动web容器(Tomcat,Jetty或undertow)和将Bean加载到容器。

@SpringBootApplication
@RestController
public class HelloWorldApplication {

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

    /**
     * 通过浏览器访问http://localhost:8080/hello-world可以在页面中渲染出大标题的Hello world!
     * @return
     */
    @GetMapping("/hello-world")
    public String helloWorld() {
        return "<h1>Hello world!</h1>";
    }

}

Test Sources

开发的测试源码是放在Test Source Folder(src\test\java)中包路径(groupId + artifactId)下,@SpringBootTest后,Spring将加载所有被管理的bean,基本等同于启动了整个服务。

@SpringBootTest
class HelloWorldApplicationTests {

    @Autowired
    private WebApplicationContext wac;

    @Test
    void contextLoads() throws Exception {
        MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();

        // MockMvcRequestBuilders构建GET请求
        String result = mockMvc.perform(MockMvcRequestBuilders.get("/hello-world")
                .accept(MediaType.TEXT_HTML_VALUE))
                //返回请求的字符串信息
                .andReturn().getResponse().getContentAsString();

        System.out.println(result);
    }

}

resources

配置

Spring Boot使用一个全局的配置文件名是application,在全局配置之前还有bootstrap命名的文件用于应用程序上下文的引导阶段,配置文件有两种格式properties和yaml,但内容的本质都是Key-Value的格式,如果使用多个profile可以使用可以使用application-${profileName}。
配置文件加载位置和加载顺序可以自己查找。

static

static中放置的是静态页面,Spring Boot 项目启动后可以通过服务器http://localhost:8080/ + 静态页面(包含路径)访问。

templates

templates中放置的是渲染的模板,动态页面需要先请求服务器,访问后台应用程序,然后再转向到页面,比如访问JSP。spring boot建议不要使用JSP,默认使用Thymeleaf来做动态页面。

target 文件夹

打包完成后jar包会生成到target目录下,命名一般是 项目名+版本号.jar。

其它文件

.idea

.idea存放项目的配置信息,包括历史记录,版本控制信息等。

hello-world.iml

iml是 intellij idea的工程配置文件,里面是当前project的一些配置信息。

HELP.md

Markdown的文本格式,可以写一些快速启动和配置的文档,和README.md类似。

总结

在一个Spring Boot通用文件结构中,每一个文件夹或文件都有其指定的功能。

参考

Spring Boot内置tomcat启动原理
Spring Boot项目结构及功能
Spring Boot 中配置文件的优先级和加载顺序

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot 项目结构 的相关文章

  • Criteria eager fetch-joined 集合以避免 n+1 选择

    假设 Item 和 Bid 是实体 一个 Item 有多个 Bid 它们被映射到休眠在典型的父子关系中
  • 逐行读取 JTextPane

    有没有办法读取a的内容JTextPane逐行 很像 BufferedReader 吗 Element root textPane getDocument getDefaultRootElement 获得根元素后 您可以检查存在多少个子元素
  • ORMLite - join where 子句中的括号

    我想使用连接三个表QueryBuilder join and QueryBuilder joinor但我想在 where 子句中添加括号 如下所示 WHERE first table where AND second table where
  • AES BadPaddingException

    如果我使用错误的密钥或错误的盐进行解密 则会引发 BadPaddingException 我希望返回一个不正确的字符串 doFinal 导致解密方法出现异常 信息 This is just an example Unfug S F V s
  • java模拟自定义对象

    public class MainClass public void makeCall CustomObject obj new CustomObject obj testMethod 我想进行单元测试makeCall 所以我必须嘲笑Cus
  • Hibernate、MySQL 视图和 hibernate.hbm2ddl.auto = 验证

    我可以在 Hibernate 中使用 MySQL 视图 将它们视为表 即 该实体与为表创建的实体没有什么不同 但是 当 Hibernate 设置为验证模型时 我的应用程序将不会部署 因为它找不到视图 因为它假设它是一个表 是否可以在启用部署
  • Android 防火墙与 VpnService

    我正在尝试使用 BS 项目的 VpnService 为 Android 实现一个简单的防火墙 我选择 VpnService 因为它将在非 root 设备上运行 它将记录连接并让您过滤连接 基于IP 有一个应用程序可以做到这一点 因此这是可能
  • Android 上的自定义视图和窗口属性

    我想要做的是在我的应用程序顶部添加一个视图 该视图类似于过滤器视图 我想操纵屏幕的颜色 并且我还希望能够同时更改屏幕的亮度时间 这两件事似乎是分开起作用的 但不能一起起作用 这是我的代码 添加视图 colourView new Layer
  • 更改 Spring Web 应用程序的默认会话超时

    我必须测试一个由 spring 和 jsp 编写的 Web 应用程序 应用程序的默认会话超时为 30 分钟 我想减少会话超时 为此 我改变了web xml文件输入tomcatInstallationLocation conf 但这不起作用
  • 为什么 Casbah / Java MongoDB 驱动程序最终会出现 java.lang.IllegalArgumentException?

    我使用时看到一个奇怪的问题casbah java driver 当驱动程序尝试从 mongo 创建响应时 我不断遇到以下异常 Oct 16 2012 10 45 07 AM com mongodb DBTCPConnector MyPort
  • 为什么 Cassandra 客户端在生产中没有 epoll 时会失败? [复制]

    这个问题在这里已经有答案了 当我在本地运行服务时 我收到一条警告 指出 epoll 不可用 因此它使用 NIO 很公平 当我将其部署到 Kubernetes 中时 我得到了以下信息 这导致服务无法运行 2017 03 29T19 09 22
  • APACHE POI 从 Java 中的 Excel 获取精确的字体颜色

    在 Excel 工作表中 如何使用 Java 中的 Apache POI 获取准确的字体颜色值 我试图通过使用来获取字体颜色 org apache poi ss usermodel Font f book getFontAt style g
  • 从字符串中提取文本 Java

    使用此字符串 ADACADABRA 如何从java中的字符串 ADACADABRA 中提取 CADA 以及如何提取 和 之间的id从下面的链接 http www youtube nocookie com embed zaaU9lJ34c5
  • JSF“总”变量类似于 JSTL 中的 c:set

    我不喜欢 JSF 但我需要用它来解决这个问题 我正在 纯 JSF 中工作 所以这就是我基本上需要的 但我不知道如何用 JSF 来实现它
  • 解析 SWIG 接口文件的结构属性

    这是我不久前问过的问题的延续 为通过参数返回的函数创建类型映射 https stackoverflow com questions 12793973 create a typemap for a function that returns
  • SecurityContextHolder.getContext().getAuthentication() 返回 null

    我想使用以下代码手动绕过 spring Security 的用户 User localeUser new User UsernamePasswordAuthenticationToken auth new UsernamePasswordA
  • JSF - 实施受限页面过滤器

    我正在关注 BalusC 的回答JSF 2 0 如何获取在浏览器地址栏中输入的 URL https stackoverflow com questions 4105263 jsf 2 0 how to get the url that is
  • 如何设置 commons-logging 来使用 logback?

    我们使用 slf4j logback 并且碰巧有一些使用 commons logging 的第三方库 如何设置它以使用 logback 答案是不要使用 commons logging jar 因为 SLF4J 的设计目的与 commons
  • selenium 没有找到合适的方法,直到(ExpectedCondition)

    这是有线的问题 我导入的项目运行 100 几个月前 今天我已将其与依赖项一起导入 但存在问题WebDriverWait 这是我的代码 WebDriverWait driverWait new WebDriverWait driver 100
  • 是什么让热部署成为“难题”?

    在工作中 我们经常遇到这样的问题 永久代内存不足 http www jroller com agileanswers entry preventing java s java lang例外 团队负责人认为这是 JVM 中的一个错误 与代码的

随机推荐

  • 基于51单片机的温控风扇设计

    作者 何朋伟 19计科一班 宏定义 define uchar unsigned char define uint unsigned int 包含头文件 include
  • Java系统多个JSSE认证

    问题描述 由于项目需要 系统需要多个JSSE认证 登录使用SSL 邮件收取 解决办法 一 对于需要一次JSSE认证来说 可以通过 1 InstallCert工具来安装证书 Copyright 2006 Sun Microsystems In
  • 模型实战(10)之win10下tensorRT部署yolov5算法

    win10下tensorRT部署yolov5算法 针对yolov5的众多版本 目前有几种部署方法 1 tensorrtx 大神针对众多网络模型 包含yolov5众多版本 开源的一个转换工具 部署方式为 onnx gt wts gt engi
  • egret native使用自定义字体

    参考文章白鹭官方链接 除了文章提到的修改内容 还有文章没提到的一些内容如下 1 在egretProperties json文件中添加字库名称 2 添加字库资源 以上是android apk包内改变字体的方法 而移动端浏览器的设置方法则需要另
  • 关于layer.js中layer.confirm弹出框看不到或者不居中问题处理

    在jsp页面body 标签上加上style height 100 就可以解决
  • 在Android中实现Unity3D的背景是透明的 u3d显示在安卓的上一层

    在Unity中 可以通过设置Camera的背景 Camera下的Environment下的Background Type设置为Solid Color Background需要设置黑色透明度0 即ARGB为 0 0 0 0 透明度不为0则无法
  • 安卓应用开发入门:两个 Activity 之间的跳转

    关键知识 Intent Intent 意图 主要实现Activity之间的来回切换和数据传递 Intent是一种轻量级的消息传递机制 这种消息描述了应用中一次操作的动作 动作涉及数据 附加数据 Android系统根据此Intent的描述 负
  • 凭借这份面经,大专的我成功拿到腾讯Android岗offer

    一 简历 网上有很多对程序员简历的一些指导 这里就不重述 大家可以搜下网上其他大神的总结 结合自身情况修改下 我有几点建议 1 尽量不要花哨 程序员和设计师或者产品运营还不一样 我们的简历成功与否决定权还是在技术面试官那 而他们看重的是你的
  • centos6.8下l2tp客户端xl2tpd的安装配置

    环境 DigitalOcean centos6 8作为l2tp客户端 ros6 43 8作为l2tp服务端 1 安装xl2tp和ppp rpm ivh http mirrors yun idc com epel 6 x86 64 epel
  • 你能活过80岁么?9大因素决定人的寿命

    你能活过80岁么 9大因素决定人的寿命 最近 一项世界上历时最长 规模最大的老龄化研究显示 对中年男子而言 寿命能否达到80岁以上 取决于9项指标 即体重 血压 血糖 胆固醇 受教育程度 婚姻状况 是否酗酒 是否吸烟以及是否拥有好的握力 这
  • 测试音质好坏的软件,音响音质的好坏简单的两招测出

    原标题 音响音质的好坏简单的两招测出 怎样判断一个音响好坏 对于略懂略懂的你真的可以判断一个音响的好坏 当没有专业的测试工具也没有精确的仪器时候 应该怎样判断一个音响好坏 然后就买买买 低配置的测试 工具 一杯水 一首无损音质的歌曲 测试低
  • Android实现屏幕旋转方法

    本文实例总结了Android实现屏幕旋转方法 分享给大家供大家参考 具体如下 在介绍之前 我们需要先了解默认情况下android屏幕旋转的机制 默认情况下 当用户手机的重力感应器打开后 旋转屏幕方向 会导致当前activity发生onDes
  • 金融分析与风险管理——投资组合的有效前沿及资本市场线

    金融分析与风险管理 投资组合的有效前沿及资本市场线 1 投资组合的可行集 2 投资组合的有效前沿 3 资本市场线 1 投资组合的可行集 投资组合中的权重变量可以实现投资组合的预期收益率与收益波动率之间的映射关系 在投资组合的理论中 所有可能
  • Tomcat服务安全加固和优化

    转载来源 https help aliyun com knowledge detail 37421 html spm a2c4g 11186623 4 5 4ad6510eY2UhOS 介绍 tomcat服务默认启用了管理后台功能 使用该后
  • Docker安装(RPM包方式)

    Docker安装 RPM包方式 一 安装环境准备 1 操作系统要求 1 查看内核版本 root nod var uname r 3 10 0 957 el7 x86 64 2 查看操作系统版本 root nod var cat etc os
  • java gridlayout 行高,RecyclerView GridLayoutManager和動態的行高

    初始化 postLine setAdapter postsAdapter postLine setLayoutManager new GridLayoutManager getActivity 2 準備後添加他們recyclerView功能
  • 【青少年CTF】“Flag在哪里?”解题记录

    青少年CTF训练平台 www qsnctf com 博主用户名 Fourstar 题目介绍 描述中并没有给出什么有用的信息 一般来讲有关于直接问Flag的 例如 Flag在哪里 Where is Flag 此类题目 第一反应就是查看网页源代
  • GitLab+Jenkins+Harbor+Kubernetes构建Devops体系

    文章目录 一 架构设计 二 环境准备 1 安装GitLab 2 安装Jenkins 1 安装方式 2 配置 3 安装Harbor 4 安装k8s 1 安装方式 2 配置 三 服务代码结构 四 Jenkins持续集成 本文介绍一套比较简单的
  • [论文阅读] Tokens-to-Token ViT: Training Vision Transformers from Scratch on ImageNet

    论文地址 https arxiv org abs 2101 11986 代码 https github com yitu opensource T2T ViT 发表于 ICCV 2021 Arxiv 2021 01 Abstract Tra
  • Spring Boot 项目结构

    简介 Spring Boot 根据实际的项目可以有不同的文件结构 比如使用maven还是使用gradle构建工具 开发Web项目还是控制台项目 使用JPA文件结构和使用Mybatis的文件结构 前后端分离项目它们采用的目录结构是不同的 但它