Jose Manuel Prieto Palacios

“Effective Java: Programming Language Guide”, Joshua Bloch, Publisher: Addison Wesley, First Edition June 01, 2001 (RESUMEN)

11/11/2009 · Dejar un comentario

<Capitulo 2>

- Crea métodos estáticos en lugar del constructor.

V: Te aseguras el singleton, no creas objetos, puedes devolver cualquier objeto.

D: una clase sin métodos públicos o privados no puede ser una subclase, no son

distinguibles de otros métodos estáticos.

- La clase singleton con el atributo como static final y el constructor privado. Un método getInstance()

que devuelva el atributo, siempre el mismo, no un objeto nuevo.

- Si quieres una clase abstrapta que no se pueda instanciar, pon un constructor privado.

- Evitar la creación de objetos duplicados.

String s = new String(“silly”); // DON’T DO THIS!

String s = “No longer silly”; // YES

- Evita métodos finally que terminen cualquier cosa.

 

<Capitulo 3>

- Sobrescribe siempre el método toString()

 

<Capitulo 4>

- (12) Minimiza el acceso a las clases y a sus métodos (public, private, protected)

- (13) Favorece las clases inmutables, aquellas cuyos casos no pueden ser modificados:

- no generes métodos que modifiquen el objeto.

- asegurate de que no halla métodos que puedan ser sobrescritos, por subclases.

- has todos los campos final, private

- (14) Favorece la composición sobre la herencia

- (15) Diseña y documenta la herencia o no la permitas.

- (16) Mejor las Interfaces que las clases Abstractas.

- (17) Usa las Interfaces solo para definir tipos.

- (18) Favorece lo estático sobre lo no estático.

 

<Capitulo 6: Métodos>

- (23) Comprueba que los parámetros son validos.

- (25) elige los nombres de los métodos con cuidado. En los parámetros, interfaces sobre clases

- (28) Escribe la documentación de lo que estas haciendo.

 

<Capitulo 7: Programación en general>

- (29) Minimiza el ámbito de las variables locales.

- Declararlas como si fuese la primera vez que las usas,

- Cerca de la declaración de una variable tiene que estar su inicialización.

- (30) Conoce y usa las librerías.

- (32) Evita String donde otros tipos son más apropiados. (enum, stringbuffer…)

- (33) Cuidado con el rendimiento de la concatenación de cadenas, usa StringBuffer.

- (34) Refiere a los objetos por sus interfaces: List subscribers = new ArrayList();

List subscribers = new Vector();

- (35) Mejor interfaces que reflexión. Reflexión: acceso programado a clases que se están ejecutando

- (38) Utiliza la convención de nombres establecida.

 

<Capitulo 8: Excepciones>

- (39) Usa las excepciones para condiciones especiales.

- (40) Usa el control de excepciones para condiciones recuperables y las excepciones run-time para

errores de programación.

- (41) Evita el uso innecesario del control de excepciones.

- (42) Favorece el uso de excepciones estandard.

- (43) Lanza las excepciones apropiadas para la abstracción.

- (44) Documenta las excepciones lanzadas en cada método

- (45) Incluye capturas de fallo de la información en los mensajes detallados.

- (46) El fallo en la invocación de un método debe dejar el objeto en el mismo estado en el que se

encontraba antes de la llamada.

- (47) No ignores las excepciones. No dejes una excepción sin tratar

 

<Capitulo 9: Hilos>

- (48) Sincroniza el acceso para compartir los datos modificables.

- (49) Evita la excesiva sincronización.

- (50) Nunca invoques un wait fuera de un bucle

- (51) No dependas del programador de tareas.

- (52) Documenta los hilos de seguridad

- (53) Evita la agrupación de hilos

 

<Capitulo 10: Serialización>

- (55) Considera personalizar la serialización, no aceptes la que viene por defecto.

→ Deja un ComentarioCategorías: Uncategorized
Etiquetado: ,

Agile Open Spain 2009: Resumen de las charlas a las que he asistido

25/10/2009 · 6 comentarios

Ha sido fabuloso. Hay luz al final del tunel. He podido conocer, tocar, palapar a gente que sabe y que sabe un huevo. Y creo que mis fustraciones son las fustraciones de todos: la autoformacion es muy jodida, cuesta mucho tiempo y golpes contra muros. Ademas, la recompensa esta en 10 años.

