java核心技术和优缺点

高屋建瓴,从较高的角度看待技术世界

对java技术的分类:

  1. 技术类: 例如jdbc,反射,IO 没有该技术在java中就不能实现对应功能
  2. 规范类: 例如jdbc,JMS,定义了一套标准,但是具体实现由厂商负责
  3. 语法糖类: 自动封装箱,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管理连接 等规范

缺点:

  1. 破坏了类加载机制中的双亲委派
  2. 连接效率由驱动包保证,java代码不能保证
  3. 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

协议

RPC
http
tcp/udp
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值