Blog

Keep up to date with the latest news

当年很流行,现在已经淘汰的Java技术,请不要再继续学了!(替换)

一、EJB 2.x:笨重的恐龙

1.1 曾经的王者

EJB(Enterprise Java Beans)在 2000 年代初期可是 Java 企业级开发的 “扛把子”。那时候,企业级应用追求的是 “大而全”,EJB 2.x 就像一个无所不能的 “全能战士”,支持分布式事务、远程调用、安全管理等各种高端操作。

想象一下,当年的程序员们写代码的时候,那叫一个 “讲究”!每个 EJB 组件都得配好几个接口(Home 接口、组件接口),XML 配置文件能写得比代码还长。部署的时候,还得依赖笨重的应用服务器,启动一次服务器得喝杯咖啡、吃个包子的功夫。

1.2 为什么被淘汰?

复杂到让人头秃:EJB 2.x 的配置和开发流程简直就是一场噩梦。写一个简单的业务逻辑,得先写接口,再写实现类,然后配置各种 XML 文件,最后还得部署到特定的应用服务器上。这一套流程下来,没个把小时根本搞不定。

性能问题:由于 EJB 2.x 采用了重量级的架构,每次远程调用都得经过层层封装,性能损耗严重。在高并发场景下,它就像一头笨重的恐龙,跑都跑不动。

轻量级框架崛起:随着 Spring、Hibernate 等轻量级框架的兴起,EJB 2.x 的笨重和复杂显得格格不入。这些框架不仅开发效率高,而且性能更好,逐渐取代了 EJB 的地位。

1.3 替代方案

现在,我们有了更简单、更高效的解决方案 ——Spring Boot 和 Spring Cloud。Spring Boot 就像一个 “全能助手”,帮你自动配置各种依赖,让你专注于业务逻辑的实现。而 Spring Cloud 则提供了一整套微服务解决方案,让你轻松构建分布式系统。

举个例子,以前用 EJB 2.x 写一个简单的 Hello World,得写一堆接口和配置文件。现在用 Spring Boot,只需要一个注解就能搞定:

@RestController

public class HelloController {

@GetMapping("/hello")

public String hello() {

return "Hello, World!";

}

}

就这么简单!而且部署的时候,直接打成一个 JAR 包就能运行,再也不用依赖笨重的应用服务器了。

二、Struts 1.x:老掉牙的诺基亚

2.1 辉煌的过去

Struts 1.x 在 2000 年代初期可是 Java Web 开发的 “标配”。那时候,MVC 模式刚刚兴起,Struts 1.x 就像一个 “启蒙老师”,教会了无数程序员如何进行 Web 开发。

Struts 1.x 的核心是基于 Servlet 和 JSP 的,它通过配置文件来定义 URL 和 Action 的映射关系。那时候的程序员们写代码的时候,都得小心翼翼地配置 struts-config.xml 文件,生怕一个不小心就把整个系统搞崩了。

2.2 被淘汰的原因

配置繁琐:Struts 1.x 的配置文件简直就是一场灾难。一个简单的 URL 映射,得在 struts-config.xml 里写一大堆配置。而且,如果项目稍微复杂一点,配置文件就会变得臃肿不堪,维护起来非常困难。

安全漏洞:Struts 1.x 存在严重的安全漏洞,比如著名的 S2-001 漏洞,曾经让无数企业的系统陷入瘫痪。这些安全漏洞不仅给企业带来了巨大的损失,也让 Struts 1.x 的声誉一落千丈。

社区维护不足:随着时间的推移,Struts 1.x 的社区逐渐萎缩,不再有新的功能和安全更新。而现代 Web 开发框架如 Spring MVC、Spring Boot 等,则拥有强大的社区支持,不断推出新的功能和优化。

2.3 替代方案