Viernes 23, prensetacion de Jose Manuel Beas: tenia escrito un simil con la escalada de grandes montañas. Mi replica: enseñame a escalar, quiero escalar contigo.

Sabado 24, sesiones:

[10h] [Artesania del Software] [Xavier Gost]

Se hablo de todo lo referente a realizar un codigo bonito y tambien de la industria en la que estamos. Se comento que todos deberiamos compartir conocimientos, ayudar al que esta empezando; sentarse al lado de el, hacer ejercicios con el para que aprenda… , “El software tieneque ser como un ensayo”, “tenemos que tener mas formacion en humanidades”, “Nuestro codigo lo escribimos para que otros lo lean”, “Tiene que ser un codigo cuya metafora se entienda universalmente, por ejemplo, no hacer metaforas sobre los Simpsons, dentro de X años a lo mejor nadie sabe quienes son” . “El codigo es tu ropa interior, la vas a enseñar y preocupate de que este limpia”.

Libros destacados:  realizos enlaces a Amazon que es lo primero que me aperce en el Google.
- Implementation Patterns. (Xavi tenia orgasmos al recordar el libro).
- Refactoring.
- Design Patterns.
- Analisis Patterns.
- Code Complete.
- Clean Code.
- Aprende a programar en 10 años (articulo).

Mis conclusiones: BUSCO MAESTRO DE KUNG FU, soy obediente, disciplando pero con tiempo limitado.

[11h] [Caminos de Adopcion Agil] [Angel Medinilla, Jorge Uriarte]

Se hablo de los problemas de implantar la metodologia ágil. La gente escribia problemas en un post-it y luego se agrupaban en la pizarra. Solo se rompio un post-it, “No hay tiempo”, explicacion del porqué “todos tenemos 24 horas”.

“Tendemos a las leyes de la Termodinamica: minima energia maximo caos”, somos vagos por naturaleza. “la regla de los 21 dias: s los 21 dias haciendo una misma cosa, ya no cuesta tanto”. “El 95% de la gestión de proyectos es comunicación”.  “Identifica a los innovadores e innovalo en ellos”, para que tu idea resulte elige primero a este grupo de personas que estan acostumbrados al cambio. “Ten una idea, busca a un amigo, meditalo, busca a un equipo”. “Proyecto POLARIS“.

“Libro: cambio sin miedo”, en ingles, no lo he encontrado mas alla de los libros de autoayuda. Que un innovador como yo, no los necesita.

[12h] [Agilismo de Guerrila: implementación desde abajo y sin permiso] [Xavier Gost]

“Hacer agilismo es tomar riesgos. El que busque un trabajo en el que ya se trabaje agil es un patas. Hay que hacerlo desde abajo”. “El poder esta en los programadores”. “Ataque y retirada tipo guerrilla”. “Nosotros somos el cambio”. “Todo codigo que toques, que tenga su test”. Si los jefes se mosquean por eso “evidencia que son unos mamones”, y que en la carta de despido lo pongan: despedido por hacer test. “Por ser lento no te echan”. “Integración continua, adoro Hudson“. “La transformacion conlleva dolor”. “Ser promiscuos con vuestro USB”, pasa la informacion, no te la quedes. “Quiero trabajar sin notarlo”. “Pregunta: ¿Como superas el desanimo?, Xavi: insultando, Jose Manuel Beas: llorando en el hombro de un amigo (argumentando un libro, creo)”. “La luz del dia es el mejor antiseptico”, que sea claro transparente.

[15h] [El alzamiento del hacker post-ágil] [No me acuerdo, sorry sorry]

El movimiento agil, lleva unos 10 años funcionando. Hay empresas que dicen que son agiles, porque es cool, pero no lo son. Dicen que lo son, pero a efectos practicos no. Comentaban que el nombre de la metodologia XP es “eXtreme Programming” y no “Agile”, porque el nombre no suena tan bien y asi el nombre no tendria tanta sonoridad, difusion, etc. Me parecio muy interesante esa manera de huir del Marketing, ademas de efectiva. Ninguna empresa dice que hace algo extremo.

Era la sesion post-comida y estaba en mala ubicacion para la explicacion, pero os dejo este enlace: Artisanal Retro-Futurism crossed with Team-Scale Anarcho-Syndicalism.

