Hands-on Spring 3: The next generation

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    4 Favorites

    Hands-on Spring 3: The next generation - Presentation 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

    + Sergi AlmarSergi Almar, 4 months ago

    custom

    1209 views, 4 favs, 3 embeds more stats

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 1209
      • 977 on SlideShare
      • 232 from embeds
    • Comments 0
    • Favorites 4
    • Downloads 3
    Most viewed embeds
    • 221 views on http://sergialmar.wordpress.com
    • 10 views on http://josebovet.blogspot.com
    • 1 views on http://translate.googleusercontent.com

    more

    All embeds
    • 221 views on http://sergialmar.wordpress.com
    • 10 views on http://josebovet.blogspot.com
    • 1 views on http://translate.googleusercontent.com

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories