# IDEA 基础配置

新安装好 IDEA 后需要设置的东西统一汇总。

# IDEA 禁用更新

一般情况下,我们想把 IDEA 固定在某个版本使用,不想随便升级,毕竟如果使用破解版的话,升级后可能就失效了。

而且,如果不禁用更新,打开的时候右下角会提示我们有新版本更新,还得手动点掉。

点击左上角【File】--》【Settings】--》【Appearance & Behavior】--》【System Settings】--》【Updates】,把【Automatically check updates for】前面的勾去掉。

image-20220622002439658

# 修改 IDEA 显示主题

选择【IntelliJ Light】对眼睛比较好,不要一味的选择黑色炫酷啦,据说,大佬们都喜欢用这个主题哦。

image-20220601095749963

# 修改快捷键

使用【Eclipse】快捷键,方便从 Eclipse 切换至 IDEA。

image-20220601093235786

# 添加从重写的方法跳转到对应的接口的快捷键

点击【Main menu】,选择【Navigate】,找到【Go to Super Method】。

image-20220601093429980

选中【Go to Super Method】,右键选中【Add Keyboard Shortcut】。

image-20220601093512973

使用快捷键Ctrl + Shift + T,因为查看接口的实现是Ctrl + T,用这个比较方便来回跳转。

image-20220601093608149

这个快捷键会和其他的冲突,移除其他的就可以。

image-20220601093706757

# 始终显示工具栏

# 设置之前

image-20220905115534074

# 设置之后

image-20220905115455574

对比可以看到,设置之后,工具栏独占一行,不和导航栏共用一行,不共用一行这样看代码的时候会比较方便。

# 设置方法

在上方菜单栏中找到【View】--》【Appearance】--》勾选上【Toolbar】。

image-20220905115728183

# 修改字体

【Editor】--》【Font】。

image-20220905121526449

# 修改注释颜色

image-20220905121808260

# 开启鼠标移动时快速显示文档注释

【Editor】--》【Code Editing】--》勾选上【Show quick documentation on mouse move】

image-20220905120309073

# 开启快速调整字体大小

找到【Editor】--》【General】--》勾选上【Change font size with Ctrl + Mouse Wheel】

image-20220905120031219

# 代码提示不区分大小写

默认是勾选的,你需要记住大小写才能匹配到你要的那个类,不勾选这个提高开发效率,提高 IDEA 的代码联想速度。

点击【Editor】-->【General】-->【Code Completion】,把 Match case 前面的勾去掉,改成图中的样子。

image-20220601091210401

# 修改文档提示延迟时间

点击左上角【File】--》【Editor】--》【Code Editing】--》然后向下滚动页面找到【Editor Tooltips】。

修改【Tooltip delay】中的值,单位毫秒,默认是鼠标移到方法上 500 毫秒后出现提示,可以根据自己需要适当调小。

调大了,要等好久才出现提示;调小了,你动一下就出现提示,都是很烦的。我调整成了【300】毫秒,稍微快一点。

image-20221013133550985

# 修改方法参数提示所需时间

点击【Editor】-->【General】-->【Code Completion】,往下翻,找到【Parameter Info】,改成如图所示。

默认的参数信息提示时间是 1000 ms,改成 500 ms。

image-20220601091430098

# 设置自动导包

如果导入的包比较多,自己一个个导入比较麻烦和费时间。

当删除一些代码时,导入的包不会自动删除,会一直存在,代码提交时会越来越臃肿。

设置方法:

点击左上角【File】--》【Settings】--》【Editor】--》【General】--》【Auto Import】

【Insert imports on paste】修改为【All】,

勾选【Add unambiguous imports on the fly】,

勾选【Optimize imports on the fly (for current projcet)】。

image-20220905120601091

说明:

Insert imports on paste:当类名重名的时候,是询问你导入那个包还是全部导入。

Add unambiguous imports on the fly:表示 IDEA 将在我们写代码的时候自动帮我们导入需要用到的包。

Optimize imports on the fly:表示 IDEA 将在我们写代码的时候自动帮我们优化导入的包,比如自动去掉一些没有用到的包。

参考文献:

IDEA如何设置自动导包 (opens new window)

# 设置显示行号和方法间的分隔符

左上角找到【File】--》【Settings】--》【Editor】--》【General】--》【Appearance】,勾选以下框框

  • Show line numbers:显示行号
  • Show method separators:显示方法之间的分隔符

image-20220915085811401

# 方法分隔符效果

可以看到,所有方法之间都加了个一条横线作为分隔符,有的时候一个方法很长的时候可能看着就乱了,显示分隔符会有一定的辨识度。

image-20220915085952805

参考文献:

IDEA这样配置,好用到爆炸!!! (opens new window)

# 开启自动编译

# 设置当前项目自动编译

