感谢邀请。
我自己也是一名软件开发工程师,目前在杭州某电子商务公司进行中间件软件的开发。职业生涯中用过C++,C#,Java,Python,Go等语言,使用最多的也是Java语言。接下来我就谈谈我对Java开发的一些理解,谈一下我是怎么学习Java的吧,希望能对想学习Java的有些帮助,能够抛砖引玉就很开心了。
Java语言学习Java语言之前,先来认识一下Java语言吧,这样对我们学习会有好处。
Java是一门面向对象编程语言,即经常说的OOP(Object Oriented Programming)。说起面向对象编程,大部分人在大学时应该都学过了C++语言,C++是很经典的面向对象语言。Java吸收了C++的OOP思想,同时也摒弃了C++中一些难以理解的元素,比如指针,多继承等。所以,Java语言同时具有了功能强大和简单易用的优点。
JVM说起Java,就不得不说Java的一个很重要的特性了,那就是JVM(Java Virtual Machine)。Java语言一经发布就收到了巨大的关注和欢迎,一门新的语言,能够迅速流行,肯定是在某些方面有着巨大的进步。尤其是在老前辈C,C++面前。
JVM是Java语言和同时代语言相比的一个重大突破。Java的口号是“Write Once, Run everywhere”。用Java语言编写的应用,只需编写一次,可以在各个平台运行,包括Window,Linux,Mac等。简言之,Java应用可以跨平台。目前有很多的跨平台语言,但是在当时,这可谓是一个巨大的突破。使用Java语言可以极大的减少跨平台应用的开发成本,收广大开发者和企业的欢迎。
JVM是如何做到跨平台呢?软件是运行在操作系统之上的,而不同的操作系统的内核,系统API都是不同的。这也导致了不同操作系统的软件不能在其他系统上直接运行。比如Windows的exe文件在Mac上无法运行。Mac的app软件在Windows上也无法运行。
计算机系统软件体系结构采用一种层的结构,有人说过一句名言:
计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决JVM也是采用了这种方法。即Java代码不是编译成可在各平台直接运行的二进制文件,而是编译为一种Class文件。Class文件运行在JVM中,JVM负责将Class文件翻译成各平台的二进制文件。通过引入JVM中间层,Java应用实现了跨平台功能。
JVM工作原理如下图所示:
在学习Java的时候,要记住Java的JVM特性。这样对后续的Java学习很有好处,比如后面我将要提到的动态代理,AOP等特性。
Java开发环境搭建知道了Java的JVM原理之后,搭建Java开发环境就很简单了。不同的操作系统上需要安装平台相关的Java开发工具,即常说的JDK,或JRE。
JDK = JRE + 开发工具。JRE是Java应用的运行时环境,是必须的。JDK包含了JRE和开发工具(比如调试,日志,监控等)。安装Java有两种方式:
安装文件安装:手动去Oracle官网下载安装文件,进行安装。
包管理工具安装:在Mac平台推荐使用Homebrew安装;Linux上使用apt-get或yum来安装。
Java IDE推荐工欲善其事必先利其器一个好的开发工具,能为我们提升效率。
Java IDE有很多,比较主流的有Eclipse和IntelliJ IDEA。强烈推荐IntelliJ IDEA,比Eclipse要强大很多,唯一的缺点是IntelliJ IDEA完整功能是收费的。不过,作为日常开发,社区办已经足够强大,满足我们的需求了。如果想使用IntelliJ IDEA商业版,可以购买,获得更好的体验。
另外,如果资金不足,可以去网上找找破解版本,作为学习使用。不过,还是推荐使用正版软件哦。Java一些容易混淆的概念我是从C#转Java的。C#是微软闭环的一个开发语言,刚开始接触Java时,还没开始写代码,就已经被Java各种概念弄的晕头转向。接下来我就理清一下那些容易混淆的概念。
Java1.6和Java6:关于Java的版本,经常看到Java 1.6和Java6的说法。其实Java 1.6和Java6是同样的版本,只是叫法不一样。目前在使用的版本一般都是Java 6或以上了。
Java SE,Java EE,Java ME:是很早的时候提出来的一些概念,现在基本已废弃了,其实可以不用关注了。但我还是简单说明一下吧,Java SE:Java Standard Edition,可以认为是Java的核心。Java EE:Java Enterprise Edittion:Java企业版,基于Java SE,添加了一些企业开发的特性,用于开发企业级的大项目。Java ME:Java Mobile Edition:移动端开发版本。现在基本没有这样的区分了,在Oracle下载Java时,也只有Java SE。Java SE就是Java。
J2EE:J2EE就是Java EE。这个概念也基本被废弃了。不用太关心。
Apache:Apache是一个开源软件基金会,也是一款Web服务器,同时还是一种武装直升机。。。。
学Java即学习Java的生态这是我自己感触最深的一点,学习Java最重要的就是要学习Java的生态。这也是刚学习Java时,大部分人比较迷茫的。学习其他语言时,主要的精力可能在学习语言本身。而学习Java,将会需要花费大量的精力来学习Java生态中的各个组件,类库,框架,产品等。当然Java语言本身也是很重要的,需要花很多时间来学习。下面我就列一下Java常用的组件吧:
Tomcat:Web容器。用于运行Java的Web应用。
Jetty:Web容器。
Maven:项目构建工具。大多数的项目都是使用maven构建的。
Gradle:角色同Maven,是Maven的下一代,升级版。但市场普及度不如Maven。
Spring:Java中最常用的框架。几乎所有的项目都会使用。我会在后面单独介绍。
Mysql:数据库。Java应用一般选择Mysql作为数据库。
Mybatis:数据库访问框架,简化数据库访问。
Netty:网络通信组件。简化网络编程。
log4j:Log for Java的缩写,一款日志框架。
junit:Java Unit的缩写,Java的单元测试框架。
Apache Commons:Apache提供的通用功能的类库。比如字符串处理,集合处理等。
上面列出的是现在使用比较多的框架,一些过时了的比如Structs,Hibernate就不列举了。框架太多了,一些过时的就不要去学习了,不要迷失在眼花缭乱的框架中。有时间可以慢慢了解。
SpringSpring框架,是目前Java生态中最重要,也是使用最广的一个框架了。Spring框架由最初提供的一些核心功能,发展到今天,已经是一个非常完整的生态了。
Java是一个大生态,Spring是这个大生态中的另一个大生态。为什么Spring如此重要,Spring提供了什么功能呢?
Spring最重要,最核心,最有价值的地方其实就两点:
IoC:Inverse of Control,控制反转。
AOP:Aspect Orentied Programming,面向切面编程。
什么是IoC?我第一次接触IoC时,我是一脸蒙圈的,我问了隔壁搞了一年多Java的哥们,什么是IoC,他噼里啪啦和我说了一通,什么解耦,依赖注入,Bean。完了我说,这个IoC有什么关系。
IoC是什么?如果要好理解,先从IoC这三个字母说起,Inverse of Control,控制反转。
那就要解释什么是控制反转了。我们来看下面这两段代码:
MysqlDB是Mysql数据库操作实现类
public class UserRepository {
private MysqlDB db;
public void insert(User user) {
db.insert(user);
}
}
IDB是一个接口,可能有Mysql,Oracle,Mondo等实现。
public class UserRepository {
private IDB db;
public void insert(User user) {
db.insert(user);
}
}
这两段代码的唯一区别就是一个使用了MysqlDB,一个使用了IDB。他们都是UserRepository的依赖。UserRepository依赖他们来实现数据库操作。
使用MysqlDB的代码中,UserRepository自己控制它依赖的组件是什么,是很明确的MysqlDB。注意这里出现了控制的字眼哦。
使用IDB的代码中,UserRepository自己不能控制它依赖的组件是什么,可能是MysqlDB,可能是OracleDB,也可能是MondoDB。
本来UserRepository依赖谁是它自己控制的,这也是绝大部分其他语言和Java代码使用的方式。但是使用IDB的代码中,控制权不在UserRepository自己这里,而是有外部来控制的。这个外部可能是其他类,可能是其他框架,总之,不是UserRepository自己。这就是控制反转。
所以,控制反转说的主要是类之间的依赖关系。当一个类将它依赖的一个具体类,变成一个抽象的接口时,这是控制反转的表现形式。那控制反转有什么好处呢?
还是以上面的例子举例:UserRepository真实想要的功能其实是“保存数据”,而不是“保存数据到Mysql”。可能今天使用Mysql,但某天发现数据量大了,需要迁移到Oracle获取更大的吞吐量,也可能使用Nosql的Mongo实现更灵活的弱Schema存储。如果使用具体的MysqlDB,代码就和MysqlDB耦合了,一旦更换了数据库,所有依赖MysqlDB的地方的代码都需要改。而采用IDB的方式,代码是不用修改的。是解耦的。而且使用接口还有个好处是,我们可以基于抽象的接口生成动态代理,来实现更高级的功能。也就是动态给Java类添加功能。
关于IoC下面的图解释的比较清楚:
图一中四个齿轮是互相啮合在一起,在软件的角度上,就是类互相耦合。
图二中四个齿轮不是啮合在一起的,而是通过IoC容器连接在一起,是解耦的。
还记得前面引用的那句话吗?
计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决IoC也是通过引入了额外的IoC容器来解决类之间的耦合问题。
图一
图二
AOPAOP:面向切面编程。我们可以看上面的图。向下的三个箭头是3个业务逻辑处理工程。他们处理了各自不同的逻辑。同时这3个业务处理都有打印日志和安全的问题。那么我们可以把这些通用的逻辑提取到一个公共的地方。就是AOP中的切面。日志和安全是两个切面,这两个切面是可以横切多个业务处理逻辑的。
使用AOP可以将一些公共的代码从各个业务类中剥离到切面中,提高系统的可维护性和扩展性。
Java进阶有了上面这些基础之后,基本算是Java入门了,开发基本的功能是可以了。接下来是一些进阶的推荐:
Java多线程编程。
Netty网络编程。
JVM调优,排查问题。
Spring MVC,Spring Boot。
RPC框架使用:Dubbo,Spring Cloud,gRPC。
消息中间件的使用。可以看看RocketMQ源码来学习。
容器:Docker,k8s等。(这个不是Java特有的,但是未来的趋势,值得学习)
以上就是我关于学习Java的一些思路吧,更多是从我自己的真实经历出发,希望能给大家一些参考吧。能力有限,有错误之处,还请大家帮着指正。
Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有