本人13年毕业,做了三年的Java开发,后转战前端。目前又想把Java捡起来。
AI给我建议的学习路径,springboot–mybatis–构建restful api–理解微服务与springcloud–学习docker k8s
当年是SSH(struts spring hibernate),现在是springboot,据说中间有过ssm(springMVC mybatis)
有一定的Java基础,但是可能有一些知识点也是记不清了。目前计划先从Spring Boot开始着手。

先准备环境

安装java

当年的Java是1.6 1.7,现在得装17以上,因为springboot3要求17起步。JAVA从1.8开始就不这样命名了,成Java8了。9 10 11 17 25这几个版本是lts版,也就是长期维护版,其他版本是短期版,市场占有率不高,可以忽略。
oracle把sun公司收购以后,JDK从8开始有了收费版,尽管从 JDK 17 开始,Oracle JDK 采用了 Oracle 免费条款和条件(NFTC) 许可证,但考虑到许可条款可能会变化,Java 生态更普遍的做法是使用由第三方维护的、完全开源的 OpenJDK 构建版本。
所以需要装一个开源版本,
Eclipse Temurin 官方下载地址:https://adoptium.net/
OpenJDK 官方下载地址:https://jdk.java.net/archive/

下载openjdk压缩包,解压

把下载的 ZIP 包解压到你专门存放开发工具的路径下,注意选择没有中文和空格的目录,避免后续出现路径识别问题。
Windows: 例如 D:\Java\jdk-21 或 C:\Program Files\Java\jdk-21
macOS / Linux: 例如 /usr/local/jdk-21 或 ~/Java/jdk-21
下的时候看对版本,mac m芯片要下载Mac/AArch64

配置环境变量

Windows的忽略,教程太多。记录一下mac的方式,编辑~/.zshrc加入以下两行

1
2
export JAVA_HOME= ~/java/jdk-17.0.2.jdk/Contents/Home #/你的/解压/路径/jdk-21
export PATH=$JAVA_HOME/bin:$PATH

注意:在 macOS 上,如果 JDK 解压后是 .jdk 包的形式,JAVA_HOME 需要指向包内的 Contents/Home 目录。
保存文件后,执行 source ~/.zshrc(或对应的配置文件)让设置立即生效。

验证是否配置成功

1
java -version

安装maven

Maven 是 Apache 软件基金会下的开源项目,基于 Apache License 2.0 协议发布,没有任何收费版本或付费功能。你可以自由地将其用于个人学习或商业项目。Maven类比前端npm。
但Maven 比 npm 管得更宽。 可以这样说:在“依赖管理”这件事上,Maven 很像 npm;但 Maven 同时还是一套“项目构建和生命周期管理工具”,这部分 npm 只做了一小部分。
Maven 的核心是“约定优于配置的项目模型 + 构建生命周期 + 插件体系”。它管的事情更多。
npm ≈ 包管理器 + 脚本运行器
Maven ≈ 包管理器 + 标准项目模型 + 构建生命周期 + 插件平台

下载安装包,解压到合适位置

官方下载页:https://maven.apache.org/download.cgi
Windows:下载 apache-maven-<version>-bin.zip
macOS / Linux:下载 apache-maven-<version>-bin.tar.gz

配置环境变量

依然只记录mac

1
2
export MAVEN_HOME=~/java/apache-maven-3.10.0  # /你的/解压/路径/apache-maven-3.9.9
export PATH=$MAVEN_HOME/bin:$PATH

保存后,执行 source ~/.zshrc(或对应的配置文件)让设置立即生效。

验证是否成功

1
mvn -v

修改配置

依赖的下载路径

进入 Maven 目录下的 conf 文件夹,用文本编辑器打开 settings.xml,找到 <localRepository> 标签(可能在注释里),取消注释并填入你想要的路径,如

1
<localRepository>/Users/clausliang/java/apache-maven-3.10.0/repo</localRepository>

必须是全路径,~识别不了
不改的话就会把依赖的jar包装到默认路径.m2/repository

在mirrors标签里添加阿里云镜像

配置国内镜像后,依赖下载速度可以提升5到10倍。

1
2
3
4
5
6
7
8
9
<mirrors>
<!-- 阿里云公共仓库镜像 -->
<mirror>
<id>aliyunmaven</id>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>

这里的 <mirrorOf>central</mirrorOf> 表示这个镜像将替代Maven默认的中央仓库。

统一JDK编译版本

有时候Maven默认会用较低的JDK版本(如1.5)编译项目,导致代码报错。你可以在 settings.xml 的 <profiles> 标签里配置全局JDK版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<profiles>
<profile>
<id>jdk-17</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>17</jdk>
</activation>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>

