b3t6 - LAB Java avanzado Flashcards
Cuáles son los directorios por defecto que usa Maven, y para qué sirven?
- src/main/java : donde guardaremos nuestras clases java fuente. Debajo de esta carpeta situaremos nuestras clases en distintos paquetes.
- src/main/resources : aquí almacenaremos los recursos (ficheros xml, ficheros de propiedades, imagenes, …) que pueda necesitar las clases java de nuestro proyecto. Igualmente aquí tienen que ir los ficheros de configuración de Spring o Hibernate por ejemplo.
- src/test/java : en dicha carpeta se guardan las clases de test que se encargarán de probar el correcto funcionamiento de nuestra aplicación. Aquí por ejemplo podemos guardar nuestros test unitarios de JUnit.
- src/test/resources : en esta carpeta guardamos los recursos que usan los recursos.
- target: donde deja los compilados
Qué partes tiene principalmente el pom.xml de Maven? Qué campos importantes tiene cada una?
-
Información básica de maven -> tiene la ruta del proyecto, el id del proyecto, la versión del proyecto y el tipo de empaquetado principalmente
– modelVersion -> versión de maven
– groupId -> rutal del proyecto
– artifactId -> id del proyecto
– version -> versión del proyecto
– packaging -> tipo de empaquetado para build del proyecto - Lista de dependencias -> en una lista “dependencies/dependecy/”
– groupId -> grupo de la dependencia en los repositorios maven
– artifactId -> id de la dependencia
– version -> versión de la dependencia
– scope -> El ámbito de aplicación de las dependencias, incluida la compilación, la provisión, el tiempo de ejecución, la prueba, el sistema y las exclusiones
El el campo scope de una dependecia del pom.xml de maven, qué opciones hay y qué son cada una?
- Compile -> Es la que se usa por defecto si no se pone. Dependencias necesarias para la construcción , por lo que estarán el el classpath de construcción
- Provided -> Dependencias que no aportamos en nuestro proyecto, porque ya están donde se vaya a desplegar el proyecto, por ejemplo en un contenedor web que ya tiene esas librerías
- Runtime -> Para las dependencias que se necesitan en tiempo de ejecución pero no antes, por ejemplo un driver jdbc. Por lo que estarán en el classpath de runtime
- Test -> Depencias que solo se usan en el runtime de los test, no de la aplicación
- System -> Parecido a provided. Deprecado
- Import -> para importar otros pom.xml
Qué fases tiene el ciclo de vida “default” de maven?
1.- validate
2.- compile
3.- test (segun los casos de prueba del directorio src/test/java)
4.- package (jar, war, ear, …)
5.- verify
6.- install (local repository)
7.- deploy (remote repository)
Cuál es el comando para usar la herramienta maven por consola?
mvn
Si hablamos de reflexión en java, cómo se usa en pocas palabras?
qué clases se usarían para manejar los aspectos principales?
Consiste en hacer código muy genérico, declarando métodos que recojen Object, para poder pasarle lo que sea, y luego dentro, obteniendo el nombre de la clase del objeto y el nombre de sus campos, poder hacer cosas con ellos.
objetc.getClass() –> devuelve un Class
clase.getSimpleName() -> devuelve un string con el nombre de la clase
clase.getDeclaredFlieds() -> devuelve un array de Fields, que son los atributos de la clase
atributo.getName() -> devuelve el nombre del Field (atrbuto)
Qué diferencias hay entre los siguientes conceptos de JDBC?
Driver
DriverManager
DataSource
Driver -> es específico del fabricante del SGBD
DriverManager -> Capa de más alto nivel para hacerle peticiones al Driver
DataSource -> Como el DriverManager pero para aplicaciones multiusuario, que internamente le pide al Driver y gestiona un pool de conexiones
Qué pasos usaríamos en JDBC para hacer consultas a una BBDD?
- Cargar en memoria el driver del fabricante -> Class.forName(“com.mysql.jdbc.Driver”
- Pedirle una conexión al Driver (o mediante el Datasource). Para ello se ha de especificar la URL de la BBDD, usuario y contraseña -> Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Ejemplos de URLs de distintos SGDB
// jdbc:oracle:thin:user/password@localhost:1521:SID
// jdbc:mysql://localhost/BD
// jdbc:postgresql://localhost/BD
// jdbc:sqlserver://localhost;instance=SQLEXPRESS;databaseName=BD
// jdbc:mariadb://localhost/BD
// jdbc:h2:mem:BD
// jdbc:hsqldb:mem:BD - Establecer la sentencia a ejecutar con Statement, PreparedStatement (precompiladas y configurable), o CallableStatement (Procedimientos almacenados) -> Statement stmt = conn.createStatement();
- Ejecutar la sentencia -> ResultSet rs = stmt.executeQuery(QUERY);)
- Recorrer el resultado con ResultSet
Qué son los modules en Java9 y en qué fichero se configuran?
Un module permite generar un jar pero sin todas las clases de los paquetes incluídos, evitando tener que incluir todas
Se configura en el fichero module-info.java donde se especifica lo que se exportará en el jar del module -> “export”, y las dependencias del module -> “requires”
module ModuloA {
exports com.arquitecturajava.core;
exports com.arquitecturajava.utils;
requires es.tai.modulo.user;
requires es.tai.modulo.bbdd;
}
En la programación funcional en java, qué anotación se ha inventado y para qué sirve?
La anotación @FunctionalInterface
Es una interfaz de un sólo método
Se usan para expresiones lambda, aplicando estas funciones sobre streams de objetos, encadenándolas
Se han creado varias especializaciones, como la clase Function
En java8, qué es la palabra default al declarar un método?
default public void g(){}
Se usa en clases abstractas o interfaces, para poder implementar el método a ese nivel, ya que por defecto no se puede en los métodos abstractos
Para qué se usan las siguientes especializaciones de @FunctionalInterface
// Consumer<T> --> metodo accept(T)
// Supplier<T> --> metodo get()
// Predicate<T>
// metodo and(Predicate) --> composicion
// metodo test(T) --> boolean
// Function<T,R>
// metodo apply(T) --> R
// metodo andThen(Function) --> composicion</T></T></T>
// Consumer<T> --> metodo accept(T) --> Función que no devuelve parámetros
// Supplier<T> --> metodo get() -> Función que no acepta parámetros, sólo devuelve
// Predicate<T> -> Función para hacer filtros en base a una condición
// metodo and(Predicate) --> composicion
// metodo test(T) --> boolean
// Function<T,R> -> Función normal
// metodo apply(T) --> R
// metodo andThen(Function) --> composicion</T></T></T>
Para qué sirven los siguientes métodos importantes de la interfaz Stream, que trabajan pasándole objetos funcionales (@FunctionalInterface o sus especializaciones)
// filter(Predicate) --> Stream // map(Function) --> Stream // reduce(BinaryOperator) -> T // forEach(Consumer) --> void
Convertir un List a stream -> nombres.stream()
// filter(Predicate) –> Stream -> Filtrar por una condición
// map(Function) –> Stream -> Mapear dos valores
// reduce(BinaryOperator) -> T -> Aplicar alguna fórmula
// forEach(Consumer) –> void
En qué consiste el patrón Optional?
Cuando un método devuelve un objeto Optional
// Otra clase (patron de diseño) es Optional (para tratar con los null). Algunos metodos importantes:
//
// of(T) -> Optional (construir el optional)
// get() –> T
// orElse(T) –> T
// orElseGet(Supplier) –> T
// ifPresent(Consumer) –> void
Con qué clases podemos poner en escucha un puerto para conexiones http?
ServerSocket y Socket