基于IDEA创建SpringBoot项目并进行入门分析

news2025/2/24 9:20:17

基于IDEA创建SpringBoot项目并进行入门分析

文章目录

  • 基于IDEA创建SpringBoot项目并进行入门分析
    • SpringBoot 项目创建
      • 创建Module
      • 项目结构分析
    • SpringBoot 项目启动分析
      • 启动入口
      • 启动过程概要分析
    • SpringBoot 快速入门分析
      • 业务描述
      • API设计分析
      • 代码编写及运行
      • 运行过程中的BUG分析
    • SpringBoot 项目中的对象特性分析
      • 准备工作
      • 延迟加载
      • 对象作用域分析
      • 对象生命周期方法
    • SpringBoot 项目中的依赖注入过程分析
      • 准备工作
      • 案例设计及分析
      • 代码编写及测试分析
      • 编写及测试过程中的BUG分析
    • 总结(Summary)
  • 结语

在这里插入图片描述

SpringBoot 项目创建

创建Module

基于IDEA创建项目Module,模块名为04-springboot-start,组id和包名为com.cy,如图所示:

在这里插入图片描述

填写module信息,如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xsv4AlHQ-1667360559326)(https://segmentfault.com/img/bVbRDeB)]

选择项目module版本,暂时不需要自己手动添加任何依赖,如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D15n4QAn-1667360559326)(https://segmentfault.com/img/bVbRDe2)]

填写Module名称,完成module创建,如图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ifBZhQsZ-1667360559327)(https://segmentfault.com/img/bVbRDgw)]

项目结构分析

项目Module创建好以后,其代码结构分析,如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nlxV9Ioc-1667360559327)(https://segmentfault.com/img/bVbRDwd)]

SpringBoot 项目启动分析

启动入口

SpringBoot 工程中由SpringBootApplication注解描述的类为启动入口类,例如:

package com.cy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {//Application.class
  public static void main(String[] args) {//Main Thread
    SpringApplication.run(Application.class, args);
  }
}

启动过程概要分析

SpringBoot工程启动时其简易初始化过程,如图所示:

在这里插入图片描述

在启动过程中底层做了哪些事情,大致描述如下:
1)基于配置加载类(通过ClassLoader将指定位置的类读到内存->底层通过线程调用IO从磁盘读取到内存)。
2)对类进行分析(创建字节码对象-Class类型,通过反射获取器配置信息)。
3)对于指定配置(例如由spring特定注解描述)的对象存储其配置信息(借助BeanDefinition对象存储)。
4)基于BeanDefinition对象中class的配置构建类的实例(Bean对象),并进行bean对象的管理(可能会存储到bean池)。

SpringBoot 快速入门分析

业务描述

在项目Module中定义一个类,类名为DefaultCache,然后将此类对象交给Spring创建并管理。最后通过单元测试对类的实例进行分析。

API设计分析

基于业务描述,进行API及关系设计,如图所示:

在这里插入图片描述

代码编写及运行

基于业务及API设计,进行代码编写,其过程如下:

第一步:定义DefaultCache类

package com.oak.libin.common.cache;
import org.springframework.stereotype.Component;
/**
 * @Component 注解描述的类,表示此类交给Spring框架管理。
 */
@Component
public class DefaultCache {
}

第二步:定义DefaultCacheTests单元测试类

package com.oak.libin.common.cache;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
@SpringBootTest
public class DefaultCacheTests {
    /**
 * @Autowired 注解描述的属性由spring框架按照一定规则为其注入值(赋值)
 * 赋值过程是怎样的?
 *  1)依赖查找?(请问查找规则是什么?)
 *  2)依赖注入?(需要借助什么技术?)
 */ @Autowired
 private DefaultCache defaultCache;
    @Test
 void testDefaultCache(){
        System.out.println(defaultCache.toString());
        //FAQ? defaultCache变量引用的对象是由谁创建的,存储 到了哪里?bean pool
 }
}

第三步:运行单元测试类进行应用分析
启动运行单元测试方法,检测其输出结果,基于结果分析:
1)SpringBoot项目中Bean对象的构建。
2)SpringBoot项目中Bean对象的获取。

运行过程中的BUG分析

  • Bean类型找不到,如图所示:

在这里插入图片描述

  • 空指针异常(NullPointerExcetpion-NPE),如图所示:

在这里插入图片描述

  • 启动类找不到,如图所示:

在这里插入图片描述

  • 启动类有多个,如图所示:

在这里插入图片描述

  • NoSuchBeanDefinition异常,如图所示:

在这里插入图片描述

  • 单元测试类中的方法添加了参数,如图所示:

在这里插入图片描述

