Your SlideShare is downloading. ×
Hands-on Spring 3: The next generation
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Hands-on Spring 3: The next generation

6,991
views

Published on

Published in: Technology

0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
6,991
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
3
Comments
0
Likes
8
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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
  • 3. Aplicación ejemplo  Disponible en http://sergialmar.wordpress.com
  • 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” />
  • 12. Framework para test @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration public class JavaHispanoIntegrationTests { @Autowired private AccountService accountService; @Test @Transactional public void testSaveAccount() { // test transaccional con auto-rollback } }
  • 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 ... ; } }
  • 27. @Lazy @Lazy @Bean public LazyBean lazyBean() { return ... ; } }
  • 28. Bootstrapping clases @Configuration <context:component-scan base-package="org.jh.config"/>
  • 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

×