左上角找到【File】--》【Settings】--》【Build, Execution, Deployment】-->【Compiler】,

勾选【Build project automatically】和【Compile independent modules in parallel】。

image-20220601091835224

# 设置新项目默认自动编译

左上角找到【File】--》【New Projects Settings】--》【Settings for New Projects...】

image-20220905121233934

选择【Build, Execution, Deployment】-->【Compiler】,

勾选【Build project automatically】和【Compile independent modules in parallel】。

image-20220601091835224

# 不压缩中间包名

点击项目上方的小齿轮,然后去掉【Compact Middle Packages】前面的勾。

image-20220719150155841

不勾选【Compact Middle Packages】的效果:

可以看到,每个文件夹都显示出来了,没有压缩。

image-20220719150318318

勾选【Compact Middle Packages】的效果:

多层文件夹,会进行压缩,不展开显示,但是,有时候也会把我们给坑了。

像下面【mapper.system】,其实这是 mapper 文件夹里面有一个 system 文件夹。但是,我们可能会误以为,这个文件夹名字叫 mapper.system

image-20220719150354333

参考文献:

idea2021包不折叠简单设置 (opens new window)

# 设置自动保存

修改【File | Settings | Appearance & Behavior | System Settings】,找到【Synchronization】,改成如图所示,默认是 10 秒自动保存一次,改成 1 秒。

image-20220601092139241

# 修改配置文件默认字符集

修改当前项目:左上角找到【File】-->【Settings】-->【Editor】-->【File Encodings】,改成和下图一样。

修改所有新项目:左上角找到【File】-->【New Projects Settings】-->【Settings for New Projects】-->【Editor】-->【File Encodings】,改成和下图一样。

image-20220601092436391

# 为所有项目统一设置 Maven 环境

image-20220601094100399

image-20220601094128285

# 设置自动下载 Maven 第三方依赖源码、文档

有需要可以勾选上,但是会导致本地仓库非常庞大,建议用到的时候才去手动下载。

image-20220905122104185

# 设置默认不折叠一行的函数

左上角选择【File】-->【Settings】-->【Editor】-->【General】-->【Code Folding】,把【One-line methods】前面的勾去掉。

image-20220619122036064

# 关闭 @Autowired 注解注释错误的提示

@Autowired 注解描述的 Mapper 对象下面有红色波浪线,但运行时没有错误,如何去除红色波浪线。

原因:因为我们在主启动类上使用 @MapperScan 来扫描包下的 Mapper 接口,这样不用每个数据库接口一个个的加 @Mapper 注解,但是 IDEA 误以为我们没有添加注解,导致认为这个接口没有交给 Spring 管理,导致报错,可以在类上添加 @Repository 接口来避免报错,或者把 @Autowired 改成 @Resource,或者禁用这个检查。

解决方案:

1、禁用检查

2、在 Mapper 接口上添加 @Repository

3、把 @Autowired 改成 @Resource

修改当前项目:左上角找到【File】-->【Settings】-->【Editor】-->【Inspections】,在输入框搜索【Autowiring for bean class】,改成和下图一样。

修改所有新项目:左上角找到【File】-->【New Projects Settings】-->【Settings for New Projects】-->【Editor】-->【Inspections】,在输入框搜索【Autowiring for bean class】,改成和下图一样。

image-20220704121456221

# 代码模板

# 新增类时自动添加作者和时间

左上角菜单栏找到【File】--》【Settings】--》【Editor】--》【File and code Templates】--》【Includes】--》点击【File Header】,然后在里面添加以下内容:

## DTO 层文件注释
#set($dtoDesc = "xxx请求数据")
## VO 层文件注释
#set($voDesc = "xxx响应数据")
## BO 层文件注释
#set($boDesc = "xxx业务数据")
## Controller 层文件注释
#set($controllerDesc = "xxx接口")
## Controller 层 FeignClient 实现类文件注释
#set($controllerFeignClientDesc = "xxx远程调用接口实现类")
## FeignClient 层文件注释
#set($feignClientDesc = "xxx远程调用接口")
## Service 层文件注释
#set($serviceDesc = "xxx接口服务层")
## Mapper 层文件注释
#set($mapperDesc = "xxx接口数据库层")
## 测试类文件注释后缀
#set($testSuffix = "测试类")
## 测试类文件注释
#set($testDesc = "xxx测试类")