SpringBoot 项目中的对象特性分析

准备工作

第一步:创建项目Module,例如名字为05-springboot-features,如图所示:

在这里插入图片描述

第二步:添加业务类ObjectPool,代码如下:

package com.oak.libin.common.pool;
@Component
public class ObjectPool{//假设此对象为一个对象池
    public ObjectPool(){//假设运行项目启动类,此构造方法执行了,说明此类对象构建了。
      Systemd.out.println("ObjectPool()")
    }
}

思考:一般池对象有什么特点?
1)在JVM内存会开辟一块相对比较大的空间。
2)在这块空间中存储一些对象(思考基于什么存储结构进行存储-数组,链表,散列表)。
3)基于“享元模式”设计思想,实现内存中对象的可重用性。

第三步:定义单元测试,代码如下:

package com.oak.libin.pool;
import com.oak.libin.common.pool.ObjectPool;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class ObjectPoolTests {

    @Autowired
    private ObjectPool objectPool01;
    @Autowired
    private ObjectPool objectPool02;
    @Test
    void testObjectPool01(){
       System.out.println(objectPool01==objectPool02);
    }
}

延迟加载

现在思考一个问题,对于ObjectPool这个类,假如项目启动以后,暂时不会用到这个池对象,是否有必要对其进行创建(默认是会创建的)?我们知道没必要,因为占用内存。那如何在启动时不创建此类对象呢?借助Spring框架提供的延迟加载特性进行实现。例如,我们可以在需要延迟加载的类上使用@Lazy注解进行描述,代码如下:

package com.oak.libin.common.pool;
@Lazy
@Component
public class ObjectPool{//假设此对象为一个对象池
    public ObjectPool(){//假设运行项目启动类,此构造方法执行了,说明此类对象构建了。
      Systemd.out.println("ObjectPool()")
    }
}

此时,我们再去运行运行启动类,检测ObjectPool对象是否创建了,假如没有创建,说明延迟加载生效了。此时,我们总结一下,什么对象适合使用延迟加载特性呢?大对象,稀少用(项目启动以后,暂时用不到)的对象。
注意:延迟加载并不是延迟对类进行加载,而是在启动时,暂时不创建类的实例。假如想看一下内存中的类是否被加载了,可以通过JVM参数进行检测,参数为-XX:+TraceClassLoading。

对象作用域分析

在实际的项目中内存中的对象有一些可能要反复应用很多次,有一些可能用完以后再也不用了或者说应用次数很少了。对于经常要重复使用的对象我可考虑存储到池中(例如交给spring框架进行管理),应用次数很少的对象那就没必要放到池中了,用完以后让它自己销毁就可以了。在Spring项目工程中为了对这样的对象进行设计和管理,提供了作用域特性的支持,具体应用:

package com.oak.libin.common.pool;
@Scope("singleton")
@Lazy
@Component
public class ObjectPool{//假设此对象为一个对象池
    public ObjectPool(){//假设运行项目启动类,此构造方法执行了,说明此类对象构建了。
      Systemd.out.println("ObjectPool()")
    }
}

其中,在上面的代码中,我们使用了@Scope注解对类进行描述,用于指定类的实例作用域。不写@Scope默认就是单例(singleton)作用域,这个作用域会配合延迟加载(@Lazy)特性使用,表示此类的实例在需要时可以创建一份并且将其存储到spring的容器中(Bean池),需要的时候从池中取,以实现对象的可重用。假如一些对象应用次数非常少,可以考虑不放入池中,进而使用@Scope(“prototype”)作用域对类进行描述,让此类的对象何时需要何时创建,用完以后,当此对象不可达了,则可以直接被GC系统销毁。

对象生命周期方法

程序中的每个对象都有生命周期,对象创建,初始化,应用,销毁的这个过程称之为对象的生命周期。在对象创建以后要初始化,应用完成以后要销毁时执行的一些方法,我们可以称之为生命周期方法。但不见得每个对象都会定义生命周期方法。在实际项目中往往一些池对象通常会定义这样的一些生命周期方法(例如连接池)。那这样的方法在spring工程中如何进行标识呢?通常要借助@PostConstruct和@PreDestroy注解对特定方法进行描述,例如:

package com.oak.libin.common.pool;
@Scope("singleton")
@Lazy
@Component
public class ObjectPool{//假设此对象为一个对象池
    public ObjectPool(){
      Systemd.out.println("ObjectPool()")
    }
    @PostConstruct
    public void init(){
       System.out.println("init()");
    }
    @PreDestroy
    public void destory(){
     System.out.println("destory()");
    }
}

