乐趣区

关于后端:从零构建Java项目MavenSpringBootGit-02-奥斯丁项目

前两天我说要写个我的项目来继续迭代,有好多小伙伴都示意反对和激励,我的项目的第一篇这不就来了么~

我给我的项目取了个名字,英文名叫做:austin,中文名叫做:奥斯丁

名字倒没有什么特地的含意,我单纯感觉这个名字难看,说白了就是我喜爱。

在起我的项目名的时候,能够不要获得那么规矩。取零碎名字能够按本人想法来搞就行了,人家只有用了你的零碎,就天然「入乡随俗」了。

不聊别的了,进入明天的主题吧。

从零开始一个我的项目,也得搭建技术环境的,所以明天先来聊聊搭建技术环境的内容吧

本文主题纲要:Maven 和 SpringBoot 以及 Git

什么是 MAVEN?为什么要用 MAVEN?

Maven 是一个「项目管理」的工具

我记得以前我在大学的时候,还没用到 Maven,每次学习最头疼的就是各种的依赖 jar 包。当我学习到 Maven 的时候,这个工具给我的第一感觉就是:这货色就是一个「依赖包治理」的工具

初体验之后,直呼太 TM 香了!再也不必到处去找 jar 包了!

其实,Maven 不仅仅承当着「依赖包治理」性能,同时他在日常开发应用中也承当着「编译」、「测试」、「打包」、「部署」等等性能。

我在 日常开发 中罕用到的 maven 命令:

1、mvn compile 
2、mvn test 
3、mvn clean 
4、mvn pakage 
5、mvn install 
6、mvn deploy  
7、mvn versions:set -DnewVersion=xxxx  设置 Maven 的版本  
8、mvn dependency:tree  查看 maven 的依赖树(排查依赖很无效)​
罕用参数
-Dmaven.test.skip=true
-Dmaven.javadoc.skip=true

当初 Java 后端我的项目很多都是用 Maven 来作为「项目管理」的工具,至多我接触的都是。

有的人就好奇了:近几年不是有个后起之秀 Gradle