[16h] [Mortal Kombat, Ping Pong Programation] [Xavier Gost y Jose Manuel Beas]

Se hablo del “pair programming“, ventajas, desventajas. Y nos pusimos a realizar una sesion de “ping pong programming“. Nos lo pasamos muy bien. Fue muy interesante los comentarios de la gente acerca de como deberia ser el código.

Conclusiones: ¿Quién quiere hace conmigo un ping-pong-pair-programing?

[17h] [Conclusiones del Agile Open]

Ha sido todo un exito. Quiero más. Mcuhas gracias a los patrocinadores y a la organización. A la siguiente aunque sea de pago voy.

→ 6 comentariosCategorías: Contenedor
Etiquetado:

Agile Open Spain 2009 (pensamiento filosófico)

24/10/2009 · 1 comentario

Ayer asisti al primer Open Agile Spain, la verdad es que fue apasionante. El ambiente inmejorable. Estaban la mayoria de los patrocinadores, ya no solo pagando sino proponiendo ideas y cursos para las conferencias. Me parece admirable que estas personas que ya tienen sus propias empresas, que ganan dinero con ellas, participen con su dinero, con su tiempo y con su experiencia.

Este tipo de acciones desinteresadas, me llevan a pensar si vale la pena compartir informacion y conocimientos. La gran mayoria hemos sido educados dentro de los margenes del copyright y de estas son mis cosas, mis derechos… no estamos acostumbrados a que la gente comparta. Pero llevo un tiempo pensandolo, ¿que tiene de bueno compartir?

Hace tiempo escribi tres manuales, les puse licencia creative commons y los publique en Internet. Tambien me di publicidad en las paginas web que por entonces eran de las mas vistas dentro del ambito a lo que se referian mis manuales. Les permitia coger mis manuales y ponerlos dentro de sus paginas si ponian mi nombre y me enlazaban. Asi fue, la gente que tenia dudas me escribia, y de tantas cosas que me preguntaban aprendi. Esas dudas me aportaron mayor conocimiento de lo que habia podido recopilar en esos manuales. Hubo gente que me escribio para que les hiciera ese trabajo. Es decir encontre tambien trabajo gracias a los manuales. Pero no lo aproveche, quiza por que esperaba que ocurriese algo de una manera mas rapida (obtener rapidamente la recompensa) y porque la Universidad me estaba apretando. Comentar tambien que hay gente que me mandaba mails con dudas estupidas que estaban respondidas en el manual. Tenemos que leer mas y no darno por vencidos a la primera.

No vas a ganar dinero inmediatamente, creo que con un copyright tampoco mucho, pero si te comunicas con la gente te van a aportar ideas y causas que desconocias e intentando solucionar sus problemas aprendes mas. Si eres constante con esta manera de trabajar, te reportara a lo largo del tiempo un beneficio, ademas de haber ayudado a la gente.

Gracias a esta idea me gustaria liberarme de mi mismo y de “La riqueza de las Naciones” y hablar de la riqueza de las personas.  Intentare seguir los pasos de esta idea, publicando mis conocimientos libremente, con el fin de ayudar a otros y de aprender mas.

→ 1 comentarioCategorías: Contenedor
Etiquetado:

Ley de Demeter LoD

19/01/2009 · Dejar un comentario

Tambien llamado Principio del Minimo Conocimiento (Northeastern University, 1987).

(Sacado del articulo de Jorge Rodriguez, “pruebas-unitarias“)

Esta ley dice que un objeto solo debe depender de objetos que esten muy cercanos a el, o sea no debería usar objetos globales.

Ejemplo:

  • helper.metodo(); // BIEN
  • helper.getSegundoHelper().metodo(); // MAL

→ Deja un ComentarioCategorías: SpringFramework
Etiquetado: ,

Versiones de Java

18/01/2009 · Dejar un comentario

Articulo original

Java 1

Java 1.0 (Enero 1996) – 8 paquetes, 212 clases -
Primera versión pública. La presión hizo que se hiciera pública demasiado pronto, lo cual significa que el diseño del lenguaje no es demasiado bueno y hay montones de errores. Respecto a seguridad, es restrictivo por defecto, no dejando hacer demasiado al código no fiable.