其中:
1)@PostConstruct 注解描述的方法为生命周期初始化方法,在对象构建以后执行.
2)@PreDestroy 注解描述的方法为生命周期销毁方法,此方法所在的对象,假如存储到了spring容器,那这个对象在从spring容器移除之前会先执行这个生命周期销毁方法(prototype作用域对象不执行此方法).

SpringBoot 项目中的依赖注入过程分析

在SpringBoot工程中,假如类与类之间存在着一定的依赖关系,Spring是如何进行依赖注入的呢,现在我们就通过一个案例做一个分析。

准备工作

第一步:创建一个项目module,如图所示:
在这里插入图片描述

第二步:启动运行项目,检测是否能成功启动

案例设计及分析

为了更好理解spring框架的底层注入机制,现在进行案例API设计,如图所示:

在这里插入图片描述

在这个案例中单元测试类CacheTests中定义一个Cache接口类型的属性,然后由Spring框架完成对cache类型属性值的注入。

代码编写及测试分析

第一步:定义Cache接口,代码如下:

package com.oak.libin.common.cache;
public interface Cache {
 
}

第二步:定义Cache接口实现类SoftCache,代码如下:

package com.oak.libin.common.cache;
 
@Component
public class SoftCache implements Cache{

}

第三步:定义Cache接口实现类WeakCache,代码如下:

package com.oak.libin.common.cache;
 
@Component
public class WeakCache implements Cache{

}

第四步:定义CacheTests单元测试类,代码如下:

package com.oak.libin.common.cache;
import org.junit.jupiter.api.Test;

@SpringBootTest    
public class CacheTests {
    @Autowired
    @Qualifier("softCache")
    private Cache cache;
    
    @Test
    public void testCache() {
        System.out.println(cache);
    }
}

其中,@Autowired由spring框架定义,用于描述类中属性或相关方法(例如构造方法)。Spring框架在项目运行时假如发现由他管理的Bean对象中有使用@Autowired注解描述的属性或方法,可以按照指定规则为属性赋值(DI)。其基本规则是:首先要检测容器中是否有与属性或方法参数类型相匹配的对象,假如有并且只有一个则直接注入。其次,假如检测到有多个,还会按照@Autowired描述的属性或方法参数名查找是否有名字匹配的对象,有则直接注入,没有则抛出异常。最后,假如我们有明确要求,必须要注入类型为指定类型,名字为指定名字的对象还可以使用@Qualifier注解对其属性或参数进行描述(此注解必须配合@Autowired注解使用)。

第五步:运行CacheTests检测输出结果,基于结果理解其注入规则。

编写及测试过程中的BUG分析

  • 依赖注入异常,如图所示:

在这里插入图片描述

总结(Summary)

本小节为springboot技术入门章节,主要讲述了SpringBoot工程下,spring中bean对象的编写,特性以及依赖注入的规则,希望通过这一小节的讲解,同学们能够理解我们为什么要将对象交给spring管理,spring管理对象有什么优势,我们在springboot工程中应该如何配置这些对象。

结语

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。

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

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

相关文章

单商户商城系统功能拆解26—营销中心—限时秒杀

单商户商城系统,也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法,例如拼团,秒杀,砍价,包邮…

数电学习(六、时序逻辑电路)(三)

文章目录时序逻辑电路的设计方法同步时序逻辑电路的设计方法一般步骤改进步骤例:蚂蚁走迷宫背景分析继续编码状态,然后写出状态图,然后卡诺图化简,得到方程设计总结时序逻辑电路的设计方法 同步时序逻辑电路的设计方法 一般步骤…

2022最新SpringCloud面试题附完整答案

一、选择题 1.启动Ribbon的类注解是: ( ) A RibbonClient B EnableClient C EnableDisscoveryClient D Ribbon 2.下面哪个注解不是SpringbootApplication包含的默认属性值:( ) A: Configuration B: EnableAutoConfiguration C: ComponentSc…

【LINUX】Linux最常用的20个基本指令 介绍~分析

什么是 Linux ​ Linux 是一款基于 GNU 通用公共许可协议 的 自由和开放源代码 的类UNIX操作系统,该操作系统的内核由 Linus Torvalds 在1991年首次发布。之后,在加上用户空间的应用程序之后,就成为了Linux操作系统。 但是,严格来…

springboot充电桩综合管理系统

目录 1 绪论 1 1.1 课题背景 1 1.2 课题研究现状 1 1.3 初步设计方法与实施方案 2 1.4 本文研究内容 2 2 系统开发环境 4 2.1 Java技术 4 2.2 JSP技术 4 2.3 B/S模式 4 2.4 MyEclipse环境配置 5 2.5 MySQL环境配置 5 2.6 SSM框架 6 3 系统分析 7 3.1 系统可行性分析 7 3.1.1 经…

