ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

IDEA+Spring Boot新手入门:从环境搭建到Web接口开发实战

2026/8/5 4:26:30 拓冰建站 浏览量
IDEA+Spring Boot新手入门:从环境搭建到Web接口开发实战 1. 项目概述为什么从IDEA和Spring开始如果你刚开始接触Java企业级开发或者刚从Eclipse、MyEclipse这类老牌IDE切换过来面对IntelliJ IDEA以下简称IDEA和Spring框架可能会觉得有点无从下手。网上的教程要么太老要么只讲理论实操起来总是卡在某个配置环节。这篇内容就是为你准备的“开箱即用”指南。我们不谈高深的理论就聚焦一件事如何在你自己的电脑上从零开始用IDEA搭建一个能跑起来的Spring项目并完成一个最简单的Web接口。为什么是IDEA和SpringIDEA是目前Java开发领域的“事实标准”其智能提示、代码重构和与构建工具如Maven的深度集成能极大提升开发效率。而Spring框架经过近二十年的发展早已成为构建企业级Java应用的基石其核心的IoC控制反转和AOP面向切面编程思想是理解现代Java后端架构的钥匙。从它们入手是构建你Java技术栈最坚实的第一步。整个过程我会假设你是一个有一定Java语法基础但对IDE和框架不熟的新手。我们会用到Maven来管理项目依赖因为它和IDEA、Spring的结合堪称完美。放心每一个步骤我都会配上截图并解释清楚“为什么要这么做”确保你不仅能跟着做出来还能理解背后的逻辑。2. 环境准备安装与配置的“避坑指南”在写第一行代码之前我们需要把“战场”打扫干净。这里主要涉及三样东西JDK、IDEA和Maven。它们的安装顺序有讲究配置更是关键。2.1 JDK选择与安装Spring框架需要运行在Java环境上。目前Spring官方推荐使用JDK 8、11或17这些长期支持LTS版本。对于新手我强烈建议直接安装JDK 17它是目前最新的LTS版本既能学习到新的语言特性又有长期的稳定性和社区支持。注意不要安装JREJava运行时环境我们需要的是包含编译工具javac的JDKJava开发工具包。安装步骤访问Oracle官网或Adoptium等开源发行版网站下载JDK 17安装包。运行安装程序记住你的安装路径例如C:\Program Files\Java\jdk-17。这一步很重要后面配置环境变量要用。验证安装打开命令行CMD或PowerShell输入java -version和javac -version。如果都能正确显示版本号特别是javac说明安装成功。环境变量配置Windows这是新手最容易出错的地方。你需要配置两个系统环境变量JAVA_HOME变量值就是你的JDK安装路径如C:\Program Files\Java\jdk-17。很多Java工具包括Maven、Tomcat都依赖这个变量来定位Java。Path在Path变量中新增一项%JAVA_HOME%\bin。这能让系统在任何位置都能找到java、javac等命令。配置完成后务必重新打开一个新的命令行窗口再执行验证命令因为环境变量的更改只对新打开的终端生效。2.2 IntelliJ IDEA社区版足矣IDEA有旗舰版Ultimate和社区版Community。旗舰版功能强大支持Web开发、企业框架等但需要付费或寻找其他方式。对于学习Spring核心框架社区版完全足够它免费、开源且对Java和Maven的支持与旗舰版无异。下载与安装前往JetBrains官网下载IDEA Community Edition的安装包。安装过程基本一路“Next”只需注意两点在“安装选项”界面建议勾选“创建桌面快捷方式”和“将bin目录添加到PATH”方便以后通过命令行启动IDEA。在“选择开始菜单文件夹”和“选择安装位置”时按自己习惯设置即可。安装完成后首次启动IDEA会让你选择主题深色或浅色和安装一些插件。对于新手保持默认即可后续有需要再安装。2.3 Maven项目依赖的“大管家”Maven不是必须的但有了它项目管理会轻松无数倍。它的核心是一个项目对象模型POM文件pom.xml在这个文件里你只需声明项目需要什么库如SpringMaven就会自动从中央仓库下载这些库以及它们依赖的其他库并管理整个构建生命周期编译、测试、打包等。下载与安装访问Maven官网下载最新版本的二进制压缩包如apache-maven-3.9.6-bin.zip。解压到一个没有中文和空格的路径下例如D:\DevTools\apache-maven-3.9.6。同样记住这个路径。配置环境变量MAVEN_HOME变量值为你的Maven解压路径如D:\DevTools\apache-maven-3.9.6。Path新增%MAVEN_HOME%\bin。验证打开新命令行输入mvn -v。正确显示Maven和JDK版本信息即成功。配置本地仓库与镜像提速关键Maven默认从国外中央仓库下载依赖速度可能很慢。我们需要修改Maven安装目录下conf/settings.xml文件。修改本地仓库位置找到localRepository标签默认被注释取消注释并将路径改为一个你指定的目录如localRepositoryD:\.m2\repository/localRepository。这能避免依赖库默认下载到C盘用户目录。配置国内镜像在mirrors标签内添加阿里云的镜像源能极大提升下载速度。mirror idaliyunmaven/id mirrorOf*/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror3. 在IDEA中创建你的第一个Spring项目环境就绪现在打开IDEA开始真正的项目创建。IDEA提供了多种创建Spring项目的方式对于新手我推荐使用Spring Initializr它是IDEA内置的、连接官方Spring项目生成服务的工具能帮你快速生成一个结构规范、依赖清晰的项目骨架。3.1 使用Spring Initializr初始化项目打开IDEA点击欢迎界面或File-New-Project。在左侧项目类型中选择Spring Initializr。注意检查右上角的JDK版本是否是你刚安装的17。项目元数据Project Metadata这是项目的“身份证”。Group通常使用公司或组织的域名倒写如com.example。这决定了生成的Java包的基础路径。Artifact项目名称也是最终生成jar包的名字如my-first-spring-app。Type保持Maven。Language保持Java。Packaging选择Jar。即使是Web应用Spring Boot也推荐使用内嵌容器的Jar包方式部署这比传统的WAR包部署到外部Tomcat要简单得多。Java Version选择17。选择依赖Dependencies这是最关键的一步决定了你的项目初始具备哪些能力。在搜索框中输入并选择Spring Web这是构建Web应用包括RESTful API的核心依赖它会自动引入Spring MVC、内嵌的Tomcat服务器等。可选Spring Boot DevTools强烈建议勾选。它提供了热重启Restart功能修改代码后无需手动重启应用能极大提升开发效率。点击Next选择项目存放位置然后点击Finish。IDEA会自动下载项目模板并初始化。初始化完成后IDEA会打开项目。第一次打开右下角会提示“Maven项目需要导入”点击“Enable Auto-Import”。这样以后pom.xml有改动IDEA会自动下载新的依赖。3.2 解读生成的项目结构项目创建好后左侧的项目面板会呈现一个标准的Maven Spring Boot项目结构my-first-spring-app ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ └── example │ │ │ └── myfirstspringapp │ │ │ └── MyFirstSpringAppApplication.java // 主启动类 │ │ └── resources │ │ ├── application.properties // 配置文件 │ │ └── static templates // 静态资源和模板目录暂无 │ └── test // 测试目录 └── pom.xml // Maven项目核心配置文件MyFirstSpringAppApplication.java这是Spring Boot应用的入口。类上的SpringBootApplication注解是一个组合注解它开启了组件扫描、自动配置等功能。里面的main方法用于启动应用。pom.xml打开它你会看到Spring Initializr已经帮你添加好了spring-boot-starter-web等依赖。parent标签指定了Spring Boot的版本它统一管理了大量第三方库的版本避免了版本冲突这是Spring Boot的一大优势。application.properties应用配置文件。我们可以在这里设置服务器端口、数据库连接等属性。4. 编写第一个Spring MVC控制器现在我们来创建一个最简单的Web接口体验一下Spring MVC是如何工作的。Spring MVC的核心思想是“模型-视图-控制器”但对于我们常见的返回JSON数据的REST API可以简化理解为一个处理HTTP请求并返回响应的方法。4.1 创建Controller类在src/main/java/com/example/myfirstspringapp包下与主启动类同级或子包新建一个Java类命名为HelloController。在类上添加RestController注解。这个注解是Controller和ResponseBody的组合它告诉Spring这个类是一个控制器并且它里面所有方法的返回值都会直接写入HTTP响应体而不是跳转到一个视图页面。这非常适合编写API。在类内部编写一个方法package com.example.myfirstspringapp; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; RestController public class HelloController { GetMapping(/hello) public String sayHello(RequestParam(value name, defaultValue World) String name) { return Hello, name !; } }代码解读GetMapping(“/hello”)这是一个路由映射注解。它表示当接收到一个HTTP GET请求且请求路径是/hello时由这个sayHello方法来处理。RequestParam用于获取HTTP请求中的查询参数Query Parameter。value “name”指定参数名defaultValue “World”设置了默认值。这意味着访问/hello和/hello?nameSpring会得到不同的响应。4.2 运行并测试应用回到主启动类MyFirstSpringAppApplication.java找到左侧行号旁的绿色小三角点击它选择Run ‘MyFirstSpringAppApplication’。IDEA会启动Spring Boot应用。在控制台Run中你会看到Spring Boot的启动日志。注意寻找类似Tomcat started on port(s): 8080 (http)这样的信息这说明内嵌的Tomcat服务器已经在8080端口启动了。测试API方式一浏览器打开浏览器访问http://localhost:8080/hello。页面应显示 “Hello, World!”。再访问http://localhost:8080/hello?nameSpring页面应显示 “Hello, Spring!”。方式二IDEA内置的HTTP Client在IDEA中你可以直接点击GetMapping(“/hello”)注解旁边出现的浏览器小图标IDEA会自动打开一个简单的测试界面发送请求并显示结果非常方便。方式三命令行工具curl或Postman等API测试工具打开命令行输入curl http://localhost:8080/hello?nameDeveloper。恭喜你的第一个Spring Web应用已经成功运行。这个过程看似简单但背后Spring Boot已经为你自动配置了Tomcat服务器、Spring MVC的DispatcherServlet、消息转换器将String转换为HTTP响应等大量组件。5. 深入理解Spring IoC容器与Bean刚刚我们写了一个Controller加了个注解它就能处理HTTP请求了。这一切的魔法都源于Spring的核心——IoC控制反转容器。理解它是理解Spring的关键。5.1 什么是IoC容器想象一个大型工厂。以前你需要什么零件对象得自己亲自去各个车间new 对象制造、组装非常麻烦耦合度高。现在有了一个超级智能的中央仓库IoC容器。你只需要告诉这个仓库你需要什么通过注解、XML或Java配置并描述一下这个零件的规格定义Bean仓库就会在需要的时候把制造好并组装完毕的零件主动送到你手上。这个“主动送达”就是“控制反转”——将对象的创建、组装、生命周期管理的控制权从程序员手中反转到了容器手中。带来的好处是解耦和易于管理。在Spring Boot中这个容器在应用启动时即运行main方法就被创建和初始化了。5.2 Bean的定义与获取被IoC容器管理的对象称为Bean。我们的HelloController之所以能工作就是因为RestController注解它本身被Component注解标记告诉Spring容器“请把我作为一个Bean管理起来”。如何定义Bean除了使用Component及其衍生注解Service,Repository,Controller,RestController进行类路径扫描自动注册外你还可以在配置类中使用Bean注解来显式声明。例如假设我们有一个简单的服务类// 这是一个普通的类没有使用Component public class MyService { public String getServiceName() { return MyCustomService; } }我们可以在一个配置类中将它定义为Beanimport org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration // 表明这是一个Spring配置类 public class AppConfig { Bean // 这个方法的返回值将被注册为Spring容器中的一个Bean方法名默认作为Bean的名称 public MyService myService() { return new MyService(); // 容器会调用此方法来创建Bean实例 } }如何获取Bean在大多数情况下你不需要手动获取BeanSpring会通过依赖注入DI自动将Bean“注入”到需要它的地方。这是IoC的具体实现方式。最常见的方式是使用Autowired注解进行字段注入、构造器注入或Setter注入。推荐使用构造器注入因为它明确地声明了必需的依赖并且便于测试。修改我们的HelloController注入上面定义的MyServiceRestController public class HelloController { private final MyService myService; // 构造器注入Spring容器会自动寻找MyService类型的Bean并传入此处 Autowired public HelloController(MyService myService) { this.myService myService; } GetMapping(/hello) public String sayHello(RequestParam(value name, defaultValue World) String name) { return Hello, name ! Service says: myService.getServiceName(); } }重启应用并访问/hello你会看到返回信息中包含了MyService提供的内容。这就是依赖注入的魅力——HelloController不需要知道MyService具体是怎么创建的它只需要声明“我需要一个MyService”容器就会满足它。6. 配置文件详解application.properties vs application.ymlSpring Boot允许你通过配置文件来灵活地调整应用行为而无需修改代码。最常用的配置文件是application.properties和application.yml或.yaml。6.1 application.properties这是传统的键值对格式使用等号赋值。# 设置服务器端口 server.port9090 # 设置应用上下文路径访问地址会变成 http://localhost:9090/myapp/xxx server.servlet.context-path/myapp # 配置日志级别 logging.level.com.example.myfirstspringappDEBUG # 数据库连接配置示例需引入对应starter # spring.datasource.urljdbc:mysql://localhost:3306/testdb # spring.datasource.usernameroot # spring.datasource.password123456 # spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver这种格式简单直接但当配置项很多且有层级关系时会显得冗长。6.2 application.ymlYAMLYAML Ain‘t Markup Language采用缩进来表示层级关系结构更清晰是当前更主流的选择。注意缩进必须使用空格不能使用Tab键。将src/main/resources/application.properties重命名为application.yml然后写入以下内容server: port: 9090 servlet: context-path: /myapp logging: level: com.example.myfirstspringapp: DEBUG # 数据库配置示例 # spring: # datasource: # url: jdbc:mysql://localhost:3306/testdb # username: root # password: 123456 # driver-class-name: com.mysql.cj.jdbc.Driver可以看到同样的配置YAML格式的层次感更强更易于阅读和维护。Spring Boot对两者都支持你可以根据团队习惯选择。我个人更推荐使用YAML。6.3 多环境配置在实际开发中我们通常有开发dev、测试test、生产prod等不同环境它们的配置如数据库地址、日志级别可能不同。Spring Boot提供了优雅的多环境配置支持。创建多个配置文件命名规则为application-{profile}.yml。application-dev.yml(开发环境)application-prod.yml(生产环境)在每个文件中编写对应环境的配置。例如在application-dev.yml中server: port: 8080 logging: level: root: INFO在application-prod.yml中server: port: 80 logging: level: root: WARN在主配置文件application.yml中使用spring.profiles.active属性来指定激活哪个环境。# application.yml spring: profiles: active: dev # 默认激活开发环境配置启动应用时Spring Boot会先加载application.yml然后加载application-{active}.yml中的配置后者会覆盖前者的相同属性。你还可以在运行Jar包时通过命令行参数来动态指定环境java -jar myapp.jar --spring.profiles.activeprod。7. 连接数据库Spring Data JPA初体验绝大多数应用都需要持久化数据。Spring Data JPA是Spring生态中用于简化数据库访问的杰出框架它基于JPAJava Persistence API标准底层可以集成Hibernate等实现。7.1 添加依赖与配置首先在pom.xml中添加Spring Data JPA和MySQL驱动的依赖以MySQL为例dependencies !-- 其他依赖... -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-jpa/artifactId /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope !-- 运行时才需要 -- /dependency /dependencies然后在application.yml中配置数据库连接spring: datasource: url: jdbc:mysql://localhost:3306/spring_test?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: your_password driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update # Hibernate的DDL策略update表示根据实体类更新表结构 show-sql: true # 在控制台显示执行的SQL语句便于调试 properties: hibernate: dialect: org.hibernate.dialect.MySQL8Dialect重要提示ddl-auto: update在开发初期很方便但绝对不要在生产环境使用因为它可能会误删数据。生产环境应该使用validate或由专业的数据库迁移工具如Flyway, Liquibase管理。7.2 创建实体类Entity实体类对应数据库中的表。我们创建一个简单的User实体。package com.example.myfirstspringapp.entity; import javax.persistence.*; Entity // 标记这是一个JPA实体类 Table(name user) // 指定对应的表名如果省略则使用类名 public class User { Id // 标记为主键 GeneratedValue(strategy GenerationType.IDENTITY) // 主键生成策略自增 private Long id; Column(nullable false, length 50) // 对应数据库字段非空长度50 private String username; Column(nullable false) private String email; // 必须有无参构造器 public User() { } // 全参构造器、Getter和Setter方法省略可以使用Lombok的Data注解简化 // ... 请务必补充上 }使用IDE如IDEA可以自动生成Getter和Setter。更推荐使用Lombok库的Data注解它能自动生成这些方法让代码更简洁。需要在pom.xml中添加Lombok依赖并在IDEA中安装Lombok插件。7.3 创建仓库接口Repository这是Spring Data JPA最神奇的地方。你只需要定义一个接口继承JpaRepository就自动拥有了对该实体进行增删改查、分页、排序等操作的能力无需编写任何实现代码。package com.example.myfirstspringapp.repository; import com.example.myfirstspringapp.entity.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; Repository // 可省略Spring会自动识别 public interface UserRepository extends JpaRepositoryUser, Long { // 你可以在这里声明自定义的查询方法遵循命名规范即可 // 例如根据用户名查找用户 User findByUsername(String username); }JpaRepositoryUser, Long中的两个泛型参数第一个是实体类型第二个是主键的类型。7.4 在Service和Controller中使用现在我们可以在Service层注入UserRepository来操作数据并通过Controller暴露API。// Service层 Service public class UserService { Autowired private UserRepository userRepository; public User createUser(String username, String email) { User user new User(); user.setUsername(username); user.setEmail(email); return userRepository.save(user); // 保存到数据库 } public ListUser getAllUsers() { return userRepository.findAll(); // 查询所有用户 } } // Controller层 RestController RequestMapping(/api/users) // 给整个控制器添加路径前缀 public class UserController { Autowired private UserService userService; PostMapping public User createUser(RequestBody User user) { // RequestBody接收JSON格式的请求体 return userService.createUser(user.getUsername(), user.getEmail()); } GetMapping public ListUser getUsers() { return userService.getAllUsers(); } }重启应用Spring Boot会根据实体类自动在数据库spring_test中创建user表。你可以使用Postman等工具发送POST请求到http://localhost:9090/myapp/api/usersJSON Body:{username:test, email:testexample.com}来创建用户然后发送GET请求到同一地址来获取用户列表。8. 项目打包与部署生成可执行的JAR开发完成后我们需要将应用打包以便部署到服务器。Spring Boot的“内嵌容器”特性使得打包变得极其简单。8.1 使用Maven打包在IDEA中右侧边栏找到Maven工具窗口如果没看到点击View-Tool Windows-Maven。展开你的项目找到Lifecycle双击package。Maven会执行编译、测试、打包等一系列操作。完成后在项目的target目录下你会找到一个名为my-first-spring-app-0.0.1-SNAPSHOT.jar的文件名字取决于你在pom.xml中设置的artifactId和version。这个JAR包是“可执行的”Fat Jar/Uber Jar它包含了你的应用代码、所有依赖的第三方库以及内嵌的Tomcat服务器。这意味着你不需要在服务器上额外安装Tomcat。8.2 运行与部署本地运行打开命令行进入target目录执行java -jar my-first-spring-app-0.0.1-SNAPSHOT.jar应用就会以你在application.yml中配置的方式启动。你可以通过--spring.profiles.activeprod参数指定生产环境配置。服务器部署将生成的jar包上传到你的Linux或Windows服务器。确保服务器上安装了对应版本的JDK如JDK 17。在后台运行应用以Linux为例nohup java -jar my-first-spring-app-0.0.1-SNAPSHOT.jar --spring.profiles.activeprod app.log 21 这条命令会让应用在后台运行并将日志输出到app.log文件。使用ps -ef | grep java查看进程使用tail -f app.log查看实时日志。8.3 打包常见问题打包失败提示“找不到主清单属性”检查pom.xml中是否引入了spring-boot-maven-plugin插件。Spring Initializr生成的项目会自动包含它。这个插件负责将应用打包成可执行Jar。build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build依赖冲突如果手动添加了依赖导致版本冲突可以使用mvn dependency:tree命令查看依赖树排查冲突的库。Spring Boot的dependency-management已经帮我们管理了大量常用库的版本优先使用它定义的版本。打包速度慢可以跳过测试以加速打包mvn clean package -DskipTests。9. 开发中的高效技巧与问题排查掌握了基本流程后一些技巧能让你开发得更顺手。9.1 活用Spring Boot DevTools之前我们勾选了Spring Boot DevTools依赖。它的核心功能是自动重启。当你修改了Java代码、配置文件或静态资源后保存文件IDEA会自动编译DevTools会触发应用重启。这个过程比冷启动快得多因为它使用了两个类加载器基础类库如第三方Jar几乎不需要重新加载。确保IDEA设置了自动编译File-Settings-Build, Execution, Deployment-Compiler勾选Build project automatically。同时按CtrlShiftA搜索Registry找到并勾选compiler.automake.allow.when.app.running。9.2 阅读控制台日志Spring Boot启动时控制台会打印大量日志。学会阅读它们至关重要启动失败通常会有明显的错误堆栈信息ERROR级别。重点关注Caused by:后面的根本原因。Bean加载情况在日志中搜索Mapping可以看到所有注册的Controller路径。搜索Bean可以看到容器中加载了哪些Bean。配置信息应用启动时会打印激活的配置文件Profiles和很多配置的最终值。9.3 常见问题速查表问题现象可能原因排查步骤启动报Port 8080 already in use端口被占用1. 更改server.port。2. 命令行找占用进程netstat -ano | findstr :8080(Win) 或lsof -i:8080(Mac/Linux)然后结束它。访问接口返回404路径错误或Controller未扫描到1. 检查URL是否包含server.servlet.context-path。2. 检查Controller类是否在主启动类同级或子包下否则需用ComponentScan指定扫描路径。3. 检查请求方法GET/POST是否匹配注解。Autowired注入失败报NoSuchBeanDefinitionExceptionBean未定义或未被扫描到1. 检查目标类是否添加了Component,Service等注解。2. 检查是否在配置类中用Bean显式定义了。3. 检查包扫描范围。连接数据库失败配置错误、网络不通、驱动不匹配1. 检查application.yml中的url,username,password。2. 确认数据库服务已启动。3. 确认数据库版本与驱动版本匹配如MySQL 8.x 使用com.mysql.cj.jdbc.Driver。修改代码后重启没生效DevTools未生效或IDEA未自动编译1. 确认pom.xml引入了devtools依赖。2. 确认IDEA开启了自动编译见9.1。3. 尝试手动Build-Recompile该类。9.4 调试API接口除了浏览器和IDEA的HTTP ClientPostman或Insomnia这类专业的API测试工具是后端开发的必备。它们可以方便地组织请求集合、设置环境变量、进行自动化测试等。对于更复杂的调试IDEA自带的断点调试功能无比强大。在代码行号旁点击设置断点然后以Debug模式而非Run启动应用。当请求命中该行代码时程序会暂停你可以查看所有变量的值单步执行这是定位逻辑错误的最有效手段。从环境搭建到第一个接口再到连接数据库和打包部署我们走完了一个Spring Boot应用最基本的生命周期。这套组合IDEA Spring Boot Maven之所以成为Java后端开发的事实标准正是因为它们把大量繁琐的配置和底层细节封装起来让开发者能更专注于业务逻辑本身。我个人的体会是初期按照教程一步步走通很重要但更重要的是理解每个步骤背后的意图——为什么用MavenRestController做了什么application.yml是怎么被加载的多问几个为什么再结合官方文档和源码才能从“会用”走向“精通”。最后一个小建议把项目代码放到Git比如GitHub上管理这是另一个必备的技能起点。