Java 1.1 (Marzo 1997) – 23 paquetes, 504 clases -
Mejoras de rendimiento en la JVM, nuevo modelo de eventos en AWT, clases anidadas, serialización de objetos, API de JavaBeans, archivos jar, internacionalización, API Reflection (Reflexión), JDBC (Java Data base Connectivity), RMI (Remote Method Invocation). Se añade la firma del código y la autentificación. Es la primera versión lo suficientemente estable y robusta.

Java 2

Java 1.2 (Diciembre 1998 ) – 59 paquetes, 1520 clases -
JFC (Swing), Drag and Drop, Java2D, Corba, API Collections. Se producen notables mejoras a todos los niveles. Para enfatizar esto Sun lo renombra como “Java 2″. El JDK (Java Development Kit) se renombra como SDK (Software Development Kit). Se divide en J2SE, J2EE y J2ME.

Java 1.3 (Abril 2000) – 77 paquetes, 1595 clases -
Orientada sobre todo a la resolución de errores y a la mejora del rendimiento; se producen algunos cambios menores como la inclusión de JNDI (Java Naming and Directory Interface) y la API Java Sound. También incluye un nuevo compilador de alto rendimiento JIT (Just In Time).

Java 1.4 (2002) – 103 paquetes, 2175 clases -
También conocido como Merlin, es la versión actual. Mejora notablemente el rendimiento y añade entre otros soporte de expresiones regulares, una nueva API de entrada/salida de bajo nivel (NIO, New I/O), clases para el trabajo con Collections, procesado de XML; y mejoras de seguridad como el soporte para la criptografía mediante las Java Cryptography Extension (JCE), la inclusión de la Java Secure Socket Extension (JSSE) y el Java Authentication and Authorization Service (JAAS).

Java 1.5 (Octubre 2004) – 131 paquetes, 2656 clases -
También conocido como Tiger, renombrado por motivos de marketing como Java 5.0.
Incluye como principales novedades: tipos genéricos (generics), autoboxing/unboxing conversiones impliticas entre tipos primitivos y los wrappers correspondientes, Enumerados, Bucles simplificados, printf, Funciones con número de parámetros variable, Metadatos en clases y métodos.

Java 1.6 (diciembre de 2006) —
También conocido como Mustang. Estuvo en desarrollo bajo la JSR 270. En esta versión, Sun cambió el nombre “J2SE” por Java SE y eliminó el “.0″ del número de versión.
Los cambios más importantes introducidos en esta versión son: Incluye un nuevo marco de trabajo y APIs que hacen posible la combinación de Java con lenguajes dinámicos como PHP, Python, Ruby y JavaScript. Incluye el motor Rhino, de Mozilla, una implementación de Javascript en Java. Incluye un cliente completo de Servicios Web y soporta las últimas especificaciones para Servicios Web, como JAX-WS 2.0, JAXB 2.0, STAX y JAXP. Mejoras en la interfaz gráfica y en el rendimiento.

→ Deja un ComentarioCategorías: SpringFramework
Etiquetado:

Patrones de Diseño

18/01/2009 · 1 comentario

Los patrones de diseño (design patterns) son la base para la búsqueda de soluciones a problemas comunes en el desarrollo de software y otros ámbitos referentes al diseño de interacción o interfaces.

Un patrón de diseño es una solución a un problema de diseño. Para que una solución sea considerada un patrón debe poseer ciertas características. Una de ellas es que debe haber comprobado su efectividad resolviendo problemas similares en ocasiones anteriores. Otra es que debe ser reusable, lo que significa que es aplicable a diferentes problemas de diseño en distintas circunstancias.

Maneras de implementar, mediante interfaces, casos específicos en programación.

→ 1 comentarioCategorías: SpringFramework
Etiquetado:

Inversión de Control (IoC) & Inyección de Dependencia (DI)

18/01/2009 · Dejar un comentario

<!– @page { margin: 2cm } P { margin-bottom: 0.21cm } –>

En los comienzos de la programación, los programas eran lineales y monolíticos. El flujo de ejecución era simplemente ejecutar línea tras linea.

Aparecieron dos conceptos que revolucionaron la programación: la modularidad y la reutilización de los componetes: se crean librerías de componentes reutilizables. El flujo se complica, saltando de componente a componente, y aparece un nuevo problema: la dependencia (acoplamiento) entre nuestros componentes.

El problema se empieza a considerar lo suficientmente importante como para definir nuevos conceptos en el diseño :

  • Inversion of Control (IoC)

  • Dependency Injection (DI)