基于 BP 神经网络特征提取的指纹识别应用(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑…

【每日训练】排序子序列

目录 题目链接: 输入输出描述&&测试用例: 解析: 程序: 题目链接: 排序子序列_牛客笔试题_牛客网 (nowcoder.com) 输入输出描述&&测试用例: 测试用例: 输入: 6 1…

设计模式之美总结(重构篇)

title: 设计模式之美总结(重构篇) date: 2022-10-27 17:31:42 tags: 设计模式 categories:技术书籍及课程 cover: https://cover.png feature: false 文章目录1. 概述1.1 重构的目的:为什么要重构(why)?1.…

10月业务安全月报 | 美国将奇虎360和知道创宇列入黑名单;丰田泄露30万用户信息;苹果曝严重漏洞

导语:随着数字化的深入普及,业务愈加开放互联。企业的关键数据、用户信息、基础设施、运营过程等均处于边界模糊且日益开放的环境中,涉及利益流和高附加值的业务面临多样的安全隐患,随时可能遭遇损失,进而影响企业运营…

HashMap底层源码分析

文章目录HashMap底层源码分析1.观察HashMap成员变量1.1 HashMap的主要成员变量1.2 HashMap的构造方法1.3 put方法HashMap底层源码分析 前言 : 上文我们已经将哈希表学完了,下面就来简单的看一下源码,就结束我们的Map和Set 的学习   1.观察H…

灰度级形态学 - 顶帽变换和底帽变换

目录 1. 介绍 2. 代码实现 1. 介绍 顶帽变换和底帽变换就是图像的加减和开闭运算的结合 顶帽变换的公式为:原图 - 原图的开运算 这里结合开运算的几何图形解释来介绍顶帽变换。 因为开运算是结构元从下往上推动的过程,所以会删除图像灰度值相对周围高…

Dom对象总结案例实操(第二十课)

Dom对象总结案例实操(第二十课) 今天文章有点长 第一部分:回顾之前Dom对象我用了四篇文章对他进行了分开讲述Dom对象的用途,今天用几个案例实操一下. 之前我们Dom对象中了解过下面的内容 Dom对象的定义?Dom对象的节点操作,了解到了父节点 子节点 第一个 子节点 最…

利用Postman测试全屋智能接口

文章目录一、Postman概述二、利用Postman测试全屋智能接口(一)移动应用开发平台API说明V2.0(二)下载Postman(三)启动Postman(四)测试用户登录接口1、查看用户登录接口说明2、查看登录…

信号完整性测试

信号完整性测试----持续更新中示波器三要素:带宽采样率存储深度IIC信号测试:SPI信号测试USART信号测试RS232信号测试RS485信号测试CAN信号测试PWM信号测试示波器三要素: 示波器三个重要参数:带宽、采样率、存储深度 带宽 示波器的带宽&…

C语言实现windows,linux双版本下的进度条小程序,快来试一试吧

文章目录C语言缓冲区🚀1.输入缓冲区🍇模拟登录密码场景🍇从键盘将内容输入到内存的真正过程🍇解决方法:清空输入缓冲区🍉清掉一个字符🍉清空输入缓冲区所有字符🚀2.用户C语言级别的缓…

【jenkins部署冲突报错】一定要看!!!!!

背景 最近接手了新的项目,他的代码仓库的分支有点乱,dev、uat、master三个分支代码不同步,差别很大,甚至功能有些也不一样,所以,就导致在合并代码时要注意,最好新切一个分支A(同步m…

inveta PLSB 点线面体 示例工程

https://github.com/inveta/demo/blob/main/Resource/demo.md点线面体生成 POI(点)ps.emitMessage(["spawn-POI","location:X0 Y0 Z0", // cm"icon:\uE998", // char"title:POI标题", // string"color…

单独用HTML javascript CSS 写三版99乘法表,我就是班里最靓的仔

☆ 99乘法表,这个从小学就让我们开始产生肌肉记忆的知识点,伴随一生。而一旦开始学习软件开发知识,99乘法表将是一个基础中不可逃避的巩固升级作业。 ☆ 口算背诵相信大家已经滚瓜烂熟了,一一得一,二二得四&#xff…

【Linux】超好用的编译工具 —— gcc/g++

文章目录 前言 一、安装gcc/g 二、背景知识 三、gcc如何完成 1.预处理(进行宏替换) 2.编译(生成汇编) 3.汇编(生成机器可识别代码) 4.连接(生成可执行文件或库文件) 5.记忆选项的小技…

Tomcat 实用安装教程

Tomcat的介绍 Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得…