Idea工具中创建 SpringBoot工程及入门详解

SpringBoot 项目创建

创建Module

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

填写module信息,如图所示:

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

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

项目结构分析

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

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.cy.pj.common.cache;
import org.springframework.stereotype.Component;
/**
 * @Component 注解描述的类,表示此类交给Spring框架管理。
 */
@Component
public class DefaultCache {
}

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

package com.cy.pj.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.cy.pj.common.pool;
@Component
public class ObjectPool{//假设此对象为一个对象池
 public ObjectPool(){//假设运行项目启动类,此构造方法执行了,说明此类对象构建了。
 Systemd.out.println("ObjectPool()")
 }
}

思考:一般池对象有什么特点?

1)在JVM内存会开辟一块相对比较大的空间。

2)在这块空间中存储一些对象(思考基于什么存储结构进行存储-数组,链表,散列表)。

3)基于“享元模式”设计思想,实现内存中对象的可重用性。

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

package com.cy.pj.pool;
import com.cy.pj.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.cy.pj.common.pool;
@Lazy
@Component
public class ObjectPool{//假设此对象为一个对象池
 public ObjectPool(){//假设运行项目启动类,此构造方法执行了,说明此类对象构建了。
 Systemd.out.println("ObjectPool()")
 }
}

此时,我们再去运行运行启动类,检测ObjectPool对象是否创建了,假如没有创建,说明延迟加载生效了。此时,我们总结一下,什么对象适合使用延迟加载特性呢?大对象,稀少用(项目启动以后,暂时用不到)的对象。

注意:延迟加载并不是延迟对类进行加载,而是在启动时,暂时不创建类的实例。假如想看一下内存中的类是否被加载了,可以通过JVM参数进行检测,参数为-XX:+TraceClassLoading。

对象作用域分析

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

package com.cy.pj.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.cy.pj.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.cy.pj.common.cache;
public interface Cache {

}

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

package com.cy.pj.common.cache;

@Component
public class SoftCache implements Cache{

}

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

package com.cy.pj.common.cache;

@Component
public class WeakCache implements Cache{

}

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

package com.cy.pj.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工程中应该如何配置这些对象。

