SpringBoot :ch01 项目结构

news2024/11/18 15:26:23

前言

在本系列博客中,我们将深入探讨 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 项目中,通常会遵循约定大于配置的原则,因此可以快速地搭建和开发项目,同时也可以根据需要进行自定义的配置和扩展。
 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决gradle下载慢的问题

1、解决gradle不同版本下载慢的问题 慢的问题在于下载时链接的是官网,而官网下载速度太慢; 可以使用下面的连接进行下载: https://mirrors.cloud.tencent.com/gradle/ 有公司做的国内镜像站; 或者使用另一个镜像站 http://mirrors.aliyun.com/gradle 但是这个镜像站的版…

MySQL数据库入门到大牛_基础_10_创建和管理表(创建和管理数据库;创建表;修改表;重命名表;删除表;清空表,内容扩展)

前面我们完成了查询结构的介绍&#xff0c;本章介绍DDL和DCL中的COMMIT和ROLL BACK。 文章目录 1. 基础知识1.1 一条数据存储的过程1.2 标识符命名规则1.3 MySQL中的数据类型 2. 创建和管理数据库2.1 创建数据库2.2 使用数据库2.3 修改数据库2.4 删除数据库 3. 创建表3.1 创建…

【ARM AMBA AXI 入门 13 -- AXI 协议中 RRESP 信号详细介绍】

请阅读【ARM AMBA AXI 总线 文章专栏导读】 文章目录 AXI 协议中 RRESP 信号RRESP 使用举例RRESP 3bit 使用AXI 协议中 RRESP 信号 在 AXI (Advanced eXtensible Interface) 协议中,RRESP 信号用来表示读取事务的响应状态,它由从设备(Slave)发往主设备(Master)来通知读…

Linux安装Mysql详细教程(两种安装方法)

Linux之Mysql安装配置 第一种&#xff1a;Linux离线安装Mysql&#xff08;提前手动下载好tar.gz包&#xff09;第二种&#xff1a;通过yum安装配置Mysql&#xff08;服务器有网络&#xff09; 第一种&#xff1a;tar.gz包安装 1、 查看是否已经安装 Mysql rpm -qa | grep m…

硬件驱动为什么要有WHQL数字签名

硬件驱动要有WHQL数字签名才能实现正常安装、启动、运行&#xff0c;并实现驱动静默安装。 目前的桌面操作系统中&#xff0c;Windows系统市场占有率处于优势&#xff0c;Windows 的各个版本的系统加起来几乎占领了大部分市场。所以很多工业和行业的硬件设备都要考虑兼容在Win…

干货|数据资产评估的基本方法和选择方法

作为一项资产&#xff0c;数据应当拥有可计量的实际价值。所谓数据价值评估&#xff0c;即是指通过专业化的数据质量评价和价值评估&#xff0c;对数据进行客观评估&#xff0c;使其成为可计量的资产&#xff0c;并确定其具体的价值。这可以借助各种评估方法和指标&#xff0c;…

jmeter接口自动化部署jenkins教程详解

首先&#xff0c;保证本地安装并部署了jenkins&#xff0c;jmeter&#xff0c;xslproc 我搭建的自动化测试框架是jmeterjenkinsxslproc 注意&#xff1a;原理是&#xff0c;jmeter自生成的报告jtl文件&#xff0c;通过xslproc工具&#xff0c;再结合jmeter自带的模板修改&…

vue el-form表单嵌套组件时正则校验不生效

vue el-form表单嵌套组件时正则校验不生效 上图 组件选中数据&#xff0c;但是正则校验未检测到并且红字提示不会消失。直接上代码 <template><div class"created_report"><el-form :model"formData" :rules"isRules" ref"…

KT142C语音芯片音乐前要空白音才行,声音会被截掉,实际语音是你好,播放变成好

