高屋建瓴,从较高的角度看待技术世界
对java技术的分类:
- 技术类: 例如jdbc,反射,IO 没有该技术在java中就不能实现对应功能
- 规范类: 例如jdbc,JMS,定义了一套标准,但是具体实现由厂商负责
- 语法糖类: 自动封装箱,lambda,函数式编程等,减少了代码量,但是没有也可以用现有代码实现。
技术类
Applet
用于在网页上嵌入java程序,被flash取代,基本淘汰
ClassLoader
java 类加载机制,java将class文件加载到内存中后,会创建对应的class对象,
ClassLoader定义了类加载顺序,流程,和部分API可以让java开发人员定义自己的类加载机制,
可以通过ClassLoader实现查看现有class,加载外部class等功能。
IO
java读写文件的API,设计思想是面向流,BIO,阻塞读取
缺点: 慢
后来的JAVA IO 使用NIO重新实现了一遍
NIO
java网络访问的API,面对缓冲区,可以提高并发访问度,设计思想是AIO 异步IO
Serializable
java的序列化机制,可以将对象转化为字节进行存储,同时将字节转化为对象。
其实,主要是定义了一套序列化/反序列化的规范。 java内部使用
缺点: 慢
市场上使用的较多的:
google protobuf (序列化为字节)
protostuff (封装了protobuf的第三方工具包,简单易用)
KryoSerialize (序列化为字节)
google gson (序列化为JSON字符串)
alibaba fastjson (序列化为字符串 json格式)
xml,json都是一种序列化,对象转化字符串->字节的过程
Reflect
java的基本技术,可以通过reflect获取正在运行的对象的属性,调用方法,动态创建对象
破坏了java的封装性
Proxy
代理技术
分为静态代理,动态代理
java实现了Proxy的动态代理
其他动态代理: cglib (Spring中的动态代理)
Socket
java的网络编程技术,因为服务器和服务器之间交互,需要网络通讯,网络通讯的底层协议则是TCP/UDP协议,
因此java实现了Socket,底层封装TCP/UDP协议,
可以使开发人员根据ip,port就可以使用tcp/udp发送消息到对应服务器。
封装内容:
tcp/udp协议
断点重传,
失败反馈
数据包的封装
等
RMI(remote method invocation) 远程方法调用
RMI是RPC协议的一种java实现,使用的是Socket技术,更底层是TCP网络传输协议
功能: Socket实现了将消息传递到远程服务器,
RMI在Socket的基础上,实现了对消息的封装和拆封功能,然后,可以按照RMI规定的格式,将一个对象->RMI->特定格式的数据包->socket->远程服务器->接收数据包->RMI->翻译为对象
可以实现将一个对象直接传输到远程服务器上,或对远程服务器上的方法进行直接调用,返回结果。
说白了: 定义了一套调用规则,格式化对象和反格式化对象的规则.
双方共同准守,则可以传输对象和远程调用。
现在一般都不用RMI直接做远程方法调用,
1.面向的服务访问者不一定都是java程序,其他语言不支持RMI
2.效率,直接实现的RPC效率一般高于RMI
Servlet
查看java源码,会发现Servlet只是一个interface,接口.因此,servlet更像一种规范定义。
那么,servlet是什么场景下的规范定义。
Servlet一般用来定义 用户在浏览器发起请求,该请求指向具体处理逻辑。
即,开发人员编写Servlet表示接收http请求,abs.com/list -> 对应listServlet.java,这就是Servlet
问题1: 谁来控制abs.com/list -> list.Servlet,并返回数据
tomcat,jboss等web 容器,这些容器负责解析请求,转发到具体的处理对象,并且返回结果给页面。
问题2:Servlet重要吗
重要。java中的web底层服务都是通过Servlet实现,Spring底层也是实现的Servlet
问题3:Servlet可以被取代吗
可以,只是一种规范而已,也可以使用别的规范,不过java上没必要。
JSP (Java Server Pages)
JSP是JSP Engine + Servlet技术的实现,JSP支持在页面上编写Java代码和Html代码,编写完成后,需要使用JSPEngine将JSP生成为Servlet class,所以实际上,真正起作用的是具体的Servlet.
现在提倡前后端分离,所以JSP用的少了。
同类技术: ASP,PHP
SAX,DOM(XML)
XML和java没有关系,不过java内置了对XML的解析方式
SAX,DOM
JMS (Java Message Service)
java消息服务,说白了,也是一套标准,具体的实现由厂商实现,定义了一套在java内部通用的标准。开发者通过JMS,进行消息订阅和推送
和JDBC类似,开发者调用JMS,JMS厂商负责处理具体调用
JMS实现原理: Socket+观察者模式
JMS其他实现:ActiveMQ
消息服务中间件:
kafka,rocketmq,activemq,robbitMQ 等
规范类
JDBC
用于java程序链接数据库,进行命令的发送,数据的获取功能
数据库方,例如mysql,oracle,制定一套访问规则,按照规则正确的访问则可以远程进行数据的查询,sql语句的执行。
因为访问规则根据数据库不同而不同,所以每个数据库需要不同的驱动。
java同样制定了JDBC规范,即不管数据库如何访问,都必须遵守jdbc规范,否则无法使用JDBC进行访问。
因此,jdbc是java访问规范,数据库又有自己的访问规范,则数据库驱动是 从数据库访问到jdbc规范的转换的java实现。
使用方法: 注册驱动,调用驱动方法,驱动链接数据库进行操作。
JDBC的原理:
java的jdbc原理就是 使用类加载机制加载驱动,然后调用驱动内的方法实现。
规定使用:
- DriverManager管理驱动
- Connection管理连接 等规范
缺点:
- 破坏了类加载机制中的双亲委派
- 连接效率由驱动包保证,java代码不能保证
- JDBC是java使用规范,具体实现在驱动包中,由各个厂商维护
同类技术:
apache提供commons-dbutils作为另一套访问数据库的标准
jdbc的基础是ClassLoader技术,否则无法实现加载外部驱动
驱动: mysql-jdbc,oraclet-jdbc
JNDI(Java Naming and Directory Interface )
java提供的命名管理方式,通俗点讲是一种注册中心,服务提供方将自己的服务按照某个名称注册到JNDI上,服务使用方根据名称查找,使服务提供方和使用方解耦。
例如:
tomcat中将不同数据库驱动注册到一个JNDI的不同名称上,tomcat的web服务要使用时,通过JNDI获取对应的数据库连接
tomcat可以直接管理数据库连接池,使所有web服务共同使用。
Spring使用JNDI配置数据源
EJB
看了一些资料也没看明白是什么,大概理解为是一种规范,定义了EJB组件如何提供服务,需要实现哪些接口。
EJB是分布式的,所以核心技术是通过RMI实现。
现在的分布式技术一般都通过RPC实现,因为需要支持不同的语言和服务,采用的也不是EJB模式
语法糖类
jdk1.5
- 自动封装/拆箱
- foreach
- 泛型
- 静态导入
- 可变参数 Var args
- 枚举
- annotation
jdk1.7 - try-with-resources
- 字面值中使用下划线
- catch 多个类型异常
- 二进制字面值
- 类型推断
jdk1.8 - lambda
- 函数式接口
- 接口支持默认方法和静态方法
- 增强类型推断
- Stream Api
等