说实话,我是没用过(:不过我也去简略理解了一番。

据我理解到的,总的来说,Gradle 比 Maven 更灵便和简洁,目前多用在 Android 我的项目上。还有很重要的一点,绝对 Maven 而言,Gradle 学习老本更大

当初 Java 后端的我的项目也越来越轻量,很多时候也不须要那么地”灵便“(Maven 提供的性能根本够用)。对于简洁来说,XML 也不是不能看(毕竟当初大家都在 IDE 上开发嘛)。所以,这次我构建的我的项目也间接用的 Maven

不过啊,因为我是没深度应用过 Gradle,所以也不能说我用 Maven 比 Gradle 肯定要适合(:但至多,在当初,我认为 Maven 还能战 10 年

为什么 SPRINGBOOT

这次我选用 SpringBoot 作为我的项目的根底环境,至于为什么 SpringBoot,我先跟大家分享下群里的对话。

我记得有一天,有个小伙伴在群里问:明天我去面试了,面试官问我应用 SpringBoot 有什么益处

接着,另一个小伙伴答复:应用 SpringBoot 最大的益处,就是让我这种垃圾程度的开发都 入了行,做上了程序员。

我在大学时是学过 SSH 和 SSM 的,我学这些的时候还没用 Maven,那时候搭建环境就尤其麻烦了。(过后还专门写了博客记录本人是如何整合 SSH 和 SSM 的)

一个我的项目里会用好几种技术栈,不同的技术栈就须要有对应的配置(常见的 Spring、SpringMVC、Mybatis)等等,而后这些技术都须要兼容对应的版本(个别咱们是把这些技术整合到 Spring 上的)。当咱们要引入新的框架,那天然就须要对齐 Spring 版本并且有对应的配置文件。

那时候真的是 配置天堂(框架们都做得灵便,都反对咱们把可能须要改变的内容写到 XML 配置上,但随着工夫流逝,咱们慢慢发现:这些 XML 配置咱们都保护不动了 …)

基于这种背景下,SpringBoot 应运而生,它最显著的就是简化了咱们开发的配置工作。当一项技术能缩小开发时工作量都有一个特点:约定大于配置(开箱即用)

只有引入了 SpringBoot,那只有通过几行的代码就能疾速地从零写出对应的 HTTP 接口(可参考官网 SpringBoot 的 Quick Start)

以前咱们干这种事,须要整合 SpringMVC,须要配置一个 Tomcat 服务器,须要对齐它们的版本(是否兼容)….

我认为 SpringBoot 作为应用方,要理解以下两块内容:

一、当咱们我的项目咱们引入了 SpringBoot 的依赖 (spring-boot-starter-parent),点进去parent 就会发现 spring-boot-dependencies 这个 pom 定义了十分多「默认的依赖」。这使得咱们在我的项目中应用的时候,都不必写版本了(因为 SpringBoot 曾经默认帮咱们曾经写上了),还不必放心版本抵触的问题(:

二、在启动 SpringBoot 我的项目的时候,还会帮咱们初始化很多默认的配置。(这里也是一个面试常常考查的中央「主动配置 」)。总的来说,@SpringBootApplication 等同于上面三个注解:

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

其中 @EnableAutoConfiguration 是要害 (启用主动配置),外部实际上就去加载META-INF/spring.factories 文件的信息,而后筛选出以 EnableAutoConfiguration 为 key 的数据,加载到 IOC 容器中,实现主动配置性能!

当初新写的 Java 后端我的项目,根本都是用 SpringBoot 作为开发环境了(:毕竟是真的爽

\
作为程序员,我最烦的就是搞各种环境配置和版本依赖的问题(真正的脏累活),尽管很多时候只用搞一次,然而感觉很多时候就真的如下图:

为什么我的项目构造是多模块?

我搭建了我的项目,取了个名字叫:austin,而后我在 IDE 上新建了几个 Maven Module,目前别离是(前面可能还会新增):

  • common(根本信息 ->POJO/ 枚举配置)
  • support(Data 获取 ->DB/Redis/Elasticsearch)
  • service-api(服务接口)
  • service-api-imp(服务接口实现)
  • web(HTTP 接口)

最开始咱们初学写代码的时候,可没那么考究,间接在一个包下一把梭就完事了(:

起初,他们说要分包,不同模块的代码写到不同的包上。于是咱们会在我的项目下新建对应包(其实就是文件夹),比如说 dao/service/controller

而到当初,根本都是分模块了,不同职责的代码被分到对应的模块上。而 austin 直属下的 pom 文件就个别只用来治理依赖(把依赖和版本信息定义在父 pom 上,具体哪个子模块须要引入就好了)

<dependencyManagement>
  <dependencies>
    <!--mysql 驱动包 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.35</version>
    </dependency>
  </dependencies>
</dependencyManagement>

那么这种分模块又比以前分包好在哪里呢?

假如咱们是分包的,那相当于所有的代码写到一个模块上。每次当咱们批改时,咱们须要从新编译整个模块(可能我只改了 Dao 包的某个实现类,但在编译的时候会把整个模块都编译一遍)。

如果是分模块的话,咱们间接到模块下 mvn compile -Dmaven.test.skip=true 就完事了。

不过这只是一个方面,说服力如同也不太足。我认为最次要的是,咱们分模块了当前能够 复用

比方,当初我有 austin 这个我的项目,此时为了对数据进行解决,我须要去新建对应的 Flink 利用。可能受限于环境下,不会把 flink 相干的代码写在 austin 我的项目下

(这也只是举了个例子,我想表白的是:一个成熟的我的项目往往不只有一个 Git 地址就笼罩了整个性能。在绝大多数时候,不同的性能都会离开到不同的我的项目上)。

那不同的我的项目下,很有可能须要做的事件是有反复的(比方我都须要去读数据库获取数据)。那这时候,分模块的益处就体现进去了:能够间接引入对应的 jar 包(比方 support 包和 common 包)。

那就不必在两个不同的我的项目上,写截然不同的代码了(:可能共用一套代码

有没有小伙伴好奇为什么 apiapi-impl是分了两个模块的吗?这里是为了:如果当前引入了 RPC 调用,那咱们只须要提供 api 模块进来就好了,api模块的依赖个别很少。

(解决版本抵触是一件脏累活,人家嵌入你的 SDK 只是想用你的服务去获取对应信息,你别给人家整了一大堆毫无作用的依赖进去)

为什么 GIT

到这里,我的项目的架子曾经搭好了。我要把我的项目上传到 Gitee 跟大家欢快地游玩(:

Git 是一个版本控制工具。把 austin 被 Git 治理后,我每次提交的内容都会被看到(:这在多人合作中尤其重要

除此之外,有了“版本”的概念当前,用 Git 能够随便回退版本(有后悔药吃

我过后刚进去实习的时候,那家公司用的是 SVN(我过后对版本控制工具了解其实是很含糊的,反正在我过后看来,就是把写好的代码上传到地方服务器,只不过它能比照出每次批改的异同)

起初当前,在公司接触都是 Git 了(当初开发根本离不开 Git 了,这玩意自身还是比拟好学的,用起来还是挺爽的)

顺便发一波我日常用到的 Git 命令吧:

1. git clone  (克隆代码)
2. git checkout -b(新建分支)3. git checkout (切换分支)
4. git add / git commit /git push(这几步我根本都是在 IDE 上用快捷键实现,很少本人敲命令)5. git fetch (获取最新的批改信息)
6. git merge (合并代码)  
7. git stash /git pop (有的时候长期会用,把代码放到暂存区中)  
8. git reset --hard  (代码写烂了,间接回退吧)

个别 Git 我是一半用命令行,一半用 IDE 集成的工具。总的来说,怎么难受怎么来(没有限定说肯定要用命令行,我是本人怎么操作比拟快就怎么搞)

对于这个我的项目而言,我这里应用到 Git 最大的起因就是:有近程的仓库装载我的代码,并且你们能看到(:

Gitee 链接:https://gitee.com/austin

GitHub 链接:https://github.com/austin

总结

说实话,如果还没工作的人,我倡议多学学 Maven 和 Git 的根本应用(这样一来,去到公司就不必一脸懵逼了)

对于 SpringBoot 的学习是永无止境的,我集体的了解是,在理解了用法当前,能够尝试面向「面试题」进行学习(毕竟面试题面的内容大多数都是比拟外围的,至多不是偏门没有任何用处的)

austin 我的项目构建:

  • Maven:依赖包管径 + 项目管理(多模块)
  • SpringBoot:根底技术环境搭建(开箱即用)
  • Git:版本控制工具(代码上传至近程 Gitee)

明天就到这里吧。我花了一个早晨搭建了架子,两个早晨写了这篇文章。自从有了这个迭代我的项目的想法当前,早晨的效率嘎嘎地就下来了。

关注我的微信公众号【Java3y】来聊点不一样的!

【对线面试官 + 从零编写 Java 我的项目】继续高强度更新中!求 star!

原创不易!!求三连!!

退出移动版