SpringBoot :ch01 项目结构

前言

在本系列博客中,我们将深入探讨 Spring Boot 项目结构的各个方面,并探讨如何利用这些结构来构建健壮、可扩展的应用程序。通过深入了解 Spring Boot 项目结构,我们可以更好地利用 Spring Boot 的优势,提高开发效率,降低维护成本,并构建出高质量的应用程序。

在本系列的第一部分中,我们将首先介绍 Spring Boot 项目结构的基本布局,包括主要的目录和文件,以及它们各自的作用。通过了解项目结构,我们可以更好地组织我们的代码,并充分利用 Spring Boot 提供的功能和特性。

一、新建项目,结构如下

1、项目依赖
<?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>
    <!-- 这个父模块是springboot的父级依赖,它提供了默认的Java版本
        、编码设置、插件管理、以及Maven依赖的版本号管理等功能,
        因此在项目中引入先关starter的时候就不在需要指定版本号-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.17</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <!-- 当前项目的GAV坐标以及名称和描述 -->
    <groupId>edu.nf</groupId>
    <artifactId>ch01</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>ch01</name>
    <description>ch01</description>

    <!-- Java版本 -->
    <properties>
        <java.version>11</java.version>
    </properties>


    <!-- 依赖-->
    <dependencies>
        <!-- 这是springboot核心starter,也就是核心的启动器,
         它包含了起步所需要的依赖,自动化配置、日志、YAML配置功能,
         所以没有它springboot无法正常工作-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- springboot集成单元测试的环境 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!-- 这个插件专门用于将springboot应用打包成jar或者war文件 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <image>
                        <builder>paketobuildpacks/builder-jammy-base:latest</builder>
                    </image>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

这些依赖都不用我们自己加,在新建项目的时候选择。 

这个 Maven POM 文件定义了一个基于 Spring Boot 的 Java 项目的配置和依赖。其中包括以下关键部分:

  1. parent 元素指定了当前项目的父级依赖为 spring-boot-starter-parent,版本号为 2.7.17。这意味着该项目将继承 Spring Boot Starter Parent 提供的默认配置和依赖管理。

  2. groupIdartifactIdversion 元素定义了当前项目的坐标信息,分别表示项目的组织ID、项目ID和版本号。

  3. properties 元素中定义了 Java 版本为 11。

  4. dependencies 元素列出了当前项目所依赖的库,包括了 spring-boot-starterlombokspring-boot-starter-test 等。

  5. build 元素中配置了用于将 Spring Boot 应用打包成 JAR 或 WAR 文件的插件,这里使用了 spring-boot-maven-plugin 插件,并设置了一些相关参数,如镜像构建器和排除某些依赖等。

通过这些配置,你可以快速搭建一个基于 Spring Boot 的 Java 项目,而无需关注大量繁琐的配置和依赖管理。

二、Ch01Application 类


@SpringBootApplication
public class Ch01Application {

    /**
     * springboot 程序入口
     *
     * SpringApplication 的 run 方法运行后会初始化一个 IOC 容器
     * 我们可以从这个容器中获取我们想要的 Bean
      * @param args
     */
    public static void main(String[] args) {
       SpringApplication.run(Ch01Application.class, args);
 
    }

}

这段代码是一个典型的 Spring Boot 应用程序的入口类。让我来解释一下:

  1. @SpringBootApplication 注解标注在该类上,它是 Spring Boot 提供的一个组合注解,包括了 @Configuration@EnableAutoConfiguration@ComponentScan 注解。通过这个注解,Spring Boot 将自动扫描当前类所在包以及子包中的组件,并对它们进行自动配置。

  2. Ch01Application 类中的 main 方法是程序的入口点。在这个方法中,调用了 SpringApplication.run 方法,传入了当前类和命令行参数 args。这将启动 Spring 应用程序,并初始化一个 IOC 容器,其中包含了所有被 @Component@Service@Repository 等注解标识的 Bean。

  3. 通过初始化 IOC 容器,我们可以从中获取我们想要的 Bean,并开始执行我们的业务逻辑。