现在,我们有了更强大、更安全的 Web 开发框架 ——Spring MVC 和 Spring Boot。Spring MVC 就像一个 “智能管家”,帮你处理 URL 映射、请求参数绑定、视图渲染等各种繁琐的操作。而 Spring Boot 则让你彻底告别繁琐的配置,专注于业务逻辑的实现。

举个例子,以前用 Struts 1.x 写一个简单的登录功能,得配置 struts-config.xml 文件,写 Action 类、FormBean 类,然后还要配置 JSP 页面。现在用 Spring Boot,只需要一个 Controller 就能搞定:

@RestController

public class LoginController {

@PostMapping("/login")

public String login(@RequestParam String username, @RequestParam String password) {

// 处理登录逻辑

return "登录成功";

}

}

就这么简单!而且 Spring Boot 还提供了强大的安全支持,比如 Spring Security,让你的系统更加安全可靠。

三、JSP:被前后端分离抛弃的 “老古董”

3.1 曾经的 “全栈开发”

JSP(Java Server Pages)在 2000 年代初期可是 Web 开发的 “主力军”。那时候,前后端还没有分离,JSP 可以包揽全部,既实现静态页面,又实现动态代码逻辑,全部都在一个 JSP 文件里面。一个程序员既是前端,又是后端。

想象一下,那时候的程序员们写 JSP 页面的时候,得在 HTML 代码里嵌入 Java 代码,然后通过 Servlet 来处理请求。虽然这种方式在当时很流行,但随着项目规模的扩大,维护起来变得非常困难。

3.2 为什么被淘汰?

前后端混合:JSP 页面里既有 HTML 代码,又有 Java 代码,导致前后端逻辑混杂在一起。这不仅让代码难以维护,也不利于团队协作。前端开发人员和后端开发人员得在同一个文件里修改代码,经常会发生冲突。

开发效率低:每次修改 JSP 页面后,都得重新编译、部署,然后才能看到效果。这对于快速迭代的现代 Web 开发来说,简直就是一场灾难。

现代前端框架崛起:随着 React、Vue、Angular 等现代前端框架的兴起,前后端分离成为主流。前端开发人员可以专注于页面的交互和展示,后端开发人员则专注于业务逻辑的实现。这种分工明确的开发模式,大大提高了开发效率。

3.3 替代方案

现在,我们有了更高效、更专业的解决方案 —— 前后端分离。后端开发人员可以使用 Spring Boot 来构建 RESTful API,前端开发人员则使用 React、Vue 等现代前端框架来开发页面。

举个例子,以前用 JSP 写一个用户列表页面,得在 JSP 文件里嵌入 Java 代码来从数据库中获取数据,然后通过循环来渲染页面。现在,后端用 Spring Boot 提供 API:

@RestController

public class UserController {

@GetMapping("/users")

public List getUsers() {

// 从数据库中获取用户列表

return userService.getUsers();

}

}

前端用 Vue 来调用 API 并渲染页面:

这样,前后端分离后,开发效率大大提高,代码也更加易于维护。

四、Swing:丑到哭的桌面应用

4.1 曾经的桌面霸主

Swing 是 Java 早期代替 AWT 的桌面应用 GUI 开发工具包。在 2000 年代初期,Swing 可是桌面应用开发的 “标配”。那时候,程序员们用 Swing 开发了各种桌面应用,比如办公软件、财务软件等。

不过,Swing 的界面设计真的是一言难尽。那时候的 Swing 应用界面,就像一个 “丑八怪”,按钮、文本框等组件的样式都非常老旧,而且很难进行定制。

4.2 为什么被淘汰?

界面丑陋:Swing 的界面设计实在是太丑了!按钮、文本框等组件的样式都是系统默认的,很难进行个性化定制。在这个追求用户体验的时代,Swing 的界面设计显然已经跟不上潮流了。

性能问题:Swing 的性能也不是很好。在处理复杂的界面和大量数据时,Swing 应用的响应速度会变得很慢,用户体验非常差。

