Portabilidad
Una aplicación escrita contra las especificaciones de JEE debería correr, sin cambios, en cualquier application server certificado: WildFly, Payara, WebLogic, etc.
JEE (Java Enterprise Edition, hoy llamada Jakarta EE) no es un programa ni un producto: es un conjunto de especificaciones construidas sobre Java SE para resolver los problemas comunes de las aplicaciones empresariales — servicios web, transacciones, seguridad, persistencia, mensajería — sin que cada equipo tenga que reinventarlos. Entre sus especificaciones más conocidas están:
| Especificación | Resuelve |
|---|---|
| Servlet | Recibir y responder peticiones HTTP |
| JPA | Mapear objetos Java a tablas de una base de datos relacional |
| EJB | Componentes de negocio con transacciones e inyección de dependencias gestionadas por el servidor |
| JMS | Mensajería asíncrona entre aplicaciones |
| CDI | Inyección de dependencias estandarizada |
| Bean Validation | Validar los datos de un objeto con anotaciones (@NotNull, @Size, …) |
Como es una especificación y no un producto, JEE por sí sola no se “usa”: la usa un application server que la implementa — Servlet, JPA, EJB y las demás piezas funcionando juntas dentro de un mismo proceso. Ejemplos de application servers que implementan el paraguas completo de JEE son WildFly, Payara (heredero de GlassFish), Open Liberty, WebLogic y WebSphere.
Un application server no es un lugar donde “se guarda” el código, como una carpeta o un repositorio: es un programa que se mantiene corriendo y que ejecuta tu aplicación dentro de sí mismo. Cuando decimos que “hacemos deploy”, esto es lo que pasa:
.war en JEE tradicional, un .jar en Spring Boot.java -jar app.jar, porque el servidor ya viene empaquetado adentro).Lo interesante ocurre justo después de arrancar. El servidor lee tus clases usando reflexión —la capacidad de Java de inspeccionar en tiempo de ejecución qué clases, métodos y anotaciones existen— y, según lo que encuentra, construye el comportamiento real de la aplicación:
@Entity, sabe que debe mapearla a una tabla de la base de datos.@GetMapping("/books"), registra esa ruta para que las peticiones HTTP a /books lleguen justo a ese método.@Autowired o @Service, crea el objeto —instancia la clase— y lo conecta con quien lo necesita: eso es la inyección de dependencias.@Transactional el proxy abre la transacción antes de llamar a tu método, y hace commit o rollback después, según si tu código lanzó una excepción o no.flowchart TD
A["Código fuente con anotaciones<br/>@Entity, @RestController, @Autowired..."] --> B["Compilar y empaquetar<br/>.war o .jar"]
B --> C["Deploy en el application server<br/>(o arranque de Spring Boot)"]
C --> D["El servidor escanea las clases<br/>por reflexión"]
D --> E["Resuelve las anotaciones:<br/>crea objetos, inyecta dependencias,<br/>genera proxies, registra rutas HTTP"]
E --> F["Aplicación en ejecución,<br/>lista para recibir peticiones"]
Este es el patrón que vas a encontrar una y otra vez en las próximas páginas: escribes una clase con anotaciones, y es el servidor —Spring Boot, en nuestro caso— quien la convierte en un objeto vivo, conectado con las demás piezas de la aplicación.
Portabilidad
Una aplicación escrita contra las especificaciones de JEE debería correr, sin cambios, en cualquier application server certificado: WildFly, Payara, WebLogic, etc.
Todo incluido
Transacciones distribuidas, seguridad declarativa, mensajería, persistencia e inyección de dependencias vienen resueltos por el servidor: no hay que ensamblarlos por separado.
Estandarización por comité
Las especificaciones las define un proceso abierto (el Jakarta EE Working Group), no un solo proveedor, lo que reduce la dependencia de una empresa en particular.
JEE aparece sobre todo en aplicaciones empresariales grandes: sistemas bancarios, aseguradoras, entidades de gobierno o corporativos que ya tienen infraestructura corporativa alrededor de un application server (por ejemplo WebLogic o WebSphere), y que necesitan transacciones distribuidas robustas, alta disponibilidad, clustering e integración con sistemas legados —colas de mensajería empresariales, por ejemplo— certificados y con soporte comercial.
Spring nació como reacción a esa complejidad: en vez de EJBs pesados, propuso construir la lógica de negocio con objetos Java simples (POJOs) a los que el framework les agrega, por fuera, inyección de dependencias, transacciones y AOP. Por eso a Spring se lo describe históricamente como una alternativa más liviana al JEE de EJB, no como un reemplazo del application server tradicional.
Spring Boot lleva esa idea un paso más allá: empaqueta Spring con configuración automática (auto-configuration) y un servidor Servlet embebido (Tomcat, por defecto), para que una aplicación se ejecute como un .jar independiente —java -jar app.jar— sin necesidad de instalar ni desplegar en un application server externo.
Spring Boot es, con distancia, el framework más usado hoy para construir APIs REST en Java, y es el que usamos en este curso. No es el único con ese espíritu: Quarkus (Red Hat) y Micronaut (Object Computing) siguen la misma idea —arranque rápido, poca configuración, aplicación autocontenida— optimizando además para contenedores y serverless; Helidon (Oracle) va en la misma línea y además puede correr directamente sobre especificaciones de MicroProfile.