总的来说,这段代码是一个标准的 Spring B

oot 应用程序的入口类,负责启动 Spring 应用程序并初始化相关的组件和 Bean。

 

那我们就是实现一个简单的dao和service的调用,不使用 mybatis.

三、dao层

1、UserDao
public interface UserDao {

    void save();

}
2、UserDaoImpl
@Repository
@Slf4j
public class UserDaoImpl implements UserDao {
    @Override
    public void save() {
        log.info("insert into user_info.... ");
    }
}

这段代码定义了一个 UserDaoImpl 类,它实现了一个 UserDao 接口,并使用了 @Repository 注解进行标识。@Repository 注解是 Spring 框架提供的一种组件扫描注解,用于标识一个 DAO(数据访问对象)组件。

该类中只实现了一个 save() 方法,方法体内部打印了一条日志,记录了插入用户信息的操作。在实际应用中,我们通常会在这个方法中编写对数据库的增、删、改、查等操作。

使用 @Slf4j 注解可以自动生成日志记录器,无需手动创建。@Slf4j 注解是 Lombok 提供的一种简化代码的注解,它可以自动为类生成一个日志记录器变量 log,并且自动引入 org.slf4j.LoggerFactory 类作为日志框架的实现。

通过以上代码,我们可以看到 Spring Boot 在整合其他框架时的便利性,如使用 @Repository 注解来标识 DAO 组件,使用 Lombok 的 @Slf4j 注解来简化日志记录器的创建,让我们能够更加专注于业务逻辑的实现。

四、service层

1、UserService
public interface UserService {

    void add();

}
 2、UserServiceImpl
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {

    private final UserDao userDao;

    @Override
    public void add() {
        userDao.save();
    }

}

五、在 Ch01Application 调用 service 的方法

前面我们讲到SpringApplication 的 run 方法运行后会初始化一个 IOC 容器 我们可以从这个容器中获取我们想要的 Bean。我们在 dao 和 service中都是用了装配注解,那我们现在就来从容器中拿出来使用。

@SpringBootApplication

public class Ch01Application {

    /**
     * springboot 程序入口
     *
     * SpringApplication 的 run 方法运行后会初始化一个 IOC 容器
     * 我们可以从这个容器中获取我们想要的 Bean
      * @param args
     */
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(Ch01Application.class, args);
        UserService service = context.getBean(UserService.class);
        service.add();
    }

}

运行效果:

成功的调用到了 service 中 add() 方法,大家有没有发现我们现在使用 springboot ,我们并没有写任何的配置类,也没有使用任何的扫描注解?那为什么还能够调用到 dao 和 service 的方法呢?

 六、详解 Ch01Application 类


@SpringBootApplication

// 指定默认的扫描包路径
//@SpringBootApplication(scanBasePackageClasses = "xxx.xxxx.aa")
public class Ch01Application {

    /**
     * springboot 程序入口
     *
     * SpringApplication 的 run 方法运行后会初始化一个 IOC 容器
     * 我们可以从这个容器中获取我们想要的 Bean
      * @param args
     */
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(Ch01Application.class, args);
        UserService service = context.getBean(UserService.class);
        service.add();
    }

}

这是 springboot 的核心启动类(同时也是一个配置类),运行整个 springboot 项目,在这个类上面有一个很重要的注解为 @SpringBootApplication 它其实是一个复合注解,包含了 @Configuration、@ComponentScan

@EnableAutoConfiguration(自动配置注解)
在启动这个类的时候他会有一个默认的扫描机制,是从当前启动类所在的包, 以及所有的子包进行扫描来专配所有带有注解的Bean,因此这个启动类通常放在最外层的父级包目录下。当然也可以改变这个默认扫描的机制,通过 scanBasePackages 属性来指定即可。

Ch01Application 类中,我们使用了 @SpringBootApplication 注解来标记这个类是一个 Spring Boot 应用程序的入口点。此外,我们还定义了一个 main 方法,用于运行应用程序并初始化 IOC 容器。