移动和 Web 应用兴起:随着智能手机和平板电脑的普及,移动应用和 Web 应用成为主流。桌面应用的市场份额逐渐萎缩,Swing 也逐渐失去了用武之地。

4.3 替代方案

现在,我们有了更现代、更美观的桌面应用开发框架 ——JavaFX、Flutter Desktop、Electron 等。JavaFX 是 Java 官方推出的新一代桌面应用开发框架,它提供了更丰富的界面组件和更强大的动画效果。Flutter Desktop 和 Electron 则是跨平台的桌面应用开发框架,可以让你用一套代码开发出在 Windows、Mac、Linux 等多个平台上运行的应用。

举个例子,用 JavaFX 开发一个简单的计算器应用,界面可以做得非常美观:

import javafx.application.Application;

import javafx.geometry.Insets;

import javafx.scene.Scene;

import javafx.scene.control.Button;

import javafx.scene.control.TextField;

import javafx.scene.layout.GridPane;

import javafx.stage.Stage;

public class Calculator extends Application {

private TextField inputField;

public static void main(String[] args) {

launch(args);

}

@Override

public void start(Stage primaryStage) {

primaryStage.setTitle("计算器");

GridPane grid = new GridPane();

grid.setPadding(new Insets(10));

grid.setVgap(8);

grid.setHgap(10);

inputField = new TextField();

GridPane.setConstraints(inputField, 0, 0, 4, 1);

grid.getChildren().add(inputField);

String[] buttons = {"7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+"};

int row = 1;

int col = 0;

for (String button : buttons) {

Button btn = new Button(button);

btn.setOnAction(e -> handleButtonClick(button));

GridPane.setConstraints(btn, col, row);

grid.getChildren().add(btn);

col++;

if (col > 3) {

col = 0;

row++;

}

}

Scene scene = new Scene(grid, 300, 275);

primaryStage.setScene(scene);

primaryStage.show();

}

private void handleButtonClick(String button) {

if (button.equals("=")) {

try {

double result = evaluate(inputField.getText());

inputField.setText(String.valueOf(result));

} catch (Exception e) {

inputField.setText("错误");

}

} else {

inputField.setText(inputField.getText() + button);

}

}

private double evaluate(String expression) {

// 简单的表达式求值逻辑

return 0;

}

}

这样的界面是不是比 Swing 的界面好看多了?

五、Java Applets:被浏览器抛弃的 “插件”

5.1 曾经的 Web 交互利器

Java Applets 是一种嵌入在网页中的 Java 程序,它可以在浏览器中运行,实现丰富的交互效果。在 2000 年代初期,Java Applets 可是 Web 开发的 “潮流”,很多网站都用它来实现游戏、动画等功能。

不过,Java Applets 的安全性问题一直是个大麻烦。由于它可以在浏览器中执行本地代码,很容易被黑客利用来攻击用户的计算机。

5.2 为什么被淘汰?

安全性问题:Java Applets 的安全性问题一直是个大隐患。黑客可以利用 Java Applets 来窃取用户的信息、控制用户的计算机等。为了解决这些安全问题,现代浏览器逐渐停止了对 Java Applets 的支持。

性能问题:Java Applets 的性能也不是很好。由于它需要在浏览器中启动 Java 虚拟机,加载时间较长,而且在运行过程中会占用大量的系统资源。

HTML5 崛起:随着 HTML5 的普及,Web 开发变得更加简单、高效。HTML5 提供了丰富的 API 和标签,可以实现各种交互效果和动画,完全可以替代 Java Applets 的功能。

5.3 替代方案

现在,我们有了更安全、更高效的 Web 交互技术 ——HTML5、WebAssembly、JavaScript 框架等。HTML5 提供了 Canvas、SVG 等标签,可以实现复杂的图形和动画效果。WebAssembly 则允许我们将其他语言编写的代码编译成 WebAssembly 模块,在浏览器中高效运行。而 JavaScript 框架如 React、Vue 等,则提供了强大的前端开发能力,让我们可以轻松构建出复杂的 Web 应用。