La utilización de interfaces y la aparición de los frameworks es un primer paso para minimizar estas dependencias entre componentes, aunque pagamos un precio: la configuración en ficheros xml se empieza a volver monolítica, difícil de mantener, crítica y es fácil cometer errores.

→ Deja un ComentarioCategorías: SpringFramework
Etiquetado: ,

Inyeccion de Dependencia (Dependency Injection, DI)

18/01/2009 · Dejar un comentario

Es un término comúnmente confundido con Inversion de Control.

En un escenario en el que utilizamos IoC, delegamos en una entidad “Contenedor” no solo la gestión de las instancias, sino la inyección de las sub-partes (dependencias). Si una venta se compone de un cliente y un producto, al instanciar un objeto venta la DI le inyecta directamente su cliente y su producto específicos.

La arquitectura de Spring esta basada en patrón de diseño llamado “Dependency Injection”, Rob Harrop define a este patrón como: “Es la manera de externalizar la creación y el manejo de las dependencias de los componentes”.

Clases e InterfacesPara comprender el patrón Dependency Injection considere la figura 1 la cual es un diagrama de clases, la clase Foo depende de una instancia de la clase Bar, para realizar algún tipo de procesamiento, tradicionalmente en la clase Foo se tendría la sentencia Bar bar=new Bar(); para crear el objeto bar, usando Dependency Injection una instancia de Bar (o bien una subclase) es proporcionada a la clase Foo en tiempo de ejecución por algún proceso externo, es decir la clase Foo no llama a crear el objeto bar si no que el proceso externo le proporciona el objeto bar a la clase Foo, es por eso que Rod Johnson define a Dependency Injection con la frase: “No me llames, yo te llamo”.

James Shore explica concisamente, “consiste en dar valores a las variables de un objeto”. Una clase, para estar completa necesita información, datos de otra. Con la DI, lo que hacemos es proporcionárselos, ya no tiene que pedir esos datos, se le dan.

1La idea se basa en que dado un objeto, “algo” resuelva sus dependencias, inyectandoselas ya sea a través de métodos setXXX o de uno de los constructores del objeto; para que esto sea posible, ese “algo” debe manejar el ciclo de vida del objeto.

Tipos de DI según Martin Fowler:

  1. TIpo 1 – Inyeccion de Interface.
  2. Tipo 2 – Inyeccion de Setter.
  3. Tipo 3 – Inyeccion de Contructor.

1Jorge Rodriguez, Interplanet S.A (Chile)

→ Deja un ComentarioCategorías: SpringFramework
Etiquetado:

Inversión de Control (Inversion of Control, IoC)

18/01/2009 · Dejar un comentario

<!– @page { margin: 2cm } P { margin-bottom: 0.21cm } –>

Es una técnica que inverte el flujo tradicional. Lo tradicional es que el código que implementes llame a las librerías; la inversión de control ocurre cuando son las librerías las que llaman a tu código.

En cierto modo es una implementación del Principio de Hollywood (no nos llames a nosotros; nosotros te llamaremos a tí.), una metodología de diseño de software.

En Spring, la inversión de control consiste en ceder el control a una entidad externa a la aplicación, llamada “Contenedor”, que se encargará de gestionar las instancias (así como sus creaciones y destrucciones).

¿Quién determina cómo deben inyectarse las dependencias?: El framework de Inversión de Control según los ficheros xml de configuración.

Beneficios

  • Elimina la responsabilidad de buscar o crear los objetos dependientes y la traslada a la configuración

  • Reduce el acoplamiento entre objetos

  • Fomenta el diseño basado en interfaces

  • Permite reconfigurar una aplicación sin modificar el código.

Se puede interpretar como que el Contenedor es un robot. Contiene piezas, engranajes, un Sistema Operativo, memoria, microprocesador… El contenedor esta esperando que le indiquemos que debe realizar para hacerlo, necesita que le programemos unas rutinas para trabajar. Esas rutinas configuradas mediante documentos xml, *.properties, permiten al robot saber que es lo que tiene que hacer. Pero es Inteligente, no le tienes que programar todo de arriba abajo, solo unas partes.

→ Deja un ComentarioCategorías: SpringFramework
Etiquetado:

Aspect Orient Programming (AOP)

18/01/2009 · Dejar un comentario

