El multiverso de Java

El multiverso de Java

Este recorrido reúne once tecnologías del ecosistema Java, desde la plataforma base hasta los frameworks orientados a cloud. Cada sección explica para qué sirve la tecnología y muestra un ejemplo de código independiente.

Nota: Los ejemplos son independientes y muestran la idea central de cada tecnología. Algunos requieren dependencias, configuración o un servidor de aplicaciones para ejecutarse. No forman un único programa.

Plataforma base

1. JAVA SE (Java Standard Edition)

Java SE es la plataforma básica de Java. Incluye el lenguaje, las bibliotecas estándar y la máquina virtual de Java (JVM), que ejecuta el bytecode generado al compilar los archivos .java. Proporciona herramientas y clases para trabajar con cadenas, colecciones, archivos, fechas, concurrencia y entrada/salida. Es la base sobre la que se construyen tecnologías como Servlets, Spring, Hibernate y otras.

Código del concepto: Archivo: Main.java

public class Main {
    public static void main(String[] args) {
        String mensaje = "Hola desde Java SE";
        System.out.println(mensaje);
    }
}

Servidor web

2. SERVLETS

Un Servlet es un componente Java que se ejecuta dentro de un contenedor web, como Apache Tomcat, y atiende solicitudes HTTP. Puede recibir datos enviados por un navegador, ejecutar lógica y devolver una respuesta. Se utiliza para construir aplicaciones web del lado del servidor y permite controlar métodos como GET y POST. Los frameworks web modernos suelen ocultar parte de este trabajo, pero muchos se apoyan en el modelo de Servlet.

Código del concepto: Archivo: HolaServlet.java (Requiere la API Jakarta Servlet y un contenedor compatible.)

import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/hola")
public class HolaServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/plain;charset=UTF-8");
        response.getWriter().println("Hola desde un Servlet");
    }
}

3. JSP (JavaServer Pages)

JSP es una tecnología de Java para generar páginas web dinámicas. Permite combinar HTML con elementos JSP y, en aplicaciones tradicionales, expresiones o etiquetas que muestran datos procesados en el servidor. El contenedor transforma la página JSP en un Servlet para atender las solicitudes. En proyectos actuales suele preferirse separar la vista de la lógica de negocio y utilizar motores de plantillas o frameworks de interfaz.

Código del concepto: Archivo: saludo.jsp

<%@ page contentType="text/html;charset=UTF-8" %>
<%
    String nombre = request.getParameter("nombre");
    if (nombre == null || nombre.isBlank()) {
        nombre = "visitante";
    }
%>
<!DOCTYPE html>
Saludo
Hola, <%= nombre %>

Datos y persistencia

4. JDBC (Java Database Connectivity)

JDBC es la API estándar de Java para conectarse a bases de datos relacionales y ejecutar SQL. La aplicación obtiene una conexión mediante un controlador JDBC, prepara sentencias, envía consultas o actualizaciones y procesa los resultados. JDBC ofrece control directo sobre el SQL y las transacciones, pero exige escribir y mantener más código repetitivo que una solución ORM.

Código del concepto: (Requiere agregar el controlador JDBC correspondiente y disponer de una base de datos.)

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class ConsultaJDBC {
    public static void main(String[] args) throws Exception {
        String url = "jdbc:postgresql://localhost:5432/empresa";

        try (Connection conexion = DriverManager.getConnection(
                url, "usuario", "contrasena");
                PreparedStatement consulta = conexion.prepareStatement(
                    "SELECT id, nombre FROM empleados WHERE activo = ?")) {

            consulta.setBoolean(1, true);

            try (ResultSet resultado = consulta.executeQuery()) {
                while (resultado.next()) {
                    System.out.println(
                        resultado.getInt("id") + " - " +
                        resultado.getString("nombre")
                    );
                }
            }
        }
    }
}

5. HIBERNATE

Hibernate es un framework ORM (Object-Relational Mapping) que permite representar registros de una base de datos mediante objetos Java. En lugar de convertir manualmente cada fila SQL en un objeto, se definen entidades y Hibernate gestiona gran parte de esa conversión, así como operaciones de persistencia y relaciones. Puede generar SQL automáticamente, aunque sigue siendo importante entender las consultas y revisar su rendimiento.

Código del concepto: (Requiere Hibernate ORM y una configuración de conexión a la base de datos.)

import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity
public class Producto {
    @Id
    private Long id;

    private String nombre;

    public Producto() {}

    public Producto(Long id, String nombre) {
        this.id = id;
        this.nombre = nombre;
    }

    public Long getId() {
        return id;
    }

    public String getNombre() {
        return nombre;
    }
}

6. JPA (Jakarta Persistence)

JPA, actualmente conocida como Jakarta Persistence, es una especificación que define cómo mapear objetos Java a tablas relacionales y cómo realizar operaciones de persistencia. No es por sí misma una implementación: establece interfaces, anotaciones y reglas comunes. Hibernate es una de las implementaciones que pueden cumplir esa especificación. Gracias a JPA, el código de persistencia puede depender de un estándar y no directamente de una implementación concreta.

Código del concepto: Ejemplo de entidad y repositorio básico usando EntityManager. (Requiere un proveedor JPA, una unidad de persistencia y una base de datos configurados.)

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;

public class GuardarProducto {
    public static void main(String[] args) {
        EntityManagerFactory fabrica =
            Persistence.createEntityManagerFactory("miUnidad");

        EntityManager em = fabrica.createEntityManager();

        try {
            em.getTransaction().begin();

            Producto producto = new Producto(1L, "Teclado");
            em.persist(producto);

            em.getTransaction().commit();
        } finally {
            em.close();
            fabrica.close();
        }
    }
}

Ecosistema Spring

7. SPRING FRAMEWORK

Spring es un framework que facilita la construcción de aplicaciones Java mediante conceptos como inversión de control e inyección de dependencias. El contenedor de Spring crea y administra objetos llamados beans, y permite organizar la aplicación en componentes con responsabilidades claras. También ofrece módulos para acceso a datos, transacciones, seguridad y aplicaciones web. Su objetivo es reducir el acoplamiento y facilitar el mantenimiento y las pruebas.

Código del concepto: Ejemplo mínimo de inyección de dependencias con Spring. (Requiere las dependencias spring-context y configuración de componentes.)

import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Component
class SaludoServicio {
    public String obtenerSaludo() {
        return "Hola desde Spring";
    }
}

@Service
class MensajeServicio {
    private final SaludoServicio saludoServicio;

    @Autowired
    public MensajeServicio(SaludoServicio saludoServicio) {
        this.saludoServicio = saludoServicio;
    }

    public void imprimir() {
        System.out.println(saludoServicio.obtenerSaludo());
    }
}

8. SPRING BOOT

Spring Boot se construye sobre Spring y simplifica la creación y ejecución de aplicaciones. Ofrece configuración automática, dependencias agrupadas mediante starters y servidores web integrados, por lo que normalmente no hace falta configurar manualmente cada componente. Permite iniciar un proyecto rápidamente y concentrarse en la lógica de la aplicación, sin eliminar la posibilidad de personalizar la configuración cuando sea necesario.

Código del concepto: (Requiere un proyecto Spring Boot con la dependencia spring-boot-starter-web.)

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class Aplicacion {
    public static void main(String[] args) {
        SpringApplication.run(Aplicacion.class, args);
    }
}

@RestController
class HolaControlador {
    @GetMapping("/hola")
    public String hola() {
        return "Hola desde Spring Boot";
    }
}

9. SPRING CLOUD

Spring Cloud reúne herramientas para desarrollar sistemas distribuidos y arquitecturas de microservicios con Spring. Facilita tareas como configuración centralizada, descubrimiento de servicios, comunicación entre componentes, tolerancia a fallos y enrutamiento, según los módulos que se incorporen. No convierte automáticamente una aplicación en una arquitectura distribuida: ayuda a implementar patrones que deben elegirse y configurarse de acuerdo con las necesidades del sistema.

Código del concepto: Ejemplo de un servicio que obtiene configuración externa mediante Spring Cloud Config. (Requiere Spring Boot, spring-cloud-starter-config y un servidor Config Server configurado.)

Archivo: application.properties

spring.application.name=servicio-pedidos
spring.config.import=optional:configserver:http://localhost:8888

La aplicación solicita al servidor Config Server la configuración asociada a su nombre y entorno. La configuración remota debe existir en el repositorio configurado por ese servidor.

Cloud nativo y microservicios

10. QUARKUS

Quarkus es un framework Java orientado a contenedores y entornos cloud, diseñado para ofrecer tiempos de arranque y consumo de memoria reducidos. Realiza gran parte del trabajo de análisis y configuración durante la compilación, y ofrece extensiones para tecnologías como REST, persistencia y mensajería. Puede generar ejecutables nativos mediante GraalVM o Mandrel, aunque también puede ejecutarse sobre una JVM tradicional.

Código del concepto: (Requiere un proyecto Quarkus con la extensión REST.)

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

@Path("/hola")
public class HolaResource {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hola() {
        return "Hola desde Quarkus";
    }
}

11. MICRONAUT

Micronaut es un framework JVM para microservicios y aplicaciones serverless. Una de sus características principales es que realiza la inyección de dependencias y buena parte del análisis de componentes durante la compilación, reduciendo la dependencia de reflexión en tiempo de ejecución. Esto puede mejorar el arranque y el consumo de memoria, especialmente en ciertos despliegues cloud. También proporciona herramientas para crear controladores HTTP, clientes, configuración y acceso a datos.

Código del concepto: (Requiere un proyecto Micronaut con el módulo HTTP server y procesamiento de anotaciones configurados.)

import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;

@Controller("/hola")
public class HolaController {
    @Get
    public String hola() {
        return "Hola desde Micronaut";
    }
}

RESUMEN DE LAS DIFERENCIAS

  • Java SE es la plataforma base del lenguaje Java.
  • Servlets atienden solicitudes HTTP en el servidor.
  • JSP genera páginas web dinámicas.
  • JDBC permite ejecutar SQL directamente desde Java.
  • Hibernate es una implementación ORM.
  • JPA/Jakarta Persistence define el estándar de persistencia ORM.
  • Spring administra componentes y dependencias y ofrece módulos para aplicaciones.
  • Spring Boot simplifica la configuración y ejecución de Spring.
  • Spring Cloud aporta herramientas para sistemas distribuidos.
  • Quarkus optimiza aplicaciones Java para contenedores y cloud.
  • Micronaut prioriza el procesamiento en compilación y reduce el uso de reflexión en ejecución.

© Arturo Juárez Monroy