/**
#if ($PACKAGE_NAME.toString().contains(".dto"))
* $dtoDesc
#elseif ($PACKAGE_NAME.toString().contains(".vo"))
* $voDesc
#elseif ($PACKAGE_NAME.toString().contains(".bo"))
* $boDesc
## Controller 层的特殊处理
#elseif ($PACKAGE_NAME.toString().contains(".controller") && $NAME.toString().endsWith("Test") && !$NAME.toString().contains("FeignClient"))
* ${controllerDesc}${testSuffix}
#elseif ($PACKAGE_NAME.toString().contains(".controller") && !$NAME.toString().contains("FeignClient"))
* $controllerDesc
## Controller 层 FeignClient 的特殊处理
#elseif ($PACKAGE_NAME.toString().contains(".controller") && $NAME.toString().endsWith("Test") && $NAME.toString().contains("FeignClient"))
* ${controllerFeignClientDesc}${testSuffix}
#elseif ($PACKAGE_NAME.toString().contains(".controller") && $NAME.toString().contains("FeignClient"))
* $controllerFeignClientDesc
## Service 层注释
#elseif ($PACKAGE_NAME.toString().contains(".service") && $NAME.toString().endsWith("Test"))
* ${serviceDesc}${testSuffix}
#elseif ($PACKAGE_NAME.toString().contains(".service"))
* $serviceDesc
## FeignClient 层注释
#elseif ($PACKAGE_NAME.toString().contains(".feignclient") && $NAME.toString().endsWith("Test"))
* ${feignClientDesc}${testSuffix}
#elseif ($PACKAGE_NAME.toString().contains(".feignclient"))
* $feignClientDesc
## Mapper 层注释
#elseif ($PACKAGE_NAME.toString().contains(".mapper") && $NAME.toString().endsWith("Test"))
* ${mapperDesc}${testSuffix}
#elseif ($PACKAGE_NAME.toString().contains(".mapper"))
* $mapperDesc
## 通用测试类注释处理
#elseif ($NAME.toString().endsWith("Test"))
* $testDesc
#else
* desc
#end
* 
* @author ${USER}
* @date ${DATE}
*/

image-20220707082133794

参考文献:

IDEA创建文件添加作者及时间信息_Simba1949的博客-CSDN博客_idea 添加作者 (opens new window)

# 新增类时根据包名自动添加相关注解

左上角菜单栏找到【File】--》【Settings】--》【Editor】--》【File and code Templates】--》【Files】--》找到【Class】,然后在里面替换为以下内容:

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
## 导入 Controller 层的包
#if ($PACKAGE_NAME.toString().contains(".controller"))
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
#end
## 导入 Service 层的包
#if ($PACKAGE_NAME.toString().contains(".service"))
import org.springframework.validation.annotation.Validated;
import org.springframework.stereotype.Service;
#end
## 导入 BO 模型的包
#if ($PACKAGE_NAME.toString().contains(".bo"))
import lombok.EqualsAndHashCode;
import lombok.ToString;
#end
## 导入 model 的包
#if (
    $PACKAGE_NAME.toString().contains(".dto")
|| $PACKAGE_NAME.toString().contains(".vo")
|| $PACKAGE_NAME.toString().contains(".bo")
|| $PACKAGE_NAME.toString().contains(".entity")
|| $PACKAGE_NAME.toString().contains(".po")
|| $PACKAGE_NAME.toString().contains(".model")
|| $PACKAGE_NAME.toString().contains(".pojo")
)
import lombok.Data;
import lombok.experimental.Accessors;
import io.swagger.annotations.ApiModel;
#end
#parse("File Header.java")
## 使用 Controller 的注解
#if ($PACKAGE_NAME.toString().contains(".controller") && !${NAME.endsWith("FeignClientController")})
@Api(tags = "xxx接口")
@RestController
@RequestMapping("/$NAME.toString().toLowerCase().charAt(0)$NAME.toString().replace("Controller", "").substring(1, $NAME.toString().indexOf("Controller"))")
#end
## 使用 Controller 的注解
#if ($PACKAGE_NAME.toString().contains(".controller") && ${NAME.endsWith("FeignClientController")})
@Api(tags = "xxx远程调用接口实现类")
@ApiIgnore
@RestController
@RequestMapping(${NAME.toString().replace("Controller", "")}.REQUEST_MAPPING)
#end
## 使用 Service 的注解
#if ($PACKAGE_NAME.toString().contains(".service"))
@Slf4j
@Validated
@Service
#end
## 使用 model 的注解
#if (
    $PACKAGE_NAME.toString().contains(".dto")