<!– @page { margin: 2cm } P { margin-bottom: 0.21cm } –>

Entre los objetivos que se ha propuesto la programación orientada a aspectos están principalmente el de separar conceptos y el de minimizar las dependencias entre ellos. Con el primer objetivo se consigue que cada cosa esté en su sitio, es decir, que cada decisión se tome en un lugar concreto, con el segundo se tiene una pérdida del acoplamiento entre los distintos elementos.

De la consecución de estos objetivos se pueden obtener las siguientes ventajas:

  • Un código menos enmarañado, más natural y más reducido.

  • Una mayor facilidad para razonar sobre las materias, ya que están separadas y tienen una dependencia mínima.

  • Más facilidad para depurar y hacer modificaciones en el código.

  • Se consigue que un conjunto grande de modificaciones en la definición de una materia tenga un impacto mínimo en las otras.

  • Se tiene un código más reusable y que se puede acoplar y desacoplar cuando sea necesario.

Básicamente consiste en implementar por un lado un aspecto, que es un trozo de código común a ejecutar en varios métodos/clases. Por otro lado configuraremos los puntos de cruce, que son los lugares en los que el aspecto cruza con el código, es decir, cuando serán ejecutados. Para que funcione debemos interponer un Proxy entre la clase y el aspecto. De esta forma podemos acoplar/desacoplar aspectos comunes sin tocar código.

Los aspectos no suelen ser unidades de descomposición funcional del sistema, sino propiedades que afectan al rendimiento o a la semántica de los componentes. Algunos ejemplos de aspectos son, los patrones de acceso a memoria, la sincronizan de procesos concurrentes, el manejo de errores, etc.

Debido a la escasa literatura en español sobre el tema, se presenta la terminología original en inglés.

  • Aspect (Aspecto) es la funcionalidad que se cruza a lo largo de la aplicación (cross-cutting) que se va a implementar de forma modular y separada del resto del sistema. El ejemplo más común y simple de un aspecto es el logging (registro de sucesos) dentro del sistema, ya que necesariamente afecta a todas las partes del sistema que generan un suceso.

  • Join point (Punto de Cruce o de Unión) es un punto de ejecución dentro del sistema donde un aspecto puede ser conectado, como una llamada a un método, el lanzamiento de una excepción o la modificación de un campo. El código del aspecto será insertado en el flujo de ejecución de la aplicación para añadir su funcionalidad.

  • Advice (Consejo) es la implementación del aspecto, es decir, contiene el código que implementa la nueva funcionalidad. Se insertan en la aplicación en los Puntos de Cruce.

  • Pointcut (Puntos de Corte) define los Consejos que se aplicarán a cada Punto de Cruce. Se especifica mediante Expresiones Regulares o mediante patrones de nombres (de clases, métodos o campos), e incluso dinámicamente en tiempo de ejecución según el valor de ciertos parámetros.

  • Introduction (Introducción) permite añadir métodos o atributos a clases ya existentes. Un ejemplo en el que resultaría útil es la creación de un Consejo de Auditoria que mantenga la fecha de la última modificación de un objeto, mediante una variable y un método setUltimaModificacion(fecha), que podrían ser introducidos en todas las clases (o sólo en algunas) para proporcionarlas esta nueva funcionalidad.

  • Target (Destinatario) es la clase aconsejada, la clase que es objeto de un consejo. Sin AOP, esta clase debería contener su lógica, además de la lógica del aspecto.

  • Proxy (Resultante) es el objeto creado después de aplicar el Consejo al Objeto Destinatario. El resto de la aplicación únicamente tendrá que soportar al Objeto Destinatario (pre-AOP) y no al Objeto Resultante (post-AOP).

  • Weaving (Tejido) es el proceso de aplicar Aspectos a los Objetos Destinatarios para crear los nuevos Objetos Resultantes en los especificados Puntos de Cruce. Este proceso puede ocurrir a lo largo del ciclo de vida del Objeto Destinatario:

    • Aspectos en Tiempo de Compilación, que necesita un compilador especial.

    • Aspectos en Tiempo de Carga, los Aspectos se implementan cuando el Objeto Destinatario es cargado. Requiere un ClassLoader especial.

    • Aspectos en Tiempo de Ejecución.

→ Deja un ComentarioCategorías: SpringFramework
Etiquetado: