Download POJOs / Anotaciones

Document related concepts
no text concepts found
Transcript
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