Temario sobre Java y Spring Boot
¿Cuál es la última versión de Java actualmente?
La última versión de Java es Java 23.
¿Cuál es la última versión de JDK?
La última versión del JDK es JDK 23.
¿Qué diferencia hay entre el JDK y el JRE?
El JDK (Java Development Kit) incluye herramientas para desarrollar aplicaciones Java, mientras que el JRE (Java Runtime Environment) solo permite ejecutar aplicaciones Java.
¿Qué es la programación funcional e imperativa?
La programación imperativa se centra en cómo se realiza una tarea mediante declaraciones y comandos, mientras que la programación funcional se basa en el uso de funciones como objetos de primera clase. Por ejemplo:
// Programación imperativa
int suma = 0;
for (int i = 1; i <= 10; i++) {
suma += i;
}
// Programación funcional
int suma = IntStream.rangeClosed(1, 10).sum();
¿A partir de qué versión de Java se implementó la programación funcional?
La programación funcional se implementó a partir de Java 8.
Características de la POO. Ejemplos de aplicación de cada uno.
- Encapsulamiento: Ocultar detalles internos de una clase. Ejemplo:
class CuentaBancaria {
private double saldo;
public void depositar(double cantidad) {
saldo += cantidad;
}
public double getSaldo() {
return saldo;
}
}
- Herencia: Permitir que una clase herede atributos y métodos de otra. Ejemplo:
class Vehiculo {
void acelerar() { System.out.println("Acelerando"); }
}
class Coche extends Vehiculo {
void abrirCofre() { System.out.println("Cofre abierto"); }
}
- Polimorfismo: Permitir que una misma operación se realice de diferentes maneras. Ejemplo:
class Animal {
void hacerSonido() { System.out.println("Sonido de animal"); }
}
class Perro extends Animal {
void hacerSonido() { System.out.println("Guau"); }
}
class Gato extends Animal {
void hacerSonido() { System.out.println("Miau"); }
}
- Abstracción: Simplificar la complejidad utilizando clases abstractas o interfaces. Ejemplo:
interface Forma {
double area();
}
class Circulo implements Forma {
private double radio;
public Circulo(double radio) { this.radio = radio; }
public double area() {
return Math.PI * radio * radio;
}
}
Diferencias entre una clase abstracta y una interfaz.
- Una clase abstracta puede tener implementación de métodos, mientras que una interfaz solo puede declarar métodos.
- Una clase puede implementar múltiples interfaces, pero solo puede extender de una clase abstracta.
- Ejemplo de clase abstracta:
abstract class Animal {
abstract void hacerSonido();
}
class Perro extends Animal {
void hacerSonido() { System.out.println("Guau"); }
}
- Ejemplo de interfaz:
interface Volador {
void volar();
}
class Pajaro implements Volador {
public void volar() { System.out.println("El pájaro vuela"); }
}
Diferencia entre HashMap y LinkedList. Ejemplos de implementación.
- HashMap: Almacena pares clave-valor y proporciona acceso rápido. Ejemplo:
HashMap map = new HashMap<>();
map.put("uno", 1);
map.put("dos", 2);
System.out.println(map.get("uno")); // Imprime 1
- LinkedList: Es una lista que permite el acceso secuencial. Ejemplo:
LinkedList list = new LinkedList<>();
list.add("elemento1");
list.add("elemento2");
System.out.println(list.get(0)); // Imprime "elemento1"
¿Cómo hacer un deploy?
El proceso de despliegue implica compilar la aplicación, empaquetarla (por ejemplo, en un archivo JAR o WAR) y subirla a un servidor o servicio en la nube. Ejemplo de comando para empaquetar con Maven:
mvn clean package
¿Cómo hacer pruebas de backend si no tienes un frontend?
Se pueden utilizar herramientas como Postman o cURL para enviar solicitudes HTTP a las APIs del backend y verificar las respuestas. Ejemplo de uso de cURL:
curl -X GET http://localhost:8080/api/usuarios
Diferencias entre Spring y Spring Boot.
¿Utilizaste control de versiones? ¿Cómo volver un commit atrás?
Sí, se utiliza Git como sistema de control de versiones. Para volver un commit atrás, se puede usar el comando
git checkout <commit_id>
.
¿Qué patrones de diseño conoces?
Conozco patrones como Singleton, Factory, Observer y Decorator. Ejemplo de patrón Singleton:
class Singleton {
private static Singleton instancia;
private Singleton() {}
public static Singleton getInstancia() {
if (instancia == null) {
instancia = new Singleton();
}
return instancia;
}
}
¿Qué es el principio SOLID?
SOLID es un acrónimo que representa cinco principios de diseño de software:
- S: Single Responsibility Principle (Principio de Responsabilidad Única)
- O: Open/Closed Principle (Principio Abierto/Cerrado)
- L: Liskov Substitution Principle (Principio de Sustitución de Liskov)
- I: Interface Segregation Principle (Principio de Segregación de Interfaces)
- D: Dependency Inversion Principle (Principio de Inversión de Dependencias)
Ejemplo de un patrón de diseño que puedas implementar.
Un ejemplo es el patrón Factory, que permite crear objetos sin especificar la clase exacta del objeto que se creará:
interface Vehiculo {
void conducir();
}
class Coche implements Vehiculo {
public void conducir() { System.out.println("Conduciendo un coche"); }
}
class Camion implements Vehiculo {
public void conducir() { System.out.println("Conduciendo un camión"); }
}
class VehiculoFactory {
public static Vehiculo crearVehiculo(String tipo) {
if (tipo.equalsIgnoreCase("coche")) {
return new Coche();
} else if (tipo.equalsIgnoreCase("camion")) {
return new Camion();
}
return null;
}
}
¿Qué diseño puedes usar para una clase donde no se puede instanciar más de una vez?
Se puede utilizar el patrón Singleton para asegurar que solo haya una instancia de la clase en todo el programa.
class Singleton {
private static Singleton instancia;
private Singleton() {}
public static Singleton getInstancia() {
if (instancia == null) {
instancia = new Singleton();
}
return instancia;
}
}
¿Cómo manejarías las excepciones en un método? ¿Qué se utiliza para controlarlas?
Las excepciones se manejan utilizando bloques
try-catch para capturar excepciones y
finally para ejecutar código que debe ejecutarse independientemente de si se lanza una excepción. Ejemplo:
try {
int resultado = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("Error: División por cero");
} finally {
System.out.println("Bloque finally ejecutado");
}
¿Qué diferencia hay entre el JDK y el JRE?
El JDK (Java Development Kit) es un paquete completo que incluye herramientas para desarrollar, compilar y ejecutar aplicaciones Java, mientras que el JRE (Java Runtime Environment) solo proporciona los componentes necesarios para ejecutar aplicaciones Java. Es decir, el JDK incluye el JRE.
¿Qué es la programación funcional e imperativa?
La programación funcional se basa en el uso de funciones puras, evitando estados mutables y efectos secundarios. En cambio, la programación imperativa se centra en cómo se deben realizar las tareas, utilizando declaraciones y cambios de estado. Java soporta ambos paradigmas, especialmente a partir de Java 8.
A partir de qué versión de Java se implementó la programación funcional?
La programación funcional se implementó en Java a partir de la versión 8, que introdujo características como las expresiones lambda y el API de Streams.
Características de la POO. Ejemplos de aplicación de cada uno.
- Encapsulamiento: Agrupar datos y métodos que operan sobre esos datos. Ejemplo: una clase
CuentaBancaria que tiene atributos privados como saldo y métodos públicos como depositar().
- Herencia: Permitir que una clase derive de otra. Ejemplo: una clase
Empleado que hereda de una clase Persona.
- Polimorfismo: Permitir que un mismo método tenga diferentes comportamientos. Ejemplo: el método
dibujar() puede ser sobrescrito en una clase Circulo y en una clase Rectangulo.
- Abstracción: Resaltar los aspectos esenciales de un objeto, ignorando los detalles. Ejemplo: una clase abstracta
Vehiculo que tiene métodos abstractos como mover().
Diferencias entre una clase abstracta y una interfaz.
Una clase abstracta puede contener implementaciones de métodos y estados (atributos), mientras que una interfaz solo puede contener declaraciones de métodos y constantes. Además, una clase puede extender solo una clase abstracta, pero puede implementar múltiples interfaces.
Diferencia entre HashMap y LinkedList. Ejemplos de implementación.
- HashMap: Almacena pares clave-valor y permite acceso rápido a los valores a través de la clave. Ejemplo:
HashMap edades = new HashMap<>();
edades.put("Juan", 30);
edades.put("Ana", 25);
- LinkedList: Es una lista que permite inserciones y eliminaciones eficientes. Ejemplo:
LinkedList nombres = new LinkedList<>();
nombres.add("Juan");
nombres.add("Ana");
¿Cómo hacer un deploy?
Para hacer un deploy de una aplicación Java Spring Boot, se puede empaquetar la aplicación en un archivo JAR ejecutable y desplegarlo en un servidor, como Tomcat o directamente en un servidor de aplicaciones que soporte Spring Boot. Esto se puede hacer usando herramientas como Docker o servicios en la nube como AWS, Azure, o Heroku.
¿Cómo hacer pruebas de backend si no tienes un frontend?
Se pueden realizar pruebas de backend utilizando herramientas como Postman para enviar solicitudes HTTP a las APIs y verificar las respuestas. También se pueden usar frameworks de pruebas como JUnit para crear pruebas unitarias y de integración.
Diferencias entre Spring y Spring Boot.
Spring es un framework completo que proporciona una infraestructura para el desarrollo de aplicaciones Java, mientras que Spring Boot es una extensión de Spring que simplifica la configuración y el despliegue de aplicaciones, proporcionando configuraciones predeterminadas y la capacidad de crear aplicaciones independientes.
¿Utilizaste control de versiones? ¿Cómo volver un commit atrás?
Sí, se puede usar Git como control de versiones. Para volver a un commit anterior, se puede usar el comando git checkout [commit_id] o git reset --hard [commit_id], dependiendo de si se desea mantener los cambios posteriores o no.
¿Qué patrones de diseño conoces?
Algunos patrones de diseño son el patrón Singleton, Factory, Observer, Strategy y Decorator. Cada uno resuelve diferentes problemas de diseño y promueve buenas prácticas en la arquitectura del software.
¿Qué es el principio SOLID?
SOLID es un acrónimo que representa cinco principios de diseño orientado a objetos que promueven la mantenibilidad y escalabilidad del software:
- S: Single Responsibility Principle (Principio de Responsabilidad Única)
- O: Open/Closed Principle (Principio de Abierto/Cerrado)
- L: Liskov Substitution Principle (Principio de Sustitución de Liskov)
- I: Interface Segregation Principle (Principio de Segregación de Interfaces)
- D: Dependency Inversion Principle (Principio de Inversión de Dependencias)
¿Qué SGBD utilizaste? ¿Qué conexiones hiciste?
He utilizado MySQL como SGBD, realizando conexiones a través de JDBC o utilizando Spring Data JPA para interactuar con la base de datos y realizar operaciones CRUD.
¿Sabes hacer consultas, subconsultas y relaciones entre tablas?
Sí, puedo realizar consultas SQL, subconsultas y definir relaciones entre tablas utilizando claves foráneas. También puedo utilizar ORM como Hibernate para gestionar estas relaciones de manera más sencilla en aplicaciones Java.
¿Qué diferencia existe entre DER y Diagrama de clases (UML)?
Un DER (Diagrama Entidad-Relación) se utiliza para modelar bases de datos y representar entidades y sus relaciones, mientras que un diagrama de clases UML se utiliza para representar la estructura de clases en un sistema orientado a objetos, incluyendo atributos y métodos.
¿Qué tipos de UML existen?
Existen varios tipos de diagramas UML, incluyendo:
- Diagrama de Clases
- Diagrama de Secuencia
- Diagrama de Casos de Uso
- Diagrama de Actividad
- Diagrama de Componentes
- Diagrama de Despliegue
¿Qué metodologías ágiles conoces?
Conozco metodologías ágiles como Scrum, Kanban y XP (Extreme Programming). Cada una tiene enfoques diferentes para la gestión de proyectos y desarrollo ágil.
¿Qué sirve el método hash code?
El método hashCode() se utiliza para generar un valor hash entero único para un objeto, lo que permite su uso eficiente en estructuras de datos como HashMap y HashSet. Es importante sobrescribir este método junto con equals() para mantener la consistencia.
¿Cuáles son las 2 herramientas para programar en Java?
Dos herramientas comunes para programar en Java son Eclipse y IntelliJ IDEA. Ambas ofrecen potentes características para el desarrollo de aplicaciones Java.
Diferencia entre interfaz y clase abstracta. ¿Cuándo usar una y cuándo otra?
Una interfaz se utiliza para definir un contrato que las clases pueden implementar, sin proporcionar implementación. Una clase abstracta puede proporcionar una implementación parcial y permite definir estados. Se debe usar una interfaz cuando se desea definir un comportamiento común sin imponer una jerarquía de clases, y una clase abstracta cuando se desea compartir código común entre clases relacionadas.
¿Qué es una API Rest?
Una API REST (Representational State Transfer) es un conjunto de reglas que permite la comunicación entre aplicaciones a través de HTTP, utilizando recursos identificados por URIs y proporcionando operaciones estándar como GET, POST, PUT y DELETE.
¿Qué es un modelo de datos?
Un modelo de datos es una representación abstracta de la estructura y la organización de los datos en un sistema, incluyendo las entidades, atributos y relaciones entre ellas. Se utiliza para diseñar y estructurar bases de datos.
¿Qué son los servicios RESTful?
Los servicios RESTful son servicios web que siguen los principios REST, permitiendo la comunicación entre sistemas mediante el intercambio de recursos a través de HTTP, utilizando un enfoque stateless y representaciones de recursos en formatos como JSON o XML.
¿Qué es un contenedor de servlets?
Un contenedor de servlets es un entorno que gestiona la ejecución de servlets, proporcionando servicios como la gestión de ciclos de vida, gestión de sesiones y manejo de solicitudes y respuestas HTTP. Ejemplos de contenedores son Apache Tomcat y Jetty.
¿Cuáles son los tipos de clases que existen?
Los tipos de clases en Java incluyen:
- Clases concretas: Implementan la lógica y pueden instanciarse.
- Clases abstractas: No se pueden instanciar y pueden contener métodos abstractos.
- Interfaces: Definen un contrato sin implementación.
- Clases anidadas: Clases definidas dentro de otras clases.
¿Qué es el ciclo de vida de un servlet?
El ciclo de vida de un servlet se compone de las siguientes fases:
- Inicialización: El contenedor de servlets carga el servlet y llama al método
init().
- Servicio: El contenedor llama al método
service() para manejar solicitudes.
- Destrucción: El contenedor llama al método
destroy() cuando el servlet se elimina.
¿Qué es Spring Security?
Spring Security es un módulo del framework Spring que proporciona autenticación y autorización para aplicaciones Java, permitiendo gestionar la seguridad de manera flexible y personalizada.
¿Qué es Hibernate?
Hibernate es un framework de mapeo objeto-relacional (ORM) que facilita la interacción con bases de datos mediante el uso de objetos Java, eliminando la necesidad de escribir consultas SQL complejas y proporcionando gestión automática de transacciones y conexiones.
¿Qué es el patrón DAO?
El patrón DAO (Data Access Object) es un patrón de diseño que proporciona una interfaz abstracta para interactuar con la base de datos, separando la lógica de acceso a datos de la lógica de negocio. Permite cambiar la implementación de la base de datos sin afectar al resto de la aplicación.
¿Qué es el patrón MVC?
El patrón MVC (Modelo-Vista-Controlador) es un patrón de diseño que separa la lógica de negocio (Modelo), la interfaz de usuario (Vista) y el control de la aplicación (Controlador), promoviendo la separación de preocupaciones y facilitando la mantenibilidad del código.
¿Qué es un middleware?
Un middleware es un software que actúa como intermediario entre diferentes aplicaciones o servicios, facilitando la comunicación y la gestión de datos entre ellos. Se utiliza para implementar funciones como autenticación, autorización y registro.
¿Qué es el framework Spring?
Spring es un framework de desarrollo de aplicaciones Java que proporciona una amplia variedad de herramientas y características para construir aplicaciones empresariales, facilitando la gestión de la configuración, la seguridad, la persistencia de datos y la creación de APIs REST.
¿Qué es el concepto de inyección de dependencias?
La inyección de dependencias es un patrón de diseño que permite que un objeto reciba sus dependencias de un contenedor en lugar de crearlas por sí mismo. Esto promueve un diseño más flexible y mantenible, facilitando las pruebas unitarias y la gestión de dependencias en aplicaciones complejas.
¿Qué es un proyecto maven?
Un proyecto Maven es un proyecto de software que utiliza Apache Maven como herramienta de gestión de proyectos, facilitando la construcción, gestión de dependencias y configuración de proyectos Java mediante un archivo de configuración pom.xml.
¿Cómo manejar errores en Java?
Los errores en Java se manejan utilizando excepciones. Se pueden lanzar excepciones utilizando la palabra clave throw y se pueden capturar con bloques try-catch. También se pueden definir excepciones personalizadas extendiendo la clase Exception.
¿Cómo realizar conexiones a bases de datos en Java?
Las conexiones a bases de datos en Java se pueden realizar utilizando JDBC (Java Database Connectivity). Se necesita cargar el controlador de la base de datos, establecer la conexión, crear una declaración y ejecutar consultas SQL. Alternativamente, se puede utilizar un framework ORM como Hibernate o Spring Data JPA para simplificar el proceso.
¿Qué es Spring Boot?
Spring Boot es un proyecto de Spring que simplifica la creación de aplicaciones Java basadas en Spring. Proporciona configuraciones automáticas y herramientas para facilitar el desarrollo y despliegue.
¿Qué es un archivo `application.properties`?
El archivo `application.properties` es un archivo de configuración utilizado por Spring Boot para definir propiedades de la aplicación, como la configuración de la base de datos, el puerto del servidor y otros ajustes específicos.
¿Cómo se puede manejar la configuración en diferentes entornos en Spring Boot?
Se pueden utilizar perfiles en Spring Boot para gestionar diferentes configuraciones según el entorno. Se pueden crear archivos como `application-dev.properties` y `application-prod.properties` para definir configuraciones específicas para desarrollo y producción.
¿Qué es el concepto de "auto-configuración" en Spring Boot?
La auto-configuración en Spring Boot permite que el framework configure automáticamente los beans y servicios necesarios según las dependencias disponibles en el classpath, reduciendo así la necesidad de configuración manual.
¿Cómo se pueden crear APIs REST en Spring Boot?
Se pueden crear APIs REST utilizando las anotaciones @RestController y @RequestMapping. Por ejemplo:
@RestController
@RequestMapping("/api")
public class UsuarioController {
@GetMapping("/usuarios")
public List obtenerUsuarios() {
return usuarioService.listarUsuarios();
}
}
¿Qué es un `@RestController` en Spring Boot?
`@RestController` es una especialización de la anotación `@Controller`, que indica que los métodos de la clase son controladores REST. Los métodos se serializan automáticamente a JSON o XML según el contenido solicitado.
¿Qué es un `@Bean` en Spring Boot?
La anotación `@Bean` se utiliza para declarar un método que devuelve un objeto que debe ser gestionado por el contenedor de Spring como un bean. Permite configurar objetos de forma programática.
¿Cómo se manejan las excepciones en Spring Boot?
Las excepciones se pueden manejar utilizando `@ControllerAdvice` para crear un controlador global de excepciones. También se pueden manejar excepciones específicas utilizando la anotación `@ExceptionHandler`.
¿Qué es Spring Data JPA?
Spring Data JPA es un proyecto que proporciona una forma simplificada de interactuar con bases de datos utilizando la API JPA (Java Persistence API). Permite crear repositorios para gestionar entidades sin necesidad de implementar métodos de acceso a datos.
¿Qué es un `@Configuration` en Spring Boot?
`@Configuration` es una anotación que indica que la clase contiene uno o más métodos de `@Bean`. Se utiliza para definir la configuración de la aplicación y la creación de beans en el contexto de Spring.
¿Cómo se inyectan dependencias en Spring Boot?
La inyección de dependencias en Spring Boot se realiza utilizando la anotación `@Autowired`, que permite que Spring gestione la creación y la inyección de instancias de beans en las clases que las necesitan.
¿Cómo se puede realizar la autenticación y autorización en una aplicación Spring Boot?
Se puede utilizar Spring Security para implementar autenticación y autorización en aplicaciones Spring Boot. Esto incluye la configuración de filtros de seguridad y la definición de roles y permisos para los usuarios.
¿Qué es un `@Value` en Spring Boot?
La anotación `@Value` se utiliza para inyectar valores de propiedades externas (como el archivo `application.properties`) en campos de la clase. Por ejemplo:
@Value("${app.nombre}")
private String nombreApp;
¿Cómo se puede hacer un test unitario en una aplicación Spring Boot?
Se pueden realizar pruebas unitarias en Spring Boot utilizando la biblioteca JUnit y la anotación `@SpringBootTest`, que carga el contexto de la aplicación para probar componentes específicos. Por ejemplo:
@SpringBootTest
public class UsuarioServiceTest {
@Autowired
private UsuarioService usuarioService;
@Test
public void testObtenerUsuarios() {
// Prueba lógica aquí
}
}
¿Qué es `Spring Boot Actuator`?
`Spring Boot Actuator` proporciona funcionalidades para monitorear y gestionar aplicaciones Spring Boot. Ofrece varios puntos finales para verificar la salud, métricas y otros aspectos de la aplicación en tiempo de ejecución.
¿Qué es `@Transactional` en Spring Boot?
La anotación `@Transactional` se utiliza para definir límites transaccionales en métodos o clases. Esto asegura que todas las operaciones dentro de la transacción se completen correctamente o se deshagan en caso de error.