举个例子,用 HTML5 的 Canvas 标签来实现一个简单的动画:

这样的动画效果是不是比 Java Applets 更好看、更流畅?

六、SOAP/JAX-WS:繁琐的 XML 协议

6.1 曾经的企业级通信标准

SOAP(Simple Object Access Protocol)和 JAX-WS(Java API for XML Web Services)是早期企业级应用中常用的通信协议。它们基于 XML 格式,提供了强大的功能,如事务处理、安全认证等。

不过,SOAP 和 JAX-WS 的配置和开发流程非常繁琐。每次调用一个 Web 服务,都得生成大量的 XML 文件,配置各种参数。而且,XML 格式的数据在传输过程中会占用大量的带宽,性能也不是很好。

6.2 为什么被淘汰?

复杂的配置:SOAP 和 JAX-WS 的配置和开发流程非常繁琐。写一个简单的 Web 服务,得生成大量的 XML 文件,配置各种参数。这对于现代快速迭代的开发来说,简直就是一场灾难。

性能问题:SOAP 和 JAX-WS 基于 XML 格式,数据在传输过程中会占用大量的带宽。而且,XML 的解析和序列化也会消耗大量的系统资源,导致性能下降。

轻量级协议崛起:随着 RESTful API 和 RPC 等轻量级协议的兴起,SOAP 和 JAX-WS 的繁琐和性能问题显得格格不入。这些轻量级协议不仅开发效率高,而且性能更好,逐渐取代了 SOAP 和 JAX-WS 的地位。

6.3 替代方案

现在,我们有了更简单、更高效的通信协议 ——RESTful API 和 RPC。RESTful API 基于 HTTP 协议,使用 JSON 格式传输数据,开发起来非常简单。而 RPC 则提供了更高效的远程过程调用机制,适用于分布式系统。

举个例子,用 Spring Boot 来构建一个 RESTful API:

@RestController

public class UserController {

@GetMapping("/users/{id}")

public User getUser(@PathVariable Long id) {

// 从数据库中获取用户信息

return userService.getUser(id);

}

@PostMapping("/users")

public User createUser(@RequestBody User user) {

// 创建用户

return userService.createUser(user);

}

}

这样的 API 是不是比 SOAP 和 JAX-WS 简单多了?

七、Ant:笨重的构建工具

7.1 曾经的构建 “老大哥”

Ant 是一种基于 XML 配置的构建工具,它在 2000 年代初期可是 Java 项目的 “标配”。那时候,程序员们用 Ant 来编译代码、打包部署、运行测试等。

不过,Ant 的配置文件非常繁琐。一个简单的构建任务,得在 build.xml 文件里写一大堆配置。而且,Ant 的语法比较复杂,学习曲线比较陡峭。

7.2 为什么被淘汰?

配置繁琐:Ant 的配置文件非常繁琐。一个简单的构建任务,得在 build.xml 文件里写一大堆配置。而且,Ant 的语法比较复杂,学习起来比较困难。

缺乏依赖管理:Ant 本身不提供依赖管理功能,需要借助其他工具来管理项目的依赖。这对于现代项目来说,非常不方便。

现代构建工具崛起:随着 Maven 和 Gradle 等现代构建工具的兴起,Ant 的繁琐和功能不足显得格格不入。这些现代构建工具不仅提供了强大的依赖管理功能,而且配置更加简单,开发效率更高。

7.3 替代方案

现在,我们有了更高效、更智能的构建工具 ——Maven 和 Gradle。Maven 基于约定优于配置的原则,提供了强大的依赖管理和项目构建功能。Gradle 则采用了 Groovy 或 Kotlin 脚本,更加灵活和高效。

举个例子,用 Maven 来管理项目的依赖和构建:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.example

my-project

1.0.0

org.springframework.boot

spring-boot-starter-web

3.2.0

org.springframework.boot

spring-boot-maven-plugin