main 方法中,我们使用 SpringApplication.run() 方法来运行应用程序,并将 Ch01Application.class 作为参数传递给它。这个方法会自动扫描并加载应用程序中所有的 Spring 组件,并启动内嵌的 Tomcat 服务器。同时,它也会根据类路径下的配置文件来自动配置应用程序,包括数据库连接、日志记录、缓存等常见功能。

main 方法中,我们还通过 ApplicationContext 接口获取了一个 IOC 容器的实例,并从容器中获取了一个 UserService 的 Bean 实例。这个 Bean 实例可以直接用于业务逻辑的处理,而无需手动创建对象或进行依赖注入。

总之,Ch01Application 类是 Spring Boot 应用程序的入口点,它提供了 main 方法用于启动应用程序、初始化 IOC 容器,以及从容器中获取 Spring Bean 实例,方便开发者编写业务逻辑代码。

 还有一个非常重要的地方要注意!!!!

 Ch01Application必须是在ch01包下,不能够放在dao或者service里面,如果是放在里面的话@SpringBootApplication注解就没有没放扫描到所有的装配注解,如果是放在 dao 里,那它只能扫描到 dao 里面的装配注解,就没有办法扫描到 service 的。这样在获取 service bean 的时候就会报错。

如果想把 Ch01Application 放在其他的包下也可以,也可以使用@SpringBootApplication注解指定  Ch01Application 的包路径的。

// 指定默认的扫描包路径
@SpringBootApplication(scanBasePackageClasses = "xxx.xxxx.aa")

七、测试类


@SpringBootTest
class Ch01ApplicationTests {

    @Autowired
    private UserService userService;

    @Test
    void contextLoads() {
        userService.add();
    }

}

 这段代码是一个典型的 Spring Boot 单元测试类,让我来逐一解释每一部分:

  1. @SpringBootTest 注解标注在类上,它是 Spring Boot 提供的一个组合注解,用于加载整个 Spring 应用程序的上下文。它会自动初始化 Spring 应用程序的 IOC 容器,并加载所有的 Bean,使得在测试中可以使用依赖注入等功能。

  2. Ch01ApplicationTests 类是一个测试类,用于测试 Ch01Application 类中的业务逻辑。在这个测试类中,我们将测试 UserServiceadd() 方法。

  3. @Autowired 注解用于自动装配 UserService 类型的 Bean,由于在测试中我们需要使用 userService 实例,因此使用 @Autowired 注解将其注入到测试类中。

  4. @Test 注解标注在 contextLoads 方法上,表示这是一个测试方法。在这个方法中,调用了 userServiceadd() 方法,以测试添加用户的业务逻辑是否正常工作。

通过以上代码,我们可以看到 Spring Boot 在测试方面的便利性,如使用 @SpringBootTest 注解来加载整个应用程序上下文,使用 @Autowired 注解来自动装配需要测试的 Bean,使得我们能够方便地编写和执行单元测试。

运行结果:

 

八、总结

Spring Boot 项目通常具有以下标准结构:

src/main/java: 主要的 Java 代码目录,包含了项目的 Java 源代码文件。

src/main/resources: 存放主要的配置文件和资源文件,如 application.properties 或 application.yml 等配置文件,以及静态资源文件、模板文件等。

src/test/java: 测试代码目录,包含了项目的单元测试和集成测试等相关的 Java 源代码文件。

src/test/resources: 存放测试相关的配置文件和资源文件。

pom.xml (如果是 Maven 项目) 或 build.gradle (如果是 Gradle 项目): 项目的构建配置文件,包含了项目的依赖管理、插件配置等。

target (如果是 Maven 项目) 或 build (如果是 Gradle 项目): 编译输出目录,包含了编译后的类文件、打包后的可执行文件等。

其他自定义的目录结构,如存放实体类的目录、存放控制器的目录、存放服务类的目录等。

在 Spring Boot 项目中,通常会遵循约定大于配置的原则,因此可以快速地搭建和开发项目,同时也可以根据需要进行自定义的配置和扩展。
 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/171577.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python接口自动化测试之接口数据依赖