私服

如果进入公司,需要连接公司内部的Maven私服(如Nexus),则需要在 <servers> 标签中配置用户名和密码进行认证。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# mirror
<mirror>
<id>nexus</id>
<name>Nexus Public</name>
<url>xxxx</url>
<mirrorOf>*</mirrorOf>
</mirror>

# 用户名密码
<servers>
<server>
<id>nexus</id>
<username>claus</username>
<password>xxx</password>
</server>
<server>
<id>nexus-releases</id>
<username>claus</username>
<password>xxx</password>
</server>
</server>

IDEA 虽然内置了 Maven,但为了和命令行环境保持一致,建议在 IDEA 中指向你独立安装的版本:

打开 IDEA 设置(Ctrl+Alt+S),搜索 Maven。
将 “Maven home path” 设置为你解压的 Maven 目录。

安装idea

官网下载最新版,然后想办法破解,或者不破解。最新版的idea免费部分已经支持创建springboot项目了。
创建springboot项目时,注意有个服务器url,可以改成阿里云https://start.aliyun.com ,原路径https://start.spring.io 可能访问较慢,下载不了依赖。
但是阿里云的只能创建springboot版本最高3.0.2的项目,最后还是换成了start.spring.io,创建了默认以springboot4.1.2为模板的项目。

第一个接口

用idea创建了一个引入springboot4.1.2的项目,写第一个接口
在myfirstspringboot文件夹下创建controller文件夹,创建一个HelloController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.claus.myfirstspringboot.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
// @RequestMapping("/api")
public class HelloController {

@GetMapping("/hello")
public String hello(@RequestParam(defaultValue = "world") String name) {
return "hello " + name;
}
}

@RestController 声明这是处理请求的类,方法返回值直接作为 HTTP 响应内容
@GetMapping 把指定 URL 的 GET 请求交给这个方法
@RequestParam 获取参数
@RequestMapping("/api") 什么时候用?常见用途是在类上设置一组接口共同的路径前缀,放在controller的类上

这样在浏览的地址栏输入localhost:8080/hello?name=claus, 就会显示hello claus

读取项目的配置

在项目的src下的main下的resource下有个application.properties或者application.yml
在java代码里读它的配置有几种方式:

@value(“${xxx}”) 将配置绑定到变量上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.claus.myfirstspringboot.config;

import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

// 该注解表示让spring管理这个类
@Component
public class EmailConfigPrinter {

@Value("${email.user}")
private String emailUser;

@Value("${email.host}")
private String emailHost;

@PostConstruct
// 该注解表示 Spring 创建好这个对象、并注入两个配置值之后,调用这个方法一次
public void printConfig() {
System.out.println("email.user=" + emailUser);
System.out.println("email.host=" + emailHost);
}
}

@component 表示让spring管理这个类,spring会自动在初始化的时候管理它
@Value("${email.user}") 获取配置在application.properties里的值
@PostConstruct Spring 创建好这个对象、并注入两个配置值之后,会调用这个方法一次

上面的方式是项目启动的时候就会自动读取配置并执行postContruct标注的方法,
也可以在@getMapping标注的接口里去读取配置的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// controller里读配置
@RestController
public class HelloController {
@Value("${email.user}")
private String emailUser;

@Value("${email.host}")
private String emailHost;
// 在接口里读配置
@GetMapping("/getProperties")
public Map<String, String> getProperties() {
return Map.of("email.user", emailUser, "email.host", emailHost);
}
}

@ConfigurationProperties(prefix = “email”)将配置批量绑定到类上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.claus.myfirstspringboot.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
// 将配置批量绑定到一个类
@ConfigurationProperties(prefix = "email")
// 想让@ConfigurationProperties标注的类被spring管理到,还得在入口类上加@ConfigurationPropertiesScan
// 如果不用@ConfigurationPropertiesScan,也可以用@Component
public class EmailProperties {

private String user;
private String host;

public String getUser() {
return user;
}

public void setUser(String user) {
this.user = user;
}

public String getHost() {
return host;
}

public void setHost(String host) {
this.host = host;
}
}

在Controller里使用配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RestController
public class HelloController {
private final EmailProperties emailProperties;

// 通过构造方法注入 EmailProperties,并保存对象引用
public HelloController(EmailProperties emailProperties) {
this.emailProperties = emailProperties;
}
// 第二种方式读取配置用@ConfigurationProperties(prefix = "email")
@GetMapping("/getEmailProperties")
public EmailProperties getEmailProperties() {
return emailProperties;
}
}