到此这篇关于Idea工具中创建 SpringBoot工程及入门分析详解的文章就介绍到这了,更多相关idea创建 SpringBoot工程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 在IDEA中创建跑得起来的Springboot项目

    1. 关于 Tomcat 可能有一点会觉得很奇怪. 这明明跑动起来的是一个 web 程序,为什么启动方式不是启动 tomcat? 而是启动的一个 Java 类的 主方法? 这是因为这个 com.how2java.springboot.SpringbootApplication 类的主方法就把 tomcat 嵌入进去了,不需要手动启动 tomcat 了呢. 2. 关于插件 首先,在IDEA中开发Springboot应用和Eclipse里面一样,本质上都是一个maven 项目. 但是呢,IDEA 本

  • 从零开始使用IDEA创建SpringBoot项目(图文)

    *注:此文章谨以记录学习过程,分享学习心得! 刚刚开始了解SpringBoot框架,觉得很好用,觉得很有必要深入学习一下该框架,现在就来创建一个SpringBoot项目: 1.在IDEA上新建一个Project,选择Spring Initializr, Project SDK 选择安装的JDK: Choose Initializr Service URL 选择默认(Default:https://start.spring.io) 选择项目模板 点击Next 2.进行项目配置 设置项目数组(gro

  • 使用IDEA创建SpringBoot项目的方法步骤

    1.打开IDEA,创建新项目,选择Spring Initializr 2.输入Artifact 3.勾选Web 4.点击finish完成 5.进入项目,可以将以下内容删除 pom.xml文件: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3

  • idea创建springboot项目和springcloud项目的详细教程

    一:创建springboot项目 1.选择File –> New –> Project –>Spring Initialer –> 点击Next 2.填写项目相关的信息,–>点击next 3.选择web –> web,–>点击next 4.填写项目名和项目位置,–>点击finish 5.会自动生成一个Application类,加上一个@RestController注解就可以写方法了 6.启动Application类中的main()方法,浏览器输入localh

  • IDEA2020.2创建springboot项目卡死在reading maven project的问题

    解决方法一 问题描述: 昨天更新IDEA2020.2版本后,创建springboot项目的时候发现一直在reading maven project 中,如下图,而且一点setting(想修改本地maven路径)时,IDEA就卡死,而且打开任务管理器发现IDEA高占CPU. 原因: 猜测是2020.2版本问题,用其他版本没有出现这类情况. 由于第一次用spring Initializr创建maven的项目,它不会找IDEA自带的maven,也不会找你配置的本地maven,而是重新下载一个全新的ma

  • IDEA创建springboot + mybatis项目全过程(步骤详解)

    鉴于隔很久再在IDEA新建springboot项目时,会出现对步骤不确定的情况,因此,写下这篇博客记录创建一个可运行的springboot+mybatis项目的全过程. 步骤如下: 1.打开IDEA 2.File ==> new ==> project ,如图: 3.选择spring Initializr ==> 右边的Project SDK我选的是我已经安装的1.8版本,其他默认 ==> 点击next 4.填写Group (自己随意就行,我的是cn + 个人英文名 + study

  • Idea工具中创建 SpringBoot工程及入门详解

    SpringBoot 项目创建 创建Module 基于IDEA创建项目Module,模块名为04-springboot-start,组id和包名为com.cy,如图所示: 填写module信息,如图所示: 选择项目module版本,暂时不需要自己手动添加任何依赖,如图所示: 填写Module名称,完成module创建,如图所示 项目结构分析 项目Module创建好以后,其代码结构分析,如图所示: SpringBoot 项目启动分析 启动入口 SpringBoot 工程中由SpringBootAp

  • Node.js中创建和管理外部进程详解

    Node被设计用来高效的处理I/O操作,但是你应该知道,有些类型的程序并不适合这种模式.比如,如果你打算用Node处理一个CPU密集的任务,你可能会堵塞事件循环,并因此降低了程序的响应.替代办法是,把CPU密集的任务分配给一个单独的进程来处理,从而释放事件循环.Node允许你产生进程,并把这个新进程做为它父进程的子进程.在Node里,子进程可以和父进程进行双向通信,而且在某种程度上,父进程还可以监控和管理子进程. 另外一种需要使用子进程的情况是,当你想简单地执行一个外部命令,并让Node获取命令

  • 创建SpringBoot工程并集成Mybatis的方法

    今天我们在springboot上集成mybatis.首先创建一个maven项目. 添加依赖 <!--springboot依赖--> <dependency> <groupId>org.springframework.boot<groupI> <artifactId>springbootstarter<artifactId> </dependency> <dependency> <groupId>or

  • IDEA2020.2.3中创建JavaWeb工程的完整步骤记录

    前言 在使用IDEA2020.2.3版本时,创建web工程遇到了一些问题,经过一番摸索之后得到解决方案. 一.新建javaweb工程 1.先创建一个java项目 2.在新建好的项目上点击右键,点Add Framework Support 3.点击导入Web Application,点击ok即可 二.配置TomCat启动项目 1.配置Tomcat (1)点击右上角的编辑配置 (2)点击+号,找到Tomcat Server 3.选择一个本地下载好的Tomcat 4.在右边的部署栏Deployment

  • IDEA 中创建SpringBoot 父子模块的实现

    新建父级项目 父级模块添加完成! 添加子模块 在父级模块又击 选择 new ==> Moudule 创建方式与父级模块创建大致一致,唯一不同的是将 Type 改为 Maven Project 打开父级项目 demo-parent 下的pom.xml 文件 复制以下三行配置信息 打开子项目 demo-son 下的pom.xml文件 将parent 节点下的前三行代码替换成为刚刚复制的那三行,如下显示 最后,在demo-parent 模块下 的pom.xml文件下新建modules节点,并添加子模块

  • SpringBoot快速入门详解

    Spring Boot是什么? Spring Boot并不是什么新的框架,它是对Spring的缺点进行了改善和优化,Spring Boot默认了很多的框架使用方式,像maven整合了所以jar包同一个道理.及SpringBoot并不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式而已. 为什么使用Spring Boot? Spring Boot官方是这么说的:Spring Boot它是基于Spring开发项目的起点,Spring Boot的设计主要是让你快速地跑起来Spri

  • SpringBoot中RabbitMQ集群的搭建详解

    目录 1. 两种模式 1.1 普通集群 1.2 镜像集群 1.3 节点类型 2. 搭建普通集群 2.1 预备知识 2.2 开始搭建 2.3 代码测试 2.4 反向测试 3. 搭建镜像集群 3.1 网页配置镜像队列 3.2 命令行配置镜像队列 4. 小结 单个的 RabbitMQ 肯定无法实现高可用,要想高可用,还得上集群. 今天松哥就来和大家聊一聊 RabbitMQ 集群的搭建. 1. 两种模式 说到集群,小伙伴们可能第一个问题是,如果我有一个 RabbitMQ 集群,那么是不是我的消息集群中的

  • Java SpringBoot模板引擎之 Thymeleaf入门详解

    目录 模板引擎简介 引入Thymeleaf模板引擎 分析Thymeleaf模板引擎 测试Thymeleaf模板引擎 1.编写一个TestController 2.编写一个测试页面 test.html 放在 templates 目录下 3.启动项目请求测试 4.结论 Thymeleaf入门: 1.修改测试请求,增加数据传输 2.使用thymeleaf 3.我们去编写下前端页面 4.启动测试! thymeleaf语法学习 1.使用任意的 th:attr 来替换Html中原生属性的值! 2.表达式语法

  • springboot中使用redis的方法代码详解

    特别说明: 本文针对的是新版 spring boot 2.1.3,其 spring data 依赖为 spring-boot-starter-data-redis,且其默认连接池为 lettuce ​redis 作为一个高性能的内存数据库,如果不会用就太落伍了,之前在 node.js 中用过 redis,本篇记录如何将 redis 集成到 spring boot 中.提供 redis 操作类,和注解使用 redis 两种方式.主要内容如下: •docker 安装 redis •springboo

  • Springboot 2.x中server.servlet.context-path的运用详解

    今天在开发项目的时候遇到了请求不通API的问题,最开始以为是server.servlet.context-path配置导致的问题,最终发现是由于AWS端口未开放/监听导致的connection refuse.虽然如此,仍然想记录一下server.servlet.context-path的作用. 功能 这个配置能够设置项目中的所有API的上下文路径(URL的一部分),与@RequestMapping有异曲同工之妙. 我们知道,@RequestMapping能够在API方法层级声明,同时能够在Con

随机推荐