DEPARTAMENTO DE SISTEMAS POJOs / Anotaciones Agenda DEPARTAMENTO DE SISTEMAS • Anotaciones • POJOS • Inyección de Dependencias Anotaciones DEPARTAMENTO DE SISTEMAS • Las anotaciones son marcas (tags) que se insertan en el código fuente • Son interpretadas por herramientas de procesamiento o A nivel de código fuente o A nivel de los archivos .class • Las anotaciones no cambian la forma en que un programa es compilado • Inicialmente definidas en el JDK 5.0 Anotaciones DEPARTAMENTO DE SISTEMAS • En general su utilización requiere o o o o Diseñar las anotaciones Utilizarlas en el código fuente Utilizar una herramienta de procesamiento para analizarlas Reaccionar ante cada anotación encontrada • Usos frecuentes o Generación automática de archivos o Descriptores Clases Java Generación automática de código Testing, Logging,etc. Anotaciones DEPARTAMENTO DE SISTEMAS • En java una anotación es usada como un modificador (public, static, …) o Se inserta antes del elemento anotado, sin “;” • El nombre de cada anotación es precedido del símbolo “@” • No genera documentación ni es parte de Javadoc • Las anotaciones son parte del código • Las anotaciones pueden tener elementos o Ej: @TestCase(id=“12244”) Anotaciones DEPARTAMENTO DE SISTEMAS • Las anotaciones pueden ser utilizadas en o o o o o Interfaces Clases Métodos Atributos Variables • Una anotación puede ir en donde sea posible utilizar public, static o final Anotaciones DEPARTAMENTO DE SISTEMAS • Cada anotación debe ser definida por una interfaz de anotación • Los métodos de la interfaz corresponden a los elementos de la anotación • Las anotaciones se definen en el código fuente • El compilador las conserva en el .class • La máquina virtual las carga • Se debe utilizar un mecanismo para analizarlas Anotaciones DEPARTAMENTO DE SISTEMAS Una anotación es definida por una interfaz modifiers @interface AnnotationName { element declaration1 element declaration2 ... } Cada elemento “declaration” tiene la forma type elementName(); type elementName() default value; Ejemplo: public @interface BugReport { String assignedTo() default "[none]"; int severity() = 0; } Anotaciones DEPARTAMENTO DE SISTEMAS Cada anotación tiene la forma: @AnnotationName(elementName1=value1, elementName2=value2, ...) Algunos aspectos importantes: • El orden de los elementos no es relevante • Si se utilizan todos los valores por defecto o no hay argumentos no es necesario usar paréntesis (marker) /** * Indicates that the specification of the annotated API element * is preliminary and subject to change */ public @interface Preliminary { } @Preliminary public class TimeTravel { ... } Anotaciones DEPARTAMENTO DE SISTEMAS Algunos aspectos importantes: • Si un elemento tiene el nombre reservado “value” se puede omitir el nombre del elemento y el operador de asignación “=” /** * Associates a copyright notice with the annotated API element */ public @interface Copyright { String value(); } @Copyright(”2008 European Organization for Nuclear Research") public class LargeHadronCollider { ... } Anotaciones DEPARTAMENTO DE SISTEMAS • Todas las interfaces de anotación extienden o java.lang.annotation.Annotation • Las interfaces de anotación no pueden ser extendidas • Nunca se proveen clases que implementen las interfaces de anotación • La máquina virtual genera clases proxy y objetos cuando se requieran Anotaciones DEPARTAMENTO DE SISTEMAS • El tipo de un elemento de anotación puede ser: o Tipo primitivo (int, short, long, byte, char, double, float, boolean) o o String Class Enum Annotation o Arreglos de los tipos anteriores o o Anotaciones DEPARTAMENTO DE SISTEMAS • Ejemplo public @interface BugReport { enum Status { UNCONFIRMED, CONFIRMED, FIXED, NOTABUG }; boolean showStopper() default false; String assignedTo() default "[none]"; Class<? extends Testable> testCase() default Testable.class; Status status() default Status.UNCONFIRMED; TestCase testCase(); String[] reportedBy(); } Anotaciones DEPARTAMENTO DE SISTEMAS • Se pueden agregar anotaciones a: o o o o o o o Paquetes Clases Enumeraciones Métodos Constructores Variables locales Parámetros Anotaciones DEPARTAMENTO DE SISTEMAS • Las anotaciones a variables locales solo pueden ser procesadas a nivel del código fuente • Estas anotaciones son descartadas cuando la clase es compilada • Un item puede tener múltiples anotaciones • No se puede utilizar más de una misma anotación por item Anotaciones DEPARTAMENTO DE SISTEMAS • Meta-Anotaciones o o @Target Aplica a una anotación Especifica a qué elementos puede aplicar la anotación @Retention Especifica por cuanto tiempo es retenida una anotación Anotaciones DEPARTAMENTO DE SISTEMAS • @Target – Valores para ElementType @Target({ElementType.METHOD, ElementType.CONSTRUCTOR}) public @interface TestCase Anotaciones DEPARTAMENTO DE SISTEMAS • @Retention @Retention(RetentionPolicy.RUNTIME) public @interface ActionListenerFor Anotaciones DEPARTAMENTO DE SISTEMAS • Ejemplo • Definición de la anotación /** * Indicates that the annotated method is a test method. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Test { } • Programa ejemplo public class MyClass { @Test public static void m1() { } public static void m2() { } @Test public static void m3() { throw new Exception("Boom"); } } Anotaciones DEPARTAMENTO DE SISTEMAS • Ejemplo • Herramienta de prueba public class RunTests { public static void main(String[] args) throws Exception { int passed = 0, failed = 0; for (Method m : Class.forName(args[0]).getMethods()) { if (m.isAnnotationPresent(Test.class)) { try { m.invoke(null); passed++; } catch (Throwable ex) { System.out.printf("Test failed: %s %n", m, ex.getCause()); failed++; } } } System.out.printf("Passed: %d, Failed %d%n", passed, failed); } } Anotaciones DEPARTAMENTO DE SISTEMAS • La herramienta APT (Annotation Processing Tool) o Herramienta de procesamiento de anotaciones o Se basa en las anotaciones presentes en los archivos fuente a ser examinados o El parser localiza anotaciones analizando los archivos .java o Utiliza un conjunto de APIs de reflexión Anotaciones DEPARTAMENTO DE SISTEMAS • Algoritmo de procesamiento public void process() { for (TypeDeclaration t : env.getSpecifiedTypeDeclarations()) { if (t.getModifiers().contains(Modifier.PUBLIC)) { for (MethodDeclaration m : t.getMethods()) { Property p = m.getAnnotation(Property.class); if (p != null) { // process property } } } // write bean info source file } } Anotaciones DEPARTAMENTO DE SISTEMAS • Procesamiento de ByteCode o Normalmente requiere librerias de apoyo como BCEL (ByteCode Engineering Library) • Procesamiento de clases cargadas o Procesamiento con agentes o Se implementa una clase con un método llamado premain o El programa a analizar se empaqueta y se ejecuta junto con el agente Agenda DEPARTAMENTO DE SISTEMAS • Anotaciones • POJOs • Inyección de Dependencias POJOs DEPARTAMENTO DE SISTEMAS • Plain Old Java Objects Objetos instanciados de una clase java que se caracteriza por o Tener atributos o Los atributos son leidos y modificados via “getters” y “setters” o Puenden tener otros métodos de negocio POJOs DEPARTAMENTO DE SISTEMAS • Ventajas de una programación basada en POJOs o Simplicidad o Mantenimiento o KISS (Keep It Short and Simple) Testing o Normalmente no hay herencia ni implementación de interfaces de frameworks JUnit Reusabilidad POJOs DEPARTAMENTO DE SISTEMAS • Normalmente las aplicaciones empresariales requieren o o o Transaccionalidad Seguridad Persistencia • Alternativas o “lightweight” frameworks o Hibernate, JDO, iBATIS, Spring Servidores JEE Glassfish, JBOSS, WebSphere, OAS Agenda DEPARTAMENTO DE SISTEMAS • Anotaciones • POJOS • Inyección de Dependencias Inyección de Dependencias DEPARTAMENTO DE SISTEMAS • Inversión de Control (IoC) o Patrón de diseño de software o El flujo de un sistema es invertido con respecto a la secuencia tradicional de llamados a procedimientos o El flujo es delegado en una tercera entidad externa o Esta entidad realiza la secuencia de llamados basada en un conjunto de instrucciones predefinidas (Definición dada por Martin Fowler) Inyección de Dependencias DEPARTAMENTO DE SISTEMAS • Un caso particular de IoC es la Inyección de Dependencias (DI) o o o o Tradicionalmente cada objeto es responsable de obtener sus propias referencias de los objetos con los que colabora Esto produce normalmente código altamente acoplado y difícil de probar Con la DI, los objetos obtienen sus dependencias al momento de su creación por una entidad externa Es decir, las dependencias son inyectadas Inyección de Dependencias DEPARTAMENTO DE SISTEMAS • Con la Inyección de Dependencias o Se obtiene código bajamente acoplado o Facíl de probar o Los objetos sólo conocen sus dependencias por sus interfaces (no sus implementaciones) o En términos generales no existe lookup o Inicialmente, esta inyección se definia mediante descriptores externos (Archivos XML) o Ahora es mas común utilizar Anotaciones !!! Inyección de Dependencias DEPARTAMENTO DE SISTEMAS Tomado de: EJB3 in Action Bibliografía DEPARTAMENTO DE SISTEMAS • • • • Core Java 2 Volume II – Advanced Features, 7th Edition, Cay S. Horstmann and Gary Cornell, Prentice Hall The Java EE 5 Tutorial, Third Edition, Eric Jendrock et al. POJOs in Action, Developing Enterprise Applications with Lightweight Frameworks, Chris Richardson EJB3 in Action. Debu Panda, Reza Rahman, Derek Lane. Mannaging Publications. 2006