Este documento presenta las principales características de Spring 3.0. Spring 3.0 incluye mejoras como una nueva implementación del lenguaje de expresiones de Spring, soporte para configuración basada en Java, extensiones para soportar REST y negociación de contenido, y abstracciones para mapeo de objetos a XML. Spring 3.0 también actualiza la API para aprovechar las características de Java 5 como generics.
investigación de los Avances tecnológicos del siglo XXI
Hands-on Spring 3: The next generation
1. Hands-on Spring 3.0:
The next generation
Sun Open Communities Forum 2009 Sergi Almar i Graupera
Madrid, 18 y 19 de Junio
sergi.almar@javahispano.org
salmar@extrema-sistemas.com
2. Formación Extrema Sistemas
Cursos SpringSource
Core Spring
21 – 24 Julio 09 / Madrid
24 – 27 Agosto 09 / Barcelona
28 Septiembre 09 – 01 Octubre 09 / Madrid
Rich Web Applications With Spring
07 -10 Septiembre 09 / Barcelona
Curso Agile Project Management
Más info:
http://extrema-sistemas.com/formacion
4. Agenda
Visión general Spring
De Spring 2.5...
... a Spring 3.0!
5. Agenda
Visión general Spring
De Spring 2.5...
... a Spring 3.0!
6. Spring Portfolio
Proyectos Spring
Spring Web Services Spring MVC Spring Web Flow
Spring Faces
Spring BlazeDS Integration
Spring
Framework Spring JavaScript
Spring Dynamic Modules
Spring IDE
Spring Rich Client Spring for .NET
Spring Security AspectJ Spring Roo
Spring Batch Spring Integration Spring LDAP
7. Agenda
Visión general Spring
De Spring 2.5...
... a Spring 3.0!
8. Spring Framework 2.5
Soporte para configuración basada en
anotaciones
@Autowired (@Quilifier opcionalmente)
@Transactional
@Service, @Repository, @Controller
Anotaciones Java EE 5 soportadas
@PostConstruct, @PreDestroy
@PersistenceContext, @PersistenceUnit
@Resource, @EJB, @WebServiceRef
@TransactionAttribute
9. Componente anotado
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
public AccountServiceImpl(AccountRepository ar) { … }
@Transactional
public void saveAccount(Account account) { … }
@PostConstruct
public initCache() { ... }
@PreDestroy
public cleanupCache() { ... }
}
10. Configuración mínima en XML
<!– Activando la configuración con annotation-based -->
<context:annotation-config/>
<!– Sólo definición de bean – no constructor-arg/property -->
<bean id=”accountService”
class=”org.jh.service.AccountServiceImpl”/>
<bean id=”accountRepository”
class=”org.jh.dao.jdbc.JdbcAccountRepository”/>
<!– Y otras definiciones de beans de infrastructura:
PlatformTransactionManager, DataSource, etc -->
11. Bootstrap mínimo en XML
<!– Escanea en búsqueda de:
@Component, @Service, @Repository, @Controller
y los registra automáticamente
-->
<context:component-scan base-package=”org.javahispano” />
13. Controlador Spring @MVC
@Controller
public class CommentController {
private final CommentService commentService;
@Autowired
public CommentController(CommentService commentService) {
this.commentService = commentService;
}
// Responde a la URL: http://host/servlet/comment/deleteComment
@RequestMapping
public String deleteComment(@RequestParam("c") int commentId) {
this.commentService.deleteComment(commentId);
return "redirect:commentList";
}
}
14. Agenda
Visión general Spring
De Spring 2.5...
... a Spring 3.0!
15. Lo nuevo en Spring 3.0
Basado en Java 5+
Compatible con J2EE 1.4 y Java EE 5
Spring Expression Language
Configuración al estilo JavaConfig
Soporte REST
y otras adiciones a Spring @MVC
OXM
16. API actualizada para Java 5
Usuarios con Java 1.4 deben seguir en la
versión 2.5.6
API refactorizada para utilizar generics,
varargs...
Interfaz BeanFactory devuelve instancias de
beans tipadas
T getBean(String name, Class<T> requiredType)
Map<String, T> getBeansOfType(Class<T> type)
17. Parser Spring EL
Implementación de parseador de expresiones
con Spring 3.0
paquete org.springframework.expression
motor de expresiones de nueva generación
inspirado en las expresiones de Spring Web Flow 2.0
Compatible con Unified EL pero más potente
acceso a propiedades de beans, maps, etc
invocación de métodos
construcción de objetos
18. EL en XML
<bean class="org.javahispano.BDTest">
<property name="databaseName"
value="“#{systemProperties.databaseName}”/>
<property name="keyGenerator"
value="“#{strategyBean.databaseKeyGenerator}”/>
</bean>
19. EL en componentes anotados
@Repository
public class BDTest {
@Value(“#{systemProperties.databaseName}”)
public void setDatabaseName(String dbName) { … }
@Value(“#{strategyBean.databaseKeyGenerator}”)
public void setKeyGenerator(KeyGenerator kg) { … }
}
20. Atributos para el contexto web
Atributos específicos web expuestos
implícitamente
"contextProperties": parámetros de inicialización del
web.xml
"contextAttributes": atributos del ServletContext
"request": Servlet/PortletRequest actual
"session": Http/PortletSession actual
Objetos JSF expuestos implícitamente en un
contexto JSF
"param", "initParam", "facesContext", etc
21. EL en otros proyectos
Un lenguaje de expresiones extensible
Utilizado en otros proyectos del portfolio
Seguridad
Integration / JMS (nombres dinámicos de colas)
...
@PreAuthorize(“hasRole('ROLE_USER') and
#usuario.nombre == principal.name”)
public void guardarUsuario(Usuario usuario) { … }
22. Configuración basada en Java
Funcionalidad de Spring JavaConfig pasa a ser
parte del core:
@Configuration
@Bean
@Primary
@Lazy
@Import
@Value
23. @Configuration
Una clase de configuración es similar a un
documento <beans/>
Especifica una clase de configuración que crea
beans
Es un objeto gestionado por Spring
Puede ser inyectado
Al estar meta-anotado con @Component, puede
ser encontrado con el component scanning sin
necesidad de definición XML
24. @Bean
Similar a <bean/>
Indica un método encargado de la creación de
un bean
Soporta los atributos: init-method, destroy-
method, autowiring y name.
25. Ejemplo nueva configuración
@Configuration
public class AppConfig {
@Value(”#{jdbcProperties.url}”) String jdbcUrl;
@Value(”#{jdbcProperties.username}”) String username;
@Value(”#{jdbcProperties.password}”) String password;
<bean id="accountService" class="org.jh.service.AccountService">
@Bean <constructor-arg ref="accountRepository" />
</bean>
public AccountService accountService() {
return new AccountServiceImpl(accountRepository());
} <bean id="accountRepository" class="org.jh.dao.hibernate.HibernateAccountRepository">
<constructor-arg ref="sessionFactory" />
</bean>
@Bean
public AccountRepository accountRepository() {
return new HibernateAccountRepository(sessionFactory());
}
26. Soporte Scoped Proxy
@Configuration
public class AppConfig {
@Bean
@Scope(value=StandardScopes.SESSION,
proxyMode=ProxyMode.INTERFACES)
public PreferenciasUsuario preferenciasUsuario() {
return ... ;
}
}
29. Soporte REST
Extensión de Spring @MVC para soportar
mappings al estilo REST
extracción de parámetros de la URI
view resolvers para negociación de contenido
Objetivo: soporte nativo para REST con Spring
MVC, con uso para UI y sin UI
Alternativa: usar JAX-RS a través de un
proveedor JAX-RS (Jersey...)
30. Ejemplo REST
http://javahispano.org/noticia/329
Representa el recurso noticia:
GET obtener una notícia
GET jh.org/noticia/329 para obtener la notícia 329
PUT crea o modifica un recurso
PUT a jh.org/noticia/329 para crear / modificar
POST crea un recurso
POST a jh.org/noticia para crear una nueva noticia
DELETE borra una notícia
DELETE a jh.org/noticia/329 para borrar la notícia
31. @PathVariable
http://www.javahispano.org/noticia/3
@RequestMapping(value=”/noticia/{id}”, method=RequestMethod.GET)
public String mostrarNoticia(@PathVariable Long id, Model model) {
// mostrar noticia
}
32. Multiples @PathVariables
http://www.javahispano.org/noticia/3/comentario/2
@RequestMapping(value=”/noticia/{id}/comentario/{comentario}”,
method=RequestMethod.GET)
public String mostrarComentario(@PathVariable(“id”) Long id,
@PathVariable(“comentario”) String comentario,
Model model) {
// mostrar comentario
}
33. Paths tipo Ant
http://www.javahispano.org/noticia/3/comentario/2
@RequestMapping(value=”/noticia/*/comentario/{comentario}”,
method=RequestMethod.GET)
public String mostrarComentario(@PathVariable(“comentario”) String comentario,
Model model) {
// mostrar comentario
}
34. Binding de datos @PathVariable
http://www.javahispano.org/noticia/2009-06-18
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
binder.registerCustomEditor(Date.class, new CustomDateEditor(df, false));
}
@RequestMapping(value=”/noticia/{fecha}”, method=RequestMethod.GET)
public String mostrarComentario(@PathVariable Date fecha, Model model) {
// mostrar comentario
}
35. VUESTRO TURNO!
- Definir método en el
NoticiaController para procesar las
peticiones GET correspondientes a
mostrar una noticia
- Responde a paths tipo: /noticia/1
(usa @PathVariable)
- Usar NoticiaService para obtener
la noticia
- Nombre de la vista a renderizar:
mostrarNoticia
36. Soporte para PUT / DELETE
Los formularios HTTP sólo soportan GET /
POST de manera nativa
@RequestMapping(value=”/noticia/{id}”, method=RequestMethod.DELETE)
public void borrarNoticia(@PathVariable Long id) {
// borrar noticia
}
Uso de HiddenHttpMethodFilter
emula los métodos PUT / DELETE
parámetro hidden especial que determina el
RequestMethod
37. HiddenHttpMethodFilter
Registro del filtro en el web.xml
<filter>
<filter-name>httpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>httpMethodFilter</filter-name>
<servlet-name>javaHispano</servlet-name>
</filter-mapping>
<form:form method=”delete”>
<input type=”submit” value=”Borrar notícia”/>
</form:form>
38. VUESTRO TURNO!
1) Definir método en el NoticiaController
para procesar las peticiones DELETE
corresponientes a borrar una noticia
- Responde a paths tipo: /noticia/1 (usa
@PathVariable)
- Usar NoticiaService para borrar la noticia
- Nombre de la vista a renderizar:
redirect:/portal/noticia
2) Registro del filtro en el web.xml
3) Creación del boton dentro de un
formulario usando el tag <form:form ...> en
la página /WEB-INF/jsp/mostrarNoticia.jsp
39. Negociación de contenido
Introducción del
ContentNegotiatingViewResolver
No resuelve vistas propiamente, delega a otros
view resolvers
Dos estrategias:
Extension (.pdf, .xml, .atom...)
Header HTTP Accept
40. Negociación de contenido
JSON
GET http://www.jh.org/noticia/1 accepts application/json
GET http://www.jh.org/noticia/1.json
XML
GET http://www.jh.org/noticia/1 accepts application/xml
GET http://www.jh.com/accounts/1.xml
ATOM
GET http://www.jh.org/noticia/1 accepts application/atom+xml
GET http://www.jh.org/noticia/1.atom
41. Nuevas vistas
AbstractAtomFeedView
AbstractRssFeedView
MarshallingView
Representación XML usando OXM
JacksonJsonView
Parte del proyecto Spring JavaScript
42. Nuevas anotaciones Spring @MVC
@RequestHeader: acceso a los headers de la
petición
@CookieValue: acceso a una cookie HTTP
43. Soporte para Shallow ETag
Para determinar si el contenido ha cambiado
Soporte a través del filtro
ShallowEtagHeaderFilter
Cachea el contenido de la vista renderizada
Genera un hash MD5
Envía un header Etag
Nuevas peticiones con el Etag en If-None-Match
Hashes iguales ? 304 : recurso
44. Abstracción OXM
Mapear objetos a XML y viceversa con
JAXB (2), Castor, JiBX, XmlBeans, Xstream
Era parte de Spring WS
Útil para propositos REST
Movido al core de Spring Framework 3.0
45. Marshallers y Unmarshallers
public interface Marshaller {
void marshall(Object graph, Result result)
throws XmlMappingException, IOException;
}
public interface Unmarshaller {
Object unmarshall(Source source)
throws XmlMappingException, IOException;
}
46. VUESTRO TURNO!
1) Descomentar el (un)marshaller en mvc-
config.xml
2) Anotar la clase Noticia con
@XmlRootElement (requerido por JAXB)
3) Definir MarshallingView para poder
mostrar las noticias en XML
47. RestTemplate
Acceso a servicios RESTful
Conceptualmente similar a clases como
JdbcTemplate o JmsTemplate
Callback
HttpMessageConverter
StringHttpMessageConverter
FormHttpMessageConverter
ByteArrayMessageConverter
MarshallingHttpMessageConverter
SourceHttpMessageConverter
BufferedImageHttpMessageConverter
48. Métodos RestTemplate
Los métodos de RestTemplate siguen una
convención
Primera parte indica el método a invocar y la
segunda el objeto devuelto
getForObject: petición GET convirtiendo al
respuesta HTTP en un objeto del tipo que
indiquemos.
postForLocation: petición POST, devuelve header
Location HTTP donde se puede encontrar el nuevo
objeto
49. VUESTRO TURNO!
1) Declarar bean restTemplate en el app-
config.xml
2) Declarar bean restTemplate en
FlickrFotosService e inyectarlo
3) Utilizar RestTemplate para obtener las
imágenes de Flickr. Debéis proporcionar la
URL, la clase que se espera y las variables
para resolver la URL (el método utiliza
varargs para las variables)
NOTA:
definición: public void metodo(String..param)
llamada: metodo(param1,param2,param3)
50. Validación de modelo
public class Usuario {
@NotNull
@Past
private Date fechaRegistro;
}
En la vista:
<form:input path="fechaRegistro">
Los mismos metadatos se pueden usar para persistencia,
renderizado, etc
Se soportará en Spring MVC en el binding de datos
JSR-303 "Bean Validation" como base
51. Spring 3.0 y Java EE 6
Early support para Java EE 6 en Spring 3.0
Integración con JSF 2.0
Integración con JPA 2.0
Soporte para modos de bloqueos, timeouts, etc
Soporte para JSR-303 Bean Validation
Todo en Tomcat 5.5+ y J2EE 1.4
Spring 3.2: soporte para plataformas JavaEE 6
Servlet 3.0 (en espera de GlassFish 3 y Tomcat 7)
JSR-236 "Concurrency Utilities for Java EE"
52. Pruning & Deprecation
Pruning: eliminación de características
obsoletas
Soporte para Commons Attributes
Substituido por anotaciones Java 5
Soporte API TopLink
A favor de JPA (EclipseLink)
Soporte para el estilo subclass de Struts 1.x
Deprecation: características substituidas
Jerarquia de controladores MVC
Substituida por los controladores anotados
Jerarquia de clases de test JUnit 3.8
Substituida por el framework de test
53. Continuación misión Spring 2.5
Spring 3 continua con la misión de Spring 2.5
aprovecha Java 5 para el modelo de programación
y configuración
ahora el framework requiere Java 5
todas las clases del framework usan sintaxis Java 5
Compatibilidad hacia atrás con Spring 2.5
compatibilidad 100% con el modelo de
programación
compatibilidad del 95% en los puntos de extensión
toda la API deprecada será eliminada
54. Gracias!
Sergi Almar i Graupera
sergi.almar@javahispano.org
salmar@extrema-sistemas.com
http://sergialmar.wordpress.com