|| $PACKAGE_NAME.toString().contains(".vo")
|| $PACKAGE_NAME.toString().contains(".bo")
|| $PACKAGE_NAME.toString().contains(".entity")
|| $PACKAGE_NAME.toString().contains(".po")
|| $PACKAGE_NAME.toString().contains(".model")
|| $PACKAGE_NAME.toString().contains(".pojo")
)
@ApiModel("desc")
@Accessors(chain = true)
@Data
#end
## 使用 bo 模型的注解
#if ($PACKAGE_NAME.toString().contains(".bo"))
@EqualsAndHashCode(callSuper = true);
@ToString(callSuper = true);
#end
## dto 包下的类要以 DTO 结尾
#if ($PACKAGE_NAME.toString().contains(".dto") && !${NAME.endsWith("DTO")})
public class ${NAME.substring(0,1).toUpperCase()}${NAME.substring(1)}DTO {
}
## vo 包下的类要以 VO 结尾
#elseif ($PACKAGE_NAME.toString().contains(".vo") && !${NAME.endsWith("VO")})
public class ${NAME.substring(0,1).toUpperCase()}${NAME.substring(1)}VO {
}
## FeignClient 接口的实现类
#elseif ($PACKAGE_NAME.toString().contains(".controller") && ${NAME.endsWith("FeignClientController")})
public class ${NAME.substring(0,1).toUpperCase()}${NAME.substring(1)} implements $NAME.toString().replace("Controller", "") {
}
## 类名首字母要大写
#else
public class ${NAME.substring(0,1).toUpperCase()}${NAME.substring(1)} {
}
#end

image-20220707082546353

远程调用服务 FeignClient 模板

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
## 导入 FeignClient 远程调用的包
#if ($PACKAGE_NAME.toString().contains(".feignclient"))
import org.springframework.cloud.openfeign.FeignClient;
#end
#parse("File Header.java")
## 使用 FeignClient 的注解
#if ($PACKAGE_NAME.toString().contains(".feignclient"))
@FeignClient(
        name = 服务名,
        contextId = "${NAME}",
        path = ${NAME}.REQUEST_MAPPING
)
#end
public interface ${NAME} {
#if ($PACKAGE_NAME.toString().contains(".feignclient"))

    String REQUEST_MAPPING = "/$NAME.toString().toLowerCase().charAt(0)$NAME.toString().substring(1)";
#end
}

# MyBatis3 mapper.xml 模板

左上角菜单栏找到【File】--》【Settings】--》【Editor】--》【File and code Templates】--》【Files】--》点击【+】新建一个模板,然后在里面添加以下内容:

Name: MyBatis3 mapper.xml
Extension: xml
File name: XxxMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxx.mapper.XxxMapper">
</mapper>

image-20221019043644015

在 resources 资源目录下,右键【New】--》找到【MyBatis3 mapper.xml】

image-20221019043811659

右键新创建出来的【XxxMapper.xml】,找到【Refactor】--》【Rename】,修改为对应接口的 mapper 名字,还有文件中的 namespace 也要改为接口的全路径。

image-20221019043920025

参考文献:

IDEA添加mybatis mapper.xml模板(附mybatis官方模板代码) (opens new window)

# Thymeleaf 文件模板

<!doctype html>
<html lang="ch" xmlns:th="http://www.thymeleaf.org">
    
</html>

点击 + 号新建一个模板,输入 Name【thymeleaf】,Extension:【html】,完成后点击【Apply】、【OK】

image-20221212185339732

新建文件的时候可以选择

image-20221212185451062

参考文献:

https://www.bilibili.com/video/BV1qy4y117qi (opens new window)

# 从 java 文件跳转到 class 文件

左上角菜单栏找到【File】--》【Settings】--》【Tools】--》【External Tools】,点击【+】新建,然后添加以下内容:

Name:打开 class 文件所在目录
Description:打开 .java对应的 .class 文件所在的文件目录
Tool Settings:
Program:explorer.exe
Arguments:/select,"$OutputPath$\$FileDirRelativeToSourcepath$\$FileNameWithoutExtension$.class" 
Working directory:$ProjectFileDir$ 
打开【Advanced Options】,把【Synchronize files after execution 去掉】

Name:用 idea 打开 class 文件
Description:用 idea 打开 .java 文件对应的编译后的 .class 文件
Tool Settings:
Program:V:\tool\idea\ideaIU-2020.1.3.win\bin\idea64.exe
Arguments:"$OutputPath$\$FileDirRelativeToSourcepath$\$FileNameWithoutExtension$.class"
Working directory:$ProjectFileDir$ 
打开【Advanced Options】,把【Synchronize files after execution 去掉】

image-20221013134731591

# 使用方法

编写一个 Hello World 文件,并且执行一次。

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

image-20221013135220141

在文件上右键,找到【External Tools】,选择【用 idea 打开 class 文件】

image-20221013135531167

就会自动用一个新的窗口打开反编译后的文件了。

image-20221013135602846

参考文献:

IDEA打开XXX.java文件所对应的XXX.class在资源管理器中 (opens new window)

参考文献:

IDEA入门教程 (opens new window)

CGB2103-day01 (opens new window)

CGB2102-SpringDay01 (opens new window)

Idea设置默认不折叠一行的函数_加班加班到天明的博客-CSDN博客_idea 一行代码 (opens new window)

2111-微服务核心知识点及问题分析 (opens new window)