前两天我说要写个我的项目来继续迭代,有好多小伙伴都示意反对和激励,我的项目的第一篇这不就来了么~
我给我的项目取了个名字,英文名叫做: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 包)。
那就不必在两个不同的我的项目上,写截然不同的代码了(:可能共用一套代码
有没有小伙伴好奇为什么 api
和api-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!
原创不易!!求三连!!