一般在做自动化测试时&#xff0c;经常会对一整套业务流程进行一组接口上的测试&#xff0c;这时候接口之间经常会有数据依赖&#xff0c;那又该如何继续呢&#xff1f; 那么有如下思路&#xff1a; 抽取之前接口的返回值存储到全局变量字典中。初始化接口请求时&#xff0c;…

Python爬虫技巧:百万级数据怎么爬取?

目录 前言 一、使用多线程/协程提高爬虫速度 1.1 使用多线程 1.2 使用协程 1.3 注意事项 二、使用代理IP解决目标网站限制爬虫的问题 三、使用分布式爬虫 四、其他一些小技巧 总结 前言 在实际的爬取过程中&#xff0c;我们经常会遇到一些需要大量爬取数据的情况&…

深入 Django 的 URL 分发器

概要 在 Django 的 MVC 架构中&#xff0c;URL 分发器扮演着至关重要的角色&#xff0c;它负责将用户的请求路由到相应的视图函数或类。这一机制不仅保证了 Django 应用的高度可扩展性&#xff0c;还为开发者提供了灵活的 URL 设计能力。本文将详细介绍 Django 中的 URL 分发器…

KT142C语音芯片客户反馈电脑端的配置文件,打开都正常,但是拷贝到KT142C内部就乱码

KT142C语音芯片客户反馈电脑端的配置文件&#xff0c;打开都正常&#xff0c;但是拷贝到KT142C内部就乱码 首先解释一下原理&#xff0c;KT142C内置的330Kbyte空间可供用户下载&#xff0c;实际上拿出程序部分的空间 作为声音存储介质的&#xff0c;也就是说&#xff0c;代码空…

安卓毕业设计:基于安卓android微信小程序的超市购物系统

运行环境 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&a…

浅谈电动汽车充电桩设计与应用研究

安科瑞 华楠 摘要&#xff1a;目前&#xff0c;随着我国社会经济的快速发展&#xff0c;我国的各个领域都取得了突破性的发展&#xff0c;尤其是在电动汽车充电桩的设计方法&#xff0c;新型的电动汽车充电桩设计已经广泛的受到了人民群众的青睐与认可&#xff0c;而这种发展前…

4本期刊被踢!11月SCI/SSCI目录已更新

​2023年11月20日&#xff0c;科睿唯安更新了Web of Science核心期刊目录。 此次更新后SCIE期刊目录共包含9481本期刊&#xff0c;SSCI期刊目录共包含3551本期刊。此次SCIE & SSCI期刊目录更新&#xff0c;与上次更新&#xff08;2023年10月&#xff09;相比&#xff0c;共…

[vxe-table] expandAll:true 当table数据更新后无法展开,只有第一次能展开才能生效的问题

:tree-config"{rowField: id,parentField: parentId,expandAll: true,reserve: true, }" :row-config"{ keyField: id, isHover: true }"参考&#xff1a; vxe tree expandAll&#xff1a;true当table数据更新后无法展开&#xff0c;只有第一次能展开才能…

visionOS空间计算实战开发教程Day 1:环境安装和编写第一个程序

安装 截至目前visionOS还未在Xcode稳定版中开放&#xff0c;所以需要下载​​Xcode Beta版​​。比如我们可以下载Xcode 15.1 beta 2&#xff0c;注意Xcode 15要求系统的版本是macOS Ventura 13.5或更新&#xff0c;也就是说2017年的MacBook Pro基本可以勉强一战&#xff0c;基…

nginx学习(4)Nginx 配置高可用集群(主从配置)

Nginx 配置高可用集群 Nginx的高可用集群是指由两台或多台Nginx服务器组成的集群系统&#xff0c;通过负载均衡和故障转移等技术&#xff0c;实现高可用性和可伸缩性的目标。在这种集群系统中&#xff0c;每个Nginx服务器都配置为主节点&#xff08;master&#xff09;或从节点…

7-tcp 三次握手和四次挥手、osi七层协议,哪七层,每层有哪些?tcp和udp的区别?udp用在哪里了?

