一、IDEA下载、配置
1、IDEA简介
1.1、概述
IDEA全称是IntelliJ,是JetBrains公司推出一个集成开发工具,是Java开发工具中的翘楚,基于这个开发工具可以快速开发我们的Java相关项目。相对于其它开发工具,IDEA提供了更加强大的提示功能,全面的快捷键操作,模板代码以及快速的资源整合。
1.2、下载与安装
准备工作
硬件(Hardware)要求
1)内存8G或以上
2)硬盘磁盘空闲空间大于5GB,最好有一块固态硬盘。
软件(Software)要求
1)Microsoft Windows 8 or later
2)macOS 10.13 or later
3)Any Linux distribution
4)Set Up and Config JDK1.8
IDEA工具下载
IDEA官网下载地址如下:https://www.jetbrains.com/idea/
基于操作系统的不同,可以选择不同平台下的IDEA,例如:
说明:至于社区版(功能受限的免费版)/还是商业版(可试用)自行决定。
IDEA工具安装
IDEA 下载以后需要进行安装进行使用。假如只是下载的解压版本,则可以将其拷贝到非中文目录,然后直接解压进行应用。假如下载的可执行程序(例如windows平台下的.exe文件)则直接启动可执行程序,然后按照提示,一步一步安装即可。
IDEA官方帮助文档文档参考如下:https://www.jetbrains.com/help/idea/discover-intellij-idea.html
IDEA工具启动
找到解压或安装好的idea根目录,然后进入bin目录找到idea.bat或者idea64.exe文件,然后直接双击进行启动,第一个启动欢迎界面如图所示:
在第一个界面呈现过程中,其实是IDEA底层在进行启动初始化,假如是第一次启动,稍等片刻会进入第二个界面,例如:
在第二个界面中,我们先选择创建新项目(New Project),然后进入创建项目的界面,这里我们先选择创建空项目,如图所示:
选择好Empty Project以后,点击next进入项目的设计,如图所示:
在上面图中,点击Finish按钮完成项目的创建,进入IDEA的项目工作窗口,如图所示:
2、IDEA 基本配置
2.1、Appearance(显示)主题配置
打开Appearance,配置字体大小和样式,如图所示:
2.2、KeyMap(快捷键)配置
打开KeyMap菜单配置,配置快捷键(推荐使用默认的),如图所示:
2.3、Editor(编辑区)配置
General 配置
滚轮滑动,改变字体大小配置,如图所示:
包导入配置,如图所示:
行号与方法分隔符配置,如图所示:
代码提示配置,如图所示:
代码补全配置,如图所示:
Font 配置
代码编辑区字体配置,如图所示:
控制台字体配置,如图所示:
Color 配置
代码中的注释颜色配置,如图所示:
File 编码配置
2.4、Build 执行配置
Compiler(编译配置)
自动编译配置(可选),选上了可能会比较慢,如图所示:
Build Tools 中的Maven配置
Maven 初始化配置(假如已有配置好的,可以使用已有的配置)
找到你磁盘中的maven根目录下的conf目录,并打开conf目录下的settings.xml文件,然后进行如下配置:
第一步:配置maven本地库(从maven远程服务器下载的资源存储到的位置)
<localRepository>${user.home}/.m5/repository</localRepository>
第二步:配置maven私服或远程仓库(配置到mirrors标签内部)。
<mirror>
<id>aliyun</id>
<name>aliyun for maven</name>
<mirrorOf>*</mirrorOf>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
第三步:配置maven中的profile(配置到profiles标签内部),设置JDK编译和运行版本。
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8
</maven.compiler.compilerVersion>
</properties>
</profile>
IDEA 中集成Maven配置
找到Build Tools/Maven选项,然后在IDEA中集成本地maven配置。如图所示:
3、总结(Summary)
本小节主要是对IDEA开发工具进行了一个简单介绍,然后基于我们后续要做的应用,做了一个初步配置,基于这个配置我们后续可以更好的展开项目的创建、测试等。
二、IDEA创建和操作项目
1、创建项目Module并运行
1.1、创建并运行java module
在IDEA打开的项目中创建Java Module,如图所示:
在创建Java Module的界面,选择Next,输入module名,如图所示:
Java Module创建好以后的结构,如图所示:
在项目模块01-javase中创建包,例如:
在指定包中创建类,如图所示:
运行Java类,如图所示:
1.2、创建并运行Maven Module
在项目中,创建maven module,如图所示:
接下来,输入module基本信息,如图所示:
打开pom.xml文件,添加Junit依赖,如图所示:
创建包、单元测试类和方法,进行单元测试,如图所示:
1.3、创建并运行Spring Initializr Module
在项目中,创建Spring Initializr Module,如图所示:
接下来输入Spring Initializr Module信息,如图所示:
选择springboot版本,依赖,然后进入一下,如图所示:
输入module信息,然后完成Module的创建,如图所示:
Spring Initializr Module创建好以后,其结构如图所示:
Module创建好以后,可以打开pom.xml文件,修改其springboot版本,如图所示:
SpringBoot 版本修改好以后(可选),向pom.xml右键,选择Add as Maven Project 选项,进行maven项目构建(此时才会springboot 依赖下载和编译),例如:
Module 构建完成,打开启动类运行module,如图所示:
Module成功启动和运行结果,如图所示:
2、IDEA中项目的其它操作
2.1、从IDEA删除项目module?
- 首先打开项目结构(Project Structure),找到Moudles菜单项,选中某个moudle,点击"-"符号,移除项目.
- 然后在IDEA中,在具体的项目模块上,右键选择delete执行项目module删除操作.
2.2、从IDEA中导入项目Module?
- 首先打开项目结构(Project Structure),找到Moudles菜单项,选中某个moudle,点击"+"符号.
- 找到对应的项目,然后执行导入(import)操作.
2.3、从IDEA中load/unload 项目modules?
直接选择项目module,然后右键执行 load/upload操作即可,这个动作类似eclipse中的close操作
3、总结(Summary)
本章节中讲解了IDEA工具下Java Module,Maven Module,Spring Boot Module 的创建,运行,删除,导入等操作,通过这些操作掌握IDEA中对项目的一个基本操作。
三、IDEA中集成Git操作
1、基于Git的项目操作
1.1、安装Git工具
Git是版本控制系统,可以借助Git实现团队代码版本控制及管理,从官方https://www.git-scm.com/downl…,如图所示:
Git下载完成以后,傻瓜式(一直下一步)安装即可,不要更改安装目录(假如已安装过则无须安装)。
1.2、Git全局配置
打开Git客户端工具,配置用户和密码,用于识别提交代码的用户。
$ git config --global user.name "your-name"
$ git config --global user.email "your-email@youremail.com"
检查配置信息
$ git config --list
user.email=xxxxxx@xxxxxx.com
user.name=xxxxxx
1.3、Idea中检查Git配置。
找到Git配置选项,进行Git测试,如图所示:
1.4、IDEA项目中创建本地库
创建项目本地库,如图所示:
一般本地库会创建在你项目的根目录,如图所示:
本地库创建好以后会在项目的根目录添加一个.git目录(可能是隐藏目录。
1.5、IDEA项目中本地库配置
对.git目录中的exclude文件进行配置,对指定资源进行过滤(例如哪些资源不提交、上传,可以此文件做全局配置),内容如下:
HELP.md
target/
out/
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
.gitignore
### maven ###
mvnw
*.cmd
.mvn/
1.6、项目Add,Commit操作
将项目、Module更新添加到暂存区,提交(Commit)本地库,例如:
也可以,基于工具栏的按钮进行相关操作,如图所示:
1.7、Idea中安装Gitee插件
打开Setting中的Plugins选项,然后进行gitee插件搜索和安装,如图所示:
Gitee 安装成功以后,检查是否在Version Control中有Gitee选项,如图所示:
点击Version Control的Gitee选项,进入Gitee配置,如图所示:
在Gitee配置界面,选则添加账户(Add Account),进入账户配置界面,如图所示:
在Gitee账户配置界面,进行连接Gitee平台的账户配置(要事先注册好Gitee平台账户),然后点击Login进行登陆,登陆成功以后会呈现如下界面,如图所示:
1.8、项目Push操作分析及实现
将项目、Module推送的Gitee远程代码托管平台,
在这里分两种情况,一种情况是已经有远程仓库了,一种情况是暂时还没有远程仓库.
在没有远程仓库的情况下,我们可以直接给予CVS进行代码的分享,其过程如图所示:
假如,在IDEA菜单栏中没有看到CVS菜单项,则可以打开Idea中的Setting选项,对CVS进行配置,如图所示
此时,再通过share project on Gitee选项直接将代码分享到Gitee平台.但是分享过程中需要指定仓库的名称,默认名称为我们要分享的项目的项目名,例如指定Gitee仓库的仓库名,库不存在,推送时自动创建(假如默认项目名的定义不符合Gitee平台仓库名的规范,可能被拒绝),如图所示:
推送成功以后,登陆Gitee,检查远程仓库内容,如图所示:
假如远程仓库已经存,例如我们在Gitee平台上先创建了一个公开仓库,如图所示:
此时我们第一次要将我们的代码提交到Gitee平台,需要先执行add,commit操作,然后配置Git远程地址,如图所示:
此时会打开远程仓库配置选项,如图所示:
当远程仓库地址,配置好以后,可以直接在Git菜单栏(或工具栏)中选择Push按钮选项,进行代码的推送,如图所示:
当执行完push操作,可以去Gitee平台,检查代码是否提交OK.
1.9、从Gitee地址克隆(Clone)项目
打开IDEA中可克隆(clone)选项,如图所示:
指定克隆地址和克隆目录,假如要克隆到本地位置已经有一个同名的项目,则可以修改新的项目名,如图所示:
克隆完成以后,选择打开项目的窗口,例如:
项目打开以后,配置JDK,MAVEN,自动编译,编码等,假如maven项目不再maven区,可将maven项目添加到maven区,如图所示:
也可以在项目的pom.xml文件上右键选择add as maven project,将项目添加到maven区。
假如是普通的java项目(非maven项目),此时还需要将src转换为sources root格式(选择src目录,右键选择mark directory as sources root).转换以后可以对项目进行rebuild操作,假如rebuild过后还不可以运行,可以重启idea进行尝试.
2、总结
在本小节中重点讲解了IDEA中Git的一个基本操作,通过Git在IDEA中实现了项目的Commit,Push,Update等操作.
四、Spring Boot简介
1、Spring Boot 背景分析
JAVAEE应用体系中繁重的配置、低下的开发效率、高难度的三方集成,复杂的部署流程等等一直被开发人员所诟病。即使是使用Spring这样的轻量级的资源整合框架,在实现其相对比较多的资源整合时,依旧需要大量的手动依赖管理,复杂的XML配置(还经常没有提示)。还有就是现在的软件生态应用也已经形成一定的规模,系统架构正在从单体架构,分布式架构,跨越到微服务架构。随着整个架构体系的变化,企业对技术的要求也在变化,现在的企业更注重技术的开箱即用,更注重技术在生态圈中的深度融合,更注重轻量级的运维。由此由此spring boot诞生。
2、Spring Boot 要解决什么问题
Spring Boot是由Pivotal团队提供的全新的Java软件开发框架(很多人现在把它理解为一个脚手架),其设计目的是用来简化Spring项目的初始搭建以及开发过程。该框架使用了特定的注解方式来进行配置,从而使开发人员不再需要大量的xml配置。不再需要大量的手动依赖管理。Spring Boot基于快速构建理念,通过约定大于配置,开箱即用的方式,希望能够在蓬勃发展的快速应用开发领域成为其领导者。
3、Spring Boot 有哪些核心的关键特性
起步依赖(Starter Dependency)。
自动配置(Auto Configuration)。
健康检查(Actator)-监控。
嵌入式服务(Tomcat,Jetty)。
4、总结(Summary)
总之,Spring Boot 框架就是要基于快速构建理念,基于约定大于配置方式,实现技术的开箱即用,以提高开发效率。
五、Spring Boot项目入门
1、SpringBoot 项目创建
1.1、创建Module
基于IDEA创建项目Module,模块名为04-springboot-start,组id和包名为com.cy,如图所示:
填写module信息,如图所示:
选择项目module版本,暂时不需要自己手动添加任何依赖,如图所示:
填写Module名称,完成module创建,如图所示
1.2、项目结构分析
项目Module创建好以后,其代码结构分析,如图所示:
2、SpringBoot 项目启动分析
2.1、启动入口
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);
}
}
2.2、启动过程概要分析
SpringBoot工程启动时其简易初始化过程,如图所示:
在启动过程中底层做了哪些事情,大致描述如下:
1)基于配置加载类(通过ClassLoader将指定位置的类读到内存->底层通过线程调用IO从磁盘读取到内存)。
2)对类进行分析(创建字节码对象-Class类型,通过反射获取器配置信息)。
3)对于指定配置(例如由spring特定注解描述)的对象存储其配置信息(借助BeanDefinition对象存储)。
4)基于BeanDefinition对象中class的配置构建类的实例(Bean对象),并进行bean对象的管理(可能会存储到bean池)。
3、SpringBoot 快速入门分析
3.1、业务描述
在项目Module中定义一个类,类名为DefaultCache,然后将此类对象交给Spring创建并管理。最后通过单元测试对类的实例进行分析
3.2、API设计分析
基于业务描述,进行API及关系设计,如图所示:
3.3、代码编写及运行
基于业务及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对象的获取。
3.4、运行过程中的BUG分析
Bean类型找不到,如图所示:
空指针异常(NullPointerExcetpion-NPE),如图所示:
启动类找不到,如图所示:
启动类有多个,如图所示:
NoSuchBeanDefinition异常,如图所示:
单元测试类中的方法添加了参数,如图所示:
4、SpringBoot 项目中的对象特性分析
4.1、准备工作
第一步:创建项目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);
}
}
4.2、延迟加载
现在思考一个问题,对于ObjectPool这个类,假如项目启动以后,暂时不会用到这个池对象,是否有必要对其进行创建(默认是会创建的)?我们知道没必要,因为占用内存。那如何在启动时不创建此类对象呢?借助Spring框架提供的延迟加载特性进行实现。例如,我们可以在需要延迟加载的类上使用@Lazy注解进行描述,代码如下:
package com.cy.pj.common.pool;
@Lazy
@Component
public class ObjectPool{//假设此对象为一个对象池
public ObjectPool(){//假设运行项目启动类,此构造方法执行了,说明此类对象构建了。
Systemd.out.println("ObjectPool()")
}
}
此时,我们再去运行运行启动类,检测ObjectPool对象是否创建了,假如没有创建,说明延迟加载生效了。此时,我们总结一下,什么对象适合使用延迟加载特性呢?大对象,稀少用(项目启动以后,暂时用不到)的对象。
注意:延迟加载并不是延迟对类进行加载,而是在启动时,暂时不创建类的实例。假如想看一下内存中的类是否被加载了,可以通过JVM参数进行检测,参数为-XX:+TraceClassLoading。
4.3、对象作用域分析
在实际的项目中内存中的对象有一些可能要反复应用很多次,有一些可能用完以后再也不用了或者说应用次数很少了。对于经常要重复使用的对象我可考虑存储到池中(例如交给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系统销毁。
4.4、对象生命周期方法
程序中的每个对象都有生命周期,对象创建,初始化,应用,销毁的这个过程称之为对象的生命周期。在对象创建以后要初始化,应用完成以后要销毁时执行的一些方法,我们可以称之为生命周期方法。但不见得每个对象都会定义生命周期方法。在实际项目中往往一些池对象通常会定义这样的一些生命周期方法(例如连接池)。那这样的方法在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作用域对象不执行此方法).
5、SpringBoot 项目中的依赖注入过程分析
在SpringBoot工程中,假如类与类之间存在着一定的依赖关系,Spring是如何进行依赖注入的呢,现在我们就通过一个案例做一个分析。
5.1、准备工作
第一步:创建一个项目module,如图所示:
第二步:启动运行项目,检测是否能成功启动
5.2、案例设计及分析
为了更好理解spring框架的底层注入机制,现在进行案例API设计,如图所示:
在这个案例中单元测试类CacheTests中定义一个Cache接口类型的属性,然后由Spring框架完成对cache类型属性值的注入。
5.3、代码编写及测试分析
第一步:定义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检测输出结果,基于结果理解其注入规则。
5.4、编写及测试过程中的BUG分析
依赖注入异常,如图所示:
6、总结(Summary)
本小节为springboot技术入门章节,主要讲述了SpringBoot工程下,spring中bean对象的编写,特性以及依赖注入的规则,希望通过这一小节的讲解,同学们能够理解我们为什么要将对象交给spring管理,spring管理对象有什么优势,我们在springboot工程中应该如何配置这些对象。