这样的配置是不是比 Ant 的 build.xml 文件简单多了?

八、Log4j 1.x:安全隐患的 “定时炸弹”

8.1 曾经的日志 “王者”

Log4j 1.x 是 Java 开发中最常用的日志框架之一。它提供了灵活的日志记录功能,可以将日志输出到控制台、文件、数据库等各种地方。

不过,Log4j 1.x 存在严重的安全漏洞。2021 年,Log4j 1.x 的一个远程代码执行漏洞(CVE-2021-44228)震惊了整个 IT 行业,导致无数企业的系统陷入瘫痪。

8.2 为什么被淘汰?

安全漏洞:Log4j 1.x 存在严重的安全漏洞,如 CVE-2021-44228。这些安全漏洞不仅给企业带来了巨大的损失,也让 Log4j 1.x 的声誉一落千丈。

维护停止:Apache 在 2015 年宣布不再维护 Log4j 1.x,这意味着不再有新的安全更新和功能改进。而现代日志框架如 Logback、Log4j 2 等,则拥有强大的社区支持,不断推出新的功能和优化。

功能不足:Log4j 1.x 的功能相对较为简单,无法满足现代项目的需求。例如,它不支持异步日志、动态日志级别调整等功能。

8.3 替代方案

现在,我们有了更安全、更强大的日志框架 ——Logback 和 Log4j 2。Logback 是 Log4j 的升级版,它提供了更高效的日志记录功能和更灵活的配置方式。Log4j 2 则在 Log4j 1.x 的基础上进行了重大改进,支持异步日志、插件化架构等功能。

举个例子,用 Logback 来配置日志输出:

%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

这样的配置是不是比 Log4j 1.x 的配置文件简单多了?

九、Java Web Start:被时代抛弃的 “启动器”

9.1 曾经的桌面应用 “启动器”

Java Web Start 是一种不依赖于浏览器的技术,允许用户直接从桌面运行 Java 应用程序。通过下载和安装 JNLP(Java Network Launch Protocol)文件,Java Web Start 可以在本地环境中运行基于 Java 的应用程序。

不过,Java Web Start 的用户体验并不是很好。每次启动应用程序都得下载大量的 JAR 文件,而且启动速度也比较慢。

9.2 为什么被淘汰?

用户体验差:Java Web Start 的用户体验并不是很好。每次启动应用程序都得下载大量的 JAR 文件,而且启动速度也比较慢。这对于现代用户来说,是无法接受的。

安全性问题:Java Web Start 的安全性问题也一直是个大隐患。黑客可以利用 JNLP 文件来执行恶意代码,攻击用户的计算机。

现代部署方式崛起:随着 Docker、Kubernetes 等容器化技术的兴起,Java 应用的部署变得更加简单、高效。现代应用通常会被打包成 Docker 镜像,然后通过容器编排工具来进行部署和管理。

9.3 替代方案

现在,我们有了更简单、更高效的部署方式 ——Docker 和 Kubernetes。Docker 可以将应用程序及其依赖打包成一个镜像,然后在任何环境中运行。Kubernetes 则提供了强大的容器编排功能,让我们可以轻松管理大规模的容器化应用。

举个例子,用 Docker 来打包一个 Spring Boot 应用:

FROM openjdk:17 ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java", "-jar", "/app.jar"]

然后,通过 Docker 命令来运行应用:

docker build -t my-app . docker run -p 8080:8080 my-app

这样的部署方式是不是比 Java Web Start 方便多了?

十、总结

好了,兄弟们,今天咱们聊了这么多曾经风光无限,现在却被时代淘汰的 Java 技术。这些技术虽然曾经辉煌过,但它们的时代已经过去了。如果你现在还在学这些过时的玩意儿,那可得抓紧时间更新你的技术栈了!

技术的发展是永无止境的,我们要紧跟时代的步伐,不断学习新的技术和框架。只有这样,我们才能在激烈的竞争中立于不败之地。