KT142C语音芯片播放音乐前必须有一段空白音才行&#xff0c;不然声音会被截掉一部分&#xff0c;播放 温度1超高&#xff0c;如果前面没有空白音&#xff0c;就会变成 度1超高 出现这个问题&#xff0c;核心的原理在于功放芯片是受控了 这个问题只存在于&#xff0c;配置为DAC…

六要素一体微型气象站介绍

WX-WQX6 随着科技的发展&#xff0c;气象监测已经进入了一个全新的时代。传统的气象站已经无法满足现代社会对气象预测的需求。因此&#xff0c;一款新型的气象站——六要素一体微型气象站应运而生。这款气象站集成了温度、湿度、风速、风向、气压和雨量六个气象要素&#xff0…

【微信小程序】2023年11月版本 关于小程序隐私保护指引设置的公告 | 修改微信小程序隐私保护 |小程序无法获取用户昵称 头像 性别 等问题

一、登录小程序后台 《关于小程序隐私保护指引设置的公告》 https://mp.weixin.qq.com/cgi-bin/announce?actiongetannouncement&announce_id11691660367cfUvX&version&langzh_CN&token 上面是官方的文档&#xff0c;但是由于比较陈旧&#xff0c;和现在的页面…

Prolog 中的逻辑探险:学习9组逻辑蕴涵公式

引言 上次写了16组等价公式定律,今天继续用Prolog写9组逻辑蕴涵公式。 感觉这些公式的名称与公式挺难一一对应来记忆的,只能多练习了. 1. 附加律 (Addition) A ⇒ A∨B 当你拿到一个苹果&#xff08;A&#xff09;&#xff0c;突然你知道&#xff0c;即使有了梨&#xff08;…

SAP smartform和ALV如何使用图片 如何下载SE78上传的图片到本地

原文链接1&#xff1a;https://mp.weixin.qq.com/s/gb3LCoDLNhZGnpplG68cyA 原文链接2&#xff1a;https://mp.weixin.qq.com/s/iFFhGwFEK93QiddR1biXyA 1.如何在SMARTFORM中打印图片 在使用SmartForms进行打印单据开发时候&#xff0c;经常需要将公司的LOGO、公司印章、管理人…

HCIP-二、MSTP+Eth-trunk

二、MSTPEth-trunk 实验拓扑实验需求及解法 实验拓扑 实验需求及解法 //1.如图所示&#xff0c;配置设备名称和 IP 地址。 //2.在 SW1 与 SW2 之间配置链路聚合协议 LACP&#xff0c;完成以下需求&#xff1a; //2.1 SW1 作为主动端&#xff0c;设置系统优先级为最高。 [SW1]l…

百度地图,地市区域描边

描边首先需要各个点的经纬度数据 json数据下载 直接复制粘贴进入页面ctrls保存就可以了。 如果需要某省中的各个地市描边可以点击这个省的进行下载&#xff0c;这里以山东为例&#xff0c;我是先下载了山东的json数据,但是发现只有山东省下各个市的描边&#xff0c;于是又下了中…

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

文章目录 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 构建垃圾…

弄懂Rust编程中的Trait

1.定义 trait trait 定义了某个特定类型拥有可能与其他类型共享的功能。可以通过 trait 以一种抽象的方式定义共享的行为。可以使用 trait bounds 指定泛型是任何拥有特定行为的类型。 一个类型的行为由其可供调用的方法构成。如果可以对不同类型调用相同的方法的话&#xff…

【C#二开业务冠邑】通过界面查看数据来源

前言 重构框架&#xff08;CS【C#】转BS【Java】&#xff09;时&#xff0c;突然发现公司的代码和数据库&#xff0c;有部分都没有写注释&#xff0c;嘎嘎&#xff0c;这不非常影响开发效率&#xff0c;于是乎&#xff0c;开始帮公司整理表结构和数据来源&#xff0c;也从而加…

ACREL DC energy meter Application in Indonesia

安科瑞 华楠 Abstract: This article introduces the application of Acrel DC meters in base station in Indonesia.The device is measuring current,voltage and energy together with hall current sensor. 1.Project Overview This company is located in Indonesia a…