1 tcp 三次握手和四次挥手 2 osi七层协议&#xff0c;哪七层&#xff0c;每层有哪些 3 tcp和udp的区别&#xff1f;udp用在哪里了&#xff1f; 1 tcp 三次握手和四次挥手 # tcp协议---》处于osi7层协议的传输层&#xff0c;可靠连接&#xff0c;使用三次握手&#xff0c;四次挥…

传统考勤太复杂怎么办?这个小技巧,我必须吹爆!

随着科技的不断进步&#xff0c;人脸识别技术在各个领域得到了广泛的应用。在企业管理和安全领域&#xff0c;三维人脸考勤系统成为了一种高效、准确的管理工具。 客户案例 银行 天津某银行是一家金融机构&#xff0c;对于安全性要求极高。传统的考勤系统无法满足他们对于员工…

Python3.11+Pyside6开发电影下载程序

VideoSave是一款使用Python3.11Pyside6编写的提供下载电影/电视剧的软件&#xff0c;支持注册、登录、搜索、下载、查看日志等功能&#xff0c;提供了Window、Mac系统安装包。 先上效果图 提供功能 节省寻找资源的时间 ⌚️模糊搜索指定影片 &#x1f434;查看影片下载日志 &…

深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序 计算机竞赛

文章目录 0 简介1 背景意义2 数据集3 数据探索4 数据增广(数据集补充)5 垃圾图像分类5.1 迁移学习5.1.1 什么是迁移学习&#xff1f;5.1.2 为什么要迁移学习&#xff1f; 5.2 模型选择5.3 训练环境5.3.1 硬件配置5.3.2 软件配置 5.4 训练过程5.5 模型分类效果(PC端) 6 构建垃圾…

企业AI虚拟ip形象定制的应用场景

随着AI人工智能和云计算等新技术的不断发展和应用&#xff0c;AI智能数字人已经演化成为了更加智慧的生命体&#xff0c;在服务企业和人类方面有了更高质量&#xff0c;特别是作为品牌形象代言人&#xff0c;通过高逼真模拟人类的外貌、声音和行为&#xff0c;在使得品牌在竞争…

Git 简介及使用(1)

目录 一、在 Linux 环境中安装 Git 1. 先检查当前服务器中是否有 Git&#xff08;如果有显示如下图&#xff09; 2. 安装Git 3. 然后重复第一步&#xff1a;查看 Git 的版本信息即可 二、Git 的初始化及配置 1. 创建目录 2. 对仓库进行初始化 3. 新增两个配置项&#xff08…

webstorm配置console.log打印

一、设置面板 打开设置面板(windows 快捷键&#xff1a; ctrl alt s) &#xff0c;找到 编辑器 -> 实时模板 -> JavaScript -> log&#xff0c;点击log会出现对应的配置 二、模板文本 将下面这些模板文本粘贴进去 console.info("&#x1f680; ~ file:$file…

一看就懂:正则表达式不用背

案例引入 正则表达式 正则&#xff1a;普通字符 正则&#xff1a;\d 正则&#xff1a;\D 正则&#xff1a;\w 正则&#xff1a;\W 正则&#xff1a;\s 正则&#xff1a;\S 正则&#xff1a;. 正则&#xff1a;| 正则&#xff1a;[abc] 正则&#xff1a;[^abc] 正则…

报错!Jupyter notebook 500 : Internal Server Error

Jupyter notebook 报错 500 : Internal Server Error 问题背景 tensorflow-gpu环境&#xff0c;为跑特定代码专门开了一个环境&#xff0c;使用conda安装了Jupyter notebook&#xff0c;能够在浏览器打开Jupyter notebook&#xff0c;但是notebook打开ipynb会报错。 问题分析…

ESP32 Arduino实战协议篇-BLE 服务端实现温度和湿度数据传输

本文将详细介绍如何在两个 ESP32 板之间建立 BLE(低功耗蓝牙)连接。一个 ESP32 将作为服务器,另一个 ESP32 将作为客户端。BLE 服务器通告包含客户端可以读取的传感器读数的特征。ESP32 BLE 客户端读取这些特征(温度和湿度)的值并将其显示在 OLED 显示屏上。 推荐阅读: E…