Sei sulla pagina 1di 931

Spring Framework documentacin de referencia Prximo

Spring Framework documentacin de referencia


Autores
3.2.1.RELEASE Copyright 2004-2012 Copias de este documento puede ser hecho para su propio uso y para su distribucin a los dems, a condicin de que no se cobra ninguna cuota por las copias y siempre que cada copia contenga este aviso de copyright, ya sea distribuido en forma impresa o electrnica.

Tabla de contenidos I. Visin general de Spring Framework 1. Introduccin a Spring Framework 1,1. Inyeccin de dependencia y Inversin de Control 1,2. Mdulos 1.2.1. Core Container 1.2.2. Acceso a datos / Integracin 1.2.3. Web 1.2.4. AOP e Instrumentacin 1.2.5. Prueba 1,3. Escenarios de uso 1.3.1. Dependencia de Gestin y Convenciones de nomenclatura Primavera Dependencias y dependiendo de Primavera Maven Dependencia de Gestin Ivy Dependencia de Gestin 1.3.2. Inicio de sesin No utilizar Commons Logging Usando SLF4J Usando Log4J II. Qu hay de nuevo en Spring 3 2. Nuevas caractersticas y mejoras en Spring Framework 3.0 2,1. Java 5 2,2. Documentacin mejorada 2,3. Nuevos artculos y tutoriales 2,4. Nuevo mdulo de organizacin y sistema de construccin

2,5. Descripcin de las caractersticas nuevas 2.5.1. Core API actualizada para Java 5 2.5.2. Spring Expression Language 2.5.3. La inversin de control (IoC) contenedor Java bean metadatos basados en Definicin de metadatos de frijol dentro de los componentes 2.5.4. Tipo de propsito general y un sistema de conversin del sistema de formato de campo 2.5.5. El nivel de datos 2.5.6. El nivel Web Soporte de apoyo integral @ MVC adiciones 2.5.7. Validacin del modelo declarativo 2.5.8. Apoyo temprano para Java EE 6 2.5.9. Soporte para bases de datos integradas 3. Nuevas caractersticas y mejoras en Spring Framework 3.1 3,1. Cach de abstraccin 3,2. Definicin de frijol perfiles 3,3. Medio Ambiente Abstraccin 3,4. Abstraccin PropertySource 3,5. Equivalentes de cdigo para espacios de nombres XML de Spring 3,6. Soporte para Hibernate 4.x 3,7. TestContext marco de apoyo para las clases de configuracin y los perfiles de frijol @ definicin 3,8. c: namespace para ms concisa inyeccin de constructor 3,9. Apoyo a la inyeccin contra no estndar JavaBeans setters 3,10. Soporte para servlets 3 Cdigo de configuracin basada en Contenedor Servlet 3,11. Soporte para servlets 3 MultipartResolver 3.12. JPA EntityManagerFactory bootstrapping sin persistence.xml 3.13. Nuevos HandlerMethod basados en clases de apoyo para el procesamiento de Controlador anotado 3.14. "Consume" y "produce" las condiciones en @RequestMapping 3.15. Flash de atributos y RedirectAttributes 3.16. Mejoras en la plantilla URI variables 3.17. @Valid On @RequestBody Argumentos mtodo de control 3.18. @RequestPart Anotacin sobre los argumentos de mtodo de control 3.19. UriComponentsBuilder y UriComponents 4. Nuevas caractersticas y mejoras en Spring Framework 3.2 4,1. Soporte para procesamiento basado en Servlet 3 solicitud asincrnica 4,2. Spring MVC Prueba marco 4,3. Mejorar el contenido de negociacin 4.4. @ControllerAdvice anotacin 4,5. Las variables de matriz 4,6. Clase base abstracta para el cdigo basado en Servlet 3 + contenedor de inicializacin 4.7. ResponseEntityExceptionHandler clase 4,8. El apoyo a los tipos genricos en el RestTemplate y en @RequestBody argumentos 4,9. Jackson JSON 2 y las mejoras relacionadas con el

4,10. Azulejos 3 4.11. @RequestBody mejoras 4.12. Mtodo HTTP PARCHE 4.13. Excluidos en los patrones de mapeado interceptores 4.14. El uso de meta-anotaciones para los puntos de inyeccin y mtodos de definicin de frijol 4.15. El apoyo inicial para JCache 0,5 4.16. Apoyo a @DateTimeFormat sin Joda Time 4,17. Global formato de fecha y hora 4.18. Nuevas funciones de prueba 4.19. Mejoras de concurrencia de todo el marco 4.20. Nueva Gradle basado en construir y mover a GitHub 4,21. Refinado Java SE 7/7 de apoyo OpenJDK III. Core Technologies 5. El contenedor IoC 5,1. Introduccin al contenedor de Spring IoC y frijoles 5,2. Contenedor visin general 5.2.1. Configuracin de metadatos 5.2.2. Crear instancias de un contenedor Composicin de metadatos basado en XML de configuracin 5.2.3. Uso del contenedor 5,3. Frijol visin general 5.3.1. Frijoles de nombres Aliasing un grano fuera de la definicin de frijol 5.3.2. Frijoles Instanciacin De instancias con un constructor De instancias con un mtodo esttico de fbrica Instanciacin utilizando un mtodo de fbrica instancia 5,4. Dependencias 5.4.1. Inyeccin de dependencia Constructor basado en la inyeccin de dependencia Setter basado en la inyeccin de dependencia Dependencia proceso de resolucin Ejemplos de inyeccin de dependencias 5.4.2. Dependencias y configuracin en detalle Valores rectos (primitivos, Strings , etc) Las referencias a otros beans (colaboradores) Frijoles interiores Colecciones Nulos y los valores de cadena vaca Atajo XML con el p-namespace Atajo XML con espacio de nombres cNombres compuestos de propiedad 5.4.3. El uso depends-on 5.4.4. Lazy-inicializadas frijoles 5.4.5. Colaboradores autowiring Limitaciones y desventajas de autoconexin La exclusin de un bean de autowiring 5.4.6. Mtodo de inyeccin Lookup inyeccin mtodo

Mtodo de sustitucin arbitraria 5,5. Frijol mbitos 5.5.1. El alcance singleton 5.5.2. El alcance prototipo 5.5.3. Singleton con frijoles prototipo de frijol dependencias 5.5.4. Solicitar, sesin y sesin global mbitos Configuracin web inicial Solicitud de alcance Sesin alcance mbito de sesin global Frijoles con mbito como dependencias 5.5.5. Custom mbitos La creacin de un mbito personalizado El uso de un mbito personalizado 5,6. Personalizacin de la naturaleza de un grano 5.6.1. Devoluciones de llamada de ciclo de vida Devoluciones de llamada de inicializacin Callbacks Destruccin Predeterminado de inicializacin y destruir mtodos La combinacin de los mecanismos del ciclo de vida Inicio y cierre de devoluciones de llamada Apagado del contenedor de IoC Primavera con gracia en aplicaciones no web 5.6.2. ApplicationContextAware y BeanNameAware 5.6.3. Otros Aware interfaces de 5,7. Frijol definicin herencia 5,8. Puntos contenedor de extensin 5.8.1. Personalizacin de los frijoles con un BeanPostProcessor Ejemplo: Hola a todos, BeanPostProcessor de estilo Ejemplo: El RequiredAnnotationBeanPostProcessor 5.8.2. Personalizacin de metadatos de configuracin con un
BeanFactoryPostProcessor Ejemplo: la PropertyPlaceholderConfigurer Ejemplo: la PropertyOverrideConfigurer

5.8.3. Personalizacin de la lgica de instancias con una FactoryBean 5,9. Anotacin basada en contenedor de configuracin 5.9.1. @Required 5.9.2. @Autowired 5.9.3. Ajuste de anotacin basado autowiring con los calificadores 5.9.4. CustomAutowireConfigurer 5.9.5. @Resource 5.9.6. @PostConstruct y @PreDestroy 5,10. Exploracin Classpath y componentes administrados 5.10.1. @Component y anotaciones posteriores estereotipo 5.10.2. La deteccin automtica de clases y el registro de las definiciones de frijol 5.10.3. Uso de filtros para personalizar la exploracin 5.10.4. Definicin de metadatos de frijol dentro de los componentes 5.10.5. Nombrar los componentes detectados automticamente 5.10.6. Proporcionar un espacio para componentes autodetectadas 5.10.7. Proporcionar metadatos calificador con anotaciones

5,11. Utilizando Anotaciones JSR 330 estndar 5.11.1. Inyeccin de Dependencia con @Inject y @Named . 5.11.2 @Named : una norma equivalente a la @Component anotacin 5.11.3. Limitaciones del enfoque estndar 5,12. Basado en Java contenedor de configuracin 5.12.1. Conceptos bsicos: @Configuration y @Bean 5.12.2. Instanciar el contenedor Spring usando
AnnotationConfigApplicationContext

Construccin simple La construccin del contenedor mediante programacin con


register(Class<?>...)

Habilitacin componente de exploracin con scan(String...) Soporte para aplicaciones web con
AnnotationConfigWebApplicationContext

5.12.3. Redaccin basadas en Java configuraciones Uso de la @Import anotacin La combinacin de Java y XML de configuracin 5.12.4. Uso del @Bean anotacin Declarar un bean Inyeccin de dependencias Recepcin de las devoluciones de llamada de ciclo de vida Especificacin del mbito de frijol Personalizacin de frijol de nomenclatura Frijol aliasing 5.12.5. Para ms informacin acerca de cmo la configuracin basada en Java funciona internamente 5,13. Registro de una LoadTimeWeaver 5,14. Capacidades adicionales de la ApplicationContext 5.14.1. Internacionalizacin mediante MessageSource 5.14.2. Eventos estndar y personalizados 5.14.3. La facilidad de acceso a bajo nivel de recursos 5.14.4. Conveniente ApplicationContext de instancias para las aplicaciones web 5.14.5. Implementacin de un ApplicationContext primavera como un archivo RAR J2EE 5,15. El BeanFactory 5.15.1. BeanFactory o ApplicationContext ? 5.15.2. Pegue el cdigo y el mal singleton 6. Recursos 6,1. Introduccin 6,2. El Resource interfaz 6,3. Built-in Resource implementaciones 6.3.1. UrlResource 6.3.2. ClassPathResource 6.3.3. FileSystemResource 6.3.4. ServletContextResource 6.3.5. InputStreamResource 6.3.6. ByteArrayResource 6,4. El ResourceLoader 6,5. El ResourceLoaderAware interfaz

6.6. Resources como dependencias 6,7. Contextos de aplicacin y Resource caminos 6.7.1. La construccin de contextos de aplicacin La construccin de ClassPathXmlApplicationContext casos accesos directos 6.7.2. Los comodines en las rutas de aplicaciones contextuales recursos constructor Estilo Ant-Patrones El classpath*: prefijo Otras notas relacionadas con comodines 6.7.3. FileSystemResource advertencias 7. Validacin, enlace de datos y el tipo de conversin 7,1. Introduccin 7,2. Validacin utilizando Spring Validator interfaz 7,3. La resolucin de los cdigos de mensajes de error 7,4. Frijol manipulacin y el BeanWrapper 7.4.1. Establecer y obtener propiedades bsicas y anidados 7.4.2. Construido en PropertyEditor implementaciones Registro adicionales personalizados PropertyEditors 7,5. Spring 3 Tipo de conversin 7.5.1. Convertidor de SPI 7.5.2. ConverterFactory 7.5.3. GenericConverter ConditionalGenericConverter 7.5.4. ConversionService API 7.5.5. Configuracin de un ConversionService 7.5.6. El uso de un ConversionService programacin 7,6. Spring 3 Campo de formato 7.6.1. Formatter SPI 7.6.2. Anotacin basada formato Formato API anotacin 7.6.3. FormatterRegistry SPI 7.6.4. FormatterRegistrar SPI 7.6.5. Configuracin de formato en Spring MVC 7.7. Configuracin de un formato de fecha y hora mundial 7,8. Spring 3 Validacin 7.8.1. Visin general de la API JSR-303 Frijol de validacin 7.8.2. Configuracin de una aplicacin Bean Validation La inyeccin de un validador Configuracin de restricciones personalizadas Opciones de configuracin adicionales 7.8.3. Configuracin de un DataBinder 7.8.4. Spring MVC 3 Validacin Disparo @ validacin de entrada del controlador Configuracin de un validador para el uso de Spring MVC Configuracin de un validador de JSR-303 para el uso de Spring MVC 8. Spring Expression Language (SPEL) 8,1. Introduccin 8,2. Descripcin general de caractersticas 8,3. Evaluacin de expresiones con la interfaz de Spring Expresin

8.3.1. La interfaz EvaluationContext Conversin de tipos 8,4. Expresin de apoyo para definir las definiciones de frijol 8.4.1. Configuracin basada en XML 8.4.2. Anotacin de configuracin basada en 8,5. Referencia del lenguaje 8.5.1. Expresiones literales 8.5.2. Propiedades, matrices, listas, mapas, indizadores 8.5.3. Listas Inline 8.5.4. Matriz construccin 8.5.5. Mtodos 8.5.6. Operadores Los operadores relacionales Los operadores lgicos Los operadores matemticos 8.5.7. Asignacin 8.5.8. Tipos 8.5.9. Constructores 8.5.10. Variables Las variables de raz y # # esto 8.5.11. Funciones 8.5.12. Referencias de frijol 8.5.13. Ternario del operador (If-Then-Else) 8.5.14. El Operador Elvis 8.5.15. Operador navegacin segura 8.5.16. Coleccin de Seleccin 8.5.17. Coleccin de proyeccin 8.5.18. Expresin de plantillas 8,6. Clases utilizadas en los ejemplos 9. Programacin Orientada a Aspectos con Spring 9,1. Introduccin 9.1.1. AOP conceptos 9.1.2. Spring AOP capacidades y objetivos 9.1.3. AOP Proxies 9,2. @ AspectJ apoyo 9.2.1. Habilitacin @ Soporte AspectJ Habilitacin @ Soporte AspectJ con Java configuracin Habilitacin @ Soporte de configuracin XML con AspectJ 9.2.2. Declarar un aspecto 9.2.3. La declaracin de un punto de corte Compatibles Designadores pointcut Combinando las expresiones pointcut Compartiendo definiciones comunes pointcut Ejemplos Escribir buenos puntos de corte 9.2.4. La declaracin de asesoramiento Antes de asesoramiento Despus de regresar asesoramiento Despus de lanzar asesoramiento Despus (por fin) el asesoramiento

Alrededor de asesoramiento Consejos parmetros Consejos de pedido 9.2.5. Presentaciones 9.2.6. Los modelos de instancias de aspecto 9.2.7. Ejemplo 9.3. Esquema basado en AOP apoyo 9.3.1. Declarar un aspecto 9.3.2. La declaracin de un punto de corte 9.3.3. La declaracin de asesoramiento Antes de asesoramiento Despus de regresar asesoramiento Despus de lanzar asesoramiento Despus (por fin) el asesoramiento Alrededor de asesoramiento Consejos parmetros Consejos de pedido 9.3.4. Presentaciones 9.3.5. Los modelos de instancias de aspecto 9.3.6. Asesores 9.3.7. Ejemplo 9,4. Elegir qu tipo de declaracin a utilizar AOP 9.4.1. Spring AOP o AspectJ completo? 9.4.2. @ AspectJ o XML para Spring AOP? 9,5. Mezclar tipos de aspecto 9,6. Mecanismos Proxying 9.6.1. Entender proxies AOP 9,7. Creacin programtica de los Proxies @ AspectJ 9,8. Usando AspectJ con aplicaciones de primavera 9.8.1. Usando AspectJ a la dependencia inyectar objetos de dominio con la primavera Las pruebas unitarias @Configurable objetos Trabajar con mltiples contextos de aplicacin 9.8.2. Otros aspectos de primavera para AspectJ 9.8.3. Configuracin de los aspectos AspectJ utilizando Spring COI 9.8.4. Carga en tiempo tejiendo con AspectJ en el Spring Framework Un ejemplo primero Aspectos ' META-INF/aop.xml ' Bibliotecas necesarias (JARS) Primavera configuracin Medio Ambiente configuracin especfica 9,9. Recursos adicionales 10. Spring AOP APIs 10,1. Introduccin 10,2. Pointcut API en la primavera 10.2.1. Conceptos 10.2.2. Las operaciones en puntos de corte 10.2.3. AspectJ expresin de puntos de corte 10.2.4. Implementaciones de Conveniencia pointcut

Puntos de corte esttico Puntos de corte dinmico 10.2.5. Superclases pointcut 10.2.6. Puntos de corte personalizados 10,3. Consejos de API en la primavera 10.3.1. Ciclos de vida de Asesoramiento 10.3.2. Tipos de asesoramiento en primavera Interceptacin alrededor asesoramiento Antes de asesoramiento Emite consejo Despus de regresar asesoramiento Introduccin consejo 10,4. Asesor de Programas en la primavera 10,5. Uso de la ProxyFactoryBean para crear proxies AOP 10.5.1. Lo esencial 10.5.2. JavaBean propiedades 10.5.3. JDK-y CGLIB proxies basados en 10.5.4. Interfaces de conexiones proxy 10.5.5. Clases de conexiones proxy 10.5.6. Usando "globales" asesores 10,6. Definiciones concisas de proxy 10,7. La creacin de proxies AOP mediante programacin con el ProxyFactory 10,8. Manipulacin de objetos asesorados 10,9. Uso de la "autoproxy" instalacin 10.9.1. AutoProxy frijol definiciones BeanNameAutoProxyCreator DefaultAdvisorAutoProxyCreator AbstractAdvisorAutoProxyCreator 10.9.2. El uso de metadatos basada en auto-proxy 10.10. Usando TargetSources 10.10.1. Hot swappable fuentes de destino 10.10.2. La combinacin de fuentes de destino 10.10.3. Fuentes prototipo de destino 10.10.4. ThreadLocal fuentes de destino 10.11. Definicin de nuevos Advice tipos 10.12. Otros recursos 11. Pruebas 11,1. Introduccin a las pruebas de primavera 11,2. Pruebas unitarias 11.2.1. Mock Objects Medio ambiente JNDI Servlet API Portlet API 11.2.2. Unidad de apoyo a las clases de prueba Utilidades Generales Spring MVC 11,3. Pruebas de Integracin 11.3.1. Visin de conjunto 11.3.2. Objetivos de las Pruebas de Integracin

Contexto y almacenamiento en cach Inyeccin de Dependencia de accesorios de prueba Gestin de transacciones Las clases de apoyo para las pruebas de integracin 11.3.3. JDBC Soporte Pruebas 11.3.4. Anotaciones Anotaciones Primavera Pruebas Soporte de anotacin estndar Primavera Pruebas JUnit Anotaciones 11.3.5. Spring Framework TestContext Abstracciones clave Contexto de la gestin Inyeccin de dependencia de accesorios de prueba Pruebas de solicitud y sesin de frijoles con mbito Gestin de transacciones TestContext Marco de las clases de apoyo 11.3.6. Spring MVC Framework prueba Pruebas del lado del servidor Pruebas de cliente REST 11.3.7. Ejemplo PetClinic 11,4. Recursos adicionales IV. Acceso a datos 12. Administracin de transacciones 12,1. Introduccin a la gestin de transacciones Spring Framework 12,2. Ventajas del modelo Spring Framework de transacciones de apoyo 12.2.1. Las transacciones globales 12.2.2. Las transacciones locales 12.2.3. Modelo de programacin coherente Spring Framework 12,3. Comprender el Spring Framework abstraccin transaccin 12,4. Sincronizacin de los recursos con transacciones 12.4.1. Alto nivel de sincronizacin enfoque 12.4.2. Bajo nivel de sincronizacin enfoque 12.4.3. TransactionAwareDataSourceProxy 12,5. Gestin de transacciones declarativa 12.5.1. Comprender la implementacin del Marco de Spring transaccin declarativa 12.5.2. Ejemplo de implementacin de transacciones declarativa 12.5.3. Anulacin de una transaccin declarativa 12.5.4. Configuracin de diferentes semntica transaccional para las semillas de diferentes 12.5.5. <tx:advice/> ajustes 12.5.6. Usando @Transactional @Transactional ajustes Los administradores mltiples transacciones con @Transactional Anotaciones personalizadas de acceso directo 12.5.7. Transaccin propagacin Necesario RequiresNew Nested 12.5.8. Asesorar a las operaciones transaccionales

12.5.9. Usando @Transactional con AspectJ 12,6. Gestin de transacciones programtica 12.6.1. Uso de la TransactionTemplate Especificacin de los valores de transaccin 12.6.2. Uso de la PlatformTransactionManager 12,7. Elegir entre la gestin de transacciones programticas y declarativas 12,8. Servidor de aplicaciones especficas de integracin 12.8.1. IBM WebSphere 12.8.2. BEA WebLogic Server 12.8.3. Oracle OC4J 12,9. Las soluciones a los problemas comunes 12.9.1. El uso del gestor de transacciones mal para un determinado DataSource 12.10. Recursos adicionales 13. DAO apoyo 13,1. Introduccin 13,2. Jerarqua excepcin consistente 13,3. Anotaciones utilizados para la configuracin de las clases DAO o depsito 14. Acceso a los datos con JDBC 14,1. Introduccin a Spring Framework JDBC 14.1.1. Eleccin de un mtodo de acceso de base de datos JDBC 14.1.2. Paquete de jerarqua 14,2. Uso de las clases principales de JDBC para controlar el procesamiento bsico JDBC y manejo de errores 14.2.1. JdbcTemplate Ejemplos de utilizacin de la clase JdbcTemplate JdbcTemplate mejores prcticas 14.2.2. NamedParameterJdbcTemplate 14.2.3. SimpleJdbcTemplate 14.2.4. SQLExceptionTranslator 14.2.5. Ejecucin de sentencias 14.2.6. Ejecucin de consultas 14.2.7. Actualizacin de la base de datos 14.2.8. Recuperacin automtica de claves generadas 14,3. Controlar las conexiones de base de datos 14.3.1. DataSource 14.3.2. DataSourceUtils 14.3.3. SmartDataSource 14.3.4. AbstractDataSource 14.3.5. SingleConnectionDataSource 14.3.6. DriverManagerDataSource 14.3.7. TransactionAwareDataSourceProxy 14.3.8. DataSourceTransactionManager 14.3.9. NativeJdbcExtractor 14,4. JDBC operaciones por lotes 14.4.1. Operaciones bsicas de proceso por lotes con el JdbcTemplate 14.4.2. Las operaciones por lotes con una lista de objetos 14.4.3. Las operaciones por lotes con varios lotes 14,5. La simplificacin de las operaciones con las clases JDBC SimpleJdbc 14.5.1. Insertar datos utilizando SimpleJdbcInsert

14.5.2. Recuperacin automtica de claves generadas utilizando SimpleJdbcInsert 14.5.3. Especificacin de las columnas para un SimpleJdbcInsert 14.5.4. Uso de SqlParameterSource para proporcionar valores de parmetro 14.5.5. Llamar a un procedimiento almacenado con SimpleJdbcCall 14.5.6. Declarar explcitamente los parmetros a utilizar para un SimpleJdbcCall 14.5.7. Cmo definir SqlParameters 14.5.8. Llamar a una funcin almacenada utilizando SimpleJdbcCall 14.5.9. Volviendo ResultSet / REF Cursor desde un SimpleJdbcCall 14,6. Modelado de las operaciones de JDBC como objetos Java 14.6.1. SqlQuery 14.6.2. MappingSqlQuery 14.6.3. SqlUpdate 14.6.4. StoredProcedure 14,7. Problemas comunes con el parmetro de valor y manejo de datos 14.7.1. Proporcionar informacin de tipo SQL para los parmetros 14.7.2. Manipulacin de objetos BLOB y CLOB 14.7.3. Pasando en las listas de valores en la clusula 14.7.4. Manejo de tipos complejos para llamadas a procedimientos almacenados 14,8. Base de datos interna de apoyo 14.8.1. Por qu utilizar una base de datos integrada? 14.8.2. Creacin de una instancia de base de datos incrustado utilizando Spring XML 14.8.3. Creacin de una instancia de base de datos incrustado mediante programacin 14.8.4. Ampliacin de la base de datos integrada de apoyo 14.8.5. Usando HSQL 14.8.6. Usando H2 14.8.7. Usando Derby 14.8.8. Prueba de la lgica de acceso a datos con una base de datos integrada 14,9. La inicializacin de un origen de datos 14.9.1. Inicializar una instancia de base de datos XML utilizando Spring Inicializacin de otros componentes que dependen de la base de datos 15. Mapeo objeto relacional (ORM) de acceso a datos 15,1. Introduccin a ORM con Spring 15,2. Generales ORM Consideraciones sobre la integracin 15.2.1. Recursos y gestin de transacciones 15.2.2. Excepcin traduccin 15,3. Hibernar 15.3.1. SessionFactory de instalacin en un contenedor Spring 15.3.2. La implementacin de DAOs basado en llano API Hibernate 3 15.3.3. Demarcacin de transacciones declarativa 15.3.4. Demarcacin de transacciones programtica 15.3.5. Estrategias de gestin de transacciones 15.3.6. Comparando contenedores administrados y definidos los recursos locales 15.3.7. Falsas alertas de servidor de aplicaciones con Hibernate 15.4. JDO 15.4.1. PersistenceManagerFactory configuracin 15.4.2. La implementacin de DAOs basado en la llanura API JDO 15.4.3. Gestin de transacciones

15.4.4. JdoDialect 15,5. JPA 15.5.1. Hay tres opciones para la configuracin de la APP en un ambiente de primavera
LocalEntityManagerFactoryBean La obtencin de una EntityManagerFactory de LocalContainerEntityManagerFactoryBean

JNDI

Lidiar con mltiples unidades de persistencia 15.5.2. Implementar DAOs basado en llano JPA 15.5.3. Administracin de transacciones 15.5.4. JpaDialect 15,6. iBATIS SQL Maps 15.6.1. Configuracin del SqlMapClient 15.6.2. Usando SqlMapClientTemplate y SqlMapClientDaoSupport 15.6.3. La implementacin de DAOs basado en API iBATIS llanura 16. Marshalling XML usando O / X mappers 16,1. Introduccin 16,2. Marshaller y Unmarshaller 16.2.1. Marshaller 16.2.2. Unmarshaller 16.2.3. XmlMappingException 16,3. Usando Marshaller y Unmarshaller 16,4. XML Schema configuracin basada en 16,5. JAXB 16.5.1. Jaxb2Marshaller XML Schema configuracin basada en 16,6. Castor 16.6.1. CastorMarshaller 16.6.2. Mapping 16.7. XMLBeans 16.7.1. XmlBeansMarshaller XML Schema configuracin basada en 16,8. JiBX 16.8.1. JibxMarshaller XML Schema configuracin basada en 16,9. XStream 16.9.1. XStreamMarshaller V. La Web 17. Web MVC marco 17,1. Introduccin a Spring Web MVC marco 17.1.1. Caractersticas de Spring Web MVC 17.1.2. Enchufabilidad de otras implementaciones de MVC 17,2. El DispatcherServlet 17.2.1. Tipos especiales de frijol en el WebApplicationContext 17.2.2. Configuracin predeterminada DispatcherServlet 17.2.3. Secuencia de procesamiento DispatcherServlet 17,3. Los controladores de aplicacin 17.3.1. Definicin de un controlador con @Controller 17.3.2. Las solicitudes de asignacin con @RequestMapping Nuevas clases de apoyo para @RequestMapping mtodos en Spring MVC 3.1

Los patrones de URI de plantilla Los patrones de URI plantilla con expresiones regulares Patrones de trayectoria Los patrones con comodines Variables de matriz Tipos de soportes consumibles Tipos de medios producible Parmetros de la peticin y los valores de la cabecera 17.3.3. Definir @RequestMapping mtodos de controlador Los tipos de los argumentos de mtodo Los tipos de mtodos de devolucin Los parmetros de unin de solicitud a los parmetros del mtodo con
@RequestParam

Cartografa del cuerpo de la solicitud con la anotacin @ RequestBody Cartografa del cuerpo de la respuesta con el @ResponseBody anotacin Uso de HttpEntity<?> Usando @ModelAttribute en un mtodo Usando @ModelAttribute en un argumento de mtodo Usando @SessionAttributes para almacenar atributos del modelo en la sesin entre peticiones HTTP Especificacin de atributos y redirigir Flash Trabajar con "application/x-www-form-urlencoded" datos Asignacin de valores de cookie con la anotacin @ CookieValue Asignacin de atributos de la peticin de cabecera con la anotacin @ RequestHeader Parmetros de mtodos y reconversin Personalizacin WebDataBinder inicializacin Apoyo a la cabecera de la respuesta del 'Last-Modified "para facilitar el almacenamiento en cach de contenido 17.3.4. Procesamiento de solicitud asincrnica Manejo de excepciones para las solicitudes asincrnicas Interceptar peticiones asncronas Configuracin para Procesamiento de solicitudes Async 17.3.5. Controladores de Pruebas 17,4. Asignaciones de controlador 17.4.1. Interceptar solicitudes con un HandlerInterceptor 17,5. Resolver vistas 17.5.1. Resolucin de puntos de vista con el ViewResolver interfaz 17.5.2. Encadenar ViewResolvers 17.5.3. Redirigir a las opiniones
RedirectView La redirect: prefijo El forward: prefijo 17.5.4. ContentNegotiatingViewResolver

17.6. El uso de atributos de flash 17.7. Edificio URI s 17.8. Utilizando locales 17.8.1. AcceptHeaderLocaleResolver 17.8.2. CookieLocaleResolver 17.8.3. SessionLocaleResolver

17.8.4. LocaleChangeInterceptor 17.9. Utilizar temas 17.9.1. Visin general de los temas 17.9.2. Definicin de los temas 17.9.3. Resolucin de temticas 17.10. Multipart Spring (carga de archivos), soporte 17.10.1. Introduccin 17.10.2. El uso de un MultipartResolver con FileUpload Commons 17.10.3. El uso de un MultipartResolver con Servlet 3.0 17.10.4. Manejo de una carga de archivos en una forma 17.10.5. Manejo de una solicitud de carga de archivos de clientes programticas 17.11. Manejo de excepciones 17.11.1. HandlerExceptionResolver 17.11.2. @ExceptionHandler 17.11.3. Manejo de Excepciones MVC estndar de Primavera 17.11.4. Anotacin de negocios Con excepciones @ResponseStatus 17.11.5. Personalizacin del Servlet Container pgina de error por defecto 17.12. Convencin sobre la configuracin 17.12.1. El controlador ControllerClassNameHandlerMapping 17.12.2. El Modelo ModelMap ( ModelAndView ) 17.12.3. The View - RequestToViewNameTranslator 17.13. ETag apoyo 17.14. Cdigo basado en Servlet inicializacin del contenedor 17.15. Configuracin de Spring MVC 17.15.1. Habilitacin del MVC Java Config o el espacio de nombres XML MVC 17.15.2. Personalizacin de la configuracin proporcionada 17.15.3. Configuracin de interceptores 17.15.4. Configuracin de Negociacin de contenido 17.15.5. Configuracin de controladores de vista 17.15.6. Configuracin Porcin de Recursos 17.15.7. mvc: default-servlet-controlador 17.15.8. Ms Spring Web MVC Recursos 17.15.9. Personalizaciones avanzadas con MVC Java Config 17.15.10. Personalizaciones avanzadas con el espacio de nombres MVC 18. Ver las tecnologas 18,1. Introduccin 18,2. JSP y JSTL 18.2.1. Ver resolvers 18.2.2. "Plain-viejas JSP JSTL frente 18.2.3. Etiquetas adicionales que faciliten el desarrollo 18.2.4. Usando biblioteca de Spring formulario de etiqueta Configuracin La form de etiquetas La input etiqueta La checkbox etiqueta La checkboxes etiqueta El radiobutton etiqueta El radiobuttons etiqueta La password etiqueta La select etiqueta

La option etiqueta La options etiqueta El textarea etiqueta El hidden etiqueta Los errors etiqueta HTTP Mtodo de conversin HTML5 Tags 18,3. Azulejos 18.3.1. Dependencias 18.3.2. Cmo integrar Azulejos
UrlBasedViewResolver ResourceBundleViewResolver SimpleSpringPreparerFactory

y SpringBeanPreparerFactory 18,4. Velocidad y FreeMarker 18.4.1. Dependencias 18.4.2. Contexto configuracin 18.4.3. Creacin de plantillas 18.4.4. Configuracin avanzada velocity.properties FreeMarker 18.4.5. Bind apoyo y la forma de manejo Las macros se unen Simple unin Formulario de macros de entrada generacin HTML escapar y compatibilidad con XHTML 18,5. XSLT 18.5.1. Mis primeras palabras Frijoles definiciones Estndar MVC controlador de cdigo Convertir los datos del modelo a XML Definicin de las propiedades de la vista Documento de transformacin 18.5.2. Resumen 18,6. Vistas del documento (PDF / Excel) 18.6.1. Introduccin 18.6.2. Configuracin y puesta en Definiciones de documento Ver Controlador de cdigo Subclases para las vistas de Excel Subclases de vistas de PDF 18.7. JasperReports 18.7.1. Dependencias 18.7.2. Configuracin Configuracin del ViewResolver Configuracin de la View s Acerca de los archivos de informe Usando JasperReportsMultiFormatView 18.7.3. Poblando el ModelAndView 18.7.4. Trabajar con subinformes Configuracin de Informe Sub-Files

Configuracin del Informe Sub-Orgenes de datos 18.7.5. Configuracin de los parmetros Exportador 18,8. Vistas de Alimentacin 18,9. XML Marshalling View 18.10. JSON Ver Mapping 19. Integracin con otros frameworks web 19,1. Introduccin 19,2. Configuracin comn 19,3. JavaServer Faces 1.1 y 1.2 19.3.1. DelegatingVariableResolver JSF (1.1/1.2) 19.3.2. SpringBeanVariableResolver JSF (1.1/1.2) 19.3.3. SpringBeanFacesELResolver (JSF 1.2 +) 19.3.4. FacesContextUtils 19,4. Apache Struts 1.x y 2.x 19.4.1. ContextLoaderPlugin DelegatingRequestProcessor DelegatingActionProxy 19.4.2. ActionSupport Clases 19,5. WebWork 2.x 19,6. Tapestry 3.xy 4.x 19.6.1. La inyeccin gestionadas por resorte frijoles Inyeccin de Dependencia Beans primavera en pginas Tapestry Archivos de definicin de componentes Adicin de acceso abstractos Inyeccin de Dependencia Beans primavera en pginas Tapestry - estilo Tapestry 4.x 19,7. Recursos adicionales 20. Portlet MVC Framework 20,1. Introduccin 20.1.1. Controllers - El C en MVC 20.1.2. Vistas - El V en MVC 20.1.3. Web de mbito de frijoles 20,2. El DispatcherPortlet 20,3. El ViewRendererServlet 20,4. Controladores 20.4.1. AbstractController y PortletContentGenerator 20.4.2. Otros controladores sencillos 20.4.3. Controladores de comandos 20.4.4. PortletWrappingController 20,5. Asignaciones de controlador 20.5.1. PortletModeHandlerMapping 20.5.2. ParameterHandlerMapping 20.5.3. PortletModeParameterHandlerMapping 20.5.4. Adicin HandlerInterceptor s 20.5.5. HandlerInterceptorAdapter 20.5.6. ParameterMappingInterceptor 20,6. Puntos de vista y resolver los 20,7. Multipart (carga de archivos), soporte 20.7.1. Uso de la PortletMultipartResolver 20.7.2. Manejo de una carga de archivos en una forma

20.8. Manejo de excepciones 20,9. Anotacin de control basada en la configuracin 20.9.1. Configuracin del despachador de apoyo anotacin 20.9.2. Definicin de un controlador con @Controller 20.9.3. Solicitudes de asignacin con @RequestMapping 20.9.4. Compatibles argumentos controlador de mtodos 20.9.5. Los parmetros de unin de solicitud a los parmetros del mtodo con
@RequestParam

20.9.6. Proporcionar un enlace a los datos del modelo con @ModelAttribute 20.9.7. Especificacin de atributos para almacenar en una reunin con
@SessionAttributes

20.9.8. Personalizacin WebDataBinder inicializacin Personalizacin de los datos obligatorios con @InitBinder Configuracin de una costumbre WebBindingInitializer 20.10. Portlet de implementacin de aplicaciones VI. Integracin 21. Remoting y servicios web utilizando Spring 21,1. Introduccin 21,2. La exposicin de los servicios que utilizan RMI 21.2.1. Exportacin del servicio mediante la RmiServiceExporter 21.2.2. La vinculacin en el servicio en el cliente 21,3. El uso de servicios de Hesse o arpillera para llamar de forma remota a travs de HTTP 21.3.1. Cableado del DispatcherServlet de arpillera y compaa. 21.3.2. Exposicin de los granos mediante el HessianServiceExporter 21.3.3. La vinculacin al servicio del cliente 21.3.4. Usando Burlap 21.3.5. La aplicacin de autenticacin bsica HTTP a un servicio expuesto a travs de arpillera arpillera o 21,4. La exposicin de los servicios que utilizan HTTP invocadores 21.4.1. La exposicin del objeto de servicio 21.4.2. La vinculacin en el servicio en el cliente 21,5. Los servicios Web 21.5.1. La exposicin de servlet servicios basados en web utilizando JAX-RPC 21.5.2. Acceso a servicios web utilizando JAX-RPC 21.5.3. Registro de JAX-RPC haba Asignaciones 21.5.4. El registro de su propio controlador de JAX-RPC 21.5.5. La exposicin de servlet servicios basados en web utilizando JAX-WS 21.5.6. Exportacin de servicios web independientes utilizando JAX-WS 21.5.7. Exportacin de servicios web mediante el apoyo de la RI JAX-WS de primavera 21.5.8. Acceso a servicios web utilizando JAX-WS 21,6. JMS 21.6.1. Configuracin del lado del servidor 21.6.2. Configuracin del lado del cliente 21,7. Auto-deteccin no est implementado para interfaces remotas 21,8. Consideraciones al momento de elegir una tecnologa 21,9. Acceder a los servicios REST en el cliente 21.9.1. RestTemplate Trabajar con el URI

Tratando con cabeceras de peticin y respuesta 21.9.2. HTTP conversin de mensajes StringHttpMessageConverter FormHttpMessageConverter ByteArrayHttpMessageConverter MarshallingHttpMessageConverter MappingJackson2HttpMessageConverter (o MappingJacksonHttpMessageConverter con 1.x Jackson) SourceHttpMessageConverter BufferedImageHttpMessageConverter 22. Enterprise JavaBeans (EJB) integracin 22,1. Introduccin 22,2. Acceso a EJBs 22.2.1. Conceptos 22.2.2. Acceso SLSBs locales 22.2.3. Acceso remoto SLSBs 22.2.4. Acceso a EJB 2.x SLSBs frente EJB 3 SLSBs 22,3. El uso de EJB Spring clases de apoyo a la ejecucin 22.3.1. EJB 2.x clases base 22.3.2. EJB 3 inyeccin interceptor 23. JMS (Java Message Service) 23,1. Introduccin 23,2. Utilizando Spring JMS 23.2.1. JmsTemplate 23.2.2. Conexiones Almacenamiento en cach los recursos de mensajera SingleConnectionFactory CachingConnectionFactory 23.2.3. Destination Management 23.2.4. Contenedores de escucha de mensajes SimpleMessageListenerContainer DefaultMessageListenerContainer 23.2.5. Gestin de transacciones 23,3. Envo de un Message 23.3.1. Uso de convertidores Mensaje 23.3.2. SessionCallback y ProducerCallback 23.4. Recepcin de un mensaje 23.4.1. Recepcin sncrona 23.4.2. Recepcin Asncrona - controlados por mensajes POJOs 23.4.3. El SessionAwareMessageListener interfaz 23.4.4. Los MessageListenerAdapter 23.4.5. Procesamiento de mensajes dentro de las transacciones 23,5. Soporte para puntos finales Mensaje JCA 23,6. JMS Soporte Espacio de nombres 24. JMX 24,1. Introduccin 24,2. Exportacin de sus granos a JMX 24.2.1. Creacin de un MBeanServer 24.2.2. La reutilizacin de una ya existente MBeanServer 24.2.3. Lazy-inicializadas MBeans

24.2.4. Registro automtico de MBeans 24.2.5. Control del comportamiento de registro 24,3. El control de la interfaz de gestin de los frijoles 24.3.1. El MBeanInfoAssembler Interface 24.3.2. El uso a nivel de fuente de metadatos (anotaciones JDK 5.0) 24.3.3. Nivel de Fuente tipos de metadatos 24.3.4. El AutodetectCapableMBeanInfoAssembler interfaz 24.3.5. Definicin de interfaces de gestin que utilizan las interfaces de Java 24.3.6. Usando MethodNameBasedMBeanInfoAssembler 24,4. El control de la ObjectName s para sus granos 24.4.1. Lectura ObjectName s de Properties 24.4.2. Uso de la MetadataNamingStrategy 24.4.3. Configuracin de anotacin basada en la exportacin MBean 24,5. JSR-160 Conectores 24.5.1. Conectores del lado del servidor 24.5.2. Conectores del lado del cliente 24.5.3. JMX sobre arpillera / Hessen / SOAP 24,6. MBeans Acceso a travs de proxy 24.7. Notificaciones 24.7.1. Oyentes Registro de Notificaciones 24.7.2. Notificaciones de publicacin 24,8. Recursos adicionales 25. JCA CCI 25,1. Introduccin 25.2. Configuracin del CCI 25.2.1. Configuracin del conector 25.2.2. ConnectionFactory configuracin en la primavera 25.2.3. Configuracin de conexiones CCI 25.2.4. Con una sola conexin CCI 25.3. Con el apoyo de Spring CCI acceso 25.3.1. Registro de conversin 25.3.2. El CciTemplate 25.3.3. DAO apoyo 25.3.4. Generacin automtica de registro de salida 25.3.5. Resumen 25.3.6. El uso de un CCI Connection y Interaction directa 25.3.7. Ejemplo para CciTemplate uso 25,4. Modelado CCI acceso como objetos de operacin 25.4.1. MappingRecordOperation 25.4.2. MappingCommAreaOperation 25.4.3. Generacin automtica de registro de salida 25.4.4. Resumen 25.4.5. Ejemplo para MappingRecordOperation uso 25.4.6. Ejemplo para MappingCommAreaOperation uso 25,5. Transacciones 26. Email 26,1. Introduccin 26.2. Uso 26.2.1. Basic MailSender y SimpleMailMessage uso 26.2.2. Uso de la JavaMailSender y la MimeMessagePreparator

26,3. Uso de la JavaMail MimeMessageHelper 26.3.1. Envo de archivos adjuntos y recursos en lnea Archivos adjuntos Inline recursos 26.3.2. La creacin de contenido de correo electrnico utilizando una biblioteca de plantillas Un ejemplo de velocidad basado en 27. Ejecucin de tareas y programacin 27,1. Introduccin 27,2. La primavera TaskExecutor abstraccin 27.2.1. TaskExecutor tipos 27.2.2. El uso de un TaskExecutor 27,3. La primavera TaskScheduler abstraccin 27.3.1. El Trigger interfaz 27.3.2. Trigger implementaciones 27.3.3. TaskScheduler implementaciones 27,4. Apoyo a la Ejecucin de anotacin y programacin asncrona 27.4.1. Habilitar las anotaciones de planificacin 27.4.2. La anotacin @ programadas 27.4.3. La anotacin @ Async 27.4.4. Ejecutor calificacin con @ Async 27,5. El espacio de nombres de tareas 27.5.1. El "programador" elemento 27.5.2. El 'ejecutor' elemento 27.5.3. El elemento programados-tareas" 27,6. Cmo usar el Programador de cuarzo 27.6.1. Uso de la JobDetailBean 27.6.2. Uso de la MethodInvokingJobDetailFactoryBean 27.6.3. Cableado de puestos de trabajo mediante desencadenadores y la
SchedulerFactoryBean

28. Apoyo en el idioma dinmico 28,1. Introduccin 28,2. Un ejemplo primero 28,3. Definicin de frijol que estn respaldados por los lenguajes dinmicos 28.3.1. Conceptos comunes El <lang:language/> elemento Frijoles actualizables Inline dinmicos archivos de idioma fuente Entendimiento inyeccin de constructor en el contexto de la dinmica de lengua respaldados por frijoles 28.3.2. JRuby frijoles 28.3.3. Groovy frijoles Personalizacin de objetos maravillosos a travs de una devolucin de llamada 28.3.4. Frijoles BeanShell 28.4. Escenarios 28.4.1. Con secuencias de comandos Spring MVC Controladores 28.4.2. Validadores con secuencias de comandos 28,5. Bits and bobs 28.5.1. AOP - asesorar a los frijoles con guin 28.5.2. Alcance

28,6. Recursos adicionales 29. Cach de abstraccin 29,1. Introduccin 29,2. Entender la abstraccin cach 29,3. Declarativa anotacin basado en el almacenamiento en cach 29.3.1. @Cacheable anotacin Generacin de claves por defecto Declaracin de encargo de Generacin de Claves Cache condicional Disponible cach SpEL evaluacin de contexto 29.3.2. @CachePut anotacin 29.3.3. @CacheEvict anotacin 29.3.4. @Caching anotacin 29.3.5. Habilitar el almacenamiento en cach anotaciones 29.3.6. Usando anotaciones personalizadas 29,4. Declarativo basado en XML, el almacenamiento en cach 29,5. Configurar el almacenamiento en cach 29.5.1. JDK ConcurrentMap basada en Cache 29.5.2. Ehcache basada en Cache 29.5.3. Tratar con cachs sin almacn de respaldo 29,6. Enchufando en diferentes cachs de back-end 29.7. Cmo puedo establecer el TTL / TTI / Desalojo poltica / XXX funcin? VII. Apndices A. Uso de Spring Classic A.1. Classic uso ORM A.1.1. Hibernar El HibernateTemplate Implementacin basada en Spring DAO sin devoluciones de llamada A.1.2. JDO JdoTemplate y JdoDaoSupport A.1.3. JPA JpaTemplate y JpaDaoSupport A.2. Classic Spring MVC A.3. Uso de JMS A.3.1. JmsTemplate A.3.2. Recepcin de mensajes asncrono A.3.3. Conexiones A.3.4. Administracin de transacciones B. Classic Spring AOP Uso B.1. Pointcut API en la primavera B.1.1. Conceptos B.1.2. Las operaciones en puntos de corte B.1.3. AspectJ expresin de puntos de corte B.1.4. Implementaciones de Conveniencia pointcut Puntos de corte esttico Puntos de corte dinmico B.1.5. Superclases pointcut B.1.6. Puntos de corte personalizados B.2. Consejos de API en la primavera B.2.1. Ciclos de vida de Asesoramiento

B.2.2. Tipos de asesoramiento en primavera Interceptacin alrededor asesoramiento Antes de asesoramiento Emite consejo Despus de regresar asesoramiento Introduccin consejo B.3. Asesor de Programas en la primavera B.4. Uso de la ProxyFactoryBean para crear proxies AOP B.4.1. Lo esencial B.4.2. JavaBean propiedades B.4.3. JDK-y CGLIB proxies basados en B.4.4. Interfaces de conexiones proxy B.4.5. Clases de conexiones proxy B.4.6. Usando "globales" asesores B.5. Definiciones concisas de proxy B.6. La creacin de proxies AOP mediante programacin con el ProxyFactory B.7. Manipulacin de objetos asesorados B.8. Uso de la "autoproxy" instalacin B.8.1. AutoProxy frijol definiciones BeanNameAutoProxyCreator DefaultAdvisorAutoProxyCreator AbstractAdvisorAutoProxyCreator B.8.2. El uso de metadatos basada en auto-proxy B.9. Usando TargetSources B.9.1. Hot swappable fuentes de destino B.9.2. La combinacin de fuentes de destino B.9.3. Fuentes prototipo de destino B.9.4. ThreadLocal fuentes de destino B.10. Definicin de nuevos Advice tipos B.11. Otros recursos C. Migracin a Spring Framework 3.1 C.1. Componente de exploracin contra el paquete "org" base D. Migracin a Spring Framework 3.2 D.1. Recientemente dependencias opcionales D.2. Apoyo EHCache mud a resortes contexto de apoyo D.3. Procesos en lnea de primavera-asm tarro D.4. Dependencia explcita CGLIB ya no se requiere D.5. Para los usuarios de OSGi D.6. MVC Java Config y Namespace MVC D.7. Decodificacin de Valores URI variables D.8. Mtodo HTTP PARCHE D.9. Azulejos 3 D.10. Spring MVC prueba independiente del proyecto D.11. Dependencias de pruebas de la primavera D.12. Pblicas cambios en el API D.12.1. JDiff informes D.12.2. El desuso E. esquema XML de configuracin basada en E.1. Introduccin E.2. Esquema XML de configuracin basada en

E.2.1. Hacer referencia a los esquemas E.2.2. El util esquema


<util:constant/> <util:property-path/> <util:properties/> <util:list/> <util:map/> <util:set/> E.2.3. El jee esquema <jee:jndi-lookup/> (simple) <jee:jndi-lookup/> (con ajuste nico entorno JNDI) <jee:jndi-lookup/> (con mltiples configuraciones de entorno <jee:jndi-lookup/> (complejo) <jee:local-slsb/> (simple) <jee:local-slsb/> (complejo) <jee:remote-slsb/> E.2.4. El lang esquema E.2.5. El jms esquema E.2.6. La tx (transaccin) esquema E.2.7. El aop esquema E.2.8. El context de esquema <property-placeholder/> <annotation-config/> <component-scan/> <load-time-weaver/> <spring-configured/> <mbean-export/> E.2.9. La tool esquema E.2.10. El jdbc esquema E.2.11. El cache esquema E.2.12. El beans esquema

JNDI)

F. extensible XML de autora F.1. Introduccin F.2. Creacin del esquema F.3. Codificacin de una NamespaceHandler F.4. Codificacin de una BeanDefinitionParser F.5. Registrar el manejador y el esquema F.5.1. 'META-INF/spring.handlers' F.5.2. 'META-INF/spring.schemas' F.6. Con una extensin personalizada en su configuracin XML Spring F.7. Ms sustancioso ejemplos F.7.1. Anidar etiquetas personalizadas dentro de las etiquetas personalizadas F.7.2. Los atributos personalizados en "normales" elementos F.8. Recursos adicionales G. spring.tld G.1. Introduccin G.2. El bind etiqueta G.3. El escapeBody etiqueta G.4. El hasBindErrors etiqueta G.5. El htmlEscape etiqueta G.6. El message etiqueta G.7. El nestedPath etiqueta

G.8. El theme etiqueta G.9. La transform etiqueta G.10. La url etiqueta G.11. La eval etiqueta H. primavera-form.tld H.1. Introduccin H.2. La checkbox etiqueta H.3. La checkboxes etiqueta H.4. Los errors etiqueta A.5. La form de etiquetas A.6. El hidden etiqueta A.7. La input etiqueta A.8. La label etiqueta A.9. La option etiqueta H.10. La options etiqueta A.11. La password etiqueta A.12. El radiobutton etiqueta A.13. El radiobuttons etiqueta A.14. La select etiqueta H.15. El textarea etiqueta Prximo Parte I. Visin general de Spring Framework

Parte I. Visin general de Spring Framework


El Spring Framework es una solucin ligera y un potencial one-stop-shop para crear sus aplicaciones preparadas para la empresa. Sin embargo, la primavera es modular, lo que permite utilizar slo aquellas partes que usted necesita, sin tener que llevar el resto. Usted puede utilizar el contenedor IoC, con Struts en la parte superior, pero tambin se puede utilizar slo el cdigo de integracin de Hibernate o la capa de abstraccin JDBC . El Spring Framework soporta la gestin de transacciones declarativa, el acceso remoto a su lgica a travs de RMI o servicios web, y varias opciones para la persistencia de datos. Ofrece un completo framework MVC , y le permite integrar AOP transparente en su software. La primavera est diseado para ser no invasivo, lo que significa que el cdigo de la lgica de dominio general, no tiene dependencias en el propio marco. En su capa de integracin (tales como la capa de acceso de datos), algunas dependencias de la tecnologa de acceso de datos y las bibliotecas Spring existir. Sin embargo, debe ser fcil de aislar estas dependencias del resto de la base de cdigo. Este documento es una gua de referencia a Spring Framework caractersticas. Si tiene alguna solicitud, comentarios o preguntas sobre este documento, por favor publicarlos

en la lista de correo del usuario o en los foros de soporte en http://forum.springsource.org/ .

1. Introduccin a Spring Framework


Spring Framework es una plataforma Java que proporciona la infraestructura de apoyo integral para el desarrollo de aplicaciones Java. Spring se encarga de la infraestructura para que pueda centrarse en su aplicacin. Primavera le permite construir aplicaciones a partir de "objetos" Plain Old Java (POJO) y aplicar servicios de la empresa de forma no invasiva para POJOs. Esta capacidad est relacionada con el modelo de programacin de Java SE y Java completo y parcial EE. Ejemplos de cmo usted, como desarrollador de aplicaciones, puede utilizar la plataforma ventaja de primavera:

Haga un mtodo Java se ejecutan en una transaccin de base de datos sin tener que lidiar con las API de transaccin. Haga un mtodo local de Java a un procedimiento remoto sin tener que lidiar con las API remota. Haga un mtodo local de Java una operacin de gestin sin tener que lidiar con JMX API. Haga un mtodo local de Java un controlador de mensajes sin tener que lidiar con las API de JMS.

1.1 Dependencia de inyeccin y Inversin de Control


Fondo "La pregunta es, qu aspecto del control es [que] invertir?" Planteada Martin Fowler esta pregunta sobre inversin de control (IoC) en su sitio en 2004. Fowler sugiri cambiar el nombre del principio para que sea ms fciles de entender y vino para arriba con la inyeccin de dependencias. Para obtener una idea de IoC y DI, consulte el artculo de Fowler en http://martinfowler.com/articles/injection.html . Las aplicaciones Java - un trmino suelto que cubre toda la gama de applets restringidos a aplicaciones de n niveles empresariales de servidor - por lo general consisten en objetos que colaboran para formar la correcta aplicacin. As, los objetos de una aplicacin tienen dependencias entre s. Aunque la plataforma Java proporciona una gran cantidad de funciones de desarrollo de aplicaciones, carece de los medios para organizar los bloques de construccin bsicos en un todo coherente, dejando esa tarea a los arquitectos y desarrolladores. Es cierto que usted puede utilizar patrones de diseo como Factory, Abstract Factory, Builder, Decorator, y Servicio de Busqueda para componer las distintas clases e instancias de objetos que componen una aplicacin. Sin embargo, estos patrones son simplemente eso: buenas prcticas dado un nombre, una descripcin de lo que el patrn hace, dnde

se aplican, los problemas que aborda, y as sucesivamente. Los patrones se formalizaron las mejores prcticas que debes poner en prctica en su aplicacin. El Spring Framework Inversin de Control (IoC) componente aborda este problema al proporcionar un medio formal de componer componentes dispares en una aplicacin totalmente funcional listo para su uso. El Spring Framework codifica formalizados patrones de diseo como objetos de primera clase que se puede integrar en su propia aplicacin (s). Numerosas organizaciones e instituciones utilizan el Spring Framework de esta manera para disear aplicaciones robustas y fciles de mantener.

1.2 Mdulos
El Spring Framework se compone de rasgos organizados en cerca de 20 mdulos. Estos mdulos se agrupan en contenedores Core, datos de acceso / integracin, Web, AOP (Programacin Orientada a Aspectos), Instrumentacin, y prueba, como se muestra en el siguiente diagrama.

Vista general de la Spring Framework


1.2.1 Core Container

El Contenedor Core consiste en el Core, frijoles, contexto y mdulos del lenguaje de expresiones.

El Core y Frijoles mdulos proporcionan las partes fundamentales de la estructura, incluyendo el COI y las caractersticas de inyeccin de dependencias. El BeanFactory es una aplicacin sofisticada del patrn de la fbrica. Se elimina la necesidad de una programacin singletons y le permite desacoplar la configuracin y especificacin de las dependencias de la lgica del programa actual. El Contexto mdulo se basa en la slida base proporcionada por el ncleo y Frijoles mdulos: es un medio para acceder a los objetos de una manera marco de estilo que es similar a un registro de JNDI. El mdulo de contexto hereda sus caractersticas desde el mdulo de Beans y aade soporte para internacionalizacin (usando, por ejemplo, paquetes de recursos), propagacin de eventos, carga de recursos, y la creacin transparente de contextos, por ejemplo, un contenedor de servlets. El mdulo de contexto tambin es compatible con Java EE caractersticas tales como EJB, JMX, y Remoting bsica. El ApplicationContext interfaz es el punto focal del mdulo Context. El lenguaje de expresin mdulo proporciona un poderoso lenguaje de expresin para consultar y manipular un grfico de objetos en tiempo de ejecucin. Es una extensin del lenguaje de expresin unificada (unificado EL) como se especifica en la especificacin JSP 2.1. El lenguaje soporta establecer y obtener valores de la propiedad, la asignacin de la propiedad, la invocacin de mtodos, el acceso al contexto de arrays, colecciones e indizadores, operadores lgicos y aritmticos, las variables con nombre y recuperacin de objetos por el nombre del contenedor de Spring COI. Tambin es compatible con proyeccin lista y seleccin, as como las agrupaciones comunes de la lista.
1.2.2 Acceso a datos / Integracin

El acceso a datos / Integracin capa consiste en el JDBC, ORM, OXM, JMS y los mdulos de transaccin. La JDBC mdulo proporciona una capa de abstraccin JDBC que elimina la necesidad de hacer tedioso JDBC codificacin y el anlisis de los cdigos de proveedor de base de datos de error especficos. El ORM mdulo proporciona capas de integracin para APIs populares mapeo objetorelacional, incluyendo JPA , JDO , Hibernate , y iBatis . Usando el paquete ORM puede utilizar todos estos marcos de O / R-mapping en combinacin con todas las ofertas de otras caractersticas de la primavera, como la simple funcin de gestin de transacciones declarativa mencionado anteriormente. El OXM mdulo proporciona una capa de abstraccin que apoya Objeto / XML implementaciones de asignacin para JAXB, Castor, XMLBeans, JiBX y XStream. El Java Messaging Service ( JMS ) mdulo contiene funciones para mensajes de productores y consumidores. La transaccin mdulo es compatible con la gestin de transacciones programticas y declarativas para las clases que implementan interfaces especiales y para todos sus POJO (Plain Old Java Objects).

1.2.3 Web

La capa de Web consiste en la Web, Web-Servlet, Web Struts, y los mdulos Web de portlet. Mdulo de Spring Web proporciona bsicas web orientados a funciones de integracin como multipart funcionalidad de carga de archivos y la inicializacin del contenedor IoC utilizando oyentes servlet y un contexto de aplicacin orientado a la web. Tambin contiene las partes relacionados con la web de apoyo a la comunicacin remota Spring. El mdulo Web Servlet contiene modelo-vista-controlador de Spring ( MVC ) la implementacin de aplicaciones web. Spring MVC marco proporciona una clara separacin entre el cdigo y el dominio del modelo de formularios web y se integra con todas las otras caractersticas de la infraestructura Spring. El mdulo Web Struts contiene las clases de apoyo para la integracin de un clsico Struts capa web en una aplicacin de Primavera. Tenga en cuenta que este apoyo es considerado obsoleto en la primavera de 3,0. Considere la posibilidad de migrar la aplicacin a Struts 2.0 y su integracin Primavera o en una solucin Spring MVC. El mdulo Web-Portlet proporciona la implementacin MVC para ser utilizado en un entorno de portlet y refleja la funcionalidad de Web-Servlet mdulo.
1.2.4 AOP e Instrumentacin

Spring AOP mdulo proporciona un AOP Alliance cumple con aspecto orientado a la aplicacin de programacin que le permite definir, por ejemplo, el mtodo-interceptores y puntos de corte en el cdigo que implementa limpiamente desacoplar funcionalidades que deberan ser separados. Utilizando la funcionalidad de metadatos a nivel de fuente, tambin puede incorporar informacin sobre el comportamiento en el cdigo, de forma similar a la de los atributos. NET. El mdulo Aspectos separado proporciona integracin con AspectJ. El mdulo de instrumentacin proporciona apoyo clase de instrumentacin y las implementaciones de cargador de clases para ser utilizados en ciertos servidores de aplicaciones.
1.2.5 Prueba

El mdulo de prueba apoya el examen de las piezas del resorte con JUnit o TestNG. Esto proporciona una carga constante de ApplicationContexts primavera y almacenamiento en cach de esos contextos. Tambin proporciona los objetos de imitacin que puede utilizar para probar el cdigo de forma aislada.

1.3 Escenarios de uso

Los componentes descritos anteriormente hacen primavera una opcin lgica en muchos escenarios, desde applets para aplicaciones empresariales completos que utilizan la funcionalidad de gestin de transacciones de Spring y la integracin framework web.

Tpico de pleno derecho Spring aplicacin web Spring declarativas caractersticas de administracin de transacciones que la aplicacin web plenamente transaccional, como lo sera si se utiliza EJB transacciones gestionadas por contenedor. Toda su lgica de negocios personalizada puede implementarse con POJOs simples y gestionada por contenedor de Spring COI. Los servicios adicionales incluyen soporte para el envo de correo electrnico y la validacin independiente de la capa de red, que le permite elegir dnde ejecutar reglas de validacin. Soporte de Spring ORM se integra con JPA, Hibernate, JDO y iBatis, por ejemplo, cuando se usa Hibernate, puede seguir utilizando sus archivos de mapeo Hibernate estndar existentes y SessionFactory de configuracin. Los controladores de formulario se integran perfectamente en la web de capa con el modelo de dominio, eliminando la necesidad de ActionForms u otras clases que transforman los parmetros HTTP a los valores de su modelo de dominio.

Primavera de nivel medio utilizando un framework web de terceros A veces las circunstancias no le permiten cambiar completamente a un marco diferente. El Spring Framework no te obliga a usar todo lo que dentro de ella, no es una solucin todo-o-nada. Existentes front-ends construido con WebWork, Struts, Tapestry, u otros marcos de interfaz de usuario se puede integrar con un resorte a base de nivel medio, lo que le permite utilizar las funciones de Primavera de transaccin. Usted slo tendr que conectar su lgica de negocio utilizando un ApplicationContext y utilizar un WebApplicationContext para integrar su capa web.

Remoting escenario de uso Cuando usted necesita el acceso al cdigo existente a travs de servicios web, puede utilizar Spring Hessian- , Burlap- , Rmi- o JaxRpcProxyFactory clases. Habilitar el acceso remoto a las aplicaciones existentes no es difcil.

EJBs - Envolver POJOs existentes El Spring Framework tambin proporciona una capa de abstraccin de acceso y para Enterprise JavaBeans, lo que le permite volver a utilizar los POJOs existentes y se envuelven en beans de sesin sin estado para su uso en aplicaciones web escalable a prueba de fallos que podran necesitar la seguridad declarativa.
1.3.1 Dependencia de Gestin y Convenciones de nomenclatura

La gestin de dependencias y la inyeccin de dependencia son cosas diferentes. Para obtener esas caractersticas agradables de la primavera en su aplicacin (como la inyeccin de dependencia) que necesita para ensamblar todas las libreras necesarias (archivos jar) y conseguir que en su ruta de clase en tiempo de ejecucin, y posiblemente en tiempo de compilacin. Estas dependencias no son componentes virtuales que se inyectan, pero los recursos fsicos de un sistema de archivos (por lo general). El proceso de gestin de la dependencia consiste en localizar esos recursos, almacenarlos y aadirlos a rutas de clases. Las dependencias pueden ser directos (por ejemplo, mi aplicacin depende de la primavera en tiempo de ejecucin), o indirecta (por ejemplo, mi aplicacin depende de commons-dbcp , que depende de commons-pool ). Las dependencias indirectas tambin se conocen como "transitivo" y son estas dependencias son las ms difciles de identificar y gestionar. Si usted va a usar Spring que necesita para obtener una copia de las bibliotecas jar que componen las piezas de la primavera que usted necesita. Para hacer ms fcil esta primavera se empaqueta como un conjunto de mdulos que separan a las dependencias de la medida de lo posible, as que por ejemplo si no quiere escribir una aplicacin web que usted no necesita los mdulos web de resorte. Para hacer referencia a la primavera mdulos de biblioteca en esta gua se utiliza una convencin de nomenclatura abreviada

spring-* o spring-*.jar, donde "*" representa el nombre corto para el mdulo (por ejemplo, spring-core , spring-webmvc , spring-jms , etc). El nombre del jar archivo

real que se utiliza puede ser de este tipo (ver abajo) o puede que no, y normalmente tambin tiene un nmero de versin en el nombre de archivo (por ejemplo, springcore-3.0.0.RELEASE.jar ). En general, la primavera publica sus artefactos a cuatro lugares diferentes:

En el sitio de descarga comunidad http://www.springsource.org/download/community . Aqu encontrars todos los tarros de primavera agrupados en un archivo zip para facilitar su descarga. Los nombres de los frascos aqu desde la versin 3,0 estn en la forma org.springframework.*-<version>.jar . Maven Central, que es el repositorio predeterminado que las consultas de Maven, y no requiere ninguna configuracin especial para su uso. Muchas de las bibliotecas comunes que la primavera depende tambin estn disponibles en Maven Central y gran parte de la comunidad de Spring utiliza Maven para la gestin de la dependencia, por lo que es conveniente para ellos. Los nombres de los frascos aqu son en forma spring-*-<version>.jar y la groupId Maven es org.springframework . El Repositorio Bundle Enterprise (EBR), que est a cargo de SpringSource y tambin recibe todas las bibliotecas que se integran con la primavera. Ambos repositorios Maven y Ivy estn disponibles aqu para todos los frascos de primavera y sus dependencias, adems de un gran nmero de otras bibliotecas comunes que la gente utiliza en aplicaciones con Spring. Ambos lanzamientos completos y tambin los hitos de desarrollo y las instantneas se despliegan aqu. Los nombres de los archivos jar estn en la misma forma que la descarga de la comunidad ( org.springframework.*-<version>.jar ) y las dependencias se encuentran tambin en esta "larga" forma, con bibliotecas externas (no de SpringSource) que tiene el prefijo com.springsource . Ver el FAQ para ms informacin. En un repositorio Maven pblico alojado en Amazon S3 para instantneas de desarrollo y comunicados hito (una copia de las notas finales tambin se celebra aqu). Los nombres de los archivos jar estn en la misma forma que Maven Central, por lo que este es un lugar til para obtener versiones de desarrollo de Primavera para su uso con otras bibliotecas desplegadas en Maven Central.

As que lo primero que hay que decidir es cmo manejar sus dependencias: la mayora de la gente usa un sistema automatizado como Maven o Ivy, pero tambin se puede hacer de forma manual mediante la descarga de todos los frascos se. Al obtener Spring con Maven o Ivy tiene entonces que decidir qu lugar te va a ir de. En general, si usted se preocupa por OSGi, utilice el EBR, ya que alberga OSGi artefactos compatibles para todas las dependencias de la primavera, como Hibernate y Freemarker. Si OSGi no le importa a usted, ya sea lugar funciona, aunque hay algunos pros y contras entre ellos. En general, escoja un lugar u otro para su proyecto, no las mezcle. Esto es particularmente importante, ya que los artefactos EBR necesariamente utilizar una nomenclatura diferente a Maven artefactos centroamericanos. Tabla 1.1. Comparacin de Maven centrales y los registros de SpringSource EBR

Caracterstica Compatible OSGi Nmero de Artefactos Consistente Convenciones de nomenclatura

Maven central No es explcito Decenas de miles de personas de todo tipo; S

EBR

Cientos; aquellos que se integra con Spring

No

Vara. Los nuevos artefactos suelen utilizar el nombre de dominio, Convencin de por ejemplo org.slf4j. Los Nombre de dominio de origen o raz del paquete nomenclatura: mayores a menudo slo principal, por ejemplo org.springframework GroupId tiene que utilizar el nombre del artefacto, por ejemplo log4j. Vara. En general, el Paquete Nombre simblico, derivado de la raz del proyecto o el nombre del paquete principal, org.springframework.beans por Convencin de mdulo, utilizando un ejemplo. Si el vaso tuvo que ser parcheado para nomenclatura: guin "-" separador, por asegurar el cumplimiento de OSGi com.springsource artifactId ejemplo, primavera-core, luego se aade, por ejemplo logj4. com.springsource.org.apache.log4j Vara. Muchos artefactos nuevos o utilizar mmm MMMX (con m = dgito, X = texto). Los mayores OSGi versin nmero MMMX, por ejemplo Convencin de utilizan mm Algunos 3.0.0.RC3. El calificador de texto impone orden nomenclatura: ninguno. Orden est alfabtico en las versiones con los mismos valores Version definida, pero no se numricos. basaban a menudo, as que no es estrictamente confiable. Por lo general, a travs de actualizaciones automticas de control de rsync o fuente. Autores del proyecto pueden cargar tarros

Publicacin

Manual (JIRA procesado por SpringSource)

Caracterstica

Maven central individuales para JIRA.

EBR

Por poltica. La exactitud Amplia para manifestar OSGi, Maven POM y los Aseguramiento es responsabilidad de los metadatos Ivy. Control de calidad realizado por el de la Calidad autores. equipo de Primavera. Contegix. Financiado por Sonatype con varios S3 financiado por SpringSource. espejos. Vario http://www.springsource.com/repository

Hosting

Utilidades de bsqueda

Integracin con Integracin a travs de Amplia integracin a travs de STS con Maven, Roo, herramientas STS con Maven CloudFoundry SpringSource dependencia de gestin

Primavera Dependencias y dependiendo de Primavera

Aunque Spring proporciona integracin y soporte para una amplia gama de empresas y otras herramientas externas, se mantiene intencionalmente sus dependencias obligatorias a un mnimo absoluto: usted no debera tener que localizar y descargar (incluso de forma automtica) un gran nmero de bibliotecas jar con el fin de usar Spring para casos de uso sencillo. Para la inyeccin de dependencia bsica slo hay una dependencia externa obligatoria, y que es para el registro (ver ms abajo para una descripcin ms detallada de las opciones de registro). A continuacin se describen los pasos bsicos necesarios para configurar una aplicacin que depende de la primavera, primero con Maven y luego con Ivy. En todos los casos, si tiene alguna duda, consulte la documentacin de su sistema de gestin de la dependencia, o ver algunos ejemplos de cdigo - Primavera mismo usa Ivy para gestionar las dependencias cuando se est construyendo, y nuestras muestras de todo el uso de Maven.
Maven Dependencia de Gestin

Si est utilizando Maven para la gestin de la dependencia que usted ni siquiera necesita para abastecer a la dependencia de registro de forma explcita. Por ejemplo, para crear un contexto de aplicacin y uso de la inyeccin de dependencia para configurar una aplicacin, sus dependencias de Maven se ver as:
<dependencies> <dependency> <groupId> org.springframework </ groupId> <artifactId> resorte contexto </ artifactId>

<versin> 3.0.0.RELEASE </ version> <scope> runtime </ alcance> </ Dependency> </ Dependencies>

Eso es todo. Tenga en cuenta el alcance puede declarar como tiempo de ejecucin si no es necesario compilar contra primavera APIs, que suele ser el caso para los casos de dependencia bsicas de uso de la inyeccin. Se utilizaron las convenciones de nomenclatura central de Maven en el ejemplo anterior, por lo que trabaja con Maven Central o el repositorio Maven SpringSource S3. Para utilizar el repositorio Maven S3 (por ejemplo, para los hitos o instantneas de desarrollo), debe especificar la ubicacin del repositorio en la configuracin de Maven. Para las versiones completas:
<repositories> <repository> <id> com.springsource.repository.maven.release </ id> <url> http://repo.springsource.org/release/ </ url> <snapshots> <enabled> false </ enabled> </ snapshots> </ Repositorio> </ Repositories>

Por hitos:
<repositories> <repository> <id> com.springsource.repository.maven.milestone </ id> <url> http://repo.springsource.org/milestone/ </ url> <snapshots> <enabled> false </ enabled> </ snapshots> </ Repositorio> </ Repositories>

Y para instantneas:
<repositories> <repository> <id> com.springsource.repository.maven.snapshot </ id> <url> http://repo.springsource.org/snapshot/ </ url> <snapshots> <enabled> true </ enabled> </ snapshots> </ Repositorio> </ Repositories>

Para utilizar el EBR SpringSource usted tendra que usar una convencin de nomenclatura diferente para las dependencias. Los nombres son generalmente fciles de adivinar, como por ejemplo en este caso es:
<dependencies> <dependency> <groupId> org.springframework </ groupId> <artifactId> org.springframework.context </ artifactId> <versin> 3.0.0.RELEASE </ version> <scope> runtime </ alcance> </ Dependency> </ Dependencies>

Tambin es necesario declarar la ubicacin del repositorio de forma explcita (slo la direccin URL es importante):
<repositories> <repository> <id> com.springsource.repository.bundles.release </ id> <url> http://repository.springsource.com/maven/bundles/release/ </ url> </ Repositorio> </ Repositories>

Si usted est manejando sus dependencias a mano, la direccin URL en el repositorio declaracin anterior no es navegable, pero no hay una interfaz de usuario en http://www.springsource.com/repository que se puede utilizar para buscar y descargar dependencias. Tambin cuenta con fragmentos tiles de Maven y configuracin Ivy que puede copiar y pegar si est utilizando estas herramientas.
Ivy Dependencia de Gestin

Si usted prefiere usar Ivy para gestionar las dependencias entonces hay nombres similares y opciones de configuracin. Para configurar Ivy para apuntar a la EBR SpringSource agregar los dispositivos de resolucin siguientes a su ivysettings.xml :
<resolvers> <url name = "com.springsource.repository.bundles.release"> <Hiedra pattern = "http://repository.springsource.com/ivy/bundles/release/ [Organizacin] / [mdulo] / [revisin] / [artefacto] -. [Revisin] [ext] "/> <Artefacto pattern = "http://repository.springsource.com/ivy/bundles/release/ [Organizacin] / [mdulo] / [revisin] / [artefacto] -. [Revisin] [ext] "/> </ Url> <url name = "com.springsource.repository.bundles.external"> <Hiedra pattern = "http://repository.springsource.com/ivy/bundles/external/ [Organizacin] / [mdulo] / [revisin] / [artefacto] -. [Revisin] [ext] "/> <Patrn artefacto = "http://repository.springsource.com/ivy/bundles/external/ [Organizacin] / [mdulo] / [revisin] / [artefacto] -. [Revisin] [ext] "/> </ Url> </ Resolvers>

El XML anterior no es vlido porque las lneas son demasiado largas - si usted copia y pega a continuacin, retire los finales de lnea extra en el medio de los patrones de URL. Una vez que Ivy est configurado para buscar en la EBR aadir una dependencia es fcil. Basta con tirar de la pgina de detalles del paquete en cuestin en el navegador de repositorios y encontrars un fragmento de Ivy listo para que lo incluya en su seccin de dependencias. Por ejemplo (en ivy.xml ):
<Dependencia org = "org.springframework" name = "org.springframework.core" rev = "3.0.0.RELEASE" conf = "compile-> tiempo de ejecucin" />

1.3.2 Registro

El registro es una dependencia muy importante para la primavera debido a ella) es la dependencia externa slo es obligatoria, b) todo el mundo le gusta ver un poco de la salida de las herramientas que estn utilizando, y c) Spring integra con muchas otras herramientas de las cuales tambin han hecho una opcin de registro de dependencia. Uno de los objetivos de un desarrollador de aplicaciones suele tener configurado el registro unificado en un lugar central para la aplicacin en su conjunto, incluyendo todos los componentes externos. Esto es ms difcil de lo que podra haber sido, ya que hay tantas opciones de marco de registro. La dependencia de registro obligatorio en primavera es el Jakarta Commons Logging API (JCL). Recopilamos contra JCL y tambin hacemos JCL Log objetos visible para las clases que extienden el Spring Framework. Es importante para los usuarios que todas las versiones de Spring utilizar la biblioteca de la tala mismo: la migracin es fcil debido a la compatibilidad hacia atrs se conserva incluso con aplicaciones que amplan la primavera. La manera de hacer esto es hacer que uno de los mdulos en Spring dependen explcitamente en commons-logging (la implementacin cannica de JCL), y luego hacer todos los mdulos de los otros depende de que en tiempo de compilacin. Si est utilizando Maven por ejemplo, y preguntando dnde cogi la dependencia de los commons-logging , entonces es a partir de la primavera y en concreto desde el mdulo central llamada spring-core . Lo bueno de commons-logging es que no hace falta nada ms para hacer su trabajo de la aplicacin. Cuenta con un algoritmo de descubrimiento de tiempo de ejecucin que busca marcos de tala en lugares bien conocidos en la ruta de clase y utiliza uno que piensa que es apropiado (o se puede decir que uno si es necesario). Si nada ms est disponible a obtener los registros que buscan bastante agradable justo desde el JDK (java.util.logging o julio para abreviar). Usted debe saber que la aplicacin funciona primavera y registra felizmente a la consola de la caja en la mayora de las situaciones, y eso es importante.
No utilizar Commons Logging

Desafortunadamente, el algoritmo de descubrimiento de tiempo de ejecucin en commons-logging , aunque conveniente para el usuario final, es problemtica. Si pudiramos volver atrs el reloj y empezar la primavera ahora como un nuevo proyecto que usara una dependencia de registro diferente. La primera opcin sera probablemente la fachada de registro simple para Java ( SLF4J ), que tambin es

utilizado por una gran cantidad de otras herramientas que utilizan las personas con la primavera dentro de sus aplicaciones. Desconexin commons-logging es fcil: slo asegrese de que no est en la ruta de clase en tiempo de ejecucin. En trminos Maven se excluye la dependencia, y por la forma en que las dependencias de primavera se declaran, slo tienes que hacer esto una vez.
<dependencies> <dependency> <groupId> org.springframework </ groupId> <artifactId> resorte contexto </ artifactId> <versin> 3.0.0.RELEASE </ version> <scope> runtime </ alcance> <exclusiones> <exclusion> <groupId> commons-logging </ groupId> <artifactId> commons-logging </ artifactId> </ Exclusin> </ Exclusiones> </ Dependency> </ Dependencies>

Ahora bien, esta aplicacin est probablemente roto porque no existe una implementacin de la API de JCL en la ruta de clases, por lo que para solucionarlo por uno nuevo tiene que ser proporcionada. En la siguiente seccin te mostramos cmo proporcionar una implementacin alternativa de JCL SLF4J utilizando como ejemplo.
Usando SLF4J

SLF4J es una dependencia ms limpia y ms eficiente en tiempo de ejecucin de commons-logging , ya que utiliza enlaces en tiempo de compilacin en lugar de descubrimiento tiempo de ejecucin de los marcos de tala se integra. Esto tambin significa que usted tiene que ser ms explcitos acerca de lo que quieres que ocurra durante la ejecucin y declararla o configurarlo en consecuencia. SLF4J ofrece enlaces a muchos marcos comunes de tala, por lo que normalmente puede elegir uno que ya utiliza, y se unen a la de configuracin y gestin. SLF4J ofrece enlaces a muchos marcos comunes, incluyendo la tala JCL, y tambin hace lo contrario: puentes entre los marcos de tala y ella misma. As que para usar SLF4J con la primavera es necesario sustituir el commons-logging dependencia con el puente SLF4J-JCL. Una vez que haya hecho eso entonces las llamadas de registro desde dentro de Primavera ser traducido al registro de llamadas a la API SLF4J, as que si otras bibliotecas en el uso de aplicaciones que API, entonces usted tiene un lugar nico para configurar y administrar el registro. Una opcin comn podra ser la de salvar a SLF4J primavera, y luego proporcionar enlace explcito de SLF4J a Log4J. Deber proporcionar 4 dependencias (y excluir la existente commons-logging ): el puente, la API SLF4J, la unin a Log4J, y la aplicacin Log4J s mismo. En Maven que hara que al igual que este
<dependencies> <dependency>

<groupId> org.springframework </ groupId> <artifactId> resorte contexto </ artifactId> <versin> 3.0.0.RELEASE </ version> <scope> runtime </ alcance> <exclusiones> <exclusion> <groupId> commons-logging </ groupId> <artifactId> commons-logging </ artifactId> </ Exclusin> </ Exclusiones> </ Dependency> <dependency> <groupId> org.slf4j </ groupId> <artifactId> jcl-over-slf4j </ artifactId> <versin> 1.5.8 </ version> <scope> runtime </ alcance> </ Dependency> <dependency> <groupId> org.slf4j </ groupId> <artifactId> slf4j-api </ artifactId> <versin> 1.5.8 </ version> <scope> runtime </ alcance> </ Dependency> <dependency> <groupId> org.slf4j </ groupId> <artifactId> slf4j-log4j12 </ artifactId> <versin> 1.5.8 </ version> <scope> runtime </ alcance> </ Dependency> <dependency> <groupId> log4j </ groupId> <artifactId> log4j </ artifactId> <versin> 1.2.14 </ version> <scope> runtime </ alcance> </ Dependency> </ Dependencies>

Esto puede parecer como un montn de dependencias slo para obtener algn registro. Bueno, lo que sea, pero es opcional, y debe comportarse mejor que el de vainilla commons-logging con respecto a las cuestiones de cargador de clases, especialmente si usted est en un contenedor estricto como una plataforma OSGi. Al parecer tambin hay una mejora en el rendimiento ya que los enlaces no son en tiempo de compilacin en tiempo de ejecucin. Una eleccin ms comn entre los usuarios SLF4J, que utiliza menos pasos y genera menos dependencias, es para unirse directamente a Logback . Esto elimina el paso de unin extra porque Logback SLF4J implementa directamente, por lo que slo tendr que depender de dos bibliotecas no cuatro ( jcl-over-slf4j y logback ). Si usted hace que usted tambin tenga que excluir la dependencia slf4j-api de otras dependencias externas (no Spring), ya que slo quieren una versin de esa API en el classpath.
Usando Log4J

Muchas personas usan Log4j como un marco de registro para fines de configuracin y gestin. Es eficiente y bien establecido, y de hecho es lo que usamos en tiempo de ejecucin cuando construimos y pruebas de la primavera. La primavera tambin

proporciona algunas utilidades para configurar e inicializar Log4j, por lo que tiene un opcional de tiempo de compilacin dependencia de Log4j en algunos mdulos. Para hacer el trabajo Log4j con la dependencia defecto JCL ( commons-logging ) todo lo que tiene que hacer es poner Log4j en la ruta de clases, y dotarla de un archivo de configuracin ( log4j.properties o log4j.xml en la raz de la ruta de clase). As que para los usuarios de Maven es tu declaracin de dependencia:
<dependencies> <dependency> <groupId> org.springframework </ groupId> <artifactId> resorte contexto </ artifactId> <versin> 3.0.0.RELEASE </ version> <scope> runtime </ alcance> </ Dependency> <dependency> <groupId> log4j </ groupId> <artifactId> log4j </ artifactId> <versin> 1.2.14 </ version> <scope> runtime </ alcance> </ Dependency> </ Dependencies>

Y aqu est una log4j.properties muestra para el registro en la consola:


log4j.rootCategory = INFO, stdout log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern =% d {ABSOLUTE}% 5p% t% c {2}:% L -% m% n log4j.category.org.springframework.beans.factory = DEBUG Los contenedores de tiempo de ejecucin con JCL Nativo

Muchas personas ejecutar sus aplicaciones de primavera en un recipiente que se proporciona una implementacin de JCL. IBM Websphere Application Server (WAS) es el arquetipo. Esto a menudo causa problemas, y por desgracia no hay una solucin mgica, simplemente excluyendo commons-logging de su solicitud no es suficiente en la mayora de las situaciones. Para ser claros en esto: los problemas reportados no son por lo general con JCL per se, o incluso con commons-logging : sino que tienen que ver con la unin commons-logging a otro marco (a menudo Log4J). Esto puede fallar porque commons-logging cambiado la forma de hacer el descubrimiento en tiempo de ejecucin entre las versiones anteriores (1,0) se encuentran en algunos contenedores y las versiones modernas que la mayora de la gente usa ahora (1,1). Primavera no utiliza ninguna pieza inusual de la API de JCL, por lo que se rompe nada all, pero tan pronto como la primavera o la aplicacin intenta hacer cualquier registro que usted puede encontrar los enlaces a Log4J no estn funcionando. En estos casos, con era la cosa ms fcil de hacer es invertir la jerarqua cargador de clases (IBM llama "ltimo padre") para que la aplicacin controla la dependencia JCL,

no el contenedor. Esa opcin no est siempre abierta, pero hay un montn de otras sugerencias en el dominio pblico para enfoques alternativos, y su experiencia puede variar dependiendo de la versin exacta y el conjunto de caractersticas del envase.

2. Nuevas caractersticas y mejoras en Spring Framework 3.0


Si usted ha estado usando Spring Framework durante algn tiempo, usted se dar cuenta que la primavera ha sido objeto de dos revisiones importantes: Spring 2.0, lanzado en octubre de 2006, y Spring 2.5, lanzado en noviembre de 2007. Ahora es el momento para una revisin tercero que resulta en Spring Framework 3.0. Java SE y Java EE Support El Spring Framework est basado en Java 5 y Java 6 es totalmente compatible. Adems, la primavera es compatible con J2EE 1.4 y Java EE 5, mientras que al mismo tiempo la introduccin de algn tipo de apoyo temprano para Java EE 6.

2.1 Java 5
El cdigo marco todo ha sido revisado para tomar ventaja de Java 5 caractersticas como genricos, varargs y mejoras en otros idiomas. Hemos hecho nuestro mejor esfuerzo para mantener an el cdigo compatible. Ahora tenemos el uso constante de las colecciones genricas y mapas, el uso consistente de FactoryBeans genricos, y tambin la resolucin constante de los mtodos de la API de puente Spring AOP. ApplicationListeners genricos reciben automticamente los tipos especficos de eventos solamente. Todas las interfaces de devolucin de llamada como TransactionCallback y HibernateCallback declarar un valor de resultado genrico ahora. En general, la base de cdigo central primavera est recin revisado y optimizado para Java 5. Abstraccin Spring TaskExecutor se ha actualizado para una estrecha integracin con las instalaciones java.util.concurrent Java de 5 aos. Ofrecemos soporte de primera clase para callables y Futuros ahora, as como adaptadores ExecutorService, integracin, etc ThreadFactory Esto ha sido alineada con JSR-236 (Utilidades de concurrencia para Java EE 6) en la medida de lo posible. Adems, proporcionamos apoyo para llamadas a mtodos asincrnicos mediante el uso de la nueva anotacin @ Async (o EJB 3.1 's asincrnica anotacin @).

2.2 Documentacin mejorada


La documentacin de referencia de Spring tambin sustancialmente sido actualizada para reflejar todos los cambios y nuevas caractersticas de Spring Framework 3.0. Todo el esfuerzo se ha hecho para asegurar que no haya errores en esta documentacin, sin embargo, algunos errores pueden haber deslizado pulg Si usted mancha cualesquiera errores tipogrficos o errores an ms graves, y le sobran unos pocos ciclos durante el

almuerzo, por favor traer el error a la atencin del equipo de Primavera por plantear una cuestin .

2.3 Los nuevos artculos y tutoriales


Hay muchos excelentes artculos y tutoriales que muestran cmo empezar con Spring Framework 3 caractersticas. Lalos en la primavera de Documentacin pgina. Las muestras se han mejorado y actualizado para tomar ventaja de las nuevas caractersticas de Spring Framework 3. Adems, las muestras se han mudado fuera del rbol de cdigo fuente en un dedicado SVN repositorio disponible en:
https://anonsvn.springframework.org/svn/spring-samples/

Como tal, las muestras ya no se distribuyen junto con Spring Framework 3 y necesitan ser descargados por separado desde el repositorio mencionado anteriormente. Sin embargo, esta documentacin se siguen haciendo referencia a algunos ejemplos (en Petclinic particular) para ilustrar diversas caractersticas.
Nota

Para obtener ms informacin acerca de Subversion (SVN o en corto), vase la pgina web del proyecto en: http://subversion.apache.org/

2.4 Organizacin mdulo nuevo y construir el sistema de


Los mdulos marco se han revisado y se gestionan por separado con un rbol de cdigo por cada frasco mdulo:

org.springframework.aop org.springframework.beans org.springframework.context org.springframework.context.support org.springframework.expression org.springframework.instrument org.springframework.jdbc org.springframework.jms org.springframework.orm org.springframework.oxm org.springframework.test org.springframework.transaction org.springframework.web org.springframework.web.portlet org.springframework.web.servlet org.springframework.web.struts

Nota:

El artefacto spring.jar que contena casi la totalidad del marco ya no se ofrece. Ahora estamos utilizando un nuevo sistema de construccin de Primavera conocido como Spring Web Flow de 2,0. Esto nos da:

Ivy basada en "Spring Build" sistema procedimiento de despliegue consistente gestin de la dependencia constante consistente generacin de manifiestos OSGi

2.5 Descripcin de las nuevas caractersticas


Esta es una lista de las nuevas caractersticas de Spring Framework 3.0. Vamos a cubrir estas caractersticas en ms detalle ms adelante en esta seccin.

Spring Expression Language COI mejoras / Java bean metadatos basados en De propsito general tipo de sistema de conversin y el sistema de formato de campo Objeto de la funcionalidad de mapeo XML (OXM) pas de Spring Servicios para Proyectos Web Soporte de apoyo integral @ MVC adiciones Validacin del modelo declarativo Apoyo temprano para Java EE 6 Base de datos interna de apoyo

2.5.1 Core API actualizada para Java 5

BeanFactory interfaz devuelve escritos instancias del bean medida de lo posible:


T getBean (Clase <T> requiredType) T getBean (String nombre, clase <T> requiredType) Mapa <String, T> getBeansOfType (tipo Class <T>)

Interfaz de Spring TaskExecutor ahora se extiende java.util.concurrent.Executor :

AsyncTaskExecutor extendido apoya callables estndar con Futuros

Nueva API basada en Java 5 y convertidor de SPI:


ConversionService aptrida y Convertidores reemplazando estndar PropertyEditors JDK

<E> ApplicationListener Typed

2.5.2 Spring Expression Language

Spring introduce un lenguaje de expresin que es similar al de Unified EL en su sintaxis, pero ofrece caractersticas significativamente ms. El lenguaje de expresin se puede utilizar en la definicin de las definiciones basadas en XML y anotacin de frijol y tambin sirve como base de apoyo a travs de la expresin del lenguaje cartera de primavera. Los detalles de esta nueva funcionalidad se puede encontrar en el captulo Lenguaje de expresin Spring (Spel). El lenguaje de expresin de Primavera fue creado para proporcionar a la comunidad de Primavera un solo idioma, bien apoyado expresin que se puede utilizar en todos los productos de la cartera de primavera. Sus caractersticas lingsticas son impulsadas por las necesidades de los proyectos de la cartera de primavera, incluyendo requerimientos de herramientas de apoyo a la terminacin de cdigo basado en Eclipse SpringSource Tool Suite . El siguiente es un ejemplo de cmo el lenguaje de expresin se puede utilizar para configurar algunas propiedades de una base de datos de configuracin
<bean class = "mycompany.RewardsTestDatabase"> Nombre <property = "databaseName" value = "# {} systemProperties.databaseName" /> Nombre <property = "keygenerator" value = "# {} strategyBean.databaseKeyGenerator" /> </ Bean>

Esta funcin tambin est disponible para que pueda configurar sus componentes mediante anotaciones:
@ Repositorio pblico RewardsTestDatabase clase { @ Value ("# {systemProperties.databaseName}") setDatabaseName public void (String nombreBd) {...} @ Value ("# {strategyBean.databaseKeyGenerator}") setKeyGenerator public void (keygenerator kg) {...} }

2.5.3 La inversin de control (IoC) contenedor Java bean metadatos basados en

Algunas de las caractersticas principales de la JavaConfig proyecto se han aadido a la Spring Framework ahora. Esto significa que las anotaciones siguientes estn directamente soportados:

@ Configuracin @ Frijol @ DependsOn @ Primaria @ Lazy @ Import

@ ImportResource @ Valor

He aqu un ejemplo de una clase Java proporciona la configuracin bsica utilizando las caractersticas JavaConfig nuevos:
paquete org.example.config; @ Configuracin AppConfig clase pblica Value @ privada ("# Value @ privada ("# Value @ privada ("# { {jdbcProperties.url}") String JDBCURL; {jdbcProperties.username}") String username; {jdbcProperties.password}") String password;

@ Frijol fooService FooService pblico () { return new FooServiceImpl (fooRepository ()); } @ Frijol fooRepository FooRepository pblico () { volver HibernateFooRepository nuevo (sessionFactory ()); } @ Frijol pblico SessionFactory sessionFactory () { / / Cable hasta una fbrica de sesiones AnnotationSessionFactoryBean asFactoryBean = AnnotationSessionFactoryBean nuevo (); asFactoryBean.setDataSource (dataSource ()); / / Config adicional volver asFactoryBean.getObject (); } @ Frijol pblica DataSource dataSource () { return new DriverManagerDataSource (JDBCURL, nombre de usuario, contrasea); } }

Para conseguir que esto funcione es necesario agregar el siguiente componente de exploracin entrada en su contexto mnimo expediente de solicitud XML.
<context:component-scan base-package = "org.example.config" /> <util:properties id = "jdbcProperties" ubicacin = "classpath:org/example/config/jdbc.properties" />

O bien, puede arrancar un @Configuration clase directamente usando AnnotationConfigApplicationContext :


public static void main (String [] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext (AppConfig. clase); FooService fooService = ctx.getBean (FooService. clase); fooService.doStuff (); }

Consulte Seccin 5.12.2, "Crear instancias del contenedor Spring usando AnnotationConfigApplicationContext " para obtener informacin completa sobre AnnotationConfigApplicationContext .
Definicin de metadatos de frijol dentro de los componentes
@Bean

mtodos anotados tambin se admiten dentro de los componentes de primavera. Aportan una definicin de bean fbrica al contenedor. Consulte Definicin de metadatos de frijol dentro de los componentes para obtener ms informacin
2.5.4 Tipo de propsito general y un sistema de conversin del sistema de formato de campo

A propsito general tipo de sistema de conversin se ha introducido. El sistema es utilizado actualmente por Spel para conversin de tipo, y tambin puede ser utilizado por un contenedor Spring DataBinder y cuando los valores de propiedad de unin de frijol. Adems, un formateador de SPI se ha introducido para dar formato a los valores de campo. Esta SPI ofrece una alternativa ms simple y ms robusto para PropertyEditors JavaBean para su uso en entornos de cliente como Spring MVC.
2.5.5 El nivel de datos

Objeto de la funcionalidad de mapeo XML (OXM) de la Web Spring Servicios para Proyectos ha sido movido a la Spring Framework ncleo ahora. La funcionalidad se encuentra en la org.springframework.oxm paquete. Ms informacin sobre el uso de la OXM mdulo se puede encontrar en la serializacin XML usando O / X mapeadores captulo.
2.5.6 El nivel de Web

La nueva caracterstica ms emocionante para el nivel Web es el apoyo a la creacin de servicios web RESTful y aplicaciones Web. Tambin hay algunas nuevas anotaciones que se pueden utilizar en cualquier aplicacin web.
Soporte de apoyo integral

Del lado del servidor soporte para la creacin de aplicaciones RESTful se ha proporcionado como una extensin de la actual anotacin impulsada framework MVC web. Del lado del cliente apoyo es proporcionado por el RestTemplate clase en el espritu de otras clases de plantilla como JdbcTemplate y JmsTemplate . Tanto el servidor y la funcionalidad del lado del cliente REST hacer uso de HttpConverter s para facilitar la conversin entre los objetos y su representacin en las solicitudes y respuestas HTTP. El MarshallingHttpMessageConverter utiliza el objeto a la funcionalidad de asignacin XML mencionado anteriormente.

Consulte las secciones sobre MVC y la RestTemplate para ms informacin.


@ MVC adiciones

A mvc espacio de nombres se ha introducido que simplifica enormemente la configuracin Spring MVC. Anotaciones adicionales como @CookieValue y @RequestHeaders se han aadido. Consulte Asignacin de valores de la galleta con la anotacin @ CookieValue y atributos de asignacin de solicitud de encabezado con la anotacin @ RequestHeader para ms informacin.
2.5.7 validacin del modelo declarativo

Varias mejoras de validacin , incluyendo soporte JSR 303 que utiliza Hibernate Validator como el proveedor predeterminado.
2.5.8 apoyo temprano para Java EE 6

Ofrecemos soporte para llamadas a mtodos asincrnicos mediante el uso de la nueva anotacin @ Async (o EJB 3.1 's asincrnica anotacin @). JSR 303, JSF 2.0, JPA 2.0, etc
2.5.9 Apoyo a las bases de datos integradas

Apoyo prctico para los motores de base de datos integrada de Java , incluyendo HSQL, H2, y Derby, ahora se proporciona.

3. Nuevas caractersticas y mejoras en Spring Framework 3.1


Esta es una lista de las nuevas caractersticas de Spring Framework 3.1. Una serie de caractersticas que no se han dedicado documentacin de referencia, pero tenemos Javadoc completo. En tales casos, nombres completos de clase se dan. Vase tambin el Apndice C, Migracin a Spring Framework 3.1

3,1 Cach Abstraccin


Captulo 29, Abstraction cach Cach Abstraccin (blog SpringSource equipo)

3.2 Definicin de frijol perfiles


XML perfiles (Blog SpringSource Team) Al presentar Profile @ (Blog SpringSource Team) Ver Javadoc org.springframework.context.annotation.Configuration Ver org.springframework.context.annotation.Profile Javadoc

3.3 Medio Ambiente Abstraccin


Medio Ambiente Abstraccin (Blog SpringSource Team) Ver Javadoc org.springframework.core.env.Environment

3,4 PropertySource Abstraccin


Unificado de Gestin de la propiedad (Blog SpringSource Team) Ver Javadoc org.springframework.core.env.Environment Ver Javadoc org.springframework.core.env.PropertySource Ver Javadoc org.springframework.context.annotation.PropertySource

3,5 equivalentes de cdigo para espacios de nombres XML de Spring


Basados en cdigos equivalentes a los elementos populares de la primavera de espacio de nombres XML <context:component-scan/>, <tx:annotation-driven/> y <mvc:annotation-driven> han desarrollado la mayor parte, en forma de @Enable anotaciones. Estos estn diseados para su uso en conjuncin con Spring @Configuration clases, que se introdujeron en Spring Framework 3.0.

Ver Javadoc org.springframework.context.annotation.Configuration Ver Javadoc org.springframework.context.annotation.ComponentScan Ver Javadoc org.springframework.transaction.annotation.EnableTransactionManagement Ver org.springframework.cache.annotation.EnableCaching Javadoc Ver Javadoc org.springframework.web.servlet.config.annotation.EnableWebMvc Ver org.springframework.scheduling.annotation.EnableScheduling Javadoc Ver Javadoc org.springframework.scheduling.annotation.EnableAsync Ver Javadoc org.springframework.context.annotation.EnableAspectJAutoProxy Ver org.springframework.context.annotation.EnableLoadTimeWeaving Javadoc Ver Javadoc org.springframework.beans.factory.aspectj.EnableSpringConfigured

3.6 Apoyo a Hibernate 4.x

Ver Javadoc para las clases en el nuevo paquete org.springframework.orm.hibernate4

3,7 TestContext marco de apoyo para las clases de configuracin y los perfiles de frijol @ definicin
El @ContextConfiguration anotacin ahora es compatible con el suministro de @Configuration clases de configuracin de la primavera TestContext . Adems, un nuevo @ActiveProfiles anotacin se ha introducido para admitir la configuracin

declarativa de perfiles activos de frijol definicin en ApplicationContext pruebas de integracin.


Primavera M2 3.1: Pruebas con clases Configuration @ y Perfiles (Blog SpringSource Team) Consulte Seccin 11.3.5, "Spring Framework TestContext" Consulte la seccin "Configuracin de contexto con clases anotadas" y org.springframework.test.context.ContextConfiguration Javadoc Ver org.springframework.test.context.ActiveProfiles Javadoc Ver org.springframework.test.context.SmartContextLoader Javadoc Ver
org.springframework.test.context.support.DelegatingSmartContextL oader Javadoc

Ver
org.springframework.test.context.support.AnnotationConfigContext Loader Javadoc

3,8 c: namespace para la inyeccin de constructor ms conciso

la seccin denominada "acceso directo XML con el c-espacio de nombres"

3.9 Apoyo a la inyeccin contra no estndar JavaBeans setters


Antes de Spring Framework 3,1, con el fin de inyectar en contra de un mtodo de propiedad se tena que ajustarse estrictamente a las normas JavaBeans firma de propiedad, es decir, que cualquier 'setter' mtodo debe ser void-retorno. Ahora es posible en la primavera de XML para especificar los mtodos setter que devuelven cualquier tipo de objeto. Esto es til cuando se considera el diseo de APIs para el mtodo de encadenamiento, donde los mtodos setter devolver una referencia a "esto".

3.10 Soporte para servlets 3 Cdigo de configuracin basada en Contenedor Servlet


El nuevo WebApplicationInitializer construye encima de Servlet 3.0 's ServletContainerInitializer soportes que ofrezcan una alternativa programtica a la tradicional web.xml.

Ver Javadoc org.springframework.web.WebApplicationInitializer Diferenciar del Invernadero de Spring aplicacin de referencia que demuestra la migracin de web.xml para WebApplicationInitializer

3.11 Soporte para servlets 3 MultipartResolver

Ver Javadoc org.springframework.web.multipart.support.StandardServletMultipartResolver

3,12 JPA EntityManagerFactory bootstrapping sin persistence.xml


En el estndar JPA, unidades de persistencia se define a travs de METAINF/persistence.xml archivos jar especficos que a su vez se buscaron @Entity clases. En muchos casos, persistence.xml no contiene ms de un nombre de unidad y se basa en valores predeterminados y / o la configuracin externa para todos los otros problemas (tales como la fuente de datos a utilizar, etc.) Por esa razn, Spring Framework 3.1 ofrece una alternativa: LocalContainerEntityManagerFactoryBean acepta un 'packagesToScan "propiedad, especificando paquetes base para buscar @Entity clases. Esto es anlogo a AnnotationSessionFactoryBean propiedad 's del mismo nombre nativo para la configuracin de Hibernate, Spring y tambin para el componente de exploracin caracterstica para el frijol de primavera regulares. Efectivamente, esto permite la libre configuracin XML JPA a expensas mero de especificar un paquete base para la exploracin entidad: un partido particularmente bien para aplicaciones de resorte que se basan en la exploracin del componente para las semillas de muelle as, posiblemente incluso bootstrap usando un Servlet cdigo basado 3,0 inicializador.

3.13 Nuevos HandlerMethod basados en clases de apoyo para el procesamiento de Controlador anotado
Spring Framework 3.1 introduce un nuevo conjunto de clases de apoyo para la tramitacin de las solicitudes con los controladores de anotaciones:
RequestMappingHandlerMapping RequestMappingHandlerAdapter ExceptionHandlerExceptionResolver

Estas clases son un reemplazo de la existente:


DefaultAnnotationHandlerMapping AnnotationMethodHandlerAdapter AnnotationMethodHandlerExceptionResolver

Las nuevas clases fueron desarrolladas en respuesta a muchas peticiones para hacer anotaciones clases de apoyo de controlador ms personalizable y abierta a la extensin. Mientras que antes se poda configurar una costumbre mtodo anotado controlador argumento de resolucin, con las nuevas clases de apoyo que puede personalizar el tratamiento para cualquier argumento o mtodo apropiado para el tipo de valor de retorno.

Ver Javadoc org.springframework.web.method.support.HandlerMethodArgumentResolver Ver Javadoc org.springframework.web.method.support.HandlerMethodReturnValueHandler

Una diferencia notable segunda es la introduccin de un HandlerMethod abstraccin para representar un @RequestMapping mtodo. Esta abstraccin se utiliza a travs de las clases de apoyo a los nuevos como el handler instancia. Por ejemplo, un HandlerInterceptor puede convertir el handler de Object a HandlerMethod y obtener acceso al mtodo controlador de destino, sus anotaciones, etc Las nuevas clases son activadas por defecto por el espacio de nombres MVC y basada en Java configuracin a travs de @EnableWebMvc . Las clases existentes seguirn estando disponibles pero el uso de las nuevas clases se recomienda en el futuro. Consulte la seccin "Clases de Apoyo Nuevas @RequestMapping mtodos en Spring MVC 3.1 " para obtener ms detalles y una lista de caractersticas no disponibles con las nuevas clases de apoyo.

3.14 "consume" y "produce" las condiciones en


@RequestMapping

Mejorado el soporte para la especificacin de los tipos de medios consumidos por un mtodo a travs del 'Content-Type' cabecera, as como para los tipos especificados producibles a travs de la 'Accept' de cabecera. Consulte la seccin "Consumibles Tipos de Medios" y la seccin "Tipos de soportes" producible

3,15 flash Atributos y RedirectAttributes


Atributos flash ahora se pueden almacenar en un FlashMap y se guarda en la sesin HTTP para sobrevivir a una redireccin. Para obtener una visin general del apoyo general para los atributos flash en Spring MVC ver Seccin 17.6, "Uso de atributos de flash" . En los controladores anotada, una @RequestMapping mtodo puede agregar atributos de flash declarando un argumento de mtodo de tipo RedirectAttributes . Este argumento del mtodo ahora tambin puede ser utilizado para obtener un control preciso sobre los atributos utilizados en un escenario de redireccin. Consulte la seccin "Especificacin de atributos y redirigir flash" para ms detalles.

3,16 URI Mejoras Plantilla variables


Las variables de plantilla URI de la peticin actual se utilizan en ms lugares:

Variables de URI de plantilla se utilizan adems de los parmetros de solicitud al enlazar una solicitud a @ModelAttribute argumentos del mtodo. @ PathVariable valores de los argumentos de mtodo se combinan en el modelo antes de la representacin, salvo en los puntos de vista que generan contenido de forma automatizada como la serializacin JSON o XML maniobra. Una cadena puede contener redirigir marcadores de posicin para las variables URI (por ejemplo, "redirect:/blog/{year}/{month}" ). Al ampliar los marcadores de posicin, las variables de la plantilla URI de la peticin actual se consideran automticamente.

Un @ModelAttribute argumento del mtodo se pueden crear instancias de una variable de plantilla URI cumpliendo con un convertidor registrada o PropertyEditor para convertir de una cadena en el tipo de objeto de destino.

3,17 @Valid en @RequestBody Argumentos mtodo de control


Un @RequestBody argumento del mtodo puede ser anotado con @Valid para invocar la validacin automtica similar al soporte para @ModelAttribute argumentos del mtodo. Un resultado MethodArgumentNotValidException se maneja en el DefaultHandlerExceptionResolver y resulta en un 400 cdigo de respuesta.

3,18 @RequestPart Anotacin sobre los argumentos de mtodo de control


Esta nueva anotacin proporciona acceso al contenido de una parte de la solicitud "multipart / form-data". Consulte Seccin 17.10.5, "Cmo manejar un archivo de solicitud de carga de los clientes programticas" y la Seccin 17.10, "(carga de archivos) de varias partes de primavera de apoyo" .

3,19 UriComponentsBuilder y UriComponents


Un nuevo UriComponents clase se ha aadido, que es un contenedor de componentes inmutable URI de acceso a todos los componentes de URI que contiene. Un nuevo UriComponentsBuilder clase tambin se proporciona para ayudar a crear UriComponents casos. Juntas, las dos clases dan un control preciso sobre todos los aspectos de la preparacin de un URI, incluyendo la construccin, la expansin de variables de plantilla URI, y la codificacin. En la mayora de los casos, las nuevas clases se puede utilizar como una alternativa ms flexible a la existente UriTemplate especialmente desde UriTemplate se basa en esas mismas clases internamente. A ServletUriComponentsBuilder sub-clase proporciona mtodos estticos de fbrica para copiar informacin de una solicitud Servlet. Consulte Seccin 17.7,

4. Nuevas caractersticas y mejoras en Spring Framework 3.2


Esta seccin abarca las novedades de Spring Framework 3.2. Vase tambin el Apndice D, Migracin a Spring Framework 3.2

4.1 Apoyo Servlet 3 procesamiento basado solicitud asincrnica


El modelo de programacin Spring MVC proporciona ahora servlet explcito apoyo async 3. @RequestMapping mtodos pueden devolver uno de:

java.util.concurrent.Callable

para completar el procesamiento en un hilo separado gestionado por un ejecutor de tareas dentro de Spring MVC. org.springframework.web.context.request.async.DeferredResult para completar el procesamiento en un momento posterior a partir de un hilo no conoce a Spring MVC - por ejemplo, en respuesta a algn evento externo (JMS, AMQP, etc) org.springframework.web.context.request.async.AsyncTask para envolver un Callable y personalizar el valor de tiempo de espera o el ejecutor de tareas para utilizarla.

Consulte Seccin 17.3.4, "Proceso de Solicitud asncrono" .

4.2 Prueba de Spring MVC marco


Soporte de primera clase para probar aplicaciones Spring MVC con un API fluida y sin un contenedor de Servlets. Del lado del servidor pruebas implican el uso de la DispatcherServlet mientras que del lado del cliente REST pruebas se basan en la RestTemplate . Consulte Seccin 11.3.6, "Spring Framework MVC Test" .

4.3 Contenido de las mejoras de negociacin


A ContentNeogtiationStrategy ya est disponible para la resolucin de los tipos de medios solicitados de una solicitud entrante. Las implementaciones disponibles se basan en la extensin del archivo, el parmetro de consulta, el 'Aceptar' de la cabecera, o un tipo de contenido fijo. Opciones equivalentes antes estaban disponibles slo en el ContentNegotiatingViewResolver pero ahora estn disponibles en todas partes.
ContentNegotiationManager

es la clase central debe usar para configurar las opciones de contenido de negociacin. Para ms detalles vea la Seccin 17.15.4, "Configuracin de Negociacin de contenido" . La introduccin de ContentNegotiationManger tambin permite patrn sufijo selectivo correspondiente las solicitudes entrantes. Para obtener ms detalles, consulte el Javadoc de RequestMappingHandlerMapping.setUseRegisteredSuffixPatternMatch .

4,4 @ControllerAdvice anotacin


Clases anotado con @ControllerAdvice puede contener @ExceptionHandler , @InitBinder y @ModelAttribute mtodos y los aplicar a @RequestMapping mtodos a travs de las jerarquas de controlador en lugar de la jerarqua de mando dentro de la cual se declaran. @ControllerAdvice es un componente que permite la anotacin clases de implementacin para se detectan de forma automtica a travs del escaneo classpath.

4.5 Matriz de las variables

Un nuevo @MatrixVariable anotacin aade soporte para la extraccin de las variables de la matriz de la URI de la solicitud. Para obtener ms informacin, consulte la seccin "Variables Matrix" .

4.6 Clase base abstracta para el cdigo basado en Servlet 3 + contenedor de inicializacin
Una implementacin de la clase base abstracta de la WebApplicationInitializer interfaz se proporciona para simplificar basado en el cdigo de registro de una DispatcherServlet y filtros asignado a l. La nueva clase se llama AbstractDispatcherServletInitializer y su sub-clase AbstractAnnotationConfigDispatcherServletInitializer se puede utilizar con la configuracin de Spring basado en Java. Para ms detalles vea la Seccin 17.14, "basado en cdigo de inicializacin del servlet container" .

4,7 ResponseEntityExceptionHandler clase


Una clase base prctica y dispone de un @ExceptionHandler mtodo que controla estndar Spring MVC excepciones y devuelve un ResponseEntity que permite personalizar y escribir la respuesta con convertidores de mensajes HTTP. Estos servidores como una alternativa a la DefaultHandlerExceptionResolver , que hace lo mismo, pero devuelve un ModelAndView lugar. Ver la versin revisada de la Seccin 17.11, "Manejo de excepciones" , incluyendo informacin sobre cmo personalizar el contenedor servlet por defecto la pgina de error.

4.8 Apoyo a los tipos genricos en el RestTemplate y en @RequestBody argumentos


El RestTemplate ahora puede leer una respuesta HTTP a un tipo genrico (por ejemplo, List<Account> ). Hay tres nuevos exchange() mtodos que aceptan ParameterizedTypeReference , una nueva clase que permite capturar y transmitir informacin de tipo genrico. En apoyo de esta funcin, el HttpMessageConverter se extiende por GenericHttpMessageConverter aadir un mtodo de lectura de contenido dado un tipo especificado con parmetros. La nueva interfaz se implementa mediante el MappingJacksonHttpMessageConverter y tambin por un nuevo Jaxb2CollectionHttpMessageConverter que puede leer una lectura genrica Collection donde el tipo genrico es un tipo JAXB anotado con @XmlRootElement o @XmlType .

4,9 Jackson JSON 2 y las mejoras relacionadas con el


The Jackson JSON biblioteca 2 es ahora compatible. Debido a los cambios de embalaje en la biblioteca de Jackson, hay clases separadas en Spring MVC tambin. Esos son

MappingJackson2HttpMessageConverter

y MappingJackson2JsonView . Otras mejoras incluyen soporte de configuracin relacionados para la impresin bastante, as como un JacksonObjectMapperFactoryBean conveniente para la personalizacin de un ObjectMapper de configuracin XML.

4,10 Azulejos 3
Azulejos 3 es ahora compatible, adems de Azulejos 2.x. Configuracin que debe ser muy similar a los cuadros de 2 configuracin, es decir, la combinacin de TilesConfigurer , TilesViewResolver y TilesView excepto que se utiliz el tiles3 en lugar de la tiles2 paquete. Tenga en cuenta tambin que, adems del cambio de nmero de versin, las dependencias de baldosas tambin han cambiado. Usted tendr que tener un subconjunto o la totalidad de tiles-request-api , tiles-api , tiles-core , tilesservlet , tiles-jsp , tiles-el .

4,11 @RequestBody mejoras


Un @RequestBody o un @RequestPart argumento ahora puede ser seguido por una Errors argumento por lo que es posible manejar los errores de validacin (como resultado de una @Valid anotacin) localmente dentro de la @RequestMapping mtodo. @RequestBody ahora tambin soporta un indicador necesario.

4,12 HTTP mtodo PARCHE


El mtodo de solicitud HTTP PATCH ahora se puede utilizar en @RequestMapping mtodos, as como en la RestTemplate en conjuncin con Apache HttpComponents HttpClient versin 4.2 o posterior. El JDK HttpURLConnection no es compatible con el PATCH mtodo.

4,13 patrones excluidos en mapeada interceptores


Mapeado interceptores ahora son compatibles con los patrones de URL que desea excluir. El espacio de nombres y el MVC MVC JavaConfig tanto exponer estas opciones.

4.14 Uso de meta-anotaciones para los puntos de inyeccin y mtodos de definicin de frijol
Como de 3,2, Spring permite @Autowired y @Value para ser utilizado como metaanotaciones, por ejemplo, para construir anotaciones personalizadas de inyeccin en combinacin con los calificadores especficos. Anlogamente, es posible construir personalizados @Bean anotaciones definicin de @Configuration clases, por ejemplo, en combinacin con los calificadores especficos, Lazy @, @ Primaria, etc

4.15 El apoyo inicial para JCache 0,5


Spring proporciona un adaptador para CacheManager JCache, construyendo en contra de la versin preliminar JCache 0,5. Apoyo JCache completa viene el prximo ao, junto con Java EE 7 final.

4.16 Apoyo a @DateTimeFormat sin Joda Time


El @DateTimeFormat anotacin ahora se puede utilizar sin necesidad de una dependencia de la biblioteca Joda Time. Si el tiempo Joda no est presente el JDK SimpleDateFormat se utiliza para analizar e imprimir los patrones de fecha. Cuando Joda Time est presente seguir ser utilizados con preferencia a SimpleDateFormat .

4,17 Global formato de fecha y hora


Ahora es posible definir formatos globales que se utilizarn cuando se analizan y tipos de impresin de fecha y hora. Consulte Seccin 7.7, "Configuracin de un formato global fecha y hora" para ms detalles.

4.18 Caractersticas del ensayo de nuevos


Adems de la inclusin de la mencionada Test Framework Spring MVC en el springtest del mdulo, la primavera TestContext Marco ha sido revisado con soporte para aplicaciones de integracin Web de pruebas, as como la configuracin de contextos de aplicacin con inicializadores de contexto. Para obtener ms informacin, consulte lo siguiente.

Configuracin y carga de un WebApplicationContext en las pruebas de integracin Pruebas de solicitud y sesin de frijoles con mbito Mejoras en la API Servlet burla Configuracin de contextos de aplicacin de prueba con ApplicationContextInitializers

4,19 refinamientos concurrencia de todo el marco


Spring Framework 3.2 incluye el perfeccionamiento de las estructuras de datos simultneos en muchas partes del marco, lo que minimiza los bloqueos y la mejora general de las modalidades de creacin muy concurrente de los granos de mbito / prototipo.

4.20 Nueva Gradle basado en construir y mover a GitHub


Construccin y contribuir al marco nunca ha sido ms fcil con nuestro traslado a un Gradle basado en sistema de construccin y control de cdigo fuente en GitHub. Ver la

construccin de la fuente de la seccin README y las directrices contribuyentes para ms detalles.

4,21 refinado Java SE 7/7 de apoyo OpenJDK


Por ltimo, pero no menos importante, Spring Framework 3.2 viene con Java refinado 7 de apoyo en el marco, as como gracias a la mejora dependencias de terceros: en concreto, CGLIB 3,0, 4,0 ASM (ambos de los cuales vienen como dependencias entre lneas con la primavera ahora) y 1,7 AspectJ apoyo (al lado del existente AspectJ 1.6 support).

Parte III. Core Technologies


Esta parte de la documentacin de referencia cubre todo de aquellas tecnologas que son absolutamente integral para el Spring Framework. La ms importante de ellas es la inversin Spring Framework de Control (IoC) el contenedor. Un tratamiento a fondo del contenedor del marco de Spring IoC es seguido de cerca por una amplia cobertura de Aspect-Oriented Spring Programacin (AOP) tecnologas. El Spring Framework tiene su propio marco de AOP, que conceptualmente es fcil de entender, y que aborda con xito el punto dulce un 80% de las necesidades de AOP en Java de programacin de la empresa. La cobertura de la integracin de Spring con AspectJ (actualmente el ms rico - en trminos de caractersticas - y ciertamente implementacin AOP ms maduro en el espacio de Java de la empresa) tambin se proporciona. Por ltimo, la adopcin de la prueba basada en el desarrollo (TDD) para el desarrollo de software es, sin duda defendido por el equipo de la primavera, por lo que la cobertura de soporte de Spring para las pruebas de integracin est cubierto (al lado de las mejores prcticas para las pruebas de unidad). El equipo de La primavera ha encontrado que el uso correcto de la COI ciertamente tiene tanto la unidad y la integracin ms fcil probar (en el que la presencia de los mtodos setter y constructores apropiados en las clases hace ms fciles de cablear juntos en una prueba sin tener que configurar el servicio de localizacin de registros y cosas por el estilo) ... el captulo dedicado exclusivamente a las pruebas con suerte le convencer de esto tambin.

Captulo 5, el contenedor IoC Captulo 6, Recursos Captulo 7, Validacin, enlace de datos y conversin de tipos Captulo 8, Spring Expression Language (SPEL) Captulo 9, Programacin Orientada a Aspectos con Spring Captulo 10, Spring AOP APIs Captulo 11, Pruebas

5. El contenedor IoC 5.1 Introduccin al contenedor de Spring IoC y frijoles

Este captulo trata sobre la implementacin del Marco de Primavera de la inversin de control (IoC) [ 1 ] principio. COI tambin se conoce como inyeccin de dependencias (DI). Es un proceso mediante el cual los objetos de definir sus dependencias, es decir, los otros objetos con los que trabajan, slo a travs de argumentos del constructor, argumentos a un mtodo de fbrica o propiedades que se establecen en la instancia del objeto despus de que se construye o regresar de un mtodo de fbrica . El recipiente luego inyecta las dependencias cuando se crea el bean. Este proceso es fundamentalmente el inverso, de ah el nombre de Inversin de Control (IoC), del propio grano de controlar la instanciacin o ubicacin de sus dependencias mediante el uso de la construccin directa de clases, o de un mecanismo como el patrn Service Locator. Los org.springframework.beans y org.springframework.context paquetes son la base para contenedor Spring Framework COI. El BeanFactory interfaz proporciona un mecanismo de configuracin avanzada capaz de gestionar cualquier tipo de objeto. ApplicationContext es una interfaz de sub- BeanFactory. Aade una integracin ms sencilla con AOP Spring funciones, el manejo de recursos de mensajes (para uso en internacionalizacin), publicacin de eventos, y de aplicacin capa de contextos especficos, como el WebApplicationContext para su uso en aplicaciones web. En resumen, el BeanFactory proporciona el marco de configuracin y funcionalidad bsica, y el ApplicationContext aade ms funcionalidad especfica de la empresa. El ApplicationContext es un superconjunto completo de la BeanFactory , y se utiliza exclusivamente en este captulo en las descripciones de contenedor de Spring COI. Para obtener ms informacin sobre el uso del BeanFactory lugar del ApplicationContext, consulte Seccin 5.15, "El BeanFactory" . En la primavera, los objetos que forman la columna vertebral de su aplicacin y que son gestionados por el contenedor Spring IoC son llamados frijoles. Un bean es un objeto que se crea una instancia, ensamblado, y de otra gestionada por un contenedor de IoC primavera. De lo contrario, un grano es simplemente uno de los muchos objetos de la aplicacin. Los frijoles, y las dependencias entre ellos, se reflejan en los metadatos de la configuracin utilizados por un contenedor.

5.2 Contenedor visin general


La interfaz org.springframework.context.ApplicationContext representa el contenedor Spring IoC y es responsable de instanciar, configuracin y montaje de los granos antes mencionados. El recipiente recibe las instrucciones sobre qu objetos para crear una instancia, configurar y ensamblar mediante la lectura de los metadatos de configuracin. Los metadatos de configuracin se representa en XML, anotaciones Java o el cdigo Java. Te permite expresar los objetos que componen la aplicacin y las interdependencias entre ricos tales objetos. Varias implementaciones del ApplicationContext interfaz son suministradas fuera de la caja con la primavera. En aplicaciones independientes es comn para crear una instancia de ClassPathXmlApplicationContext o FileSystemXmlApplicationContext . Mientras que XML ha sido el formato tradicional para la definicin de metadatos de configuracin puede indicar al contenedor

a utilizar las anotaciones de Java o el cdigo como el formato de metadatos, proporcionando una pequea cantidad de configuracin XML para habilitar mediante declaracin soporte para estos formatos de metadatos adicionales. En la mayora de los escenarios de aplicacin, cdigo de usuario explcito no es necesario crear una instancia de una o ms instancias de un contenedor de IoC primavera. Por ejemplo, en un escenario de aplicacin web, un simple ocho (o ms) lneas de texto modelo J2EE web descriptor XML en el web.xml de archivo de la aplicacin normalmente ser suficiente (ver Seccin 5.14.4, "Convenient ApplicationContext creacin de instancias para las aplicaciones web " ). Si est utilizando la herramienta de SpringSource suite Eclipse-powered entorno de desarrollo o Spring Roo repetitivo esta configuracin se pueden crear fcilmente con unos pocos clics del ratn o pulsaciones de teclas. El siguiente diagrama es una vista de alto nivel de cmo funciona la primavera. Las clases de la aplicacin se combina con metadatos de configuracin para que despus del ApplicationContext se crea y se inicializa, tiene un sistema completamente configurado y ejecutable o aplicacin.

La primavera contenedor de IoC


5.2.1 Configuracin de los metadatos

Como muestra el diagrama anterior, la Primavera de IoC container consume una forma de metadatos de configuracin, lo que representa metadatos de configuracin cmo usted como un desarrollador de aplicaciones decirle al contenedor Spring para crear una instancia, configurar y ensamblar los objetos de la aplicacin. Configuracin de metadatos que tradicionalmente se presenta en un formato XML sencillo e intuitivo, que es lo que la mayor parte de este captulo se utilizan para transmitir los conceptos clave y las caractersticas del contenedor de IoC primavera.

Nota

Basado en XML de metadatos no es la nica forma permitida de metadatos de configuracin. La primavera COI propio contenedor est totalmente desacoplado del formato en el que es en realidad estos metadatos configuracin por escrito. Para obtener informacin sobre el uso de otras formas de metadatos con el contenedor Spring, ver:

Anotacin de configuracin basada en : Spring 2.5 introdujo soporte para metadatos de configuracin basada en anotacin. Basado en Java configuracin : Comenzando con Spring 3.0, muchas caractersticas proporcionadas por el proyecto JavaConfig primavera se convirti en parte de la infraestructura Spring ncleo. As se puede definir frijoles externos a las clases de la aplicacin mediante el uso de Java en lugar de archivos XML. Para utilizar estas nuevas funciones, consulte la @Configuration , @Bean, @Import y @DependsOn anotaciones.

Configuracin de resorte se compone de al menos uno y tpicamente ms de una definicin de frijol que el contenedor debe administrar. Basado en XML de metadatos de configuracin muestra estos granos configurados como <bean/> elementos dentro de un nivel superior <beans/> elemento. Estas definiciones de frijol se corresponden con los objetos reales que componen la aplicacin. Normalmente se definen los objetos de servicio de capa, los objetos de acceso a datos (DAO), objetos de presentacin como Struts Action casos, los objetos de infraestructura como Hibernate SessionFactories , JMS Queues , etc. Por lo general no se configura de grano fino objetos de dominio en el contenedor, ya que por lo general es la responsabilidad de DAO y la lgica de negocio para crear y cargar objetos de dominio. Sin embargo, puede utilizar la integracin de Spring con AspectJ para configurar los objetos que se han creado fuera del control de un contenedor IoC. Consulte Uso de AspectJ para objetos de dependencia inyectar dominio con la primavera . El ejemplo siguiente muestra la estructura bsica de metadatos de configuracin basado en XML:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/springbeans.xsd "> <bean id = "..." class = "..."> <- Colaboradores y configuracin para este bean ir aqu -> </ Bean> <bean id = "..." class = "..."> <- Colaboradores y configuracin para este bean ir aqu -> </ Bean>

<- Ms definiciones de frijol ir aqu -> </ Beans>

La id atributo es una cadena que se utiliza para identificar la definicin de frijol individual. La class atributo define el tipo de frijol y utiliza el nombre de clase completamente cualificado. El valor del atributo id se refiere a objetos de colaboracin. El XML para hacer referencia a los objetos colaboradores no se muestra en este ejemplo, vase Dependencias para ms informacin.
5.2.2 Crear instancias de un contenedor

Crear instancias de un contenedor Spring IoC es sencillo. La va de ubicacin o caminos suministrada a un ApplicationContext constructor son realmente cadenas de recursos que permiten que el recipiente para cargar metadatos de la configuracin de una variedad de fuentes externas tales como el sistema de archivos local, desde el Java CLASSPATH , y as sucesivamente.
ApplicationContext context = ClassPathXmlApplicationContext nuevo (new String [] {"services.xml", "daos.xml"});

Nota

Despus de aprender sobre el contenedor de Spring IoC, es posible que desee saber ms acerca de Spring Resource abstraccin, como se describe en el Captulo 6, Recursos , que proporciona un mecanismo conveniente para la lectura de un InputStream desde ubicaciones definidas en una sintaxis URI. En particular, los Resource caminos se utilizan para construir aplicaciones contextos como se describe en la Seccin 6.7, "contextos de aplicacin y Resource los caminos " . El ejemplo siguiente muestra los objetos de la capa de servicios (services.xml) de archivos de configuracin:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/springbeans.xsd "> <- Servicios -> <Bean id = "PetStore" class = "org.springframework.samples.jpetstore.services.PetStoreServiceImpl"> <propiedad nombre = "accountDao" ref = "accountDao" /> <propiedad nombre = "itemDao" ref = "itemDao" /> <- Colaboradores adicionales y la configuracin de este bean ir aqu -> </ Bean> <- Ms definiciones de frijol para servicios van aqu ->

</ Beans>

El siguiente ejemplo muestra el acceso a los objetos de datos daos.xml del archivo:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/springbeans.xsd "> <Bean id = "accountDao" class = "org.springframework.samples.jpetstore.dao.ibatis.SqlMapAccountDao"> <- Colaboradores adicionales y la configuracin de este bean ir aqu -> </ Bean> <bean id = "itemDao" class = "org.springframework.samples.jpetstore.dao.ibatis.SqlMapItemDao"> <- Colaboradores adicionales y la configuracin de este bean ir aqu -> </ Bean> <- Ms definiciones de frijol para los objetos de acceso a datos van aqu -> </ Beans>

En el ejemplo anterior, la capa de servicio consiste en la clase PetStoreServiceImpl , y dos objetos de acceso de datos del tipo SqlMapAccountDao y SqlMapItemDao se basan en la iBatis Objeto / marco de asignacin relacional. El property name elemento se refiere al nombre de la propiedad JavaBean, y el ref elemento se refiere al nombre de otra definicin de bean. Esta vinculacin entre el ello y elementos ref indica la dependencia entre objetos colaboradoras. Para obtener ms informacin sobre la configuracin de las dependencias de un objeto, consulte Dependencias .
Composicin de metadatos basado en XML de configuracin

Puede ser til tener definiciones de frijol abarcar varios archivos XML. A menudo, cada individuo Archivo de configuracin XML representa un nivel lgico o mdulo en su arquitectura. Usted puede utilizar el constructor contexto de aplicacin para cargar las definiciones de frijol de todos estos fragmentos XML. Este constructor toma mltiples Resource ubicaciones, como se mostr en la seccin anterior. Como alternativa, utilice una o ms ocurrencias de la <import/> elemento para cargar las definiciones de frijol de otro archivo o archivos. Por ejemplo:
<beans> <import resource = "services.xml" /> <import resource = "resources/messageSource.xml" /> <import resource = "/resources/themeSource.xml" />

<bean id = clase = "bean1" "..." /> <bean id = clase = "bean2" "..." /> </ Beans>

En el ejemplo anterior, las definiciones externas de frijol se cargan a partir de tres archivos, services.xml , messageSource.xml y themeSource.xml . Todas las rutas son relativas a la ubicacin del archivo de definicin haciendo la importacin, as services.xml deben estar en el mismo directorio o ubicacin classpath el archivo haciendo la importacin, mientras que messageSource.xml y themeSource.xml debe estar en resources situado debajo del punto del archivo de importacin. Como se puede ver, una barra inclinada inicial se ignora, pero dado que estas rutas son relativas, es mejor formar de no utilizar la barra en absoluto. El contenido de los archivos que estn siendo importados, incluido el nivel superior <beans/> elemento, deben ser vlidos definiciones de frijol XML segn el esquema de primavera o DTD.
Nota

Es posible, pero no se recomienda, para hacer referencia a los archivos en los directorios padre con un familiar ".. /" ruta de acceso. Hacindolo crea una dependencia en un archivo que se encuentra fuera de la aplicacin actual. En particular, esta referencia no se recomienda para el "classpath:" URL (por ejemplo, "classpath:.. / Services.xml"), donde el proceso de resolucin de tiempo de ejecucin escoge el "ms cercano" root classpath y luego mira a su directorio padre. Cambios de configuracin de Classpath pueden conducir a la eleccin de un directorio diferente, incorrecto. Siempre puede utilizar ubicaciones de recursos completos en lugar de rutas de acceso relativas, por ejemplo, "file: C :/ config / services.xml" o "config :/ classpath / services.xml". Sin embargo, tenga en cuenta que usted est acoplamiento configuracin de la aplicacin a determinados lugares absolutos. En general, es preferible mantener una indireccin para dichas ubicaciones absolutas, por ejemplo, a travs de "$ {...}" marcadores de posicin que se resuelven en contra de las propiedades del sistema de JVM en tiempo de ejecucin.
5.2.3 Uso del envase

El ApplicationContext es la interfaz para una fbrica de avanzada capaz de mantener un registro de los diferentes granos y sus dependencias. Utilizando el mtodo T getBean(String name, Class<T> requiredType) se puede recuperar instancias de los beans. El ApplicationContext le permite leer las definiciones de frijol y acceder a ellos de la siguiente manera:
/ / Crear y configurar beans ApplicationContext context = ClassPathXmlApplicationContext nuevo (new String [] {"services.xml", "daos.xml"}); / / Recuperar instancia configurada

PetStoreServiceImpl servicio = context.getBean ("PetStore", PetStoreServiceImpl clase.); / / Usa instancia configurada Lista lista_usuarios service.getUsernameList = ();

Utilice getBean() para recuperar las instancias de los beans. El ApplicationContext interfaz tiene algunos otros mtodos para la recuperacin de frijoles, pero lo ideal es el cdigo de aplicacin nunca debe utilizarlos. De hecho, el cdigo de la aplicacin no debera tener llamadas al getBean() mtodo en absoluto, y por lo tanto no dependen de APIs Spring en absoluto. Por ejemplo, la integracin de Spring con frameworks web ofrece para inyeccin de dependencias para diversas clases de framework de desarrollo web como controladores y los frijoles JSF administrados.

5,3 haba visin general


Un contenedor de IoC Spring gestiona uno o ms beans. Estos granos se crean con los metadatos de configuracin que se proporciona al recipiente, por ejemplo, en forma de XML <bean/> definiciones. Dentro del propio envase, estas definiciones de frijol se representan como BeanDefinition objetos, que contienen (entre otra informacin) los siguientes metadatos:

Un paquete nombre completo de clase: tpicamente la clase de implementacin real del grano se est definiendo. Grano de elementos de configuracin de comportamiento, que indique cmo debe comportarse el grano en el contenedor (mbito de aplicacin, las devoluciones de llamada de ciclo de vida, y as sucesivamente). Las referencias a otros beans que se necesitan para el grano para hacer su trabajo, estas referencias son tambin llamados colaboradores o dependencias. Otras opciones de configuracin para configurar en el nuevo objeto creado, por ejemplo, el nmero de conexiones a utilizar en un grano que gestiona un grupo de conexin, o el lmite de tamao de la piscina.

Estos metadatos se traduce en un conjunto de propiedades que componen cada definicin de bean. Tabla 5.1. La definicin de frijol
Propiedad clase nombre alcance argumentos del Explicacin pulg ..

Seccin 5.3.2, "frijoles" Instanciacin Seccin 5.3.1, "frijoles de denominacin" Seccin 5.5, "Bean mbitos" Seccin 5.4.1, "inyeccin de dependencias"

Propiedad constructor propiedades autowiring modo lazy-inicializacin de modo mtodo de inicializacin destruccin mtodo

Explicacin pulg ..

Seccin 5.4.1, "inyeccin de dependencias" Seccin 5.4.5, "colaboradores" autowiring Seccin 5.4.4, "Lazy-inicializadas frijoles" la seccin titulada "devoluciones de llamada de inicializacin" la seccin llamada "destruccin" callbacks

Adems de las definiciones de frijol que contienen informacin sobre cmo crear un grano especfico, los ApplicationContext implementaciones permiten tambin el registro de los objetos existentes que se crean fuera del contenedor, por los usuarios. Esto se hace mediante el acceso a la BeanFactory ApplicationContext va el mtodo getBeanFactory() que devuelve el BeanFactory aplicacin DefaultListableBeanFactory . DefaultListableBeanFactory soporta este registro a travs de los mtodos registerSingleton(..) y registerBeanDefinition(..) . Sin embargo, las aplicaciones tpicas de trabajar nicamente con los granos de frijol se definen a travs de las definiciones de metadatos.
5.3.1 Designacin de frijoles

Cada grano tiene uno o ms identificadores. Estos identificadores deben ser nicos dentro del contenedor que aloja el frijol. Un grano por lo general slo tiene un identificador, pero si se necesita ms de una, los extras puede ser considerado alias. En los metadatos de configuracin basado en XML, se utiliza el id y / o name atributos para especificar el identificador de frijol (s). El id atributo permite especificar exactamente un id. Convencionalmente estos nombres son alfanumricos ('myBean', 'fooService', etc), pero puede caracteres especiales tambin. Si desea introducir otros alias para el frijol, tambin se pueden especificar en el name atributo, separados por una coma ( , ), punto y coma ( ; ), o espacios en blanco. Como nota histrica, en las versiones anteriores a Spring 3.1, el id atributo se escribe como un xsd:ID , que obligado caracteres posibles. Como de 3,1, ahora se xsd:string . Tenga en cuenta que el frijol Identificacin singularidad se siguen aplicando por el contenedor, aunque ya no por los analizadores XML. Usted no est obligado a proporcionar un nombre o identificador de un frijol. Si no hay ningn nombre o la identificacin se proporciona explcitamente, el contenedor genera un nombre nico para ese grano. Sin embargo, si usted desea hacer referencia a que el frijol por su nombre, a travs del uso de la ref elemento o servicio Localizador de bsqueda de estilo, debe proporcionar un nombre. Los motivos para no suministrar un nombre se relaciona con el uso frijoles interiores y autowiring colaboradores .

Convenciones de nomenclatura de frijol La convencin es usar la convencin estndar de Java para los nombres de campo de instancia al nombrar a los frijoles. Es decir, los nombres de frijol comenzar con una letra minscula, y son camello con carcasa de ah en adelante. Ejemplos de tales nombres sera (sin comillas) 'accountManager' , 'accountService' , 'userDao' , 'loginController' , y as sucesivamente. Frijoles nomenclatura consistente hace que su configuracin ms fcil de leer y entender, y si usted est utilizando Spring AOP ayuda mucho en la aplicacin de asesoramiento a un conjunto de frijoles relacionadas por su nombre.
Aliasing un grano fuera de la definicin de frijol

En una definicin de bean, puede suministrar ms de un nombre para el frijol, mediante el uso de una combinacin de hasta un nombre especificado por el id de atributo, y un sinnmero de otros nombres en el name atributo. Estos nombres pueden ser equivalentes a los alias del grano mismo, y son tiles para algunas situaciones, tales como permitir que cada componente en una aplicacin para referirse a una dependencia comn mediante el uso de un nombre de bean que es especfico para ese componente en s mismo. Especificar todos los alias que es en realidad el frijol definidas no siempre es suficiente, sin embargo. A veces es deseable introducir un alias para un grano que se define en otra parte. Este suele ser el caso en los sistemas grandes donde la configuracin se divide entre cada subsistema, cada subsistema tiene su propio conjunto de definiciones de objetos. En los metadatos de configuracin basado en XML, puede utilizar el <alias/> elemento para lograr esto.
<alias name = "fromName" alias = "toName" />

En este caso, un grano en el mismo recipiente que se nombra fromName , puede tambin despus del uso de esta definicin de alias, se refiere como toName . Por ejemplo, los metadatos de configuracin para un subsistema puede referirse a un origen de datos mediante el nombre de 'subsystemA-dataSource. Los metadatos de configuracin para el subsistema B puede referirse a un origen de datos mediante el nombre de 'subsystemB-dataSource. Al redactar la principal aplicacin que utiliza estos dos subsistemas de la aplicacin principal se refiere a la fuente de datos a travs del nombre 'myApp-dataSource. Para que los tres nombres se refieren al mismo objeto que agregue a la configuracin de metadatos MyApp las definiciones siguientes alias:
<alias name = "subsystemA-dataSource" alias = "subsystemBdataSource" /> <alias name = "subsystemA-dataSource" alias = "myApp-dataSource" />

Ahora, cada uno de los componentes y la aplicacin principal puede hacer referencia a la fuente de datos a travs de un nombre que sea nico y garantizado de no entrar en conflicto con ninguna otra definicin (de hecho, la creacin de un espacio de nombres), sin embargo, se refieren a la misma frijol.

5.3.2 frijoles Instanciacin

Una definicin de bean esencialmente es una receta para crear uno o ms objetos. El contenedor se ve en la receta de un bean llamado cuando se le pregunt, y utiliza los metadatos de configuracin encapsulado por esa definicin de frijol para crear (o adquirir) un objeto real. Si utiliza XML basado en metadatos de configuracin, debe especificar el tipo (o clase) del objeto que se va a crear una instancia de la class atributo de la <bean/> elemento. Esta class atributo, que internamente es una Class en una propiedad BeanDefinition ejemplo, suele ser obligatorio. (Para excepciones, vea la seccin llamada "instanciacin utilizando un mtodo de fbrica instancia" y Seccin 5.7, "Bean herencia definicin" .) Se utiliza la Class propiedad de una de dos maneras:

Normalmente, para especificar la clase del bean que se construir en el caso de que el propio contenedor crea directamente el grano llamando a su constructor reflexiva, algo equivalente a cdigo Java utilizando el new operador. Para especificar la clase real que contiene el static mtodo de fbrica que se invocar para crear el objeto, en el caso menos frecuente en el contenedor invoca un static mtodo de fbrica en una clase para crear el bean. El tipo de objeto devuelto por la invocacin de la static mtodo de fbrica puede ser la misma clase o de otra clase completamente.

Nombres internos de clase Si desea configurar una definicin de bean para una static clase anidada, usted tiene que utilizar el nombre del binario de la clase interna. Por ejemplo, si usted tiene una clase llamada Foo en el com.example paquete, y esta Foo clase tiene una static clase interna llamada Bar , el valor de la 'class' de atributos en una definicin de frijol sera ...
com.example.Foo$Bar

Observe el uso de la $ carcter en el nombre para separar el nombre de la clase interna a partir del nombre de la clase externa.
De instancias con un constructor

Cuando se crea un bean por el enfoque de constructor, todas las clases normales son utilizables y compatibles con la primavera. Es decir, la clase que se est desarrollado no es necesario implementar ninguna interfaces especficas o de ser codificada en una manera especfica. Basta con especificar la clase del bean debera ser suficiente. Sin embargo, dependiendo del tipo de la COI que utiliza para que el frijol especfica, es posible que tenga un defecto (vaco) constructor. La primavera COI contenedor puede manejar prcticamente cualquier clase que desee para administrar, no se limita a gestionar verdadero JavaBeans. La mayora de los usuarios prefieren la primavera real JavaBeans con slo un defecto (sin argumentos)

constructor y setters y getters apropiadas siguiendo el modelo de las propiedades en el contenedor. Usted tambin puede tener ms exticas no al estilo de frijol clases en su contenedor. Si, por ejemplo, es necesario utilizar un pool de conexiones legado que absolutamente no se adhiere a la especificacin JavaBean, Spring se puede gestionar tambin. Con los metadatos de configuracin basado en XML, puede especificar la clase de bean de la siguiente manera:
<bean id = "exampleBean" class = "examples.ExampleBean" /> nombre = <bean "anotherExample" class = "examples.ExampleBeanTwo" />

Para obtener ms informacin sobre el mecanismo para el suministro de argumentos al constructor (si es necesario) y el establecimiento de las propiedades de objeto de instancia despus de que el objeto es construido, ver Inyeccin de dependencias .
De instancias con un mtodo esttico de fbrica

Cuando se define un bean que se crean con un mtodo de fbrica esttica, se utiliza la class atributo para especificar la clase que contiene el static mtodo de fbrica y un atributo denominado factory-method para especificar el nombre del mtodo de fbrica en s. Usted debe ser capaz de llamar a este mtodo (con argumentos opcionales que se describen ms adelante) y devolver un objeto vivo, que posteriormente es tratado como si hubiera sido creado a travs de un constructor. Uno de los usos de esa definicin frjol es llamar static fbricas de cdigo heredado. La definicin de frijol siguiente especifica que el frijol se crea llamando a un mtodo de fbrica. La definicin no especifica el tipo (clase) del objeto devuelto, slo la clase que contiene el mtodo de fbrica. En este ejemplo, la createInstance() mtodo debe ser un mtodo esttico.
<Bean id = "clientService" class = "examples.ClientService" fbrica method = "createInstance" /> pblico ClientService clase { private static ClientService clientService = new ClientService (); ClientService privado () {} public static ClientService createInstance () { volver clientService; } }

Para obtener ms informacin sobre el mecanismo para el suministro (opcional) argumentos para el mtodo de fbrica y el establecimiento de las propiedades de objeto de instancia despus de que el objeto se devuelve desde la fbrica, consulte Dependencias y configuracin en detalle .

Instanciacin utilizando un mtodo de fbrica instancia

Similar a la creacin de instancias a travs de un mtodo de fbrica esttica , de instancias con un mtodo de fbrica ejemplo invoca un mtodo no esttico de un bean existente del recipiente para crear un nuevo bean. Para utilizar este mecanismo, deje la class atributo vaco, y en la factory-bean atributo, especifique el nombre de un grano en la corriente (o padre / antepasado) recipiente que contiene el mtodo de instancia que se va a invocar a crear el objeto. Establezca el nombre del mtodo de fbrica con el mismo factory-method atributo.
<- El grano de la fbrica, que contiene un mtodo llamado createInstance () -> <bean id = "serviceLocator" class = "examples.DefaultServiceLocator"> <- Inyectar las dependencias requeridas por este bean localizador > </ Bean> <- El grano que se crear a travs de la fbrica de frijol -> <Bean id = "clientService" fbrica de frijol = "ServiceLocator" fbrica method = "createClientServiceInstance" /> DefaultServiceLocator clase pblica { private static ClientService clientService = new ClientServiceImpl (); DefaultServiceLocator privado () {} pblico ClientService createClientServiceInstance () { volver clientService; } }

Una clase de fbrica tambin puede tener ms de un mtodo de fbrica como se muestra aqu:
<bean id = "serviceLocator" class = "examples.DefaultServiceLocator"> <- Inyectar las dependencias requeridas por este bean localizador > </ Bean> <Bean id = "clientService" fbrica de frijol = "ServiceLocator" fbrica method = "createClientServiceInstance" /> <Bean id = "AccountService" fbrica de frijol = "ServiceLocator" fbrica method = "createAccountServiceInstance" /> DefaultServiceLocator clase pblica { private static ClientService clientService = new ClientServiceImpl (); private static AccountService AccountService = new AccountServiceImpl (); DefaultServiceLocator privado () {} pblico ClientService createClientServiceInstance () { volver clientService; } pblico AccountService createAccountServiceInstance () {

volver AccountService; } }

Este enfoque muestra que el grano de fbrica en s mismo puede ser administrado y configurado a travs de la inyeccin de dependencia (DI). Ver Dependencias y configuracin en detalle .
Nota

En la documentacin de primavera, fbrica de beans se refiere a un grano que est configurado en el contenedor Spring que va a crear objetos a travs de una instancia o esttico mtodo de fbrica. Por el contrario, FactoryBean (ntese la mayscula inicial) se refiere a un resorte especfico FactoryBean .

5.4 Dependencias
Una aplicacin tpica empresa no consiste de un solo objeto (o frijol en la jerga de primavera). Incluso la simple aplicacin tiene algunos objetos que trabajan juntos para presentar lo que el usuario final ve como una aplicacin coherente. La siguiente seccin explica cmo se pasa de la definicin de una serie de definiciones de frijol que estn solos en una aplicacin plenamente en que los objetos colaboran para lograr un objetivo.
5.4.1 Inyeccin de dependencia

Inyeccin de dependencia (DI) es un proceso mediante el cual los objetos de definir sus dependencias, es decir, los otros objetos con los que trabajan, slo a travs de argumentos del constructor, argumentos a un mtodo de fbrica o propiedades que se establecen en la instancia del objeto despus de que se construye o se devuelven a partir de un mtodo de fbrica. El recipiente luego inyecta las dependencias cuando se crea el bean. Este proceso es esencialmente la inversa, de ah el nombre de Inversin de control (IoC), del propio grano de controlar la creacin de instancias o la ubicacin de sus dependencias por su cuenta mediante el uso de la construccin directa de las clases, o el patrn Service Locator. Cdigo es ms limpio con el principio DI y desacoplamiento es ms eficaz cuando los objetos se proporcionan con sus dependencias. El objeto no se ve hasta sus dependencias, y no conoce la ubicacin o clase de las dependencias. Por lo tanto, las clases son ms fciles de probar, en particular cuando las dependencias son las interfaces o clases base abstractas, que permiten taln o implementaciones simuladas que se utilizarn en las pruebas unitarias. DI existe en dos variantes principales, Constructor basado en la inyeccin de dependencia y de inyeccin del organismo con sede en la dependencia .
Constructor basado en la inyeccin de dependencia

Constructor basado DI se lleva a cabo por el contenedor de la invocacin de un constructor con una serie de argumentos, cada uno representando una dependencia. Llamar a un static mtodo de fbrica con argumentos concretos para construir el frijol

es casi equivalente, y esta discusin trata a los argumentos a un constructor y un static mtodo de fbrica de manera similar. El siguiente ejemplo muestra una clase que slo puede ser la dependencia a inyectar con la inyeccin de constructor. Tenga en cuenta que no hay nada especial acerca de esta clase, es un POJO que no tiene dependencias en las interfaces de contenedores especficos, clases base o anotaciones.
pblico SimpleMovieLister clase { / / El SimpleMovieLister tiene una dependencia en un MovieFinder MovieFinder MovieFinder privado; / / Un constructor de manera que el contenedor puede Spring 'inyectar' un MovieFinder pblico SimpleMovieLister (MovieFinder MovieFinder) { este MovieFinder = MovieFinder.; } / / La lgica de negocio que en realidad 'usa' la MovieFinder inyectado se omite ... } Constructor resolucin argumento

Argumento constructor coincidente resolucin se produce utilizando el tipo del argumento. Si no hay ninguna ambigedad potencial existe en los argumentos del constructor de una definicin de frijol, el orden en el que los argumentos del constructor son definidas en una definicin de frijol es el orden en que estos argumentos se suministran al constructor apropiado cuando el grano est siendo instanciado. Considere la siguiente clase:
paquete xy; public class Foo { Foo pblico (bar Bar, Baz Baz) { / / ... } }

No existe ambigedad potencial, asumiendo que Bar y Baz clases no estn relacionados por herencia. As pues, la siguiente configuracin funciona bien, y no es necesario especificar los ndices argumento del constructor y / o tipos de forma explcita en el <constructor-arg/> elemento.
<beans> <bean id = "foo" class = "xyFoo"> <constructor-arg ref = "bar" /> <constructor-arg ref = "baz" /> </ Bean> <bean id = "bar" class = "xyBar" /> <bean id = "baz" class = "xyBaz" /> </ Beans>

Cuando se hace referencia a otro bean, el tipo se conoce, y de adaptacin puede ocurrir (como era el caso con el ejemplo anterior). Cuando un tipo simple se utiliza, tal como <value>true<value> , Spring no puede determinar el tipo del valor, y por lo tanto no puede igualar por tipo sin ayuda. Considere la siguiente clase:
ejemplos de paquetes; pblico ExampleBean clase { / / N de aos para el clculo de la respuesta definitiva privadas int ao; / / La respuesta a la vida, el Universo y Todo ultimateAnswer private String; pblico ExampleBean (aos int, String ultimateAnswer) { este ao = ao.; este ultimateAnswer = ultimateAnswer.; } }
Constructor tipo de argumento coincidente

En el escenario anterior, el contenedor puede utilizar la concordancia tipo con tipos simples si se especifica explcitamente el tipo del argumento del constructor con el type de atributo. Por ejemplo:
<bean id = "exampleBean" class = "examples.ExampleBean"> <constructor-arg type = value = "int" "7500000" /> <constructor-arg type = value = "java.lang.String" "42" /> </ Bean>
Constructor ndice argumento

Utilice el index atributo para especificar explcitamente el ndice de argumentos del constructor. Por ejemplo:
<bean id = "exampleBean" class = "examples.ExampleBean"> <constructor-arg index = "0" value = "7500000" /> <constructor-arg index = "1" value = "42" /> </ Bean>

Adems de resolver la ambigedad de mltiples valores simples, especificando un ndice resuelve la ambigedad donde un constructor tiene dos argumentos del mismo tipo. Tenga en cuenta que el ndice est basado 0.
Constructor nombre de argumento

A partir de Spring 3.0 tambin puede usar el nombre del parmetro constructor para la desambiguacin valor:
<bean id = "exampleBean" class = "examples.ExampleBean"> <constructor-arg name = value = "years" "7500000" /> <constructor-arg name = value = "ultimateanswer" "42" /> </ Bean>

Tenga en cuenta que para hacer este trabajo fuera de la caja el cdigo debe ser compilado con la bandera debug habilitado para que Spring puede buscar el nombre de parmetro en el constructor. Si no puede compilar el cdigo con el indicador de depuracin (o no quieren) que puede utilizar @ConstructorProperties anotacin JDK para nombrar explcitamente los argumentos de constructor. La clase de ejemplo tendra que tener el siguiente aspecto:
ejemplos de paquetes; pblico ExampleBean clase { / / Campos omitidos @ ConstructorProperties ({"ao", "ultimateAnswer"}) pblico ExampleBean (aos int, String ultimateAnswer) { este ao = ao.; este ultimateAnswer = ultimateAnswer.; } }

Setter basado en la inyeccin de dependencia

Setter basado DI se lleva a cabo por el contenedor de llamar a los mtodos setter en sus granos despus de invocar un constructor sin argumentos o sin argumentos- static mtodo de fbrica para instanciar el bean. El siguiente ejemplo muestra una clase que slo puede ser dependencia de inyeccin de usar la inyeccin de setter puro. Esta clase es Java convencional. Se trata de un POJO que no tiene dependencias en las interfaces de contenedores especficos, clases base o anotaciones.
pblico SimpleMovieLister clase { / / El SimpleMovieLister tiene una dependencia en el MovieFinder MovieFinder MovieFinder privado; / / Un mtodo de establecimiento de modo que el contenedor puede Spring 'inyectar' un MovieFinder public void setMovieFinder (MovieFinder MovieFinder) { este MovieFinder = MovieFinder.; } / / La lgica de negocio que en realidad 'usa' la MovieFinder inyectado se omite ... }

El ApplicationContext apoya constructor y setter basado DI para los granos que gestiona. Tambin es compatible con setter basado DI despus de algunas dependencias ya se inyecta a travs del mtodo constructor. Configura las dependencias en la forma de un BeanDefinition , que se utiliza con PropertyEditor instancias para convertir las propiedades de un formato a otro. Sin embargo, la mayora de los usuarios de primavera no funcionan con estas clases de forma directa (mediante programacin), sino ms bien con un archivo de definicin XML que luego se convierte internamente a instancias de estas clases, y se utiliza para cargar un resorte toda la instancia de contenedor IoC.

Constructor-basado o setter basado DI? Ya que se puede mezclar ambas cosas, Constructor y Setter basado en DI, es una buena regla del pulgar para usar argumentos de constructor para las dependencias obligatorias y setters para las dependencias opcionales. Tenga en cuenta que el uso de una Requerido @ anotacin en un fijador puede ser utilizado para hacer las dependencias setters requeridos. El equipo de Primavera en general aboga por inyeccin de setter, ya que un gran nmero de argumentos del constructor puede conseguir difcil de manejar, especialmente cuando las propiedades son opcionales. Mtodos de establecimiento tambin hacer que los objetos de esa clase susceptibles de reconfiguracin o reinyeccin posterior. Gestin a travs de JMX MBeans es un caso de uso convincente. Algunos puristas favorecer constructor con sede en inyeccin. El suministro de todas las dependencias de los objetos significa que el objeto siempre se devuelve al cliente (llamadas) de cdigo en un estado totalmente inicializado. La desventaja es que el objeto se convierte en menos susceptible a la reconfiguracin y re-inyeccin. Utilice el DI que tiene ms sentido para una clase particular. A veces, cuando se trata de clases de terceros a los que no cuentan con la fuente, la eleccin se hace por usted. Una clase de legado no puede exponer todos los mtodos setter, por lo que la inyeccin de constructor es el nico disponible DI.
Dependencia proceso de resolucin

El contenedor realiza la resolucin de frijol dependencia de la siguiente manera: 1. El ApplicationContext se crea y se inicializa con los metadatos de configuracin que se describen todos los granos. Configuracin de metadatos se puede especificar a travs de XML, el cdigo Java o anotaciones. 2. Para cada una de frijol, sus dependencias se expresan en forma de propiedades, argumentos de constructor o argumentos al mtodo esttico de fbrica, si usted est usando que en lugar de un constructor normal. Estas dependencias se proporcionan al grano, cuando el bean se crea realmente. 3. Cada argumento de la propiedad o constructor es una definicin real del valor para establecer, o una referencia a otro bean en el contenedor. 4. Cada propiedad o constructor argumento que es un valor se convierte de su formato especificado en el tipo real de esa propiedad o argumento del constructor. Para la primavera del defecto puede convertir un valor proporcionado en formato de serie para todos los tipos integrados, como int , long , String , boolean , etc El contenedor Spring valida la configuracin de cada grano como el recipiente se crea, incluyendo la validacin de si las propiedades de frijol de referencia se refieren a granos de vlidas. Sin embargo, las propiedades del bean en s no se establece hasta que el grano se crea realmente. Beans que son de mbito de singleton y listo para ser preinstancia (por defecto) se crean cuando el contenedor se crea. Los mbitos se definen en la Seccin 5.5, "Bean mbitos" De lo contrario, se crea el bean slo cuando se solicite. Creacin de un bean potencialmente causa un grfico de los granos de ser creado, como

dependencias del bean y dependencias sus dependencias '(y as sucesivamente) se crean y asignan. Circular dependencias Si se utiliza predominantemente inyeccin de constructor, es posible crear un escenario irresoluble dependencia circular. Por ejemplo: Clase A requiere una instancia de la clase B a travs de la inyeccin de constructor y de clase B requiere una instancia de la clase A a travs de la inyeccin de constructor. Si configura frijoles para las clases A y B que se inyectan en la otra, la primavera contenedor de IoC detecta esta referencia circular en tiempo de ejecucin, y lanza un BeanCurrentlyInCreationException . Una posible solucin es editar el cdigo fuente de algunas clases para ser configurados por setters en lugar de constructores. Por otra parte, evitar la inyeccin de constructor y utilizar la inyeccin de setter solamente. En otras palabras, aunque no se recomienda, puede configurar dependencias circulares con la inyeccin de setter. A diferencia del caso tpico (sin dependencias circular), una dependencia circular entre A y B frijol frijol obliga a uno de los granos que se inyectan en el otro antes de ser inicializado por completo en s (un clsico pollo / huevo escenario). En general, usted puede confiar en primavera para hacer lo correcto. Detecta problemas de configuracin, tales como las referencias a que no existen frijoles y dependencias circulares, en contenedor en tiempo de carga. Primavera establece las propiedades y dependencias resuelve lo ms tarde posible, cuando el bean se crea realmente. Esto significa que un contenedor de primavera, que se ha cargado correctamente despus puede generar una excepcin cuando se solicita un objeto si hay un problema al crear ese objeto o una de sus dependencias. Por ejemplo, el frijol se produce una excepcin, como resultado de una propiedad que falta o no vlido. Esta visibilidad posible retraso de algunos problemas de configuracin es la razn por ApplicationContext implementaciones por defecto antes de instanciar frijoles nicos. A costa de un poco de tiempo por adelantado y memoria para crear estas habas antes de que sean realmente necesarios, a descubrir problemas de configuracin cuando el ApplicationContext se crea, no despus. Usted todava puede anular este comportamiento predeterminado para que los granos aislados se lazy-inicializar, en lugar de ser pre-instancia. Si no existen dependencias circulares, cuando uno o ms granos de colaboradores se inyecta en un bean dependiente, cada grano colaboradoras est totalmente configurado antes de ser inyectado en el bean dependiente. Esto significa que si haba A tiene una dependencia de frijol B, la Primavera de IoC container completamente configura bean B antes de invocar el mtodo setter en frijol A. En otras palabras, el grano se crea una instancia (si no es un pre-instancia singleton), su dependencias se sent, y los mtodos de ciclo de vida pertinentes (como un mtodo init configura o el mtodo de devolucin de llamada InitializingBean ) haya alegado.

Ejemplos de inyeccin de dependencias

En el ejemplo siguiente, se utiliza basado en XML de metadatos de configuracin para setter basado en DI. Una pequea parte de un archivo de configuracin de Spring XML especifica algunas definiciones de frijol:
<bean id = "exampleBean" class = "examples.ExampleBean"> <- Setter inyeccin usando el elemento anidado <ref/> -> <propiedad nombre "beanOne" => <ref frijol = "anotherExampleBean" /> </ propiedad> <- Setter inyeccin usando el atributo 'ref' el ms limpio -> <propiedad nombre = "beanTwo" ref = "yetAnotherBean" /> <propiedad nombre = valor = "integerProperty" "1" /> </ Bean> <bean id = "anotherExampleBean" class = "examples.AnotherBean" /> <bean id = "yetAnotherBean" class = "examples.YetAnotherBean" /> pblico ExampleBean clase { beanOne AnotherBean privado; beanTwo YetAnotherBean privado; private int i; public void setBeanOne (AnotherBean beanOne) { este beanOne = beanOne.; } public void setBeanTwo (YetAnotherBean beanTwo) { este beanTwo = beanTwo.; } public void setIntegerProperty (int i) { este i = i.; } }

En el ejemplo anterior, se declaran setters para coincidir con las propiedades especificadas en el archivo XML. El ejemplo siguiente utiliza constructor con sede en DI:
<bean id = "exampleBean" class = "examples.ExampleBean"> <- Constructor inyeccin que utiliza el elemento <ref/> anidada -> <constructor-arg> <ref frijol = "anotherExampleBean" /> </ Constructor-arg> <- Constructor inyeccin usando el atributo 'ref' el ms limpio -> <constructor-arg ref = "yetAnotherBean" /> <constructor-arg type = value = "int" "1" /> </ Bean> <bean id = "anotherExampleBean" class = "examples.AnotherBean" /> <bean id = "yetAnotherBean" class = "examples.YetAnotherBean" /> pblico ExampleBean clase {

beanOne AnotherBean privado; beanTwo YetAnotherBean privado; private int i; pblico ExampleBean ( AnotherBean anotherBean, YetAnotherBean yetAnotherBean, int i) { este beanOne = anotherBean.; este beanTwo = yetAnotherBean.; este i = i.; } }

Los argumentos del constructor especificado en la definicin de frijol se utilizarn como argumentos al constructor de la ExampleBean . Ahora considere una variante de este ejemplo, en lugar de utilizar un constructor, Spring se le dice que llame a un static mtodo de fbrica para devolver una instancia del objeto:
<Bean id = "exampleBean" class = "examples.ExampleBean" fbrica method = "createInstance"> <constructor-arg ref = "anotherExampleBean" /> <constructor-arg ref = "yetAnotherBean" /> <constructor-arg value = "1" /> </ Bean> <bean id = "anotherExampleBean" class = "examples.AnotherBean" /> <bean id = "yetAnotherBean" class = "examples.YetAnotherBean" /> pblico ExampleBean clase { / / Un constructor privado ExampleBean privado (...) { ... } / / Un mtodo de fbrica esttica, los argumentos de este mtodo puede ser / / Considera las dependencias del frijol que se devuelve, / / Independientemente de la forma en que esos argumentos sean utilizadas efectivamente. public static createInstance ExampleBean ( AnotherBean anotherBean, YetAnotherBean yetAnotherBean, int i) { ExampleBean eb = new ExampleBean (...); / / Algunas otras operaciones ... volver eb; } }

Los argumentos de la static mtodo de fbrica se suministran a travs de <constructor-arg/> elementos, exactamente lo mismo que si un constructor haba sido efectivamente utilizado. El tipo de la clase que son devueltos por el mtodo de fbrica no tiene por qu ser del mismo tipo que la clase que contiene el static mtodo de fbrica, aunque en este ejemplo es. Un ejemplo (no esttica) mtodo de fbrica sera

utilizado de una manera esencialmente idntica (aparte del uso de la factory-bean atributo en lugar de la class atributo), por lo que los detalles no sern discutidos aqu.
5.4.2 Dependencias y configuracin en detalle

Como se mencion en la seccin anterior, se pueden definir las propiedades del bean y argumentos de constructor como referencias a otros beans gestionados (colaboradores), o como en lnea los valores definidos. Basado en XML de Spring metadatos configuracin soporta sub-tipos de elementos dentro de su <property/> y <constructor-arg/> elementos para este fin.
Valores rectos (primitivos, Strings , etc)

El value del atributo <property/> elemento especifica una propiedad o un argumento de constructor como una representacin de cadena legible para el usuario. Tal como se mencion anteriormente , JavaBeans PropertyEditors se utilizan para convertir estos valores de cadena de una String con el tipo real de la propiedad o argumento.
<bean id = "myDataSource" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method "close" => <- Da como <propiedad /> <propiedad /> <propiedad <propiedad </ Bean> resultado un setDriverClassName (String) llamada -> nombre = valor = "driverClassName" "com.mysql.jdbc.Driver" nombre = valor = "url" "jdbc:mysql://localhost:3306/mydb" nombre = valor = "username" "root" /> nombre = valor = "password" "masterkaoli" />

En el ejemplo siguiente se utiliza la p-namespace para an ms sucinta de configuracin XML.


<Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: p = "http://www.springframework.org/schema/p" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd "> <Bean id = "myDataSource" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method = "close" t: driverClassName = "com.mysql.jdbc.Driver" p: url = "jdbc: mysql :/ / localhost: 3306/mydb" p: username = "root" p: password = "masterkaoli" /> </ Beans>

El XML anterior es ms sucinto, sin embargo, se descubren errores tipogrficos en tiempo de ejecucin en lugar de tiempo de diseo, a menos que utilice un IDE como IntelliJ IDEA o la herramienta de SpringSource suite (STS) que apoyan la terminacin

automtica de propiedades al crear definiciones de frijol. El auxilio IDE es muy recomendable. Tambin puede configurar un java.util.Properties instancia es:
<Bean id = "mappings" class = "org.springframework.beans.factory.config.PropertyPlaceholderConfigure r"> <- Escribe como un java.util.Properties -> <propiedad nombre = "properties"> <valor> jdbc.driver.className = com.mysql.jdbc.Driver jdbc.url = jdbc: mysql :/ / localhost: 3306/mydb </ Value> </ Propiedad> </ Bean>

El contenedor de Spring convierte el texto dentro de la <value/> elemento en una java.util.Properties instancia mediante el JavaBeans PropertyEditor mecanismo. Este es un buen atajo, y es uno de los pocos lugares donde el equipo de Primavera estn a favor del uso de la anidados <value/> elemento sobre el value del atributo de estilo.
El idref elemento

El idref elemento es simplemente una manera a prueba de error para pasar el identificador (valor de cadena - no una referencia) de otro grano en el recipiente a una <constructor-arg/> o <property/> elemento.
<bean id = clase = "theTargetBean" "..." /> <bean id = clase = "theClientBean" "..."> <propiedad nombre = "targetName"> <idref frijol = "theTargetBean" /> </ Propiedad> </ Bean>

El siguiente fragmento de frijol definicin anterior es exactamente equivalente (en tiempo de ejecucin) para el siguiente fragmento:
<Bean id = "theTargetBean" class = "..." />

<bean id = clase = "client" "..."> <propiedad nombre = valor = "targetName" "theTargetBean" /> </ Bean>

La primera forma es preferible a la segunda, porque el uso de la idref etiqueta permite que el recipiente para validar en tiempo de despliegue que la referencia, bean llamada realmente existe. En la segunda variacin, no se realiza la validacin en el valor que se pasa a la targetName propiedad del client bean. Typos slo se descubren (con resultados fatales ms probables) cuando el client bean es en realidad una instancia. Si

el client frijol es un prototipo de frijol, este error y la excepcin derivada, slo puede descubrirse mucho despus de que el contenedor se implementa. Adems, si el grano de referencia est en la unidad de XML mismo, y el nombre del bean bean es el identificador, puede utilizar el local atributo, lo que permite que el analizador XML s mismo para validar el ID de frijol antes, en el momento de analizar XML documento.
<propiedad nombre = "targetName"> <- Un frijol con 'theTargetBean' id debe existir;! De lo contrario una excepcin ser lanzada -> <idref local = "theTargetBean" /> </ Propiedad>

Un lugar comn (al menos en las versiones anteriores de Spring 2,0) donde el elemento <idref/> aporta valor est en la configuracin de AOP interceptores en un ProxyFactoryBean definicin de frijol. Utilizando elementos <idref/> al especificar los nombres interceptores le impide una falta de ortografa Identificacin del interceptor.
Las referencias a otros beans (colaboradores)

El ref elemento es el elemento final dentro de un <constructor-arg/> o <property/> elemento de definicin. Aqu se ajusta el valor de la propiedad especificada de un bean que es una referencia a otro bean (colaborador), gestionado por el contenedor. El grano se hace referencia es una dependencia del grano cuya propiedad se establecer y se inicializa en la demanda, segn sea necesario antes de que la propiedad se establece. (Si el colaborador es un bean singleton, puede ser iniciada ya por el contenedor.) Todas las referencias son en ltima instancia, una referencia a otro objeto. Alcance y validacin depender de si se especifica el id / nombre del otro objeto a travs de la bean , local, o parent atributos. Especificacin de la haba de destino a travs de la bean atributo de la <ref/> tag es la forma ms general, y permite la creacin de una referencia a cualquier bean en el mismo recipiente o contenedor principal, independientemente de si es en el mismo archivo XML. El valor de la bean de atributo puede ser la misma que la id atributo del grano diana, o como uno de los valores en el name atributo de la haba de destino.
<ref frijol = "someBean" />

Especificacin del frijol blanco a travs del local atributo aprovecha la capacidad del analizador XML para validar las referencias XML id dentro del mismo archivo. El valor del local atributo debe ser el mismo que el id atributo de la haba de destino. Los temas analizador XML un error si no hay ningn elemento coincidente en el mismo archivo. Como tal, utilizando la variante local es la mejor eleccin (con el fin de saber acerca de los errores tan pronto como sea posible) si el grano de destino est en el mismo archivo XML.
<ref local = "someBean" />

Especificacin de la haba de destino a travs de la parent atributo crea una referencia a un grano que est en un contenedor primario del contenedor actual. El valor de la

parent

de atributo puede ser la misma que o bien la id atributo de la haba de destino, o uno de los valores en el name atributo de la haba de destino, y el grano de destino debe estar en un contenedor primario de la actual. Se utiliza esta variante de referencia frijol principalmente cuando se tiene una jerarqua de contenedores y quiere envolver un bean existente en un contenedor padre con un proxy que tendr el mismo nombre que el grano de los padres.
<- En el contexto de los padres -> <bean id = "accountService" class = "com.foo.SimpleAccountService"> <- Introduce dependencias segn sea necesario como en este caso -> </ Bean> <- En el nio (descendiente) Contexto -> <Bean id = "AccountService" <- Nombre de bean es el mismo que el grano de padre -> class = "org.springframework.aop.framework.ProxyFactoryBean"> <propiedad nombre = "target"> <ref parent = "accountService" /> <- cuenta de cmo nos referimos al padre haba -> </ Propiedad> <- Inserte otra configuracin y dependencias segn sea necesario aqu -> </ Bean>

Frijoles interiores

A <bean/> elemento dentro de las <property/> o <constructor-arg/> elementos define un bean interior llamada.
<bean id = clase = "outer" "..."> <- En lugar de utilizar una referencia a un bean destino, simplemente definir el objetivo de frijol inline -> <propiedad nombre = "target"> clase <bean = "com.example.Person"> <- este es el grano interior -> <propiedad nombre = valor = "name" "Fiona Apple" /> <propiedad nombre = valor = "age" "25" /> </ Bean> </ Propiedad> </ Bean>

Una definicin de bean interior no requiere un ID definido o nombre, el recipiente ignora estos valores. Tambin ignora el scope del pabelln. Frijoles internos son siempre annimas y siempre estn mbito como prototipos . No es posible inyectar granos de interiores en colaboracin otros granos de frijol en la envolvente.
Colecciones

En el <list/> , <set/> , <map/> y <props/> elementos, se establecen las propiedades y los argumentos del Java Collection tipos List , Set , Map y Properties , respectivamente.
<bean id = "moreComplexObject" class = "example.ComplexObject"> <- Resulta en una setAdminEmails (java.util.Properties) llaman -> <propiedad nombre = "adminEmails"> <props> <prop clave = "administrator"> administrator@example.org </ prop>

<prop clave = "support"> support@example.org </ prop> <prop clave = "development"> development@example.org </ prop> </ Accesorios> </ Propiedad> <- Da como resultado un setSomeList (java.util.List) Llamada -> <propiedad nombre = "someList"> <list> <valor> un elemento de la lista seguido de una referencia </ value> <ref frijol = "myDataSource" /> </ List> </ Propiedad> <- Da como resultado un setSomeMap (java.util.Map) Llamada -> <propiedad nombre = "someMap"> <map> <entry clave = valor = "an entry" "just algunos string" /> <entry clave = "a ref" value-ref = "myDataSource" /> </ Map> </ Propiedad> <- Da como resultado un setSomeSet (java.util.Set) Llamada -> <propiedad nombre = "someSet"> <set> <valor> slo algunas string </ value> <ref frijol = "myDataSource" /> </ Set> </ Propiedad> </ Bean>

El valor de una clave del mapa o valor, o un valor ajustado, puede tambin ser de nuevo cualquiera de los siguientes elementos:
bean | ref | idref | lista | set | Mapa | puntal | valor | null Coleccin fusin

A partir de Spring 2.0, el contenedor apoya la fusin de las colecciones. Un desarrollador de aplicaciones puede definir una matriz de estilo <list/> , <map/> , <set/> o <props/> elemento, y tener un hijo de estilo <list/> , <map/> , <set/> o <props/> elementos heredar y sobrescribir los valores de la coleccin primaria. Es decir, los valores de la coleccin del nio son el resultado de la fusin de los elementos de las colecciones de los padres y el nio, con elementos de la coleccin del nio reemplazar los valores especificados en la coleccin principal. En esta seccin se analiza la fusin en el mecanismo de frijol entre padres e hijos. Los lectores no familiarizados con las definiciones de frijol padre e hijo puede desear leer la seccin correspondiente antes de continuar. El siguiente ejemplo demuestra la fusin de coleccin:
<beans> <bean id = abstracto "parent" = class = "true" "example.ComplexObject"> <propiedad nombre = "adminEmails"> <props> <prop clave = "administrator"> administrator@example.com </ prop> <prop clave = "support"> support@example.com </ prop>

</ Accesorios> </ Propiedad> </ Bean> <bean id = padres = "child" "parent"> <propiedad nombre = "adminEmails"> <- La fusin se especifica en el nio * * definicin coleccin -> <props merge = "true"> <prop clave = "sales"> sales@example.com </ prop> <prop clave = "support"> support@example.co.uk </ prop> </ Accesorios> </ Propiedad> </ Bean> <beans>

Observe el uso de la merge=true en el atributo <props/> elemento de la adminEmails propiedad del child definicin de frijol. Cuando el child se resuelve bean y instanciado por el contenedor, la instancia resultante tiene un adminEmails Properties coleccin que contiene el resultado de la fusin del nio adminEmails coleccin con los padres adminEmails coleccin.
administrador = administrator@example.com ventas = sales@example.com apoyar support@example.co.uk =

El nio Properties del conjunto de recopilacin de valor hereda todos los elementos de propiedad de los padres <props/> , y el valor del nio para el support valor prevalece sobre el valor de la coleccin principal. Este comportamiento se aplica de manera similar a la fusin de la <list/> , <map/> y <set/> tipos de coleccin. En el caso especfico de la <list/> elemento, la semntica asociada a la List tipo de coleccin, es decir, la nocin de un ordered conjunto de valores, se mantiene, los valores de los padres preceder a todos los valores de la lista de hijos. En el caso de los Map , Set y Properties tipos de coleccin, no existe ordenamiento. Por lo tanto no ordenan semntica estn en vigor para los tipos de coleccin que se basa la correspondiente Map , Set y Properties tipos de implementacin utilizadas por el contenedor interno.
Limitaciones de la coleccin de fusin

No es posible combinar distintos tipos de recogida (por ejemplo, un Map y una List ), y si lo hace intento de hacerlo una adecuada Exception tira. La merge de atributo debe ser especificado en la inferior, definicin heredada nio,; especificando la merge de atributos en una definicin coleccin primaria es redundante y no dar lugar a la fusin deseada. La funcin de combinacin est disponible slo en Spring 2.0 y versiones posteriores.
Coleccin fuertemente tipada (Java 5 + solamente)

En Java 5 y versiones posteriores, puede utilizar las colecciones con establecimiento inflexible de tipos (tipos genricos). Es decir, es posible declarar una Collection tipo tal que slo puede contener String elementos (por ejemplo). Si usted est usando la primavera a la dependencia se inyecte un establecimiento inflexible de tipos

Collection

en un bean, usted puede tomar ventaja de la primavera del tipo de conversin de soporte de manera que los elementos de su establecimiento inflexible de tipos Collection casos se convierten al tipo adecuado antes de ser aadidos a la Collection .
public class Foo { Mapa privado <String, cuentas Float>; public void setaccounts (Mapa <String, cuentas Float>) { esto explica = cuentas.; } } <beans> <bean id = "foo" class = "xyFoo"> <propiedad nombre = "accounts"> <map> <entry clave = valor = "one" "9.99" /> <entry clave = valor = "two" "2.75" /> <entry clave = valor = "six" "3.99" /> </ Map> </ Propiedad> </ Bean> </ Beans>

Cuando la accounts de la propiedad foo frijol se prepara para la inyeccin, la informacin sobre los medicamentos genricos del tipo de elemento de la inflexible de tipos Map<String, Float> est disponible en la reflexin. As, la infraestructura de Spring Tipo de conversin reconoce los diversos elementos de valor como ser de tipo Float , y la cadena de valores de 9.99, 2.75 y 3.99 se convierte en un verdadero Float tipo.
Nulos y los valores de cadena vaca

Primavera trata a los argumentos vacos de propiedades y similares, como vacos Strings . El siguiente fragmento de cdigo XML basado en metadatos de configuracin define la propiedad de correo electrnico al vaco String de valor ("")
<bean class = "ExampleBean"> <propiedad nombre = valor = "email" "" /> </ Bean>

El ejemplo anterior es equivalente al siguiente cdigo Java: exampleBean.setEmail("") . El <null/> elemento maneja null valores. Por ejemplo:
<bean class = "ExampleBean"> <propiedad nombre "email" => <null/> </ propiedad> </ Bean>

La configuracin anterior es equivalente al siguiente cdigo Java: exampleBean.setEmail(null) .

Atajo XML con el p-namespace

El p-namespace permite utilizar el bean atributos de los elementos, en lugar de anidadas <property/> elementos, para describir sus valores de propiedad y / o frijoles colaboradoras. Spring 2.0 y posterior es compatible con los formatos de configuracin extensibles con espacios de nombres , que se basan en una definicin de esquema XML. El beans formato de configuracin descrito en este captulo se define en un documento de esquema XML. Sin embargo, el p-espacio de nombres no se define en un archivo XSD y slo existe en el ncleo de la primavera. El siguiente ejemplo muestra dos fragmentos de cdigo XML que se resuelven en el mismo resultado: El primero utiliza el formato estndar XML y la segunda utiliza el espacio de nombres p.
<Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: p = "http://www.springframework.org/schema/p" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd "> <bean name = "classic" class = "com.example.ExampleBean"> <propiedad nombre = valor = "email" "foo@bar.com" /> </ Bean> <Nombre del bean = "p-namespace" class = "com.example.ExampleBean" p: email = "foo@bar.com" /> </ Beans>

El ejemplo muestra un atributo en el espacio de nombres llamado p-mail en la definicin de frijol. Esto le dice a la primavera para incluir una declaracin de propiedad. Como se mencion anteriormente, el p-espacio de nombres no tiene una definicin de esquema, por lo que puede establecer el nombre del atributo que el nombre de la propiedad. El siguiente ejemplo incluye dos definiciones ms frijol que ambos tienen una referencia a otro bean:
<Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: p = "http://www.springframework.org/schema/p" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd "> <bean name = "john-classic" class = "com.example.Person"> <propiedad nombre = valor = "name" "John Doe" /> <propiedad nombre = "spouse" ref = "jane" /> </ Bean> <Nombre del bean = "john-moderno" class = "com.example.Person" p: name = "John Doe"

p: Cnyuge-ref = "jane" /> <bean name = "jane" class = "com.example.Person"> <propiedad nombre = valor = "name" "Jane Doe" /> </ Bean> </ Beans>

Como puede ver, este ejemplo incluye no slo un valor de propiedad mediante el pespacio de nombres, pero tambin utiliza un formato especial para declarar referencias de propiedad. Considerando que la definicin de bean utiliza primero <property name="spouse" ref="jane"/> para crear una referencia de frijol john frijol a jane , la definicin de frijol segundo utiliza p:spouse-ref="jane" como un atributo que hacer exactamente lo mismo. En este caso spouse es el nombre de la propiedad, mientras que el -ref parte indica que esto no es un valor lineal, sino ms bien una referencia a otro bean.
Nota

El p-espacio de nombres no es tan flexible como el formato XML estndar. Por ejemplo, el formato para la declaracin de referencias de propiedad enfrentamientos con propiedades que terminan en Ref , mientras que el formato XML estndar no lo hace. Le recomendamos que elija cuidadosamente su enfoque y comunicar esto a los miembros de su equipo, para evitar la produccin de documentos XML que utilizan los tres mtodos al mismo tiempo.
Atajo XML con espacio de nombres c-

Al igual que en la seccin denominada "acceso directo XML con el p-espacio de nombres" , el c-espacio de nombres, de reciente introduccin en la primavera de 3,1, permite el uso de atributos entre lneas para la configuracin de los argumentos del constructor en lugar de anidadas constructor-arg elementos. Vamos a repasar los ejemplos de la seccin "Constructor basado en la inyeccin de dependencia" con la c espacio de nombres:
<Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: c = "http://www.springframework.org/schema/c" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd "> <bean id= "bar" class = "xyBar" /> <bean id= "baz" class = "xyBaz" /> <- "Tradicional" declaracin -> <bean id= "foo" class = "xyFoo"> <constructor-arg ref= "bar" /> <constructor-arg ref= "baz" /> <constructor-arg value= "foo@bar.com" /> </ Bean> <- Declaracin 'c-namespace' -> <bean id= clase "foo" = "xyFoo" c:bar-ref= "bar" c:baz-ref= "baz" c:email= "foo@bar.com">

</ Beans>

El c: espacio de nombres se utilizan las mismas convenciones que el p: una (posterior -ref para las referencias de frijol) para establecer los argumentos del constructor por sus nombres. Y as como as, tiene que ser declarado a pesar de que no est definida en un esquema XSD (pero existe en el interior del ncleo de muelles). En los raros casos en los nombres de los argumentos de constructor no estn disponibles (por lo general si el bytecode compilado sin informacin de depuracin), se puede utilizar de reserva a los ndices de argumentos:
<- Declaracin ndice 'c-namespace' -> <bean id= "foo" class = "xyFoo" c:_ 0 -ref= "bar" c:_ 1 -ref= "baz">

Nota

Debido a la gramtica XML, la notacin ndice requiere la presencia del _ de liderazgo como los nombres de atributos XML no pueden comenzar con un nmero (aunque algunos IDE lo permiten). En la prctica, la resolucin constructor mecanismo es muy eficaz en los argumentos que coinciden por lo menos que uno realmente necesita, se recomienda utilizar la notacin de nombre largo de todo su configuracin.
Nombres compuestos de propiedad

Puede utilizar nombres compuestos o anidado de propiedad al configurar las propiedades del bean, siempre y cuando todos los componentes de la ruta, excepto el nombre de la propiedad final, no son null . Tenga en cuenta la definicin de bean siguiente.
<bean id = "foo" class = "foo.Bar"> <propiedad nombre = valor = "fred.bob.sammy" "123" /> </ Bean>

El foo frijol tiene un fred propiedad, que tiene un bob propiedad, que tiene una sammy propiedad, y esa final sammy propiedad se establece con el valor 123 . Para que esto funcione, el fred propiedad de foo , y el bob propiedad de fred no debe ser null despus de que el frijol se construye, o una NullPointerException es lanzada.
5.4.3 Uso depends-on

Si un grano es una dependencia de otro que por lo general significa que un frijol se establece como una propiedad de otro. Normalmente a lograr esto con el <ref/> elemento de metadatos de configuracin basado en XML. Sin embargo, a veces, las dependencias entre los granos son menos directos, por ejemplo, un inicializador esttico en una clase necesita ser activado, tal como el registro de base de datos del controlador. El depends-on atributo puede forzar explcitamente uno o ms beans que ser inicializado antes de la haba de usar este elemento se inicializa. En el ejemplo siguiente se utiliza la depends-on atributo para expresar una dependencia de un solo grano:

<bean id = clase = "beanOne" "ExampleBean" depends-on = "gerente "/> <bean id = "manager" class="ManagerBean" />

Para expresar una dependencia de granos mltiples, proporcionar una lista de los nombres de frijol como el valor de la depends-on atributo, con comas y puntos y comas, espacios en blanco, que se utilizan como delimitadores vlidos:
<bean id = "beanOne" class = "ExampleBean" depends-on "manager,accountDao" => <propiedad nombre = "manager" ref = "manager" /> </ Bean> <bean id = "manager" class = "ManagerBean" /> <bean id = "accountDao" class = "xyjdbc.JdbcAccountDao" />

Nota

El depends-on atributo en la definicin de frijol puede especificar tanto una dependencia de tiempo de inicializacin y, en el caso de simples granos solamente, una correspondiente destruir dependencia del tiempo. Beans dependientes que definen un depends-on relacin con un grano dado se destruyen primero, antes de la haba dado a s misma de ser destruido. Por lo tanto depends-on tambin puede controlar el orden de apagado.
5.4.4 Lazy-inicializadas frijoles

De forma predeterminada, ApplicationContext implementaciones ansiosamente crear y configurar todos los simples frijoles como parte del proceso de inicializacin. Generalmente, este pre-instanciacin es deseable, ya que los errores en la configuracin o entorno circundante se descubri inmediatamente, en lugar de horas o incluso das posteriores. Cuando se produce este comportamiento no es deseable, puede evitar precreacin de instancias de un bean singleton marcando la definicin de bean como lazyinicializado. Un bean perezoso inicializada le dice al contenedor IoC para crear una instancia del bean cuando se solicit por primera vez, en lugar de en el inicio. En XML, este comportamiento es controlado por el lazy-init atributo en el <bean/> elemento, por ejemplo:
<bean id = "lazy" class = "com.foo.ExpensiveToCreateBean" lazyinit="true" /> nombre = <bean "not.lazy" class = "com.foo.AnotherBean" />

Cuando la configuracin anterior es consumido por un ApplicationContext , el bean llamado lazy no es esperada con pre-instancias cuando la ApplicationContext se est iniciando, mientras que el not.lazy bean con impaciencia pre-instanciada. Sin embargo, cuando un grano perezoso inicializada es una dependencia de un bean singleton que no es perezoso-inicializado, el ApplicationContext crea el bean perezoso inicializada en el inicio, ya que debe satisfacer las dependencias del Singleton. El frijol perezoso inicializada se inyecta en un bean singleton en otro lugar que no es perezoso inicializada.

Tambin puede controlar la inicializacin diferida en el nivel de contenedor utilizando el default-lazy-init atributo en el <beans/> elemento, por ejemplo:
<beans default-lazy-init "true" => <-! Frijoles no se pre-instancia ... </ Beans> ->

5.4.5 colaboradores autowiring

El contenedor de primavera puede autowire relaciones entre beans colaboradoras. Puede permitir a Spring resolver colaboradores (frijoles otros) de forma automtica para su bean mediante la inspeccin de los contenidos de la ApplicationContext . Autowiring tiene las siguientes ventajas:

Autowiring puede reducir significativamente la necesidad de especificar propiedades o argumentos de constructor. (Otros mecanismos como una plantilla de frijol se seala en este captulo tambin son valiosos en este sentido.) Autoconexin puede actualizar una configuracin como los objetos de evolucionar. Por ejemplo, si necesita agregar una dependencia a una clase, que la dependencia puede ser satisfecha de forma automtica sin que sea necesario modificar la configuracin. As autowiring puede ser especialmente til durante el desarrollo, sin negar la opcin de cambiar el cableado explcita cuando el cdigo base se vuelve ms estable.

Cuando se utiliza XML basado en metadatos de configuracin [ 2 ], se especifica el modo de autowire para una definicin de frijol con el autowire atributo de la <bean/> elemento. La funcionalidad autowiring tiene cinco modos. Se especifica autowiring por grano y por lo tanto pueden elegir cules autowire. Cuadro 5.2. Modos autowiring
Modo Explicacin

no

apodo

byType

(Default) no autowiring. Referencias de frijol se debe definir a travs de una ref elemento. Cambio de la configuracin por defecto no est recomendado para implementaciones mayores, porque los colaboradores que especifican explcitamente da un mayor control y claridad. En cierta medida, se documenta la estructura de un sistema. Autowiring por nombre de propiedad. Spring mira para un grano con el mismo nombre que la propiedad que necesita ser autoconectados. Por ejemplo, si una definicin de bean se establece en autowire por su nombre, y que contiene una propiedad principal (es decir, que tiene un setMaster (..) mtodo), Spring busca una definicin bean llamado master , y lo utiliza para establecer la propiedad. Permite una propiedad que se autoconectados si exactamente un bean del tipo de propiedad que existe en el contenedor. Si hay ms de uno, una excepcin grave se produce, lo que indica que no se puede utilizar autowiring byType para que bean. Si no hay granos de juego, no pasa nada, la propiedad no est establecida.

Modo constructor

Explicacin

Anlogo a byType, pero se aplica a los argumentos de constructor. Si no hay exactamente un bean del tipo de argumento del constructor en el recipiente, un error fatal se eleva.

Con byType o modo autowiring constructor, usted puede transferir matrices y colecciones mecanografiadas. En tales casos, todos los candidatos autowire dentro del contenedor que coincida con el tipo esperado se proporcionan para satisfacer la dependencia. Puede autowire Mapas inflexible de tipos si el tipo de clave es esperado String . Una valores Mapas autoconectados consistir en todas las instancias del bean que coinciden con el tipo esperado, y las teclas de mapas contendr los nombres de frijol correspondientes. Puede combinar el comportamiento autowire con la comprobacin de dependencias, que se realiza despus de autowiring completa.
Limitaciones y desventajas de autoconexin

Autowiring funciona mejor cuando se usa consistentemente a travs de un proyecto. Si autowiring no se utiliza, en general, puede ser confuso para los desarrolladores a utilizar para conectar slo una o dos definiciones de frijol. Tenga en cuenta las limitaciones y desventajas de autowiring:

Dependencias explcitas en property y constructor-arg siempre anulan los ajustes de autoconexin. No se puede autowire propiedades simples llamadas primitivas, tales como Strings , y Classes (y las matrices de dichas propiedades simples). Esta limitacin es por diseo. Autowiring es menos exacto que el cableado explcito. Aunque, como se ha indicado en el cuadro anterior, la primavera tiene cuidado de evitar adivinar en caso de ambigedad que puede tener resultados inesperados, las relaciones entre los objetos gestionados Spring-ya no estn documentadas explcitamente. Informacin de cableado puede no estar disponible para las herramientas que pueden generar documentacin de un contenedor Spring. Mltiples definiciones de frijol en el recipiente puede coincidir con el tipo especificado por el mtodo setter o argumento del constructor que se autoconectados. Para las matrices, colecciones o mapas, esto no es necesariamente un problema. Sin embargo, para las dependencias que esperan un solo valor, esta ambigedad no resuelta de manera arbitraria. Si no hay una definicin nica de frijol est disponible, se produce una excepcin.

En este ltimo caso, usted tiene varias opciones:

Abandonar autowiring a favor de cableado explcito.

Evite autoconexin para una definicin de frijol mediante el establecimiento de sus autowire-candidate atributos a false , como se describe en la siguiente seccin. Designar a una definicin de frijol solo como el candidato principal configurando el primary atributo de su <bean/> elemento true . Si utiliza Java 5 o posterior, implementar el control ms preciso disponible con anotacin basada en la configuracin, como se describe en la Seccin 5.9, "Anotacin de configuracin basada en contenedor" .

La exclusin de un bean de autowiring

Sobre una base per-bean, puede excluir un grano de autoconexin. En el formato XML de Spring, establezca la autowire-candidate atributo de la <bean/> elemento a false , el contenedor hace que la definicin de bean especfica disponible para la infraestructura autowiring (incluyendo configuraciones de estilo de anotacin como @Autowired ). Tambin puede limitar candidatos autowire basado en reconocimiento de patrones en contra de los nombres de frijol. El nivel superior <beans/> elemento acepta uno o ms patrones dentro de su default-autowire-candidates atributo. Por ejemplo, para limitar el estatus autowire candidato a cualquier legumbre cuyo nombre termina con depsito, proporcione un valor de depsito *. Para proporcionar mltiples patrones, a definir en una lista separada por comas. Un valor explcito de true o false para un bean definiciones autowire-candidate atributo siempre tiene prioridad, y para las semillas de estas, las reglas de coincidencia de patrones no se aplican. Estas tcnicas son tiles para los granos que no desea que se inyecta en otros frijoles por autowiring. Esto no significa que un bean excluidos no puede ser configurado usando autowiring. Ms bien, el propio bean no es un candidato para la autoconexin de otros granos.
5.4.6 Mtodo de inyeccin

En la mayora de los escenarios de aplicacin, la mayora de los granos en el contenedor son nicos . Cuando un bean singleton tiene que colaborar con otro bean singleton o un grano de no-singleton tiene que colaborar con otro bean singleton no, se suele manejar la dependencia mediante la definicin de un bean como una propiedad de la otra. Surge un problema cuando los ciclos de vida de frijol son diferentes. Supongamos singleton bean A tiene que utilizar no singleton (prototipo) bean B, tal vez en cada invocacin de mtodo sobre A. El recipiente slo crea el bean singleton A la vez, por lo que slo tiene una oportunidad para establecer las propiedades. El contenedor no puede proporcionar bean A con una nueva instancia de bean B cada vez que se necesita. Una solucin es renunciar a parte la inversin de control. Puede hacer bean A consciente del recipiente mediante la aplicacin de la ApplicationContextAware interfaz, y por hacer una getBean ("B") llamar al recipiente pedir (tpicamente una nueva) bean ejemplo B cada grano de tiempo A lo necesita. El siguiente es un ejemplo de este enfoque:

/ / Una clase que utiliza un stateful de comandos de estilo de clase para llevar a cabo algn tipo de procesamiento paquete fiona.apple; / / API Primavera-las importaciones org.springframework.beans.BeansException importacin; org.springframework.context.ApplicationContext importacin; importar org.springframework.context.ApplicationContextAware; Administrador de comandos de clase pblica implementa ApplicationContextAware { applicationContext ApplicationContext privado; proceso public Object (Mapa commandState) { / / Tomar una nueva instancia de la Comandancia correspondiente Comando comando CreateCommand = (); / / Establecer el estado de la instancia de comando (con suerte estrenar) command.setState (commandState); volver Command.Execute (); } Comando protegida CreateCommand () { / / Cuenta de la dependencia API primavera! devuelva este applicationContext.getBean ("comando", el Comando de la clase.).; } pblico setApplicationContext void (ApplicationContext applicationContext) lanza BeansException { este applicationContext = applicationContext.; } }

Lo anterior no es deseable, porque el cdigo de negocio es conocer y acoplado a la Spring Framework. Mtodo de inyeccin, una caracterstica algo avanzado del contenedor Spring IoC, permite este caso de uso que se maneja de una manera limpia. Usted puede leer ms acerca de la motivacin para inyeccin mtodo en esta entrada de blog .
Lookup inyeccin mtodo

Inversa inyeccin mtodo es la capacidad del recipiente para reemplazar los mtodos de granos de contenedores gestionadas, para devolver el resultado de la bsqueda para otro bean llamada en el recipiente. La bsqueda implica tpicamente un bean de prototipo como en el escenario descrito en la seccin anterior. El Spring Framework implementa este mtodo de inyeccin mediante la generacin de cdigo de bytes de la biblioteca CGLIB para generar dinmicamente una subclase que anula el mtodo.
Nota

Por esta subclasificacin dinmica al trabajo, a la clase que el contenedor Primavera

subclase no puede ser final , y el mtodo a ser anulado no puede ser final tampoco. Adems, probando una clase que tiene un abstract mtodo requiere que usted subclase de la clase usted mismo y para suministrar una implementacin de cdigo auxiliar de la abstract mtodo. Por ltimo, los objetos que han sido el blanco de inyeccin mtodo no se puede serializar. Desde la primavera 3.2, ya no es necesario aadir CGLIB a la ruta de clases, ya que las clases son CGLIB reenvasado bajo org.springframework y distribuidos en el JAR primavera-core. Esto se hace tanto para la comodidad, as como para evitar posibles conflictos con otros proyectos que utilizan versiones diferentes de CGLIB. Mirando el CommandManager de clase en el fragmento de cdigo anterior, ver que el contenedor Spring dinmicamente invalidar la aplicacin de la createCommand() mtodo. Su CommandManager de clase no tiene ninguna dependencia del resorte, como se puede ver en el ejemplo reelaborado:
paquete fiona.apple; / / Ms no las importaciones de primavera! public abstract class {Administrador de comandos proceso public Object (Objeto commandState) { / / Tomar una nueva instancia de la interfaz de comandos apropiado Comando comando CreateCommand = (); / / Establecer el estado de la instancia de comando (con suerte estrenar) command.setState (commandState); volver Command.Execute (); } / / Bien ... pero dnde est la aplicacin de este mtodo? protegido abstracto Comando CreateCommand (); }

En la clase de cliente que contiene el mtodo que se inyecta (el CommandManager en este caso), el mtodo que se inyecta requiere una firma de la forma siguiente:
<public|protected> [resumen] <return-type> theMethodName (sin argumentos);

Si el mtodo es abstract , la subclase generado dinmicamente implementa el mtodo. De lo contrario, la subclase generado dinmicamente reemplaza el mtodo concreto definido en la clase original. Por ejemplo:
<- Un bean con estado desplegado como un prototipo (no-singleton) -> <bean id = clase = "command" alcance "fiona.apple.AsyncCommand" "prototype" => <- Inyectar las dependencias necesarias como aqu -> </ Bean> <- CommandProcessor utiliza statefulCommandHelper -> <bean id = "commandManager" class = "fiona.apple.CommandManager"> nombre = <lookup-method "createCommand" frijol = "command" /> </ Bean>

El frijol identificado como Administrador de comandos llama a su mtodo propio createCommand() cada vez que necesita una nueva instancia del bean de comando. Usted debe tener cuidado al implementar el command frijol como un prototipo, si eso es realmente lo que se necesita. Si se implementa como un singleton , la misma instancia del command frijol se volvi cada vez.
Punta

El lector interesado puede encontrar tambin la ServiceLocatorFactoryBean (en la org.springframework.beans.factory.config paquete) para ser de utilidad. El enfoque utilizado en ServiceLocatorFactoryBean es similar a la de otra clase de utilidad, ObjectFactoryCreatingFactoryBean , pero le permite especificar su propia interfaz de consulta en lugar de una interfaz de bsqueda Primaveraespecfica. Consulte las JavaDocs para estas clases, as como la entrada de blog para obtener informacin adicional ServiceLocatorFactoryBean.
Mtodo de sustitucin arbitraria

Una forma menos til de inyeccin mtodo de inyeccin mtodo de bsqueda es la capacidad de sustituir los mtodos arbitrarios en un bean gestionado con otro mtodo de aplicacin. Los usuarios de forma segura puede omitir el resto de esta seccin hasta que la funcionalidad es realmente necesario. Con los metadatos de configuracin basado en XML, puede utilizar el replacedmethod elemento para reemplazar una implementacin de mtodo existente con otro, para un bean desplegado. Considere la siguiente clase, con un computeValue mtodo, que queremos anular:
MyValueCalculator clase pblica { public String computeValue (entrada de cadena) { / / Cdigo real ... } / / Otros mtodos ... }

Una clase que implementa el


org.springframework.beans.factory.support.MethodReplacer

interfaz

proporciona la definicin del mtodo nuevo.


/ ** Destinado a ser usado para reemplazar el existente computeValue (String) aplicacin en MyValueCalculator * / pblico ReplacementComputeValue clase implementa MethodReplacer { reimplementar public Object (Object o, Mtodo m, Object [] args) throws Throwable { / / Obtener el valor de entrada, trabajar con l, y devolver un resultado calculado Entrada = String (String) args [0];

... regreso ...; } }

La definicin de frijol para desplegar la clase original y especificar el mtodo override se vera as:
<bean id = "myValueCalculator" class = "xyzMyValueCalculator"> <- Reemplazo mtodo arbitrario -> nombre = <replaced-method "computeValue" sustituto "replacementComputeValue" => <arg-type> cadena </ arg-type> </ Reemplazado mtodo-> </ Bean> <bean id = "replacementComputeValue" class = "abcReplacementComputeValue" />

Usted puede utilizar uno o ms contenidos <arg-type/> elementos dentro de la <replaced-method/> elemento para indicar la signatura del mtodo del mtodo de suplantacin. La firma de los argumentos es necesario slo si el mtodo est sobrecargado y existen mltiples variantes dentro de la clase. Para mayor comodidad, la cadena de tipo de un argumento puede ser una subcadena del nombre de tipo completo. Por ejemplo, la raz de todo partido java.lang.String :
java.lang.String Cadena Str.

Debido a que el nmero de argumentos es a menudo suficiente para distinguir entre cada opcin posible, este acceso directo se puede ahorrar un montn de escribir, por lo que le permite escribir slo la cadena ms corta que se ajuste a un tipo de argumento.

5,5 haba mbitos


Cuando se crea una definicin de frijol, se crea una receta para la creacin de instancias reales de la clase definida por esa definicin de frijol. La idea de que una definicin de frijol es una receta es importante, porque significa que, como en una clase, se pueden crear varias instancias de objetos a partir de una receta nica. Usted puede controlar no slo las distintas dependencias y los valores de configuracin que van a ser conectados a un objeto que se crea a partir de una definicin de bean en particular, sino tambin el alcance de los objetos creados a partir de una definicin de bean en particular. Este enfoque es de gran alcance y flexible que se puede elegir el alcance de los objetos que se crean a travs de configuracin en lugar de tener que cocinar en el mbito de un objeto en el nivel de clase Java. Los frijoles pueden ser definidos para ser desplegado en una de una serie de mbitos: de la caja, el Spring Framework admite cinco mbitos, tres de los cuales slo estn disponibles si se utiliza un web-aware ApplicationContext .

Los alcances siguientes son compatibles fuera de la caja. Tambin puede crear un mbito personalizado. Cuadro 5.3. Frijol mbitos
Alcance Descripcin

(Default) Scopes una definicin de frijol solo para una instancia de objeto nico por primavera contenedor IoC. prototipo Scopes una definicin solo grano a cualquier nmero de instancias de objeto. Scopes una definicin nica de frijol para el ciclo de vida de una sola peticin HTTP, es decir, cada solicitud HTTP tiene su propia instancia de un bean solicitar creado desde la parte trasera de una definicin nica de frijol. Slo es vlido en el contexto de una web-aware Spring ApplicationContext . Scopes una definicin nica de frijol para el ciclo de vida de un HTTP sesin Session . Slo es vlido en el contexto de una web-aware Spring ApplicationContext . Scopes una definicin nica de frijol para el ciclo de vida de un sistema sesin mundial HTTP Session . Normalmente slo es vlido cuando se utiliza en un global contexto de portlet. Slo es vlido en el contexto de una web-aware Spring ApplicationContext . semifallo

Tema mbito en grano

Como Spring de 3,0, un alcance hilo est disponible, pero no est registrado por defecto. Para obtener ms informacin, consulte la documentacin de SimpleThreadScope . Para obtener instrucciones sobre cmo registrar este o cualquier otro mbito personalizado, consulte la seccin "Uso de un mbito personalizado" .
5.5.1 El alcance singleton

Slo una instancia compartida de un bean singleton se gestiona, y todas las solicitudes de frijoles con un identificador o identificadores de juego que resultan bean definicin en ese caso un bean especfica sea devuelta por el contenedor Spring. Para decirlo de otra manera, cuando se define una definicin de bean con mbito y es como un singleton, el contenedor de IoC Spring crea exactamente una instancia del objeto definido por esa definicin de frijol. Esta instancia solo se almacena en una memoria cach de esos granos simples, y todas las solicitudes subsiguientes y las referencias para que bean llamado devolver el objeto en cach.

Concepto de Primavera de un grano de singleton difiere del patrn Singleton como se define en la Banda de los Cuatro (GoF) Libro de patrones. El Singleton GoF duros cdigos de los alcances de un objeto de modo que una y slo una instancia de una clase en particular es creado por ClassLoader . El alcance del singleton Spring se describe mejor como por contenedor y por bean. Esto significa que si se define un bean para una clase particular en un solo contenedor Spring, entonces el contenedor Spring crea una y slo una instancia de la clase definida por esa definicin de frijol. Singleton El mbito es el mbito por omisin en la primavera. Para definir un bean como un producto nico en XML, podra escribir, por ejemplo:
<bean id = "accountService" class = "com.foo.DefaultAccountService" /> <- Lo siguiente es equivalente, aunque redundante (alcance singleton es el valor predeterminado) -> <bean id = "accountService" class = "com.foo.DefaultAccountService" scope = "singleton" />

5.5.2 El prototipo alcance

La no-singleton, el alcance de los resultados de implementacin prototipo de frijol en la creacin de una instancia de bean nuevo cada vez que una peticin de que el frijol especfico se realiza. Es decir, el frijol se inyecta en otro bean o usted lo solicita a travs de un getBean() llamada al mtodo en el envase. Como regla general, utilice el telescopio prototipo para todos los beans con estado y el alcance singleton para beans. El siguiente diagrama ilustra el alcance prototipo primavera Objeto de acceso a datos (DAO) no suele ser configurado como un prototipo, ya que un tpico DAO no tiene

ningn estado conversacional;. Era ms fcil para el autor de reutilizar el centro del diagrama singleton .

En el ejemplo siguiente se define un bean como un prototipo en XML:


<- Usando primavera-frijol-2.0.dtd -> <bean id = "accountService" class = "com.foo.DefaultAccountService" scope = "prototype" />

En contraste con los otros mbitos, Spring no gestiona el ciclo de vida completo de un grano de prototipo: las instancias de contenedores, configura, y de otra manera rene a un objeto prototipo, y se la entrega al cliente, sin registro continuo de la misma instancia prototipo. As, aunque inicializacin mtodos de devolucin de llamada de ciclo de vida se pidi a todos los objetos independientemente de su capacidad, en el caso de prototipos, configurados devoluciones de llamada del ciclo de vida de destruccin no son llamados. El cdigo del cliente debe limpiar con mbito de prototipo objetos y liberar recursos costosos que el bean prototipo (s) estn sosteniendo. Para sacar el contenedor del resorte para liberar los recursos que mantiene con mbito de prototipo frijoles, pruebe a utilizar una costumbre frijol post-procesador , que contiene una referencia a los frijoles que necesitan ser limpiados. En algunos aspectos, el papel del contenedor de Spring en lo que se refiere a un bean con mbito de prototipo es un reemplazo para el Java new operador. Toda la gestin del ciclo de vida ms all de ese punto debe ser manejado por el cliente. (Para obtener ms informacin sobre el ciclo de vida de un grano en el contenedor Spring, consulte la Seccin 5.6.1, "las devoluciones de llamada de ciclo de vida" .)

5.5.3 Singleton frijoles con prototipo de frijol dependencias

Al utilizar singleton de mbito de frijoles con dependencias de granos de prototipos, tenga en cuenta que las dependencias se resuelven en tiempo de creacin de instancias. As, si la dependencia a inyectar un bean con mbito de prototipo en un bean singleton de mbito, un grano nuevo prototipo se crea una instancia y luego inyecta-dependencia en el bean singleton. La instancia prototipo es la nica instancia que se suministra siempre con el grano singleton de mbito. Sin embargo, supongamos que desea que el bean singleton de mbito de la adquisicin de una nueva instancia del bean con mbito de prototipo varias veces durante la ejecucin. No es posible dependencia a inyectar un bean con mbito de prototipo en el bean singleton, ya que la inyeccin se produce slo una vez, cuando el contenedor Spring es una instancia del bean singleton y resolver e inyectar sus dependencias. Si usted necesita una nueva instancia de un bean prototipo en tiempo de ejecucin ms de una vez, ver la Seccin 5.4.6, "Mtodo de inyeccin"
5.5.4 Solicitud, sesin y mbitos global de la sesin

La request , session y global session mbitos slo estn disponibles si se utiliza un web-aware Spring ApplicationContext aplicacin (como XmlWebApplicationContext ). Si utiliza estos mbitos con regulares Primavera contenedores IoC como el ClassPathXmlApplicationContext , se obtiene una IllegalStateException quejndose de un alcance desconocido frijol.
Configuracin web inicial

Apoyar la definicin del alcance de los granos en la request , session y global session niveles (web de mbito de frijoles), alguna configuracin inicial menor de edad se requiere antes de definir sus granos. (Esta configuracin inicial no es necesaria para el estndar mbitos, Singleton y prototipo.) Cmo realizar la configuracin inicial depende de su entorno Servlet particular .. Si accede a los frijoles con mbito en Spring Web MVC, en efecto, dentro de la solicitud de que sean procesados por el Resorte DispatcherServlet o DispatcherPortlet , entonces ninguna configuracin especial es necesario: DispatcherServlet y DispatcherPortlet ya exponer todo el estado correspondiente. Si utiliza un Servlet 2.4 + contenedor web, las peticiones procesadas fuera de DispatcherServlet Spring (por ejemplo, cuando se utiliza JSF o Struts), es necesario agregar la siguiente javax.servlet.ServletRequestListener a las declaraciones en su web las aplicaciones web.xml archivo :
<web-app> ... <listener> <listener-class> org.springframework.web.context.request.RequestContextListener </ Listener-clase> </ Listener>

... </ Web-app>

Si utiliza un contenedor web de mayor edad (Servlet 2.3), utilice siempre el javax.servlet.Filter implementacin. El siguiente fragmento de configuracin XML se debe incluir en el web.xml de archivo de la aplicacin web, si desea acceder a la web de mbito de frijoles en las solicitudes fuera de DispatcherServlet primavera en un contenedor de Servlet 2.3. (La asignacin de filtro depende de la configuracin de aplicaciones web circundante, por lo que debe cambiar en su caso.)
<web-app> .. <filter> <filter-name> requestContextFilter </ filter-name> <filter-class> org.springframework.web.filter.RequestContextFilter </ filter-clase> </ Filter> <filter-mapping> <filter-name> requestContextFilter </ filter-name> <url-pattern> / * </ url-pattern> </ Filter-mapping> ... </ Web-app> DispatcherServlet , RequestContextListener

y RequestContextFilter todos hacen exactamente lo mismo, a saber unir el objeto de la peticin HTTP al Thread que da servicio a esta solicitud. Esto hace que los frijoles que son de peticiones y de mbito de sesin adicional disponible en la cadena de llamada.
Solicitud de alcance

Tenga en cuenta la definicin de bean siguiente:


<bean id = "loginAction" class = "com.foo.LoginAction" scope = "request" />

El contenedor de Spring crea una nueva instancia de la LoginAction frijol mediante el loginAction definicin de frijol para cada solicitud HTTP. Es decir, el loginAction bean est en el mbito en el nivel de solicitud HTTP. Puede cambiar el estado interno de la instancia que se crea todo lo que quieras, porque otras instancias creadas a partir de la misma loginAction definicin de bean no ver estos cambios en el estado, sino que son particulares a una solicitud individual. Cuando la solicitud finaliza el proceso, el grano que tiene como alcance la solicitud se descarta.
Sesin alcance

Tenga en cuenta la definicin de bean siguiente:


<bean id = "userPreferences" class = "com.foo.UserPreferences" scope = "session" />

El contenedor de Spring crea una nueva instancia de la UserPreferences frijol mediante el userPreferences definicin de frijol para la vida de un solo HTTP

Session Session

. En otras palabras, la userPreferences frijol es eficaz en el mbito HTTP nivel. Al igual que request-scoped frijoles, se puede cambiar el estado interno de la instancia que se crea todo lo que quieras, sabiendo que los dems HTTP Session instancias que tambin estn usando instancias creadas a partir de la misma userPreferences definicin de bean no ven estos cambios en el estado , debido a que son particulares de un individuo HTTP Session . Cuando el HTTP Session finalmente se descart, el grano que tiene como alcance ese particular HTTP Session tambin se descarta.
mbito de sesin global

Tenga en cuenta la definicin de bean siguiente:


<bean id = "userPreferences" class = "com.foo.UserPreferences" scope = "globalSession" />

La global session alcance es similar a la norma HTTP Session alcance ( descrito anteriormente ), y slo se aplica en el contexto de aplicaciones web basadas portlet. La especificacin de portlet define la nocin de un sistema mundial Session que se comparte entre todos los portlets que componen una sola aplicacin de mdulo web. Beans definidos en la global session alcance estn en el mbito (o consolidados) para el perodo de vigencia del mundial portlet Session . Si escribes un estndar de Servlet aplicacin basada en web y definir uno o ms beans de tener global session alcance, el estndar HTTP Session alcance se utiliza, y no hay error se levanta.
Frijoles con mbito como dependencias

El contenedor de IoC Spring gestiona no slo la creacin de instancias de los objetos (frijoles), sino tambin el cableado de colaboradores (o dependencias). Si desea inyectar (por ejemplo) un bean con mbito peticin HTTP a otro bean, debe inyectar un proxy AOP en lugar del grano mbito. Es decir, es necesario inyectar un objeto proxy que expone la misma interfaz pblica como objeto de mbito sino que tambin puede recuperar el objeto real, objetivo del mbito correspondiente (por ejemplo, una peticin HTTP) y pide delegado mtodo en el objeto real .
Nota

No es necesario utilizar el <aop:scoped-proxy/> junto con frijoles cuyo mbito como singletons o prototypes . La configuracin del ejemplo siguiente es slo una lnea, pero es importante entender el "por qu", as como el "cmo" detrs de l.
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemaLocation = "http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/springbeans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <- Una sesin HTTP con mbito de frijol expuesto como un proxy -> <bean id = "userPreferences" class = "com.foo.UserPreferences" scope = "session"> <- Indica al contenedor para aproximar el frijol rodea -> <aop:scoped-proxy/> </ Bean> <- Un bean singleton de mbito inyectado con un proxy para el frijol por encima -> <bean id = "userService" class = "com.foo.SimpleUserService"> <- Una referencia al bean PreferenciasDelUsuario proxy -> <propiedad nombre = "userPreferences" ref = "userPreferences" /> </ Bean> </ Beans>

Para crear un proxy, se inserta un <aop:scoped-proxy/> elemento en una definicin de bean con mbito. Consulte la seccin "Seleccin del tipo de proxy para crear" y el Apndice E, esquema XML de configuracin basada ) Por qu definiciones de frijoles con mbito en la. request , session , globalSession niveles y alcance costumbreRequiere <aop:scoped-proxy/> elemento? Examinemos la siguiente definicin de bean singleton y contrastarlo con lo que es necesario definir los mbitos antes mencionados. (El siguiente userPreferences definicin de bean en su forma actual es incompleta.)
<bean id = "userPreferences" class = "com.foo.UserPreferences" scope = "session" /> <bean id = "userManager" class = "com.foo.UserManager"> <propiedad nombre = "userPreferences" ref = "userPreferences" /> </ Bean>

En el ejemplo anterior, el singleton frijol userManager se inyecta con una referencia a las opciones de HTTP Session de frijol mbito- userPreferences . El punto saliente es que el userManager frijol es un producto nico: se crea una instancia exactamente una vez por contenedor, y sus dependencias (en este caso slo uno, los userPreferences frijol) tambin se inyecta una sola vez. Esto significa que el userManager bean slo funcionar en exactamente el mismo userPreferences objeto, es decir, la que se inyecta originalmente con. Este no es el comportamiento que usted quiere al inyectar un bean con mbito de vida ms corta en un bean con mbito de vida ms larga, por ejemplo, la inyeccin de un HTTP Session de mbito de la colaboracin de frijol como una dependencia en semifallo de frijol. Ms bien, se necesita un solo userManager objeto, y durante toda la vida de un HTTP Session , se necesita un userPreferences objeto que es especfico a dicho HTTP Session . As, el contenedor crea un objeto que expone la exacta misma interfaz pblica como la UserPreferences clase (idealmente un objeto que es un

UserPreferences

ejemplo) que puede alcanzar el verdadero UserPreferences objeto del mecanismo de determinacin del alcance (peticin HTTP, Session , etc.) El contenedor inyecta este objeto proxy en el userManager frijol, que no se da cuenta de que este UserPreferences referencia es un proxy. En este ejemplo, cuando un UserManager ejemplo invoca un mtodo en la dependencia de inyeccin UserPreferences objeto, en realidad se est invocando a un mtodo en el proxy. El proxy obtiene el verdadero UserPreferences objeto de (en este caso) el HTTP Session , y delega la invocacin de mtodo sobre la recuperada verdadero UserPreferences objeto. Por lo tanto se necesita lo siguiente, correcta y completa, la configuracin cuando se inyecta request- , session- , y globalSession-scoped frijoles en objetos colaboradoras:
<bean id = "userPreferences" class = "com.foo.UserPreferences" scope = "session"> <aop:scoped-proxy/> </ Bean> <bean id = "userManager" class = "com.foo.UserManager"> <propiedad nombre = "userPreferences" ref = "userPreferences" /> </ Bean> La eleccin del tipo de proxy para crear

Por defecto, cuando el contenedor Spring crea un proxy para un bean que est marcado con el <aop:scoped-proxy/> elemento, una clase de proxy CGLIB basado se crea. Nota: proxies CGLIB slo interceptar llamadas Mtodo pblico No llame a mtodos no pblicos en un proxy, no se delegar en el mbito objeto de destino!. Como alternativa, puede configurar el contenedor de Spring para crear JDK estndar de interfaz basados en sustitutos para esos frijoles mbito, especificando false por el valor de la proxy-target-class atributo de la <aop:scoped-proxy/> elemento. El uso de JDK interfaz proxies basados significa que no se necesitan bibliotecas adicionales en su aplicacin classpath para efectuar tal proxy. Sin embargo, esto tambin significa que la clase de la haba mbito debe implementar al menos una interfaz, y que todos los colaboradores en la que se inyecta el bean mbito debe hacer referencia al bean a travs de una de sus interfaces.
<- DefaultUserPreferences implementa la interfaz PreferenciasDelUsuario -> <bean id = "userPreferences" class = "com.foo.DefaultUserPreferences" scope = "session"> <Aop: mbito-proxy proxy-target-class = "false" /> </ Bean> <bean id = "userManager" class = "com.foo.UserManager"> <propiedad nombre = "userPreferences" ref = "userPreferences" /> </ Bean>

Para obtener informacin ms detallada acerca de la eleccin basada en la clase o interfaz basada en proxy, consulte la Seccin 9.6, "Uso de proxy mecanismos" .

5.5.5 mbitos personalizados

A partir de Spring 2.0, el mecanismo de determinacin del alcance de frijol es extensible. Puede definir sus propios mbitos, o incluso redefinir mbitos existentes, aunque este ltimo se considera una mala prctica y no se puede anular la incorporada en el singleton y prototype mbitos.
La creacin de un mbito personalizado

Para integrar su mbito personalizado (s) en el recipiente de primavera, es necesario implementar el org.springframework.beans.factory.config.Scope interfaz, que se describe en esta seccin. Para tener una idea de cmo poner en prctica sus propios mbitos, consulte el Scope las implementaciones que se suministran con el Spring Framework en s y el Javadoc Scope , que explica los mtodos que usted necesita para poner en prctica con mayor detalle. El Scope interfaz tiene cuatro mtodos para obtener los objetos del mbito de aplicacin, retrelos de su alcance, y permitir que sean destruidos. El siguiente mtodo devuelve el objeto del mbito de aplicacin subyacente. La implementacin mbito de sesin, por ejemplo, devuelve el bean de mbito de sesin (y si no existe, el mtodo devuelve una nueva instancia del bean, despus de haberlo obligado a la sesin para futura referencia).
Object get (String nombre, ObjectFactory ObjectFactory)

El mtodo siguiente se quita el objeto del mbito de aplicacin subyacente. La implementacin mbito de sesin, por ejemplo, se elimina el bean de mbito de sesin de la sesin subyacente. El objeto debe ser devuelto, pero se puede devolver null si el objeto con el nombre especificado no se encontr.
Objeto remove (String nombre)

El mtodo siguiente registra las devoluciones de llamada del alcance debe ejecutar cuando se destruye o cuando el objeto especificado en el campo de aplicacin es destruido. Consulte el Javadoc o una aplicacin Spring alcance para obtener ms informacin sobre las devoluciones de llamada de destruccin.
vaco registerDestructionCallback (String nombre, destructionCallback Ejecutable)

El mtodo siguiente se obtiene el identificador de conversacin para el mbito de aplicacin subyacente. Este identificador es diferente para cada mbito de aplicacin. Para una implementacin de un mbito de sesin, este identificador puede ser el identificador de sesin.
Cadena getConversationId ()

El uso de un mbito personalizado

Despus de escribir y probar uno o ms de encargo del Scope de las implementaciones, usted necesita para hacer el contenedor Spring consciente de su nuevo mbito (s). El mtodo siguiente es el mtodo central para registrar una nueva Scope con el contenedor Spring:
vaco registerScope (String scopeName, alcance Scope);

Este mtodo se declara en el ConfigurableBeanFactory interfaz, que est disponible en la mayora de los concretos ApplicationContext implementaciones que se incluyen en primavera a travs de la propiedad BeanFactory. El primer argumento de la registerScope(..) mtodo es el nombre nico asociado con un mbito de aplicacin, ejemplos de esos nombres en el contenedor Spring s son singleton y prototype . El segundo argumento de la registerScope(..) mtodo es una instancia real de la costumbre Scope de aplicacin que desea registrar y utilizar. Supongamos que usted escribe su costumbre Scope de implementacin, y luego registrarlo como abajo.
Nota

El ejemplo siguiente utiliza SimpleThreadScope que se incluye con la primavera, pero no se ha registrado de forma predeterminada. Las instrucciones seran los mismos para sus propios personalizados Scope implementaciones.
ThreadScope Scope = new SimpleThreadScope (); beanFactory.registerScope ("thread", threadScope);

A continuacin, crear definiciones de frijol que se adhieren a las reglas de mbito de su costumbre Scope :
<bean id = "..." class = "..." scope = "thread">

Con una costumbre Scope de implementacin, no se limitan al registro programtico del mbito de aplicacin. Usted tambin puede hacer el Scope inscripcin declarativa, utilizando el CustomScopeConfigurer clase:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/springbeans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <bean class = "org.springframework.beans.factory.config.CustomScopeConfigurer"> <propiedad nombre = "scopes"> <map>

<entry clave = "thread"> <bean class = "org.springframework.context.support.SimpleThreadScope" /> </ Entry> </ Map> </ Propiedad> </ Bean> <bean id = clase = "bar" alcance "xyBar" "thread" => <propiedad nombre = valor = "name" "Rick" /> <aop:scoped-proxy/> </ Bean> <bean id = "foo" class = "xyFoo"> <propiedad nombre = "bar" ref = "bar" /> </ Bean> </ Beans>

Nota

Cuando se coloca en una <aop:scoped-proxy/> FactoryBean implementacin, es el grano de fbrica s mismo que no est en el mbito, el objeto devuelto desde getObject() .

5,6 Personalizacin de la naturaleza de un grano


5.6.1 devoluciones de llamada de ciclo de vida

Para interactuar con la administracin del contenedor del ciclo de vida del bean, puede implementar la primavera InitializingBean y DisposableBean interfaces. El contenedor llama afterPropertiesSet() para el primero y destroy() para los segundos para permitir que el grano a realizar ciertas acciones en la inicializacin y destruccin de sus granos. Tambin se puede lograr la misma integracin con el recipiente sin acoplamiento de las clases a las interfaces de resorte a travs del uso de init-mtodo y destruir mtodo objeto de metadatos definicin. Internamente, el Spring Framework utiliza BeanPostProcessor implementaciones para procesar cualquier interfaz de devolucin de llamada que puede encontrar y llamar a los mtodos adecuados. Si necesita caractersticas personalizadas o Primavera otro ciclo de vida de un comportamiento no ofrece out-of-the-box, se puede implementar un BeanPostProcessor ti mismo. Para obtener ms informacin, consulte la Seccin 5.8, "Puntos de extensin de contenedores" . Adems de las devoluciones de llamada de inicializacin y destruccin, gestionados por Spring-objetos tambin se pueden poner en prctica el Lifecycle interfaz para que los objetos puedan participar en el proceso de inicio y apagado como impulsado por propio ciclo de vida del contenedor. Las interfaces de devolucin de llamada de ciclo de vida se describen en esta seccin.

Devoluciones de llamada de inicializacin

El org.springframework.beans.factory.InitializingBean interfaz permite que un grano de realizar el trabajo de inicializacin despus de todas las propiedades necesarias en el frijol han sido establecidos por el contenedor. El InitializingBean interfaz especifica un mtodo nico:
afterPropertiesSet vaco () throws Exception;

Se recomienda que no utilice el InitializingBean interfaz, ya que las parejas innecesariamente el cdigo para la primavera. Como alternativa, especifique un mtodo de inicializacin POJO. En el caso de los metadatos de configuracin basado en XML, se utiliza el init-method atributo para especificar el nombre del mtodo que tiene un vaco sin argumentos firma. Por ejemplo, la siguiente definicin:
<bean id = "exampleInitBean" class = "examples.ExampleBean" initmethod = "init" /> pblico ExampleBean clase { public void init () { / / Hacer algo de trabajo de inicializacin } }

... Es exactamente la misma que ...


<bean id = "exampleInitBean" class = "examples.AnotherExampleBean" /> pblico AnotherExampleBean clase implementa InitializingBean { afterPropertiesSet public void () { / / Hacer algo de trabajo de inicializacin } }

... pero no par el cdigo para la primavera.


Callbacks Destruccin

Aplicacin de la org.springframework.beans.factory.DisposableBean interfaz permite un grano de obtener una devolucin de llamada cuando el recipiente que lo contiene se destruye. El DisposableBean interfaz especifica un mtodo nico:
anular destroy () throws Exception;

Se recomienda que no utilice el DisposableBean interfaz de devolucin de llamada de forma innecesaria porque las parejas el cdigo para la primavera. Como alternativa, especifique un mtodo genrico que se apoya en definiciones de frijol. Con los metadatos de configuracin basado en XML, se utiliza el destroy-method atributo en el <bean/> . Por ejemplo, la siguiente definicin:
<bean id = "exampleInitBean" class = "examples.ExampleBean" destroymethod = "cleanup" />

pblico ExampleBean clase { limpieza public void () { / / Hacer algo de trabajo destruccin (como la liberacin de conexiones agrupadas) } }

... Es exactamente la misma que ...


<bean id = "exampleInitBean" class = "examples.AnotherExampleBean" /> pblico AnotherExampleBean clase implementa DisposableBean { public void destroy () { / / Hacer algo de trabajo destruccin (como la liberacin de conexiones agrupadas) } }

... pero no par el cdigo para la primavera.


Predeterminado de inicializacin y destruir mtodos

Cuando se escribe la inicializacin y destruir las devoluciones de llamada de mtodos que no utilizan el resorte especfico InitializingBean y DisposableBean interfaces de devolucin de llamada, normalmente escribir mtodos con nombres tales como init() , initialize() , dispose() , y as sucesivamente. Idealmente, los nombres de estos mtodos de devolucin de llamada de ciclo de vida son estandarizados a travs de un proyecto para que todos los desarrolladores utilizar los nombres de los mtodos mismos y garantizar la coherencia. Puede configurar el contenedor de Spring para look por nombre de inicializacin y destruir nombres de devolucin de llamada de mtodo en cada grano. Esto significa que usted, como desarrollador de aplicaciones, puede escribir sus clases de la aplicacin y el uso de una devolucin de llamada de inicializacin llamado init() , sin tener que configurar un init-method="init" atributo con cada definicin de bean. El contenedor de IoC primavera llama a este mtodo cuando el bean se crea (y de acuerdo con el contrato de devolucin de llamada de ciclo de vida estndar descrito anteriormente). Esta caracterstica tambin se aplica una convencin de nomenclatura coherente para la inicializacin y destruir las devoluciones de llamada de mtodo. Suponga que sus mtodos de devolucin de llamada de inicializacin se nombran init() y mtodos de devolucin de llamada se nombran destruir destroy() . Su clase se parecer a la clase en el siguiente ejemplo.
DefaultBlogService clase pblica implementa BlogService { blogDao BlogDao privado; public void setBlogDao (BlogDao blogDao) { este blogDao = blogDao.; }

/ / Esto es (como era de esperar) el mtodo de devolucin de llamada de inicializacin public void init () { si (esto. blogDao == NULL) { throw new IllegalStateException ("El [blogDao] propiedad se debe establecer."); } } } <beans default-init-method "init" => <bean id = "blogService" class = "com.foo.DefaultBlogService"> <propiedad nombre = "blogDao" ref = "blogDao" /> </ Bean> </ Beans>

La presencia del default-init-method atributo en el nivel superior <beans/> atributo hace que el elemento contenedor de IoC primavera para reconocer un mtodo llamado init en los granos como la devolucin de llamada mtodo de inicializacin. Cuando un bean es creado y montado, si la clase de bean tiene tal mtodo, se invoca en el momento apropiado. Se configura destruir callbacks mtodo similar (en XML, que es) mediante el defaultdestroy-method atributo en el nivel superior <beans/> elemento. Cuando las clases existentes de frijol ya tienen mtodos de devolucin de llamada que se nombran en desacuerdo con la convencin, se puede reemplazar el valor predeterminado especificando (en XML, que es) el nombre del mtodo mediante el init-method y destroy-method atributos de la <bean/> s mismo. El contenedor de Spring garantiza que una devolucin de llamada de inicializacin configurado se llama inmediatamente despus de un grano se suministra con todas las dependencias. As, la devolucin de llamada de inicializacin de una llamada en la referencia frijol crudo, lo que significa que AOP interceptores y as sucesivamente an no se aplican a la semilla. Un bean destino est totalmente creado primero, luego un proxy AOP (por ejemplo) con su cadena interceptor se aplica. Si el bean destino y el proxy se definen por separado, su cdigo incluso pueden interactuar con el bean destino en bruto, sin pasar por el proxy. Por lo tanto, no sera coherente aplicar los interceptores al mtodo init, porque hacerlo sera par del ciclo de vida del bean de destino con su proxy / interceptores y dejar semntica extraos cuando el cdigo interacta directamente con el frijol blanco crudo.
La combinacin de los mecanismos del ciclo de vida

A partir de Spring 2.5, usted tiene tres opciones para controlar el comportamiento del ciclo de vida de frijol: el InitializingBean y DisposableBean interfaces de devolucin de llamada, personalizados init() y destroy() mtodos, y la @PostConstruct y @PreDestroy anotaciones . Puede combinar estos mecanismos de control de un grano determinado.
Nota

Si mltiples mecanismos del ciclo de vida estn configurados para un bean, y cada mecanismo est configurado con un nombre de mtodo diferente, entonces cada mtodo configurado se ejecuta en el orden indicado a continuacin. Sin embargo, si el mismo nombre de mtodo est configurado - por ejemplo, init() para un mtodo de inicializacin - para ms de uno de estos mecanismos de ciclo de vida, este mtodo se ejecuta una vez, como se explica en la seccin anterior. Mltiples mecanismos configurados para el ciclo de vida de frijol mismo, con los mtodos de inicializacin diferentes, se denominan como sigue:

Los mtodos anotados con @PostConstruct afterPropertiesSet() tal como se define por la InitializingBean interfaz de devolucin de llamada Una costumbre configurado init() mtodo

Destruye mtodos son llamados en el mismo orden:


Los mtodos anotados con @PreDestroy destroy() tal como se define por la DisposableBean interfaz de devolucin de llamada Una costumbre configurado destroy() mtodo

Inicio y cierre de devoluciones de llamada

El Lifecycle interfaz define los mtodos esenciales para cualquier objeto que tiene sus requisitos propios del ciclo de vida (por ejemplo, arranca y para algunos procesos en segundo plano):
pblico Lifecycle interfaz { anular start (); anular stop (); isRunning boolean (); }

Cualquier objeto Primavera-administrado puede implementar esa interfaz. Entonces, cuando el propio ApplicationContext se inicia y se detiene, caer en cascada esas llamadas para todas las implementaciones de ciclo de vida definido dentro de ese contexto. Para ello, delegando en un LifecycleProcessor :
public interface extends LifecycleProcessor Lifecycle { anular OnRefresh (); anular onClose (); }

Observe que el LifecycleProcessor s mismo es una extensin del Lifecycle interfaz. Tambin agrega otros dos mtodos para reaccionar ante el contexto que se actualiza y se cierra. El orden de inicio y apagado de invocaciones puede ser importante. Si un "depends-on" existe una relacin entre dos objetos, la parte dependiente se iniciar despus de su dependencia, y se detendr antes de su dependencia. Sin embargo, a veces las dependencias directas son desconocidos. Slo se puede saber que los objetos de un tipo determinado debe comenzar antes de los objetos de otro tipo. En esos casos, la SmartLifecycle interfaz define otra opcin, a saber, la getPhase() mtodo tal como se define en su super-interfaz, Phased .
interfaz pblica por etapas { getPhase int (); } SmartLifecycle interfaz pblica se extiende del ciclo de vida, por etapas { booleano isAutoStartup (); anular la parada (callback Ejecutable); }

Al arrancar, los objetos con la fase ms baja empezar primero, y cuando se detiene, el orden inverso al seguido se. Por lo tanto, un objeto que implementa SmartLifecycle y cuya getPhase () devuelve Integer.MIN_VALUE estara entre los primeros en iniciar y el ltimo en parar. En el otro extremo del espectro, un valor de fase de Integer.MAX_VALUE indicara que el objeto debe ser iniciado y detenido primera pasada (probablemente porque depende de otros procesos que se ejecuta). Cuando se considera el valor de fase, tambin es importante saber que la fase por defecto para cualquier "normal" Lifecycle objeto que no implementa SmartLifecycle sera 0. Por lo tanto, cualquier valor de fase negativa indicara que un objeto debe comenzar antes de que esos componentes estndar (y para despus de ellos), y viceversa para cualquier valor de fase positiva. Como se puede ver el mtodo de parada definido por SmartLifecycle acepta una devolucin de llamada. Cualquier aplicacin debe invocar el mtodo de devolucin de llamada que run (), tras un proceso que la aplicacin del sistema est completamente apagado. Esto permite el apagado asncrona cuando sea necesario ya que la implementacin predeterminada de la LifecycleProcessor interfaz, DefaultLifecycleProcessor , esperar hasta su valor de tiempo de espera para el grupo de objetos dentro de cada fase de invocar esa devolucin de llamada. El valor predeterminado de tiempo de espera por fase es de 30 segundos. Puede anular el ciclo de vida de la instancia predeterminada del procesador mediante la definicin de un bean llamado "lifecycleProcessor" dentro del contexto. Si slo desea modificar el tiempo de espera, entonces la definicin de los siguientes sera suficiente:

<bean id = "lifecycleProcessor" class = "org.springframework.context.support.DefaultLifecycleProcessor"> <- Valor de tiempo de espera en milisegundos -> <propiedad nombre = valor = "timeoutPerShutdownPhase" "10000" /> </ Bean>

Como se mencion, el LifecycleProcessor interfaz define mtodos de devolucin de llamada para el refrigerio y el cierre del contexto. Este ltimo simplemente conducir el proceso de apagado, como si stop () haba sido llamado de manera explcita, pero va a suceder cuando el contexto se est cerrando. El 'refresh' callback por otro lado permite que otra caracterstica de SmartLifecycle frijoles. Cuando el contexto se actualiza (despus de todos los objetos que se han creado instancias e inicializa), devolucin de llamada que se invoca, y en ese momento el ciclo de vida del procesador por defecto comprobar el valor booleano devuelto por cada SmartLifecycle objeto isAutoStartup() mtodo. Si "verdadero", entonces ese objeto se iniciar en ese punto en lugar de esperar para una invocacin explcita de la de contexto o su propio mtodo de inicio () (a diferencia del contexto de actualizacin, el inicio contexto no se produce automticamente una implementacin de contexto estndar) . La "fase" valor, as como cualquier "depende-on" relaciones determinar el orden de inicio de la misma manera como se describi anteriormente.
Apagado del contenedor de IoC Primavera con gracia en aplicaciones no web Nota

Esta seccin se aplica slo a la falta de aplicaciones web. Basados en la web de Spring ApplicationContext implementaciones ya tiene cdigo en lugar de cerrar el contenedor de IoC Primavera con gracia cuando la aplicacin web correspondiente se apaga. Si est utilizando contenedor de Spring COI en un entorno de aplicaciones no web, por ejemplo, en un entorno de cliente de escritorio rico, se registra un gancho de cierre con la JVM. As, asegura un cierre correcto y llama a la correspondiente destruir los mtodos de los beans simples para que todos los recursos son liberados. Por supuesto, usted tiene que configurar y poner en prctica estos callbacks destruir correctamente. Para registrar un gancho de cierre, se llama al registerShutdownHook() mtodo que se declare en la AbstractApplicationContext clase:
org.springframework.context.support.AbstractApplicationContext importacin; org.springframework.context.support.ClassPathXmlApplicationContext importacin; Boot public final class { public static void main (String [] args definitivo) throws Exception { AbstractApplicationContext ctx = New ClassPathXmlApplicationContext (new String [] {"beans.xml"}); / / Aadir un gancho de cierre para el contexto anterior ... ctx.registerShutdownHook ();

/ / App funciona aqu ... / / Salidas principales del mtodo, se llama al gancho antes de la aplicacin de apagar ... } }

5.6.2 ApplicationContextAware y BeanNameAware

Cuando un ApplicationContext crea una clase que implementa la org.springframework.context.ApplicationContextAware interfaz, la clase se proporciona con una referencia a esa ApplicationContext .
pblico ApplicationContextAware interfaz { vaco setApplicationContext (ApplicationContext applicationContext) throws BeansException; }

As frijoles pueden manipular mediante programacin el ApplicationContext que los cre, a travs del ApplicationContext interfaz, o por haber emitido la referencia a una subclase conocida de esta interfaz, como ConfigurableApplicationContext , que expone la funcionalidad adicional. Un uso sera la recuperacin de programacin de otros granos. A veces, esta capacidad es til, sin embargo, en general se debe evitar, ya que se acopla el cdigo para la primavera y no sigue el estilo de inversin de control, donde los colaboradores se proporcionan a los frijoles como propiedades. Otros mtodos de la ApplicationContext facilitar el acceso a los recursos de archivos, eventos y publicacin de aplicaciones que acceden a una MessageSource. Estas funciones adicionales se describen en la Seccin 5.14, "Capacidades adicionales de la ApplicationContext " A partir de primavera de 2,5, autowiring es otra alternativa para obtener referencia al ApplicationContext . El "tradicional" constructor y byType modos autowiring (como se describe en la Seccin 5.4.5, "autowiring colaboradores" ) puede proporcionar una dependencia de tipo ApplicationContext para un argumento de constructor o parmetro de mtodo setter, respectivamente. Para mayor flexibilidad, incluyendo la capacidad de autowire campos y mtodos mltiples parmetros, utilizar las nuevas caractersticas basadas en anotacin autowiring. Si lo hace, el ApplicationContext se autoconectados en un campo, el argumento de constructor, o parmetro del mtodo que est esperando el ApplicationContext tipo si el campo, constructor o mtodo en cuestin lleva el @Autowired anotacin. Para obtener ms informacin, consulte la Seccin 5.9.2, " @Autowired " . Cuando un ApplicationContext crea una clase que implementa la org.springframework.beans.factory.BeanNameAware interfaz, la clase se proporciona con una referencia al nombre definido en su definicin de objeto asociado.
pblico BeanNameAware interfaz { setBeanName void (string name) throws BeansException; }

La devolucin de llamada se invoca despus de la poblacin de las propiedades del bean normales, pero antes de una devolucin de llamada de inicializacin como InitializingBean afterPropertiesSet s o una costumbre mtodo init-.
5.6.3 Otros Aware interfaces de

Adems ApplicationContextAware y BeanNameAware se discuti anteriormente, Spring ofrece una gama de Aware interfaces que permiten frijoles para indicar al contenedor que requieren una dependencia de determinadas infraestructuras. Los ms importantes Aware interfaces se resumen a continuacin - como regla general, el nombre es un buen indicador del tipo de dependencia: Tabla 5.4. Aware de interfaces
Nombre Dependencia Injected Explicacin pulg ..

ApplicationContextAware

Declarar

Seccin 5.6.2, "

ApplicationContex ApplicationContextAwar t e y BeanNameAware "

Evento editor de la

ApplicationEventPublisherAwar envolvente adicionales de la e ApplicationContex ApplicationContext t BeanClassLoaderAware

Seccin 5.14, "Capacidades "

Del cargador de clases usado para cargar las clases de frijol. Declarar
BeanFactory

Seccin 5.3.2, "frijoles" Instanciacin Seccin 5.6.2, "


ApplicationContextAwar e y BeanNameAware "

BeanFactoryAware

BeanNameAware

5.6.2, " Nombre del grano de Seccin ApplicationContextAwar declarar e y BeanNameAware " Adaptador de recursos
BootstrapContext

BootstrapContextAware

el contenedor se ejecuta pulg Por lo general slo disponible en JCA consciente


ApplicationContex ts

Captulo 25, JCA CCI

LoadTimeWeaverAware

MessageSourceAware

Tejedor Definido por definicin de la clase de procesamiento en tiempo de carga Estrategia configurada para la resolucin de los

Seccin 9.8.4, "en tiempo de carga de tejer con AspectJ en el Marco de la primavera" Seccin 5.14, "Capacidades adicionales de la ApplicationContext "

Nombre

Dependencia Injected

Explicacin pulg ..

NotificationPublisherAware

PortletConfigAware

mensajes (con soporte para parametrizacin e internacionalizacin) Primavera JMX Seccin 24.7, notificacin editor "Notificaciones" Actual PortletConfig el contenedor se ejecuta pulg Vlido slo en Captulo 20, Portlet MVC Framework una web-aware Spring
ApplicationContex t

Actual
PortletContext PortletContextAware

el contenedor se ejecuta pulg Vlido slo en Captulo 20, Portlet MVC Framework una web-aware Spring
ApplicationContex t

ResourceLoaderAware

ServletConfigAware

Cargador configurado para acceso de bajo Captulo 6, Recursos nivel a los recursos Actual ServletConfig el contenedor se ejecuta pulg Vlido slo en Captulo 17, Web MVC marco una web-aware Spring
ApplicationContex t

Actual
ServletContext ServletContextAware

el contenedor se ejecuta pulg Vlido slo en Captulo 17, Web MVC marco una web-aware Spring
ApplicationContex t

Tenga en cuenta una vez ms que el uso de estas interfaces ata su cdigo para la API de primavera y no sigue el estilo de inversin de control. Por lo tanto, se recomiendan para los granos de infraestructura que requieren un acceso mediante programacin al contenedor.

5,7 haba herencia definicin


Una definicin de bean puede contener una gran cantidad de informacin de configuracin, incluyendo argumentos del constructor, los valores de propiedad, as como informacin especfica del contenedor como mtodo de inicializacin, el nombre del mtodo esttico de fbrica, etc. Una definicin de frijol hijo hereda los datos de configuracin de una definicin de los padres. La definicin hijo puede sobrescribir algunos valores, o aadir otros, segn sea necesario. Utilizando las definiciones principales y secundarios de frijol puede ahorrar un montn de escribir. Efectivamente, esta es una forma de plantillas. Si usted trabaja con un ApplicationContext interfaz de programacin, las definiciones de nio de frijol estn representados por la ChildBeanDefinition clase. La mayora de los usuarios no trabajar con ellos en este nivel, en lugar de configurar las definiciones de frijol declaracin en algo as como el ClassPathXmlApplicationContext . Cuando se utiliza basado en XML metadatos de la configuracin, se indica una definicin de bean nio mediante el uso de la parent atributo, especificando el bean padre como el valor de este atributo.
<Bean id = "inheritedTestBean" abstract = "true" class = "org.springframework.beans.TestBean"> <propiedad nombre = valor = "name" "parent" /> <propiedad nombre = valor = "age" "1" /> </ Bean> <Bean id = "inheritsWithDifferentClass" class = "org.springframework.beans.DerivedTestBean" parent = "inheritedTestBean" init-method = "inicializar"> <propiedad nombre = valor = "name" "override" /> <- El valor de la propiedad era de 1 se hereda de los padres -> </ Bean>

Una definicin de frijol nio utiliza la clase de bean de la definicin de los padres si no se especifica ninguno, pero tambin la puede anular. En este ltimo caso, la clase de bean nio debe ser compatible con la matriz, es decir, debe aceptar los valores de la matriz de propiedad. Una definicin de frijol hijo hereda los valores de constructor de argumentos, los valores de propiedad y sustituye el mtodo de la matriz, con la opcin de aadir nuevos valores. Cualquier mtodo de inicializacin, destruir mtodo y / o static configuracin del mtodo de fbrica que usted especifique anularn las configuraciones primarias correspondientes. Los valores restantes se toman siempre de la definicin hijo: depende, modo autowire, comprobacin de dependencias, singleton, alcance, perezoso init. En el ejemplo anterior marca explcitamente la definicin de bean padre como abstracta mediante la abstract de atributos. Si la definicin de los padres no especifica una clase, marcar explcitamente la definicin de bean padre como abstract se requiere, como sigue:

<bean id = "inheritedTestBeanWithoutClass" abstract = "true"> <propiedad nombre = valor = "name" "parent" /> <propiedad nombre = valor = "age" "1" /> </ Bean> <Bean id = "inheritsWithClass" class = "org.springframework.beans.DerivedTestBean" parent = "inheritedTestBeanWithoutClass" init-method = "inicializar"> <propiedad nombre = valor = "name" "override" /> <- Edad heredarn el valor 1 a partir de la definicin de bean padre -> </ Bean>

El frijol padre no puede ser instanciada por s porque es incompleta, y tambin se marca explcitamente como abstract . Cuando una definicin es abstract como este, es utilizable solamente como una definicin de plantilla bean puro que sirve como una definicin de los padres para las definiciones de nio. Tratar de utilizar este tipo de abstract de frijol padre por su cuenta, refirindose a ella como una propiedad de ref otro bean o hacer un explcito getBean() llamada con el identificador de frijol matriz, devuelve un error. Del mismo modo, el contenedor interno preInstantiateSingletons() mtodo ignora las definiciones de frijol que se definen como abstracta.
Nota
ApplicationContext

pre-instancia todos nicos por defecto. Por lo tanto, es importante (al menos para los frijoles nico) que si se tiene una definicin (padre) de frijol que se va a utilizar slo como una plantilla, y esta definicin especifica una clase, usted debe asegurarse de establecer el atributo abstracto a lo real caso contrario, el contexto de aplicacin realmente (intento de) pre-instancia del abstract de frijol.

5,8 puntos contenedor de extensin


Normalmente, un desarrollador de aplicaciones no necesita subclase ApplicationContext clases de implementacin. En su lugar, el contenedor Spring COI puede prolongarse conectando en implementaciones de interfaces de integracin especiales. Las siguientes secciones describen estas interfaces de integracin.
5.8.1 Personalizacin de frijoles con un BeanPostProcessor

El BeanPostProcessor interfaz define mtodos de devolucin de llamada que se pueden implementar para proporcionar a su cuenta (o anular predeterminado del contenedor) instanciacin lgica, la lgica de la dependencia resolucin, y as sucesivamente. Si desea implementar alguna lgica personalizada despus de que el contenedor Spring termina instancia, configuracin e inicializacin de un bean, puede conectar uno o ms BeanPostProcessor implementaciones. Puede configurar varios BeanPostProcessor casos, y puede controlar el orden en que stos BeanPostProcessor s ejecutar estableciendo el order la propiedad. Puede

establecer esta propiedad slo si la BeanPostProcessor implementa la Ordered interfaz, si usted escribe su propio BeanPostProcessor usted debe considerar la aplicacin de la Ordered interfaz tambin. Para ms detalles, consulte el Javadoc para la BeanPostProcessor y Ordered interfaces. Vase tambin la nota siguiente en el registro de programacin de BeanPostProcessors
Nota
BeanPostProcessor

s operar en frijol (u objeto) casos, es decir, la Primavera de IoC container crea una instancia de bean y luego BeanPostProcessor s hacer su trabajo.
BeanPostProcessor

s estn en el mbito por contenedor. Esto slo es relevante si est utilizando jerarquas de contenedores. Si se define una BeanPostProcessor en un contenedor, slo post-procesar los granos en ese contenedor. En otras palabras, los frijoles que se definen en un contenedor no son post-procesados por un BeanPostProcessor definido en otro recipiente, incluso si ambos recipientes son parte de la misma jerarqua. Para cambiar la definicin de bean real (es decir, el modelo que define el frijol), en su lugar deber utilizar un BeanFactoryPostProcessor como se describe en la Seccin 5.8.2, "Personalizacin de metadatos de configuracin con un BeanFactoryPostProcessor " . El org.springframework.beans.factory.config.BeanPostProcessor interfaz consiste en exactamente dos mtodos de devolucin de llamada. Cuando tal clase est registrada como un post-procesador con el recipiente, para cada instancia de frijol que se crea por el contenedor, el post-procesador obtiene una devolucin de llamada desde el contenedor, tanto antes de los mtodos de inicializacin contenedor (como afterPropertiesSet InitializingBean () y cualquier mtodo declarado init) se denominan as como despus de las devoluciones de llamada de frijol de inicializacin. El postprocesador puede tomar cualquier accin con la instancia del bean, incluso haciendo caso omiso de la devolucin de llamada por completo. Un grano de post-procesador tpicamente verifica para las interfaces de devolucin de llamada o pueden envolver un grano con un proxy. Algunas clases de primavera AOP infraestructura se implementan como frijol post-procesadores con el fin de actuar como proxy de envoltura de la lgica. Un ApplicationContext detecta automticamente los frijoles que se definen en la configuracin de metadatos que implementan la BeanPostProcessor interfaz. El ApplicationContext registra estos granos como post-procesadores para que puedan ser llamados ms tarde a la creacin de frijol. Frijol post-procesadores se pueden implementar en el contenedor al igual que cualquier otros granos.
Programacin registrar BeanPostProcessors

Si bien el mtodo recomendado para BeanPostProcessor registro es a travs de ApplicationContext deteccin automtica (como se describe anteriormente), es tambin posible registrar mediante programacin contra un ConfigurableBeanFactory usando el addBeanPostProcessor mtodo. Esto

puede ser til cuando se necesita para evaluar la lgica condicional antes del registro, o incluso para copiar los procesadores de frijol mensaje a travs de contextos en una jerarqua. Tenga en cuenta sin embargo que BeanPostProcessors agregado mediante programacin no respetan la Ordered interfaz. Aqu est el orden de inscripcin que dicta la orden de ejecucin. Tenga en cuenta tambin que BeanPostProcessors registrados programticamente siempre se procesan antes que los registrados a travs de la deteccin automtica, independientemente de cualquier orden explcita.
BeanPostProcessors AOP y auto-proxy

Las clases que implementan la BeanPostProcessor interfaz son especiales y son tratados de manera diferente por el contenedor. Todos BeanPostProcessors y frijoles que se crean instancias de referencia directamente en el inicio, como parte de la fase de inicio especial de la ApplicationContext . A continuacin, todos los BeanPostProcessors se registran de una manera ordenada y se aplica a todos los granos adicionales en el contenedor. Debido AOP auto-proxy se implementa como un BeanPostProcessor s misma, tampoco BeanPostProcessors ni los granos de los que hacen referencia directamente son elegibles para auto-proxy, y por lo tanto no tienen aspectos en su tejido. Para cualquier frijol tal, debera ver un mensaje de registro de informacin: "Bean foo no es elegible para conseguir procesar todas las interfaces BeanPostProcessor (por ejemplo: no es elegible para auto-proxy)". Los siguientes ejemplos muestran cmo escribir, registrar y utilizar BeanPostProcessors en un ApplicationContext .
Ejemplo: Hola a todos, BeanPostProcessor de estilo

Este primer ejemplo ilustra el uso bsico. El ejemplo muestra una costumbre BeanPostProcessor aplicacin que invoca el toString() mtodo de cada grano ya que se crea por el contenedor y se imprime el string resultante a la consola del sistema. Ponemos a tu disposicin la costumbre BeanPostProcessor definicin de la clase de implementacin:
paquete de secuencias de comandos; importar org.springframework.beans.factory.config.BeanPostProcessor; org.springframework.beans.BeansException importacin; InstantiationTracingBeanPostProcessor clase pblica implementa BeanPostProcessor { / / Devuelva el frijol instancia tal y como son postProcessBeforeInitialization public Object (Objeto de frijol, beanName String) lanza BeansException { volver frijol / / nos podra devolver cualquier objeto de referencia aqu ... }

postProcessAfterInitialization public Object (Objeto de frijol, beanName String) lanza BeansException { System.out.println ("Bean '" + beanName + "' creado:" + bean.toString ()); volver frijol; } } <? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: lang = "http://www.springframework.org/schema/lang" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/springbeans.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd "> <Lang: groovy id = "mensajero" guin-source = "classpath: org / springframework / scripts / Groovy / Messenger.groovy"> nombre = valor <lang:property "message" = "Fiona de Apple es tan Dreamy." /> </ Lang: groovy> <! cuando el bean anterior (mensajero) de la instancia, esta costumbre Aplicacin BeanPostProcessor dar salida el hecho de que la consola del sistema -> <bean class = "scripting.InstantiationTracingBeanPostProcessor" /> </ Beans>

Observe cmo el InstantiationTracingBeanPostProcessor se define simplemente. Ni siquiera tiene un nombre, y porque es un grano que puede ser de dependencia inyectado como cualquier otro frijol. (La disposicin anterior tambin define un bean que est respaldado por un script Groovy. Spring 2.0 El soporte de lenguajes dinmicos se detalla en el captulo Captulo 28, el apoyo dinmico de idioma .) La siguiente aplicacin Java simple ejecuta el cdigo anterior y configuracin:
org.springframework.context.ApplicationContext importacin; org.springframework.context.support.ClassPathXmlApplicationContext importacin; importar org.springframework.scripting.Messenger; Boot public final class { public static void main (String [] args definitivo) throws Exception { ApplicationContext ctx = new ClassPathXmlApplicationContext ("scripting / beans.xml"); Mensajero mensajero = (Messenger) ctx.getBean ("mensajero");

System.out.println (mensajero); } }

La salida de la aplicacin anterior, similar al siguiente:


'Mensajero' Bean creado: org.springframework.scripting.groovy.GroovyMessenger @ 272961 org.springframework.scripting.groovy.GroovyMessenger @ 272961

Ejemplo: El RequiredAnnotationBeanPostProcessor

Utilizacin de interfaces de devolucin de llamada o anotaciones en conjuncin con una costumbre BeanPostProcessor aplicacin es un medio comn de extender el contenedor Spring COI. Un ejemplo es el de Spring RequiredAnnotationBeanPostProcessor - un BeanPostProcessor aplicacin que se incluye con la distribucin de primavera, que se asegura de que las propiedades del JavaBean de frijol que estn marcados con una anotacin (arbitraria) son en realidad (configurado para ser) con inyeccin de dependencia con un valor.
5.8.2 Personalizacin de la configuracin de metadatos con un
BeanFactoryPostProcessor

El punto de extensin siguiente que vamos a ver es la


org.springframework.beans.factory.config.BeanFactoryPostProcessor . semntica de esta interfaz son similares a los de la BeanPostProcessor , con una diferencia principal: BeanFactoryPostProcessor s operar en los metadatos

La

configuracin bean, es decir, el contenedor Spring IOC permite BeanFactoryPostProcessors para leer los metadatos y la configuracin potencialmente cambiar antes de que el contenedor crea una instancia de cualquier otros granos que BeanFactoryPostProcessors . Puede configurar varios BeanFactoryPostProcessors , y usted puede controlar el orden en el que estos BeanFactoryPostProcessors ejecutar estableciendo el order la propiedad. Sin embargo, slo se puede establecer esta propiedad si el BeanFactoryPostProcessor implementa la Ordered interfaz. Si usted escribe su propio BeanFactoryPostProcessor , se debe considerar la aplicacin de la Ordered interfaz tambin. Consulte el Javadoc para la BeanFactoryPostProcessor y Ordered interfaces para ms detalles.
Nota

Si desea cambiar los ejemplares del bean reales (es decir, los objetos que se crean a partir de los metadatos de configuracin), entonces en vez necesite usar un BeanPostProcessor (que se describe ms arriba en la Seccin 5.8.1, "Personalizacin de frijoles con un BeanPostProcessor " ). Si bien es tcnicamente posible trabajar con instancias de frijol en un BeanFactoryPostProcessor (por ejemplo, utilizando BeanFactory.getBean() ), haciendo causa la eyaculacin instanciacin frijol, violando el ciclo de vida del envase estndar. Esto puede causar efectos secundarios negativos, tales como pasar

por la transformacin del grano de correos. Adems, BeanFactoryPostProcessors estn en el mbito por contenedor. Esto slo es relevante si est utilizando jerarquas de contenedores. Si se define una BeanFactoryPostProcessor en un envase, que slo se aplican a las definiciones de frijol de ese contenedor. Definiciones de frijol en un recipiente no ser postprocesado por BeanFactoryPostProcessors en otro contenedor, incluso si ambos recipientes son parte de la misma jerarqua. Una fbrica de beans post-procesador se ejecuta automticamente cuando se declara dentro de un ApplicationContext , con el fin de aplicar los cambios a la configuracin de los metadatos que definen el contenedor. Spring incluye un nmero predefinido de frijol de fbrica post-procesadores, tales como PropertyOverrideConfigurer y PropertyPlaceholderConfigurer . Una costumbre BeanFactoryPostProcessor tambin se puede utilizar, por ejemplo, para registrar los editores de propiedades personalizados. Un ApplicationContext detecta automticamente los frijoles que se despliegan en ella que implementan la BeanFactoryPostProcessor interfaz. Utiliza estos granos como frijol fbrica post-procesadores, en el momento adecuado. Puede implementar estos granos post-procesador como lo hara con cualquier otro frijol.
Nota

Al igual que con BeanPostProcessor s, por lo general no desea configurar BeanFactoryPostProcessor s para la inicializacin perezosa. Si no hay referencias a otros frijol Bean(Factory)PostProcessor , que despus de procesador no se crea una instancia en absoluto. Por lo tanto, marcndolo para la inicializacin perezosa se tendr en cuenta, y el Bean(Factory)PostProcessor se crear una instancia con entusiasmo incluso si establece el default-lazy-init atributo de true en la declaracin de sus <beans /> elemento.
Ejemplo: la PropertyPlaceholderConfigurer

Se utiliza el PropertyPlaceholderConfigurer de exteriorizar los valores de propiedad de un bean definicin en un archivo separado utilizando el estndar Java Properties formato. Si lo hace, permite a la persona de implementar una aplicacin para personalizar las propiedades especficas del entorno, tales como las URL de la base de datos y contraseas, sin la complejidad o riesgo de modificar el principal archivo de definicin XML o los archivos para el contenedor. Considere el siguiente fragmento XML basado en metadatos de configuracin, donde un DataSource con los valores de marcador de posicin se define. El ejemplo muestra propiedades configuradas desde un dispositivo externo Properties del archivo. En tiempo de ejecucin, un PropertyPlaceholderConfigurer se aplica a los metadatos que sustituir a algunas propiedades de la fuente de datos. Los valores para sustituir se especifican como marcadores de posicin de la forma $ {property-name} que sigue a la hormiga / log4j / JSP EL estilo.

<bean class = "org.springframework.beans.factory.config.PropertyPlaceholderConfigure r"> <propiedad nombre = valor = "locations" "classpath:com/foo/jdbc.properties" /> </ Bean> <Bean id = "origen de datos" destroy-method = "close" class = "org.apache.commons.dbcp.BasicDataSource"> <propiedad nombre = valor = "driverClassName" "${jdbc.driverClassName}" /> <propiedad nombre = valor = "url" "${jdbc.url}" /> <propiedad nombre = valor = "username" "${jdbc.username}" /> <propiedad nombre = valor = "password" "${jdbc.password}" /> </ Bean>

Los valores actuales son originarios de otro archivo en el estndar Java Properties formato:
jdbc.driverClassName = org.hsqldb.jdbcDriver jdbc.url = jdbc: hsqldb: hsql :/ / produccin: 9002 jdbc.username = sa jdbc.password = root

Por lo tanto, la cadena ${jdbc.username} es reemplazado en tiempo de ejecucin con 'sa' el valor, y lo mismo se aplica para los valores de marcador de posicin de otros que responden a las claves en el archivo de propiedades. El PropertyPlaceholderConfigurer comprueba marcadores de posicin de la mayora de propiedades y atributos de una definicin de frijol. Por otra parte, el prefijo y el sufijo marcador de posicin se pueden personalizar. Con el context espacio de nombres introducido en la primavera de 2,5, es posible configurar marcadores de posicin de propiedad con un elemento de configuracin dedicada. Uno o ms lugares puede ser proporcionada como una lista separada por comas en la location atributo.
<context:property-placeholder ubicacin = "classpath:com/foo/jdbc.properties" />

El PropertyPlaceholderConfigurer no slo busca propiedades en las Properties archivo que especifique. Por defecto se comprueba tambin en contra de los Java System propiedades si no se puede encontrar una propiedad en los archivos de propiedades especificadas. Puede personalizar este comportamiento estableciendo la systemPropertiesMode propiedad del configurador con uno de los siguientes tres valores enteros soportados:

Nunca (0): No comprobar las propiedades del sistema de reserva (1): Compruebe las propiedades del sistema si no pueden resolverse en los archivos de propiedades especificadas. Este es el valor predeterminado. override (2): Verifique las propiedades del sistema en primer lugar, antes de tratar los archivos de propiedades especificadas. Esto permite que las propiedades del sistema para anular cualquier fuente de otros bienes.

Consulte el Javadoc para la PropertyPlaceholderConfigurer para ms informacin.

Clase sustitucin del nombre

Usted puede utilizar el PropertyPlaceholderConfigurer para sustituir los nombres de clase, lo cual es a veces til cuando usted tiene que escoger una clase de implementacin en particular en tiempo de ejecucin. Por ejemplo:
<bean class = "org.springframework.beans.factory.config.PropertyPlaceholderConfig urer"> <propiedad nombre = "locations"> <valor> classpath: com / foo / strategy.properties </ value> </ Propiedad> <propiedad nombre = "properties"> <valor> custom.strategy.class = com.foo.DefaultStrategy </ value> </ Propiedad> </ Bean> <bean id = "serviceStrategy" class = "${custom.strategy.class}" />

Si la clase no se puede resolver en tiempo de ejecucin a una clase vlida, la resolucin del grano produce un error cuando est a punto de ser creado, que es durante el preInstantiateSingletons() fase de un ApplicationContext para un bean non-lazy-init.
Ejemplo: la PropertyOverrideConfigurer

El PropertyOverrideConfigurer , otra fbrica de beans post-procesador, se asemeja a la PropertyPlaceholderConfigurer , pero a diferencia de este ltimo, las definiciones originales pueden tener valores por defecto o no los valores de las propiedades en absoluto de frijol. Si una imperiosa Properties archivo no tiene una entrada para una propiedad de bean cierto, la definicin de contexto por defecto se utiliza. Tenga en cuenta que la definicin de frijol no es consciente de ser anulado, por lo que no es inmediatamente obvio por el archivo de definicin XML que el configurador de anulacin se est utilizando. En el caso de mltiples PropertyOverrideConfigurer instancias que definen diferentes valores para la propiedad de bean mismo, los ltimos uno gana, debido al mecanismo primordial. Propiedades de las lneas del archivo de configuracin tomar este formato:
beanName.property = valor

Por ejemplo:
dataSource.driverClassName = com.mysql.jdbc.Driver dataSource.url = jdbc: mysql: mydb

Este archivo de ejemplo se puede utilizar con una definicin contenedor que contiene un bean llamado fuente de datos, que tiene el conductor y propiedades de URL.

Nombres compuestos de propiedad tambin son compatibles, siempre y cuando todos los componentes de la ruta, excepto la ltima propiedad es la suplantacin ya no nulo (presumiblemente inicializado por los constructores). En este ejemplo ...
foo.fred.bob.sammy = 123

... el sammy propiedad de la bob de la propiedad fred propiedad del foo bean se establece en el valor escalar 123 .
Nota

Respetar los valores de anulacin son siempre valores literales, sino que no se traducen en referencias de frijol. Este Convenio se aplica tambin cuando el valor original en la definicin XML bean especifica una referencia de frijol. Con el context espacio de nombres introducido en la primavera de 2,5, es posible configurar propiedad de reemplazo con un elemento de configuracin dedicado:
<context:property-override ubicacin = "classpath:override.properties" />

5.8.3 Personalizacin instanciacin lgica con un FactoryBean

Implementar el org.springframework.beans.factory.FactoryBean interfaz para los objetos que ellos mismos son fbricas. El FactoryBean interfaz es un punto de enchufabilidad en la lgica de instancias de primavera COI contenedor. Si tiene un cdigo de inicializacin compleja que se expresa mejor en Java en lugar de una cantidad (potencialmente) detallado de XML, usted puede crear su propio FactoryBean , escriba la inicializacin compleja dentro de esa clase, y luego conecte su costumbre FactoryBean en el recipiente. El FactoryBean interfaz proporciona tres mtodos:
Object getObject()

: devuelve una instancia del objeto de esta fbrica crea. La instancia posiblemente puede ser compartida, en funcin de si esta fbrica devuelve singletons o prototipos. boolean isSingleton() : devuelve true si esta FactoryBean vuelve nicos, false de lo contrario. Class getObjectType() : devuelve el tipo de objeto devuelto por el getObject() mtodo o null si el tipo no se conoce de antemano.

El FactoryBean concepto y la interfaz se utiliza en un nmero de lugares dentro de la infraestructura Spring; ms de 50 implementaciones de la FactoryBean buque interfaz con Spring s mismo. Cuando usted necesita para hacer un contenedor para un verdadero FactoryBean instancia s mismo en vez del grano que produce, prefacio id del bean con el smbolo ampersand ( & ) al llamar a la getBean() mtodo de la ApplicationContext . As que para un determinado FactoryBean con un id de myBean , invocando

getBean("myBean") en el contenedor devuelve el producto invocando getBean("&myBean") devuelve el FactoryBean

de la FactoryBean y que, instancia s mismo.

5.9 Anotacin basada en contenedor de configuracin


Son mejores que las anotaciones XML para la configuracin de Spring? La introduccin de anotacin configuraciones basadas plante la cuestin de si este enfoque es "mejor" que XML. La respuesta corta es que depende. La respuesta larga es que cada mtodo tiene sus pros y sus contras, y por lo general es responsabilidad del desarrollador para decidir qu estrategia le conviene mejor. Debido a la forma en que se definen, las anotaciones proporcionan una gran cantidad de contexto en su declaracin, lo que lleva a la configuracin ms corto y conciso. Sin embargo, destaca XML en el cableado de los componentes sin tocar su cdigo fuente ni recompilar ellos. Algunos desarrolladores prefieren tener el cableado cerca de la fuente, mientras que otros argumentan que las clases anotadas ya no son POJOs y, adems, que la configuracin se descentraliza y ms difcil de controlar. No importa la opcin, la primavera puede acomodar ambos estilos e incluso mezclarlos entre s. Vale la pena sealar que a travs de su JavaConfig opcin, Spring permite anotaciones para ser utilizado de forma no invasiva, sin tocar el cdigo fuente de los componentes de destino y que en trminos de herramientas, configuracin de todos los estilos son compatibles con la suite de herramientas SpringSource . Una alternativa a las configuraciones de XML se proporciona por medio de anotacin basado en configuracin que se basan en los metadatos de cdigo de bytes para el cableado de los componentes en lugar de las declaraciones del soporte de ngulo. En lugar de utilizar XML para describir un cableado de frijol, el desarrollador se mueve en la configuracin de la clase del componente en s mediante el uso de anotaciones en la clase correspondiente, el mtodo o declaracin de campo. Como se menciona en la seccin "Ejemplo: El RequiredAnnotationBeanPostProcessor " , utilizando un BeanPostProcessor junto con las anotaciones es un medio comn de extender el contenedor Spring COI. Por ejemplo, Spring 2.0 introduce la posibilidad de aplicar las propiedades necesarias con el @ Required anotacin. Spring 2.5 permitido seguir ese mismo enfoque general para impulsar la inyeccin de Spring dependencia. En esencia, el @Autowired anotacin proporciona las mismas capacidades que se describen en la Seccin 5.4.5, "autowiring colaboradores" , pero con ms control preciso y una mayor aplicabilidad. Spring 2.5 tambin aade soporte para JSR-250 anotaciones como @PostConstruct y @PreDestroy . Spring 3.0 aade soporte para JSR-330 (inyeccin de dependencias para Java) anotaciones que figuran en el paquete javax.inject como @Inject y @Named . Los detalles sobre esas anotaciones se pueden encontrar en la seccin pertinente .
Nota

Anotacin inyeccin se lleva a cabo antes de la inyeccin XML, por lo tanto la ltima configuracin anular el anterior para las propiedades con cable a travs de ambos enfoques.

Como siempre, usted puede registrarse como definiciones de frijol individuales, pero tambin pueden ser registradas implcitamente al incluir la siguiente etiqueta en una configuracin de Spring basado en XML (ntese la inclusin del context espacio de nombres):
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: context = "http://www.springframework.org/schema/context" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/springcontext.xsd "> <context:annotation-config/> </ Beans>

(La implcitamente registrado postprocesadores as como la antes mencionada RequiredAnnotationBeanPostProcessor .)


Nota
<context:annotation-config/>

slo busca anotaciones de frijoles en el contexto de la aplicacin misma en la que se ha definido. Esto significa que, si se pone <context:annotation-config/> en un WebApplicationContext un DispatcherServlet , slo comprueba @Autowired frijoles en sus controladores, y no sus servicios. Consulte Seccin 17.2, "El DispatcherServlet " para ms informacin.
5.9.1 @Required

La @Required anotacin se aplica a los mtodos de frijol setter de propiedad, como en el ejemplo siguiente:
pblico SimpleMovieLister clase { MovieFinder MovieFinder privado; @ Required public void setMovieFinder (MovieFinder MovieFinder) { este MovieFinder = MovieFinder.; } / / ... }

Esta anotacin indica simplemente que la propiedad de bean afectada debe estar ocupado en el momento de la configuracin, a travs de un valor de la propiedad en una definicin explcita oa travs de frijol autowiring. El recipiente se produce una excepcin si la propiedad de bean afectada no ha sido poblada, lo que permite por no ansiosos y explcito, evitando NullPointerException s o similares en el futuro.

Todava se recomienda poner afirmaciones en la clase de bean s, por ejemplo, en un mtodo init. Si lo hace, aplica esas referencias necesarias y los valores, incluso cuando se utiliza la clase fuera de un contenedor.
5.9.2 @Autowired

Como era de esperar, se puede aplicar el @Autowired anotacin a los mtodos "tradicionales" setter:
pblico SimpleMovieLister clase { MovieFinder MovieFinder privado; @ Autoconectados public void setMovieFinder (MovieFinder MovieFinder) { este MovieFinder = MovieFinder.; } / / ... }

Nota

@ JSR 330 de Inyectar anotacin se puede utilizar en lugar de Spring @Autowired anotacin en los ejemplos siguientes. Ver aqu para ms detalles Tambin puede solicitar la anotacin a los mtodos con nombres arbitrarios y / o argumentos mltiples:
MovieRecommender clase pblica { movieCatalog MovieCatalog privado; customerPreferenceDao CustomerPreferenceDao privado; @ Autoconectados public void prepare (MovieCatalog movieCatalog, CustomerPreferenceDao customerPreferenceDao) { este movieCatalog = movieCatalog.; este customerPreferenceDao = customerPreferenceDao.; } / / ... }

Usted puede solicitar @Autowired a constructores y campos:


MovieRecommender clase pblica { @ Autoconectados movieCatalog MovieCatalog privado; customerPreferenceDao CustomerPreferenceDao privado; @ Autoconectados pblico MovieRecommender (CustomerPreferenceDao customerPreferenceDao) {

este customerPreferenceDao = customerPreferenceDao.; } / / ... }

Tambin es posible proporcionar todos los granos de un tipo particular de la ApplicationContext mediante la adicin de la anotacin a un campo o mtodo que espera un conjunto de ese tipo:
MovieRecommender clase pblica { @ Autoconectados privado MovieCatalog [] movieCatalogs; / / ... }

Lo mismo se aplica para las colecciones con tipo:


MovieRecommender clase pblica { privadas movieCatalogs Set <MovieCatalog>; @ Autoconectados setMovieCatalogs public void (Juego <MovieCatalog> movieCatalogs) { esta movieCatalogs = movieCatalogs.; } / / ... }

Mapas Incluso puede autoconectados escritos, siempre y cuando el tipo de clave es esperado String . Los valores del mapa contendr todos los granos del tipo esperado, y las teclas contendr los nombres de frijol correspondientes:
MovieRecommender clase pblica { Mapa privado <String, MovieCatalog> movieCatalogs; @ Autoconectados setMovieCatalogs public void (Mapa <String, MovieCatalog> movieCatalogs) { esta movieCatalogs = movieCatalogs.; } / / ... }

Por defecto, el autowiring no siempre frijoles cero candidatos estn disponibles, el comportamiento por defecto es tratar a los mtodos anotados, los constructores y los campos a medida que indica las dependencias necesarias. Este comportamiento se puede cambiar como se demuestra a continuacin.
pblico SimpleMovieLister clase { MovieFinder MovieFinder privado;

@ Autoconectados (required = false) public void setMovieFinder (MovieFinder MovieFinder) { este MovieFinder = MovieFinder.; } / / ... }

Nota

Slo un constructor anotado por clase puede ser marcado como se requiere, pero no requeridos mltiples constructores se pueden anotar. En ese caso, cada uno es considerado como uno de los candidatos y la primavera utiliza el constructor ms codiciosos cuyas dependencias se pueden satisfacer, es el constructor que tiene el mayor nmero de argumentos.
@Autowired

atributo 's se requiere es ms recomendable que la @Required anotacin. El atributo requerido indica que la propiedad no es necesaria para los propsitos autowiring, la propiedad se omite si no se puede autoconectados. @Required , por otro lado, es ms fuerte en que hace cumplir la propiedad que fue establecido por cualquier medio admitido por el contenedor . Si no hay valor se inyecta, una excepcin correspondiente se eleva. Tambin puede utilizar @Autowired para interfaces que son bien conocidos dependencias resolubles: BeanFactory , ApplicationContext , Environment , ResourceLoader , ApplicationEventPublisher y MessageSource . Estas interfaces y sus interfaces extendidos, como ConfigurableApplicationContext o ResourcePatternResolver , se resuelve automticamente, sin ninguna configuracin especial necesaria.
MovieRecommender clase pblica { @ Autoconectados privado contexto ApplicationContext; MovieRecommender pblico () { } / / ... }

Nota
@Autowired , @Inject , @Resource y @Value anotaciones son manejados por un resorte BeanPostProcessor implementaciones que a su vez significa que usted no puede aplicar estas anotaciones dentro de su propio BeanPostProcessor o BeanFactoryPostProcessor tipos (si procede). Estos tipos deben ser "cableado" de forma explcita a travs de XML o el uso de un resorte @Bean mtodo.

5.9.3 Ajuste fino de anotacin basado autowiring con los calificadores

Debido autowiring por tipo puede conducir a mltiples candidatos, a menudo es necesario tener ms control sobre el proceso de seleccin. Una forma de lograr esto es

con Spring @Qualifier anotacin. Puede asociar valores clasificatorios con argumentos concretos, reduciendo el conjunto de coincidencias de tipo para que un grano especfico que se elija para cada argumento. En el caso ms simple, esto puede ser un valor descriptivo simple:
MovieRecommender clase pblica { @ Autoconectados @ Qualifier ("main") movieCatalog MovieCatalog privado; / / ... }

El @Qualifier anotacin tambin se pueden especificar en argumentos de constructor individuales o parmetros de mtodo:
MovieRecommender clase pblica { movieCatalog MovieCatalog privado; customerPreferenceDao CustomerPreferenceDao privado; @ Autoconectados public void preparar (@ Qualifier ("main") MovieCatalog movieCatalog, CustomerPreferenceDao customerPreferenceDao) { este movieCatalog = movieCatalog.; este customerPreferenceDao = customerPreferenceDao.; } / / ... }

Las definiciones de frijol correspondientes aparecen de la siguiente manera. El frijol con valor calificativo de "principal" est conectado con el argumento de constructor que se califica con el mismo valor.
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: context = "http://www.springframework.org/schema/context" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/springcontext.xsd "> <context:annotation-config/> <bean class = "example.SimpleMovieCatalog"> <qualifier value="main"/> <- Inyectar las dependencias requeridas por este bean -> </ Bean> <bean class = "example.SimpleMovieCatalog"> <qualifier value="action"/> <- Inyectar las dependencias requeridas por este bean ->

</ Bean> <bean id = "movieRecommender" class = "example.MovieRecommender" /> </ Beans>

Para un partido de reserva, el nombre del bean se considera un valor predeterminado calificador. As se puede definir el grano con un id "principal" en lugar del elemento calificador anidado, lo que lleva al resultado coincidente mismo. Sin embargo, aunque se puede utilizar esta convencin para referirse a los frijoles especficas por nombre, @Autowired trata fundamentalmente de tipo impulsado por inyeccin con la opcin de calificadores semnticos. Esto significa que los valores de clasificacin, incluso con el nombre de reserva de frijol, siempre tiene un estrechamiento semntica dentro del conjunto de coincidencias de tipo y no semnticamente expresar una referencia a un identificador nico bean. Buenos valores clasificatorios son "principal" o "EMEA" o "persistentes", que expresa caractersticas de un componente especfico que son independientes de la Identificacin del frijol, que puede ser generado automticamente en caso de una definicin de bean annimo como la que en el ejemplo anterior . Calificadores tambin aplica a las colecciones de tipo, como se discuti anteriormente, por ejemplo, para Set<MovieCatalog> . En este caso, todos los granos de emparejamiento de acuerdo con la fase de clasificacin declarados se inyectan como una coleccin. Esto implica que los calificadores no tiene que ser nico, sino que ms bien se limita a fijar los criterios de filtrado. Por ejemplo, puede definir varias MovieCatalog frijoles con el mismo valor calificativo de "accin", todo lo cual se inyecta en una Set<MovieCatalog> anotado con @Qualifier("action") .
Punta

Si tiene la intencin de expresar anotacin impulsada por inyeccin por su nombre, no utilizan principalmente @Autowired , aunque tcnicamente es capaz de hacer referencia a un nombre de frijol a travs de @Qualifier valores. En su lugar, utilice el JSR-250 @Resource anotacin, que se define semnticamente para identificar un componente de destino especfico por su nombre nico, con el tipo declarado no pertinentes para el proceso de casacin. Como una consecuencia especfica de esta diferencia semntica, granos que se estn definidos como un conjunto o tipo de mapa no puede ser inyectado a travs de @Autowired , porque coincidencia de tipos no es adecuadamente aplicable a ellos. Usar @Resource para los granos de estos, en referencia a la coleccin especfica o un mapa de frijol por su nombre nico.
@Autowired

aplica a los campos, constructores y mtodos mltiples argumentos, lo que permite reducir a travs de anotaciones calificador en el nivel de parmetros. Por el contrario, @Resource slo se admite en los campos y mtodos de frijol de propiedad setter con un solo argumento. Como consecuencia de ello, se adhieren con calificadores si tu objetivo inyeccin es un constructor o un mtodo multiargumento.

Usted puede crear sus propias anotaciones calificador personalizadas. Simplemente defina una anotacin y proporcionar el @Qualifier anotacin dentro de su definicin:
@ Target ({ElementType.FIELD, ElementType.PARAMETER}) @ Retention (RetentionPolicy.RUNTIME) @ Qualifier public @ interface Gnero { Valor String (); }

A continuacin, puede proporcionar el calificador personalizada en los campos autoconectados y parmetros:


MovieRecommender clase pblica { @ Autoconectados @ Gnero ("Accin") actionCatalog MovieCatalog privado; comedyCatalog MovieCatalog privado; @ Autoconectados public void setComedyCatalog (@ Gnero ("Comedia") MovieCatalog comedyCatalog) { este comedyCatalog = comedyCatalog.; } / / ... }

A continuacin, proporcione la informacin correspondiente a las definiciones de candidatos de frijol. Puede aadir <qualifier/> etiquetas como sub-elementos de la <bean/> etiqueta y especifique el type y value para que coincida con sus anotaciones calificador personalizadas. El tipo se compara con el nombre de clase completamente calificado de la anotacin. O, como una conveniencia, si hay riesgo de nombres en conflicto existe, puede utilizar el nombre de clase corta. Ambos enfoques se muestra en el ejemplo siguiente.
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: context = "http://www.springframework.org/schema/context" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/springcontext.xsd "> <context:annotation-config/> <bean class = "example.SimpleMovieCatalog"> <qualifier type="Genre" value="Action"/> <- Inyectar las dependencias requeridas por este bean -> </ Bean> <bean class = "example.SimpleMovieCatalog"> <qualifier type="example.Genre" value="Comedy"/>

<- Inyectar las dependencias requeridas por este bean -> </ Bean> <bean id = "movieRecommender" class = "example.MovieRecommender" /> </ Beans>

En la Seccin 5.10, "Anlisis de rutas de clases y componentes administrados" , ver una alternativa basada en anotacin a proporcionar los metadatos en XML calificador. En concreto, consulte la Seccin 5.10.7, "Proporcionar metadatos calificador con anotaciones" . En algunos casos, puede ser suficiente utilizar una anotacin sin un valor. Esto puede ser til cuando la anotacin sirve a un propsito ms genrico y puede ser aplicado a travs de varios tipos diferentes de dependencias. Por ejemplo, puede proporcionar un catlogo en lnea que se busc cuando no hay conexin a Internet disponible. Primero defina la anotacin simple:
@ Target ({ElementType.FIELD, ElementType.PARAMETER}) @ Retention (RetentionPolicy.RUNTIME) @ Qualifier public @ interface Desconectado { }

A continuacin, aadir la anotacin en el campo o propiedad que se autoconectados:


MovieRecommender clase pblica { @ Autoconectados @ Desconectado offlineCatalog MovieCatalog privado; / / ... }

Ahora, la definicin de bean slo necesita un calificador type :


<bean class = "example.SimpleMovieCatalog"> <qualifier type="Offline"/> <- Inyectar las dependencias requeridas por este bean -> </ Bean>

Tambin puede definir anotaciones personalizadas calificador que aceptan atributos con nombre, adems o en lugar de la simple value de atributo. Si varios valores de atributo se especifica a continuacin, en un campo o parmetro a autoconectados, una definicin de bean debe acertar los valores de los atributos que sta se considera un candidato autowire. Como ejemplo, considere la definicin siguiente anotacin:
@ Target ({ElementType.FIELD, ElementType.PARAMETER}) @ Retention (RetentionPolicy.RUNTIME) @ Qualifier public @ interface MovieQualifier { Gnero String ();

Formato Format (); }

En este caso, Format es una enumeracin:


public enum {Formato VHS, DVD, BluRay }

Los campos a autoconectados se anotan con el calificador personalizada e incluyen valores para ambos atributos: genre y format .
MovieRecommender clase pblica { @ Autoconectados @ MovieQualifier (format = Format.VHS, gnero = "Accin") actionVhsCatalog MovieCatalog privado; @ Autoconectados @ MovieQualifier (format = Format.VHS, gnero = "Comedia") comedyVhsCatalog MovieCatalog privado; @ Autoconectados @ MovieQualifier (format = Format.DVD, gnero = "Accin") actionDvdCatalog MovieCatalog privado; @ Autoconectados @ MovieQualifier (format = Format.BLURAY, gnero = "Comedia") comedyBluRayCatalog MovieCatalog privado; / / ... }

Por ltimo, las definiciones de frijol debe contener valores coincidentes calificador. Este ejemplo tambin demuestra que los atributos de frijol meta se puede utilizar en lugar de la <qualifier/> sub-elementos. Si est disponible, la <qualifier/> y sus atributos tienen prioridad, pero el mecanismo autowiring cae de nuevo en los valores proporcionados dentro de los <meta/> etiquetas si no calificativo tal est presente, como en las definiciones de frijol dos ltimos en el ejemplo siguiente.
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: context = "http://www.springframework.org/schema/context" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/springcontext.xsd "> <context:annotation-config/> <bean class = "example.SimpleMovieCatalog"> <qualifier type = "MovieQualifier"> atributo> clave = valor = "format" "VHS" /> atributo> clave = valor = "genre" "Action" /> </ Calificador>

<- Inyectar las dependencias requeridas por este bean -> </ Bean> <bean class = "example.SimpleMovieCatalog"> <qualifier type = "MovieQualifier"> atributo> clave = valor = "format" "VHS" /> atributo> clave = valor = "genre" "Comedy" /> </ Calificador> <- Inyectar las dependencias requeridas por este bean -> </ Bean> <bean class = "example.SimpleMovieCatalog"> <meta clave = valor = "format" "DVD" /> <meta clave = valor = "genre" "Action" /> <- Inyectar las dependencias requeridas por este bean -> </ Bean> <bean class = "example.SimpleMovieCatalog"> <meta clave = valor = "format" "BLURAY" /> <meta clave = valor = "genre" "Comedy" /> <- Inyectar las dependencias requeridas por este bean -> </ Bean> </ Beans>

5.9.4 CustomAutowireConfigurer

El CustomAutowireConfigurer es un BeanFactoryPostProcessor que le permite registrar sus propios tipos personalizados anotacin calificador, incluso si no estn anotados con Spring @Qualifier anotacin.
<Bean id = "customAutowireConfigurer" class = "org.springframework.beans.factory.annotation.CustomAutowireConfigurer "> <propiedad nombre = "customQualifierTypes"> <set> <valor> example.CustomQualifier </ value> </ Set> </ Propiedad> </ Bean>

La implementacin particular de AutowireCandidateResolver que se activa para el contexto de aplicacin depende de la versin Java. En las versiones anteriores de Java 5, las anotaciones calificador no son compatibles, y por lo tanto los candidatos autowire estn nicamente determinadas por el autowire-candidate valor de cada definicin de frijol, as como por cualquier default-autowire-candidates modelo (s) disponibles en los <beans/> elemento. En Java 5 o posterior, la presencia de @Qualifier anotaciones y las anotaciones personalizadas registradas en el CustomAutowireConfigurer tambin jugar un papel importante. Independientemente de la versin de Java, cuando mltiples beans califican como candidatos autowire, la determinacin de un "principal" candidato es el mismo: si exactamente una definicin de frijol entre los candidatos tiene un primary atributo establecido en true , se puede seleccionar.

5.9.5 @Resource

Spring tambin soporta la inyeccin utilizando la JSR-250 @Resource anotacin en los campos o mtodos de frijol de propiedad setter. Este es un patrn comn en Java EE 5 y 6, por ejemplo, en JSF 1.2 beans gestionados o JAX-WS 2.0 puntos finales. Spring soporta este modelo para la primavera gestionados objetos tambin.
@Resource

tiene un atributo de nombre, y para la primavera defecto interpreta ese valor como el nombre del bean a inyectar. En otras palabras, se sigue por nombre semntica, como se demuestra en este ejemplo:
pblico SimpleMovieLister clase { MovieFinder MovieFinder privado; @ Resource (name = "myMovieFinder") public void setMovieFinder (MovieFinder MovieFinder) { este MovieFinder = MovieFinder.; } }

Si no se especifica el nombre explcitamente, el nombre predeterminado se deriva del nombre del campo o mtodo setter. En caso de un campo, toma el nombre del campo, y en caso de un mtodo setter, toma el nombre de la propiedad de frijol. As que el siguiente ejemplo va a tener el grano con el nombre de "MovieFinder" inyectado en su mtodo setter:
pblico SimpleMovieLister clase { MovieFinder MovieFinder privado; @ Resource public void setMovieFinder (MovieFinder MovieFinder) { este MovieFinder = MovieFinder.; } }

Nota

El nombre proporcionado con la anotacin se resuelve como un nombre de frijol por el ApplicationContext de que la CommonAnnotationBeanPostProcessor es consciente. Los nombres pueden ser resueltos a travs de JNDI si configura Spring SimpleJndiBeanFactory explcitamente. Sin embargo, se recomienda que se basan en el comportamiento por defecto y slo tiene que utilizar las capacidades de Spring bsqueda JNDI para preservar el nivel de indireccin. En el caso exclusivo del @Resource uso con ningn nombre explcito especificado, y similar a @Autowired , @Resource encuentra un tipo de acuerdo con el primario en lugar de un grano de nombre especfica y resuelve bien conocidos dependencias resolubles: la BeanFactory , ApplicationContext, ResourceLoader, ApplicationEventPublisher , y MessageSource interfaces. As, en el ejemplo siguiente, el customerPreferenceDao campo primero busca un bean llamado customerPreferenceDao, entonces cae de nuevo a una coincidencia de tipo

primario para el tipo CustomerPreferenceDao . El "contexto" de campo se inyecta sobre la base de lo conocido puede resolver la dependencia de tipo ApplicationContext .
MovieRecommender clase pblica { @ Resource customerPreferenceDao CustomerPreferenceDao privado; @ Resource privado contexto ApplicationContext; MovieRecommender pblico () { } / / ... }

5.9.6 @PostConstruct y @PreDestroy

El CommonAnnotationBeanPostProcessor no slo reconoce el @Resource anotacin sino tambin las anotaciones del ciclo de vida JSR-250. Introducido en Spring 2.5, el soporte para estas anotaciones ofrece otra alternativa a los descritos en las devoluciones de llamada de inicializacin y destruccin devoluciones de llamada . Siempre que el CommonAnnotationBeanPostProcessor est registrada en el Spring ApplicationContext , un mtodo que lleva una de estas anotaciones se invoca en el mismo punto en el ciclo de vida como el mtodo de interfaz Spring correspondiente ciclo de vida o declara explcitamente mtodo de devolucin de llamada. En el siguiente ejemplo, la cach se rellena previamente en la inicializacin y se aclar a la destruccin.
pblico CachingMovieLister clase { @ PostConstruct populateMovieCache public void () { / / Rellena la cach durante la inicializacin pelcula ... } @ PreDestroy clearMovieCache public void () { / / Borra la cach pelcula sobre la destruccin ... } }

Nota

Para obtener ms informacin acerca de los efectos de la combinacin de diversos mecanismos del ciclo de vida, consulte la seccin titulada "Combinacin de los mecanismos del ciclo de vida" .

5,10 exploracin de rutas de clases y componentes administrados


La mayora de los ejemplos de este captulo utilizan XML para especificar la configuracin de metadatos que produce cada BeanDefinition dentro del contenedor

de Spring. En la seccin anterior ( Seccin 5.9, "Anotacin de configuracin basada en contenedor" ) muestra cmo proporcionar una gran cantidad de los metadatos de configuracin a travs de anotaciones del nivel de fuente. Incluso en los ejemplos, sin embargo, la "base" definiciones de frijol se definen explcitamente en el archivo XML, mientras que las anotaciones slo conducir la inyeccin de dependencias. En esta seccin se describe una opcin para la deteccin de los componentes implcitamente candidatos mediante el escaneo de la ruta de clases. Componentes candidatos son clases que coincidan con un criterio de filtro contra y tienen una definicin de bean correspondiente registrado en el recipiente. Esto elimina la necesidad de utilizar XML para realizar el registro de frijol, en lugar usted puede utilizar anotaciones (por ejemplo Component @), expresiones AspectJ tipo, o sus criterios de filtro personalizados propios para seleccionar las clases tendrn definiciones de frijol registradas en el contenedor.
Nota

Comenzando con Spring 3.0, muchas caractersticas proporcionadas por el proyecto JavaConfig primavera son parte del ncleo de Spring Framework. Esto le permite definir frijoles con Java en lugar de utilizar los archivos XML tradicionales. Echa un vistazo a la @Configuration , @Bean , @Import y @DependsOn anotaciones para obtener ejemplos de cmo utilizar estas nuevas caractersticas.
5.10.1 @Component y anotaciones posteriores estereotipo

En la primavera de 2,0 y ms tarde, el @Repository anotacin es un marcador de cualquier clase que cumple el rol o estereotipo (tambin conocido como Data Access Object o DAO) de un repositorio. Entre los usos de este marcador es la traduccin automtica de excepciones como se describe en la Seccin 15.2.2, "Traduccin de excepcin" . Spring 2.5 introduce nuevas anotaciones estereotipo: @Component , @Service y @Controller . @Component . es un estereotipo genrico para cualquier componente Primavera-administrado @Repository , @Service y @Controller son especializaciones de @Component para ms casos de uso especficos, por ejemplo, en las capas de persistencia, el servicio, y la presentacin, respectivamente. Por lo tanto, puede anotar sus clases de componentes con @Component , pero anotando con @Repository , @Service o @Controller en cambio, las clases son ms idnea para el procesamiento por herramientas o asociarse con aspectos. Por ejemplo, estas anotaciones estereotipo hacer objetivos ideales para puntos de corte. Tambin es posible que @Repository , @Service y @Controller puede llevar semntica adicional en futuras versiones de Spring Framework. Por lo tanto, si usted est eligiendo entre el uso @Component o @Service para su capa de servicios, @Service es claramente la mejor opcin. Del mismo modo, como se ha dicho, @Repository ya est previsto como un marcador para la traduccin automtica de excepcin en su capa de persistencia.

5.10.2 Deteccin automtica las clases y el registro de las definiciones de frijol

Spring puede detectar automticamente las clases estereotipadas y registro correspondiente BeanDefinition s con el ApplicationContext . Por ejemplo, las siguientes dos clases son elegibles para la deteccin automtica de tal:
@ Servicio pblico SimpleMovieLister clase { MovieFinder MovieFinder privado; @ Autoconectados pblico SimpleMovieLister (MovieFinder MovieFinder) { este MovieFinder = MovieFinder.; } } @ Repositorio JpaMovieFinder clase pblica implementa MovieFinder { / / Se elide aplicacin para una mayor claridad }

Para detectar automticamente las clases y el registro de los granos correspondientes, es necesario incluir el siguiente elemento en XML, donde el elemento base del paquete es un paquete primario comn para las dos clases. (Si lo prefiere, puede especificar una lista separada por comas que incluye el paquete principal de cada clase).
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: context = "http://www.springframework.org/schema/context" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/springbeans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/springcontext.xsd "> <context:component-scan base-package = "org.example" /> </ Beans>

Punta

El uso de <context:component-scan> implcitamente permite la funcionalidad de <context:annotation-config> . Por lo general, no es necesario incluir el <context:annotation-config> elemento al usar <context:component-scan> .
Nota

La exploracin de los paquetes de classpath requiere la presencia de entradas de directorio correspondiente en el classpath. Cuando se genera JAR con Ant, asegrese de que usted no activa el interruptor de slo archivos JAR de la tarea. Por otra parte, el AutowiredAnnotationBeanPostProcessor y CommonAnnotationBeanPostProcessor estn incluidos implcitamente cuando se

utiliza el elemento componente de exploracin. Eso significa que los dos componentes se autodetecta y conectados entre s - todo sin ningn metadato configuracin bean proporciona en XML.
Nota

Usted puede desactivar el registro de AutowiredAnnotationBeanPostProcessor y CommonAnnotationBeanPostProcessor incluyendo el atributo anotacin-config con un valor de false.
5.10.3 Uso de filtros para personalizar la exploracin

De forma predeterminada, las clases anotadas con @Component , @Repository , @Service , @Controller , o una anotacin costumbre que se est anotado con @Component son los componentes candidatos slo detectados. Sin embargo, puede modificar y ampliar este comportamiento simplemente mediante la aplicacin de filtros personalizados. Agregar como incluir o excluir a filtrar con filtro sub-elementos del component-scan del elemento. Cada elemento de filtro requiere el type y la expression los atributos. La siguiente tabla describe las opciones de filtrado. Tabla 5.5. Tipos de filtros
Tipo de filtro Ejemplo de expresin Descripcin Una anotacin de estar presente en el nivel de tipo de componentes de destino. Una clase (o interfaz) que los componentes de destino se pueden asignar a (ampliar / implementar). Una expresin de tipo AspectJ ir acompaada de los componentes de destino. Una expresin regex ir acompaada de los nombres de los componentes de destino de clase. Una implementacin personalizada del costumbre org.example.MyTypeFilter
org.springframework.core.type .TypeFilter interfaz.

anotacin org.example.SomeAnnotation

asignable org.example.SomeClass

AspectJ

org.example..*Service+

regex

org\.example\.Default.*

El siguiente ejemplo muestra la configuracin XML ignorando todos los @Repository anotaciones y el uso de "stub" repositorios en su lugar.
<beans>

<context:component-scan base-package "org.example" => <context:include-filter type = "regex" expresin = ".*Stub.*Repository" /> Contexto <: exclude-filter type = "anotacin" = expresin "org.springframework.stereotype.Repository" /> </ Context: component-scan> </ Beans>

Nota

Tambin puede desactivar los filtros predeterminados, proporcionando defecto de uso-filtros = "false" como un atributo del elemento <component-scan/>. Esto, en efecto, desactivar la deteccin automtica de clases anotadas con @Component , @Repository , @Service o @Controller .
5.10.4 Definicin de frijol metadatos dentro de los componentes

Componentes de resorte tambin puede contribuir metadatos bean definicin al recipiente. Esto se hace con el mismo @Bean anotacin utiliza para definir los metadatos dentro de frijol @Configuration anotados clases. He aqu un ejemplo simple:
@ Component public class {FactoryMethodComponent @ @ Haba Qualifier ("pblico") pblico testBean publicInstance () { return new testBean ("publicInstance"); } doWork public void () { / / Implementacin del mtodo de componentes omitidos } }

Esta clase es un componente de primavera que tiene una aplicacin especfica del cdigo que figura en su doWork() mtodo. Sin embargo, tambin aporta una definicin de bean que tiene un mtodo de fbrica de referencia al mtodo publicInstance() . El @Bean anotacin identifica el mtodo de fbrica y otras propiedades de definicin de soja, tales como un calificador a travs de la @Qualifier anotacin. Otras anotaciones a nivel de mtodos que se pueden especificar son @Scope , @Lazy anotaciones calificador, y la costumbre. Autoconectados campos y mtodos se admiten como se discuti previamente, con soporte adicional para autowiring de @Bean mtodos:
@ Component public class {FactoryMethodComponent private static int i; @ @ Haba Qualifier ("pblico") pblico testBean publicInstance () { return new testBean ("publicInstance"); }

/ / Uso de un calificador de la costumbre y de los parmetros del mtodo autowiring @ Frijol protegida testBean protectedInstance (@ Qualifier ("pblico") testBean cnyuge, @ Value ("# {privateInstance.age}") pas String) { TestBean tb = new testBean ("protectedInstance", 1); tb.setSpouse (tb); tb.setCountry (pas); volver tb; } @ @ Haba Alcance (BeanDefinition.SCOPE_SINGLETON) privado privateInstance testBean () { return new testBean ("privateInstance", i + +); } @ @ Scope Frijol (valor = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) pblico testBean requestScopedInstance () { return new testBean ("requestScopedInstance", 3); } }

El ejemplo autowires la String mtodo parmetro country por el importe de la Age propiedad en otro bean llamado privateInstance . Una Expresin Spring elemento Idioma define el valor de la propiedad a travs de la notacin #{ <expression> } . Por @Value anotaciones, una resolucin de expresin est preconfigurado para buscar nombres de frijol en la resolucin de texto de expresin. Los @Bean mtodos en un componente de primavera se procesa de manera diferente que sus contrapartes dentro de una primavera @Configuration clase. La diferencia es que @Component clases no se han mejorado con CGLIB para interceptar la invocacin de mtodos y campos. CGLIB proxy es el medio por el cual se invoca mtodos o campos dentro @Configuration clases @Bean frijol mtodos crean referencias a los objetos de metadatos colaboradoras. Los mtodos no son invocados con la semntica normal de Java. Por el contrario, llamar a un mtodo o campo dentro de un @Component clases @Bean mtodo tiene la semntica estndar de Java.
5.10.5 Nombrar los componentes detectados automticamente

Cuando un componente es detectado automticamente como parte del proceso de escaneo, su nombre bean es generado por el BeanNameGenerator estrategia conocida para ese detector. Por defecto, cualquier anotacin estereotipo Spring ( @Component , @Repository , @Service y @Controller ) que contiene un name valor por ello, aportar ese nombre a la definicin de bean correspondiente. Si dicha anotacin contiene ningn name valor o para cualquier otro componente detectado (tales como los descubiertos por filtros personalizados), el generador de beans predeterminada devuelve el nombre sin maysculas no cualificado nombre de la clase. Por ejemplo, si los dos componentes siguientes fueron detectados, los nombres seran myMovieLister y movieFinderImpl:

@ Service ("myMovieLister") pblico SimpleMovieLister clase { / / ... } @ Repositorio pblico MovieFinderImpl clase implementa MovieFinder { / / ... }

Nota

Si no quiere depender de la omisin de nombres de frijol estrategia, puede proporcionar una medida de frijol nombramiento estrategia. En primer lugar, poner en prctica la BeanNameGenerator interfaz, y asegrese de incluir un defecto noarg constructor. A continuacin, proporcione el nombre de clase completo al configurar el escner:
<beans> Contexto <: componente de exploracin de base-package = "org.example" Nombre del generador = "org.example.MyNameGenerator" /> </ Beans>

Como regla general, es recomendable especificar el nombre con la anotacin siempre que otros componentes pueden hacer referencias explcitas a ella. Por otra parte, los nombres generados automticamente son adecuados siempre que el contenedor es responsable de cableado.
5.10.6 Proporcionar un espacio para componentes autodetectadas

Al igual que con gestionadas Primavera-componentes en general, el mbito predeterminado y el ms comn de los componentes detectados automticamente es singleton. Sin embargo, a veces es necesario otros mbitos, que ofrece Spring 2.5 con un nuevo @Scope anotacin. Simplemente proporcione el nombre del campo de aplicacin dentro de la anotacin:
@ Scope ("prototipo") @ Repositorio pblico MovieFinderImpl clase implementa MovieFinder { / / ... }

Nota

Para proporcionar una estrategia personalizada para la resolucin de alcance en lugar de confiar en el enfoque basado en anotacin, aplicar el ScopeMetadataResolver interfaz, y asegrese de incluir un defecto no-arg constructor. A continuacin, proporcione el nombre de clase completo al configurar el escner:
<beans> Contexto <: componente de exploracin de base-package = "org.example"

alcance-resolver = "org.example.MyScopeResolver" /> </ Beans>

Cuando se utilizan ciertos mbitos no nicos, puede ser necesario para generar proxies para mbito de los objetos. El razonamiento que se describe en la seccin llamada "frijoles de mbito de sus dependencias" . Para este propsito, un atributo de mbito de proxy est disponible en el elemento componente de exploracin. Los tres valores posibles son: No, interfaces y targetClass. Por ejemplo, la siguiente configuracin dar como resultado estndar JDK proxies dinmicos:
<beans> Contexto <: componente de exploracin de base-package = "org.example" mbito de proxy = "interfaces" /> </ Beans>

5.10.7 Proporcionar metadatos calificador con anotaciones

El @Qualifier anotacin se discute en la Seccin 5.9.3, "Afinar anotacin basada autowiring con calificadores" . Los ejemplos de esta seccin muestran el uso de la @Qualifier anotacin y anotaciones personalizadas clasificatorios para proporcionar un control preciso cuando se resuelven los candidatos autowire. Debido a que estos ejemplos se basan en XML definiciones de frijol, los metadatos calificador se proporcion en las definiciones de candidatos de frijol utilizando el qualifier o meta sub-elementos de la bean elemento en el XML. Al depender de exploracin classpath para la deteccin automtica de componentes, se proporcionarn los metadatos calificador con anotaciones de nivel de tipo de la clase de candidato. Los tres ejemplos siguientes demuestran esta tcnica:
@ Component @ Qualifier ("Accin") pblico ActionMovieCatalog clase implementa MovieCatalog { / / ... } @ Component @ Gnero ("Accin") pblico ActionMovieCatalog clase implementa MovieCatalog { / / ... } @ Component @ Desconectado pblico CachingMovieCatalog clase implementa MovieCatalog { / / ... }

Nota

Al igual que con la mayora de anotacin basadas en alternativas, tenga en cuenta que los metadatos anotacin est asociada a la definicin de la clase en s, mientras que el uso de XML permite frijoles mltiples del mismo tipo para proporcionar variaciones en los metadatos de clasificacin, ya que los metadatos se proporciona por instancia y no por clase.

5.11 Uso de JSR 330 anotaciones estndar


Comenzando con Spring 3.0, Spring ofrece soporte para JSR-330 anotaciones estndar (inyeccin de dependencias). Estas anotaciones se analizan de la misma manera como las anotaciones del resorte. Usted slo tiene que tener los frascos relevantes en su ruta de clase.
Nota

Si est utilizando Maven, el javax.inject artefacto est disponible en el repositorio Maven estndar ( http://repo1.maven.org/maven2/javax/inject/javax.inject/1/ ). Usted puede agregar la siguiente dependencia a su pom.xml del archivo:
<dependency> <groupId> javax.inject </ groupId> <artifactId> javax.inject </ artifactId> <versin> 1 </ version> </ Dependency>

5.11.1 inyeccin de dependencia con @Inject y @Named

En lugar de @Autowired , @javax.inject.Inject se puede utilizar de la siguiente manera:


importar javax.inject.Inject; pblico SimpleMovieLister clase { MovieFinder MovieFinder privado; @ Inject public void setMovieFinder (MovieFinder MovieFinder) { este MovieFinder = MovieFinder.; } / / ... }

Como con @Autowired , es posible utilizar @Inject en el nivel de clase, a nivel de campo, de nivel de mtodo y nivel constructor-argumento. Si desea utilizar un nombre calificado por la dependencia que debe ser inyectada, debe utilizar el @Named anotacin como sigue:
importar javax.inject.Inject; importar javax.inject.Named; pblico SimpleMovieLister clase { MovieFinder MovieFinder privado; @ Inject public void setMovieFinder (@ Named ("principal") MovieFinder MovieFinder) { este MovieFinder = MovieFinder.;

} / / ... }

5.11.2 @Named : una norma equivalente a la @Component anotacin

En lugar de @Component , @javax.inject.Named se puede utilizar de la siguiente manera:


importar javax.inject.Inject; importar javax.inject.Named; @ Named ("movieListener") pblico SimpleMovieLister clase { MovieFinder MovieFinder privado; @ Inject public void setMovieFinder (MovieFinder MovieFinder) { este MovieFinder = MovieFinder.; } / / ... }

Es muy comn el uso @Component sin especificar un nombre para el componente. @Named se puede utilizar de una manera similar:
importar javax.inject.Inject; importar javax.inject.Named; @ Named pblico SimpleMovieLister clase { MovieFinder MovieFinder privado; @ Inject public void setMovieFinder (MovieFinder MovieFinder) { este MovieFinder = MovieFinder.; } / / ... }

Cuando se utiliza @Named , es posible utilizar el componente de exploracin de la misma forma exacta como cuando se utiliza anotaciones Spring:
<beans> <context:component-scan base-package = "org.example" /> </ Beans>

5.11.3 Limitaciones del enfoque estndar

Cuando se trabaja con anotaciones estndar, es importante saber que algunas de las caractersticas importantes no estn disponibles, como se muestra en la tabla siguiente: Tabla 5.6. Anotaciones Spring vs anotaciones estndar

Primavera

javax.inject *.

javax.inject restricciones / comentarios

@ @ Inject Autoconectados @ Component

@ Inject no tiene 'required' atributo

@ Named -

@ Scope ("singleton")

@ Singleton

El mbito predeterminado JSR-330 es como la primavera del prototype . Sin embargo, con el fin de mantener la coherencia con los valores predeterminados generales de primavera, un grano de JSR-330 declarados en el envase primavera es un singleton por defecto. Para utilizar un alcance diferente del singleton , debe usar Spring @Scope anotacin.
javax.inject

tambin proporciona un mbito @ anotacin. Sin embargo, ste slo se dise para ser utilizado para la creacin de sus propias anotaciones.
@ Qualifier @ Valor @ Required @ Lazy @ Named hay equivalente hay equivalente hay equivalente

5,12 basado en Java contenedor de configuracin


5.12.1 Conceptos bsicos: @Configuration y @Bean

El artefacto central en la nueva temporada Primavera-configuracin de Java de apoyo es la @Configuration anotado clase. Estas clases consisten principalmente en @Bean anotado mtodos que definen la lgica de instancias, configuracin e inicializacin de los objetos a ser gestionados por el contenedor de IoC primavera. Anotacin de una clase con la @Configuration indica que la clase puede ser utilizado por el contenedor Spring COI como una fuente de definiciones de frijol. La forma ms sencilla posible @Configuration clase sera el siguiente:
@ Configuracin AppConfig clase pblica { @ Frijol myService MyService pblico () { volver MyServiceImpl nuevo (); } }

Para aquellos ms familiarizados con Spring <beans/> XML, el AppConfig clase anterior sera equivalente a:
<beans> <bean id = "myService" class = "com.acme.services.MyServiceImpl" /> </ Beans>

Como se puede ver, el @Bean anotacin desempea el mismo papel que el <bean/> elemento. El @Bean anotacin se discutir en detalle en las secciones siguientes. Primero, sin embargo, vamos a cubrir las diversas formas de crear un contenedor de primavera con una configuracin basada en Java.
5.12.2 Crear instancias del contenedor Spring usando
AnnotationConfigApplicationContext

En las secciones siguientes Spring documento AnnotationConfigApplicationContext , nuevo en Spring 3.0. Este verstil ApplicationContext aplicacin es capaz de aceptar no slo @Configuration clases como entrada, pero tambin simples @Component clases y clases anotadas con JSR-330 metadatos. Cuando @Configuration clases se proporcionan como entrada, la @Configuration clase en s est registrado como una definicin de frijol, y todos declararon @Bean mtodos dentro de la clase tambin se registran como definiciones de frijol. Cuando @Component y clases de JSR-330 se proporcionan, se registran como definiciones de frijol, y se supone que los metadatos DI como @Autowired o @Inject se utilizan dentro de esas clases cuando sea necesario.
Construccin simple

De la misma manera que la primavera archivos XML se utiliza como entrada al crear instancias de un ClassPathXmlApplicationContext , @Configuration clases pueden ser utilizados como entrada al crear instancias de un AnnotationConfigApplicationContext . Esto permite un uso totalmente libre de XML del contenedor Spring:
public static void main (String [] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext (AppConfig. clase); MyService myService = ctx.getBean (MyService. clase); myService.doStuff (); }

Como se mencion anteriormente, AnnotationConfigApplicationContext no se limita a trabajar slo con @Configuration clases. Cualquier @Component o JSR-330 clase anotada puede ser suministrado como entrada para el constructor. Por ejemplo:
public static void main (String [] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext (MyServiceImpl. clase, Dependency1 clase, Dependency2 clase..); MyService myService = ctx.getBean (MyService. clase);

myService.doStuff (); }

Lo anterior supone que MyServiceImpl , Dependency1 y Dependency2 usar Spring anotaciones de inyeccin de dependencia, tales como @Autowired .
La construccin del contenedor mediante programacin con register(Class<?>...)

Un AnnotationConfigApplicationContext puede crear una instancia utilizando un constructor sin argumentos y configurado a continuacin, utilizando el register() mtodo. Este enfoque es particularmente til cuando la construccin de una programacin AnnotationConfigApplicationContext .
public static void main (String [] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext (); ctx.register (AppConfig. clase, OtherConfig clase.); ctx.register (AdditionalConfig. clase); ctx.refresh (); MyService myService = ctx.getBean (MyService. clase); myService.doStuff (); }

Habilitacin componente de exploracin con scan(String...)

Los usuarios experimentados de primavera estarn familiarizados con el siguiente comnmente utilizado declaracin XML de Spring context: espacio de nombres
<beans> <context:component-scan base-package = "com.acme" /> </ Beans>

En el ejemplo anterior, el com.acme paquete sern analizados, en busca de cualquier @Component anotadas las clases, y las clases se registrar como definiciones de frijol de primavera en el contenedor. AnnotationConfigApplicationContext expone el scan(String...) mtodo para permitir para el mismo componente de deteccin de la funcionalidad:
public static void main (String [] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext (); ctx.scan ("com.acme"); ctx.refresh (); MyService myService = ctx.getBean (MyService. clase); }

Nota

Recuerde que @Configuration clases son meta-anotado con @Component , por lo que son candidatos para el componente de exploracin! En el ejemplo anterior, en el supuesto de que AppConfig se declara dentro de la com.acme paquete (o cualquier paquete de debajo), se recogi durante la llamada a scan() , y sobre refresh() todos sus @Bean mtodos sern procesados y registrada como definiciones de frijol dentro del contenedor.

Soporte para aplicaciones web con AnnotationConfigWebApplicationContext

Un WebApplicationContext variante de AnnotationConfigApplicationContext est disponible con AnnotationConfigWebApplicationContext . Esta aplicacin se puede utilizar la configuracin de la primavera ContextLoaderListener oyente servlet, Spring MVC DispatcherServlet , etc Lo que sigue es un web.xml que configura un fragmento de Spring MVC tpica aplicacin web. Observe el uso de la contextClass context-param param e init-:
<web-app> <- Configurar ContextLoaderListener utilizar AnnotationConfigWebApplicationContext en lugar del predeterminado XmlWebApplicationContext -> <context-param> <param-name> contextClass </ param-name> <param-value> org.springframework.web.context.support.AnnotationConfigWebApplication Context </ Param-value> </ Context-param> <- Ubicaciones de configuracin deben consistir en uno o ms comas o espacio delimitado totalmente calificados @ clases de configuracin. Totalmente calificado paquetes tambin puede ser especificado para el componente de deteccin de -> <context-param> <param-name> contextConfigLocation </ param-name> <param-value> com.acme.AppConfig </ param-value> </ Context-param> <- Bootstrap contexto, la raz de la aplicacin como de costumbre utilizando ContextLoaderListener -> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </ listenerclase> </ Listener> <- Declarar una DispatcherServlet Spring MVC, como de costumbre -> <servlet> <servlet-name> dispatcher </ servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </ servlet-clase> <- Configurar DispatcherServlet utilizar AnnotationConfigWebApplicationContext en lugar del predeterminado XmlWebApplicationContext -> <init-param> <param-name> contextClass </ param-name> <param-value> org.springframework.web.context.support.AnnotationConfigWebApplication Context </ Param-value> </ Init-param> <- Una vez ms, config ubicaciones deben consistir en uno o ms comas o espacio delimitado y totalmente calificados @ clases de configuracin ->

<init-param> <param-name> contextConfigLocation </ param-name> <param-value> com.acme.web.MvcConfig </ param-value> </ Init-param> </ Servlet> <- Mapa todas las solicitudes de / app / * para el servlet dispatcher -> <servlet-mapping> <servlet-name> dispatcher </ servlet-name> <url-pattern> / app / * </ url-pattern> </ Servlet-mapping> </ Web-app>

5.12.3 Composicin de Java basados en configuraciones Uso de la @Import anotacin

Por mucho que la <import/> elemento se utiliza en la primavera de archivos XML para ayudar en la modularizacin configuraciones, el @Import anotacin permite la carga @Bean definiciones de otra clase de configuracin:
@ Configuracin pblico ConfigA clase { public @ Bean A a () {return new A ();} } @ Configuracin @ Import (ConfigA.class) pblico ConfigB clase { public @ Bean B b () {return new B ();} }

Ahora, en lugar de tener que especificar tanto ConfigA.class y ConfigB.class al crear una instancia del contexto, slo ConfigB debe ser suministrada de manera explcita:
public static void main (String [] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext (ConfigB. clase); / / Ahora en grano A y B estar disponible ... A un ctx.getBean = (A. clase); B b = ctx.getBean (B. clase); }

Este enfoque simplifica la creacin de instancias de contenedores, ya que slo una clase tiene que ser tratada, en lugar de requerir que el desarrollador recordar un nmero potencialmente elevado de @Configuration clases durante la construccin.
Inyeccin de dependencias de la importacin de @Bean definiciones

El ejemplo anterior funciona, pero es simplista. En la mayora de los escenarios de prcticas, frijoles tienen dependencias entre s a travs de clases de configuracin. Al utilizar XML, esto no es un problema, per se, ya que no hay compilador involucrados, y simplemente se puede declarar ref="someBean" y la confianza que la primavera va a

trabajar a cabo durante la inicializacin del contenedor. Por supuesto, cuando se utiliza @Configuration clases, el compilador Java impone limitaciones en el modelo de configuracin, en la que las referencias a otros granos debe ser vlida la sintaxis de Java. Afortunadamente, la solucin de este problema es sencilla. Recuerde que @Configuration clases son en ltima instancia ms que otro grano en el contenedor esto significa que pueden aprovechar @Autowired metadatos inyeccin al igual que cualquier otro frijol! Consideremos un escenario ms real con varias @Configuration clases, cada una en funcin de granos declarados en los dems:
@ Configuracin ServiceConfig clase pblica { @ accountRepository privado AccountRepository autoconectados; public @ haba TransferService transferService () { return new TransferServiceImpl (accountRepository); } } @ Configuracin RepositoryConfig clase pblica { @ autoconectados privado DataSource dataSource; public @ haba accountRepository AccountRepository () { volver JdbcAccountRepository nuevo (dataSource); } } @ Configuracin @ Import ({ServiceConfig.class, RepositoryConfig.class}) SystemTestConfig clase pblica { public @ haba DataSource dataSource () {/ * return new DataSource * /} } public static void main (String [] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext (SystemTestConfig. clase); / / Cables todo para arriba a travs de clases de configuracin ... TransferService transferService = ctx.getBean (TransferService. clase); transferService.transfer (100,00, "A123", "C456"); }
Totalmente calificado granos importados para facilitar la navegacin

En el escenario anterior, utilizando @Autowired funciona bien y ofrece la modularidad deseado, pero determinar exactamente donde las definiciones de frijol autoconectados se declaran an es un tanto ambigua. Por ejemplo, un desarrollador mirando ServiceConfig , cmo se sabe exactamente dnde est el @Autowired AccountRepository frijol se declara? No es explcito en el cdigo, y esto puede estar bien. Recuerde que el SpringSource Tool Suite proporciona herramientas que pueden hacer que los grficos que muestran cmo todo est cableado - que puede ser todo lo

que usted necesita. Adems, su Java IDE puede encontrar fcilmente todas las declaraciones y los usos de la AccountRepository tipo, y rpidamente le mostrar la ubicacin de @Bean mtodos que devuelven ese tipo. En los casos en que esta ambigedad no es aceptable y desea tener la navegacin directa desde dentro del IDE de una @Configuration clase a otra, considerar autowiring las clases de configuracin propios:
@ Configuracin ServiceConfig clase pblica { @ repositoryConfig privado RepositoryConfig autoconectados; public @ haba TransferService transferService () { / / Navegar "a travs de" la clase de configuracin para el mtodo del Bean @! return new TransferServiceImpl (repositoryConfig.accountRepository ()); } }

En la situacin anterior, es completamente explcito donde AccountRepository se define. Sin embargo, ServiceConfig est estrechamente unida a RepositoryConfig , esa es la disyuntiva. Este acoplamiento apretado puede ser mitigado mediante la interfaz a base de extracto o clasistas @Configuration clases. Considere lo siguiente:
@ Configuracin ServiceConfig clase pblica { @ repositoryConfig privado RepositoryConfig autoconectados; public @ haba TransferService transferService () { return new TransferServiceImpl (repositoryConfig.accountRepository ()); } } @ Configuracin RepositoryConfig interfaz pblica { @ Haba accountRepository AccountRepository (); } @ Configuracin DefaultRepositoryConfig clase pblica implementa RepositoryConfig { public @ haba accountRepository AccountRepository () { volver JdbcAccountRepository nuevo (...); } } @ Configuracin @ Import ({ServiceConfig.class, DefaultRepositoryConfig.class}) / / importar la configuracin de concreto! SystemTestConfig clase pblica { public @ haba DataSource dataSource () {return / * DataSource * /} } public static void main (String [] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext (SystemTestConfig. clase);

TransferService transferService = ctx.getBean (TransferService. clase); transferService.transfer (100,00, "A123", "C456"); }

Ahora ServiceConfig es imprecisa con respecto al hormign DefaultRepositoryConfig , y construido en herramientas IDE sigue siendo til: ser fcil para el desarrollador para obtener una jerarqua de tipos de RepositoryConfig implementaciones. De esta manera, la navegacin por @Configuration clases y sus dependencias se convierte en no es diferente que el proceso habitual de la navegacin basada en interfaz de cdigo.
La combinacin de Java y XML de configuracin

Spring @Configuration apoyo de la clase no pretende ser un reemplazo completo al 100% para la primavera XML. Algunas instalaciones como espacios de nombres XML Spring siendo una forma ideal para configurar el contenedor. En los casos en que XML es conveniente o necesario, usted tiene una opcin: o bien crear una instancia del contenedor en un "XML-cntrica" camino utilizando, por ejemplo, ClassPathXmlApplicationContext , o en un "Java-cntrico" moda usando AnnotationConfigApplicationContext y la @ImportResource anotacin a importar XML segn sea necesario.
XML centrado en el uso de la @Configuration clases

Puede ser preferible para arrancar el contenedor de Spring XML e incluir @Configuration clases de una manera ad-hoc. Por ejemplo, en una base de cdigo grande existente que utiliza Spring XML, ser ms fcil para crear @Configuration clases en una funcin de las necesidades y los incluyen desde los archivos XML existentes. A continuacin encontrar las opciones para el uso de @Configuration clases en este tipo de "XML centrado en" situacin.
Declarar @Configuration clases como la Primavera llanura <bean/> elementos

Recuerde que @Configuration clases son en ltima instancia, slo las definiciones de frijol en el recipiente. En este ejemplo, se crea una @Configuration clase llamada AppConfig e incluirlo en system-test-config.xml como <bean/> definicin. Porque <context:annotation-config/> est encendido, el contenedor reconocer la @Configuration anotacin, y procesar los @Bean mtodos declarados en AppConfig correctamente.
@ Configuracin AppConfig clase pblica { @ autoconectados privado DataSource dataSource; public @ haba accountRepository AccountRepository () { volver JdbcAccountRepository nuevo (dataSource); } public @ haba TransferService transferService () { volver TransferService nuevo (accountRepository ()); } }

sistema de prueba-config.xml <beans> <- Habilitar el procesamiento de anotaciones como @ @ autoconectados y configuracin -> <context:annotation-config/> <context:property-placeholder ubicacin = "classpath:/com/acme/jdbc.properties" /> <bean class = "com.acme.AppConfig" /> <bean class = "org.springframework.jdbc.datasource.DriverManagerDataSource"> <propiedad nombre = valor = "url" "${jdbc.url}" /> <propiedad nombre = valor = "username" "${jdbc.username}" /> <propiedad nombre = valor = "password" "${jdbc.password}" /> </ Bean> </ Beans> jdbc.properties jdbc.url = jdbc: hsqldb: hsql :/ / localhost / xdb jdbc.username = sa jdbc.password = public static void main (String [] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext ("com classpath :/ / acme / system-test-config.xml"); TransferService transferService = ctx.getBean (TransferService. clase); / / ... }

Nota

En system-test-config.xml anterior, el AppConfig<bean/> no declara una id elemento. Aunque sera aceptable hacerlo, es innecesario, dado que no haba otra vez se refieren a l, y es poco probable que sea explcitamente captar del contenedor por su nombre. Lo mismo sucede con el DataSource de frijol - es slo alguna vez autoconectados por tipo, por lo que un grano de Identificacin explcita no es estrictamente necesario.
Usando <context:component-scan/> para recoger @Configuration clases

Debido a @Configuration es meta-anotado con @Component , @Configuration anotado clases son automticamente candidatos para la exploracin de los componentes. Utilizando el mismo escenario que el anterior, podemos redefinir system-testconfig.xml para aprovechar componente de exploracin. Ntese que en este caso, no es necesario declarar explcitamente <context:annotation-config/> , porque <context:component-scan/> permite a todos la misma funcionalidad.
sistema de prueba-config.xml <beans> <- Recoge y registra AppConfig como una definicin de bean -> <context:component-scan base-package = "com.acme" /> <context:property-placeholder ubicacin = "classpath:/com/acme/jdbc.properties" /> <bean class = "org.springframework.jdbc.datasource.DriverManagerDataSource"> <propiedad nombre = valor = "url" "${jdbc.url}" /> <propiedad nombre = valor = "username" "${jdbc.username}" />

<propiedad nombre = valor = "password" "${jdbc.password}" /> </ Bean> </ Beans> @Configuration clase centrada en el uso de XML con @ImportResource

En aplicaciones donde @Configuration clases son el principal mecanismo para la configuracin del recipiente, todava ser probable que sea necesario utilizar al menos algunos XML. En estos casos, basta con utilizar @ImportResource y definir slo lo XML como sea necesario. Si lo hace, logra un "Java-cntrico" para configurar el contenedor XML y mantiene al mnimo.
@ Configuracin @ ImportResource ("classpath :/ com / acme / properties-config.xml") AppConfig clase pblica { Value @ privada ("$ {} jdbc.url") url String; Value @ privada ("$ {} jdbc.username") String username; Value @ privada ("$ {} jdbc.password") String password; public @ haba DataSource dataSource () { return new DriverManagerDataSource (url, nombre de usuario, contrasea); } } propiedades-config.xml <beans> <context:property-placeholder ubicacin = "classpath:/com/acme/jdbc.properties" /> </ Beans> jdbc.properties jdbc.url = jdbc: hsqldb: hsql :/ / localhost / xdb jdbc.username = sa jdbc.password = public static void main (String [] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext (AppConfig. clase); TransferService transferService = ctx.getBean (TransferService. clase); / / ... }

5.12.4 Uso del @Bean anotacin


@Bean

es una anotacin de nivel de mtodo y un anlogo directo del XML <bean/> elemento. La anotacin soporta algunos de los atributos que ofrece <bean/> , tales como: init-method , destroy-method , autowiring y name . Usted puede utilizar el @Bean anotacin en una @Configuration anotado o en un @Component anotado clase.
Declarar un bean

Para declarar un bean, simplemente anotar un mtodo con el @Bean anotacin. Este mtodo se utiliza para registrar una definicin de bean dentro de un ApplicationContext del tipo especificado como valor de retorno del mtodo. Por

defecto, el nombre del bean ser el mismo que el nombre del mtodo. El siguiente es un ejemplo sencillo de un @Bean declaracin de mtodo:
@ Configuracin AppConfig clase pblica { @ Frijol transferService pblico TransferService () { volver TransferServiceImpl nuevo (); } }

La configuracin anterior es exactamente equivalente a la siguiente XML Spring:


<beans> <bean id = "transferService" class = "com.acme.TransferServiceImpl" /> </ Beans>

Ambas declaraciones hacen un bean llamado transferService disponible en el ApplicationContext , con destino a una instancia de objeto de tipo TransferServiceImpl :
transferService -> com.acme.TransferServiceImpl

Inyeccin de dependencias

Cuando @Bean s tienen dependencias entre s, expresando que la dependencia es tan simple como tener un grano de llamar a otro mtodo:
@ Configuracin AppConfig clase pblica { @ Frijol pblico Foo foo () { return new Foo (bar ()); } @ Frijol bar Bar pblico () { volver nueva barra (); } }

En el ejemplo anterior, el foo bean recibe una referencia a la bar a travs de la inyeccin de constructor.
Recepcin de las devoluciones de llamada de ciclo de vida

Beans declarados en un @Configuration apoyo de la clase anotado las devoluciones de llamada de ciclo de vida normales. Las categoras que se definen con el @Bean

anotacin puede utilizar el @PostConstruct y @PreDestroy de anotaciones JSR-250, consulte JSR-250 anotaciones para ms detalles. La primavera regulares del ciclo de vida callbacks estn completamente soportadas. Si un bean implementa InitializingBean , DisposableBean , o Lifecycle , sus respectivos mtodos son llamados por el contenedor. El conjunto estndar de *Aware interfaces como BeanFactoryAware , BeanNameAware , MessageSourceAware , ApplicationContextAware , etc tambin son totalmente compatibles. El @Bean anotacin permite especificar la inicializacin arbitraria y mtodos de destruccin de devolucin de llamada, al igual que la primavera XML init-method y destroy-method atributos en el bean elemento:
public class Foo { public void init () { / / Inicializacin lgica } } Bar public class { limpieza public void () { / / Destruccin lgica } } @ Configuracin AppConfig clase pblica { @ Bean (InitMethod = "init") pblico Foo foo () { return new Foo (); } @ Bean (destroyMethod = "limpieza") bar Bar pblico () { volver nueva barra (); } }

Por supuesto, en el caso de Foo arriba, sera igualmente vlidas para llamar al init() mtodo directamente durante la construccin:
@ Configuracin AppConfig clase pblica { @ Frijol pblico Foo foo () { Foo foo = new Foo (); foo.init (); volver foo; } / / ... }

Punta

Cuando se trabaja directamente en Java, puede hacer lo que quieras con tus objetos

y no siempre hay que confiar en el ciclo de vida del envase!


Especificacin del mbito de frijol
Usando el @Scope anotacin

Puede especificar que los beans definidos con el @Bean anotacin debe tener un mbito de aplicacin especfico. Puede utilizar cualquiera de los mbitos especificados en el estndar de la haba Scopes seccin. El mbito predeterminado es singleton , pero se puede reemplazar esto con el @Scope anotacin:
@ Configuracin MyConfiguration clase pblica { @ Frijol @ Scope ("prototipo") pblico encriptador Encryptor () { / / ... } } @Scope and scoped-proxy

Spring ofrece una manera conveniente de trabajar con las dependencias de mbito a travs de proxies mbito . La manera ms fcil de crear un proxy cuando se utiliza la configuracin XML es el <aop:scoped-proxy/> elemento. Configuracin de los frijoles en Java con una anotacin @ Scope ofrece un apoyo equivalente al atributo proxyMode. El valor predeterminado es sin proxy ( ScopedProxyMode.NO ), pero se puede especificar ScopedProxyMode.TARGET_CLASS o ScopedProxyMode.INTERFACES . Si usted transfiere el ejemplo de proxy mbito de la documentacin de referencia XML (ver enlace anterior) a nuestro @Bean usando Java, se vera como la siguiente:
/ / HTTP mbito de sesin haba expuesto como un proxy @ Frijol @ Scope (value = "sesin", proxyMode = ScopedProxyMode.TARGET_CLASS) PreferenciasDelUsuario PreferenciasDelUsuario pblico () { volver PreferenciasDelUsuario nuevo (); } @ Frijol UserService servicio pblico () { UserService servicio = new SimpleUserService (); / / Una referencia al bean PreferenciasDelUsuario proxy service.setUserPreferences PreferenciasDelUsuario (()); devolver servicio; } Lookup inyeccin mtodo

Como se ha sealado anteriormente, bsqueda inyeccin mtodo es una funcin avanzada que se debe utilizar en raras ocasiones. Es til en los casos en que un bean

singleton de mbito tiene una dependencia en un bean con mbito de prototipo. Uso de Java para este tipo de configuracin proporciona un medio natural para la aplicacin de este patrn.
public abstract class {Administrador de comandos proceso public Object (Objeto commandState) { / / Tomar una nueva instancia de la interfaz de comandos apropiado Comando comando CreateCommand = (); / / Establecer el estado de la instancia de comando (con suerte estrenar) command.setState (commandState); volver Command.Execute (); } / / Bien ... pero dnde est la aplicacin de este mtodo? protegido abstracto Comando CreateCommand (); }

Uso de Java-soporte de configuracin, puede crear una subclase de CommandManager cuando el resumen createCommand() mtodo se reemplaza de manera que se vea una nueva (prototipo) objeto de comando:
@ Frijol @ Scope ("prototipo") asyncCommand pblico AsyncCommand () { AsyncCommand comando = new AsyncCommand (); / / Inyectar dependencias aqu como se requiere volver mando; } @ Frijol pblica Administrador de comandos del Administrador de comandos () { / / Devuelve nueva implementacin annimo de Administrador de comandos con el comando () reemplaza / / Devolver un objeto prototipo nuevo Comando volver Administrador de comandos new () { Comando protegida CreateCommand () { volver asyncCommand (); } } }

Personalizacin de frijol de nomenclatura

De forma predeterminada, las clases de configuracin utiliza un @Bean nombre de mtodo como el nombre del grano resultante. Esta funcionalidad se puede cambiar, sin embargo, con el name atributo.
@ Configuracin AppConfig clase pblica { @ Bean (name = "myFoo") pblico Foo foo () { return new Foo (); }

Frijol aliasing

Como se discuti en la Seccin 5.3.1, "Asignacin de nombres frijoles" , a veces es conveniente dar algunos nombres de frijol individuales mltiples, tambin conocido como aliasing frijol. El name del atributo @Bean anotacin acepta una matriz de String para este fin.
@ Configuracin AppConfig clase pblica { @ Bean (name = {"origen de datos", "subsystemA-dataSource", "subsystemB-dataSource"}) pblica DataSource dataSource () { / / Instanciar, configurar y volver DataSource frijol ... } }

5.12.5 Para ms informacin acerca de cmo la configuracin basada en Java funciona internamente

El siguiente ejemplo muestra un @Bean anotado mtodo que se llama dos veces:
@ Configuracin AppConfig clase pblica { @ Frijol pblico clientService1 ClientService () ClientServiceImpl clientService = new clientService.setClientDao (clientDao volver clientService; } @ Frijol pblico ClientService clientService2 () ClientServiceImpl clientService = new clientService.setClientDao (clientDao volver clientService; } @ Frijol pblico ClientDao clientDao () { volver ClientDaoImpl nuevo (); } } { ClientServiceImpl (); ());

{ ClientServiceImpl (); ());

clientDao() ha sido llamado una vez en clientService1() y una vez en clientService2() . Dado que este mtodo crea una nueva instancia de ClientDaoImpl y lo devuelve, que normalmente se esperara tener 2 casos (uno por

cada servicio). Que sin duda sera problemtico: en primavera, frijoles instancias tienen un singleton alcance de forma predeterminada. Aqu es donde la magia viene en: Todos @Configuration clases son subclases en el arranque en tiempo con CGLIB . En la subclase, el mtodo nio comprueba el primer contenedor para cualquier cach (mbito) de frijoles antes de llamar al mtodo primario y crea una nueva instancia.

Tenga en cuenta que en la primavera de 3,2, ya no es necesario aadir CGLIB a la ruta de clases porque las clases CGLIB han vuelto a empaquetar bajo org.springframework e incluy directamente en el muelle JAR-core.
Nota

El comportamiento puede ser diferente de acuerdo con el alcance de su grano. Estamos hablando de singletons aqu.
Nota

Hay algunas restricciones debido al hecho de que CGLIB dinmicamente aade caractersticas al inicio del tiempo:

Clases de configuracin no debe ser final Ellos deben tener un constructor sin argumentos

5.13 Registro de una LoadTimeWeaver


El LoadTimeWeaver es utilizado por resorte para transformar dinmicamente clases, ya que se cargan en la mquina virtual Java (JVM). Para habilitar la carga a tiempo tejiendo aadir el @EnableLoadTimeWeaving a uno de tus @Configuration clases:
@ Configuracin @ EnableLoadTimeWeaving AppConfig clase pblica { }

Como alternativa para la configuracin XML utiliza el context:load-time-weaver elemento:


<beans> <context:load-time-weaver/> </ Beans>

Una vez configurado para el ApplicationContext . Cualquier bean dentro que ApplicationContext puede implementar LoadTimeWeaverAware , recibiendo as una referencia a la instancia de tiempo de carga tejedor. Esto es particularmente til en combinacin con el apoyo JPA Spring donde en tiempo de carga tejido puede ser necesaria para la transformacin clase APP. Consulte la LocalContainerEntityManagerFactoryBean Javadoc para obtener ms detalles. Para ms informacin sobre AspectJ en tiempo de carga tejer, ver la Seccin 9.8.4, "en tiempo de carga de tejer con AspectJ en el marco de la Primavera" .

5.14 Capacidades adicionales de la ApplicationContext

Como se discuti en la introduccin del captulo, el org.springframework.beans.factory paquete proporciona la funcionalidad bsica para la gestin y manipulacin de granos, incluyendo de manera programtica. El org.springframework.context package agrega el ApplicationContext interfaz, la cual se extiende la BeanFactory interfaz, adems de ampliar otras interfaces para proporcionar funcionalidad adicional en una aplicacin ms orientada al estilo de marco. Muchas personas usan el ApplicationContext de forma totalmente declarativo, ni siquiera la creacin de programacin, pero en lugar de confiar en las clases de apoyo, como ContextLoader para crear una instancia automticamente un ApplicationContext como parte del proceso normal de inicio de una aplicacin web J2EE. Para mejorar BeanFactory funcionalidad en un estilo ms orientado al marco del paquete de contexto tambin proporciona las siguientes funcionalidades:

El acceso a los mensajes de i18n de estilo, a travs de la MessageSource interfaz. El acceso a los recursos, tales como URLs y archivos, a travs de la ResourceLoader interfaz. Evento publicacin de granos de ejecucin de la ApplicationListener interfaz, a travs del uso de la ApplicationEventPublisher interfaz. Carga de mltiples (jerrquica) contextos, permitiendo que cada uno se centra en una capa particular, tal como la capa de banda de una aplicacin, a travs de la HierarchicalBeanFactory interfaz.

5.14.1 La internacionalizacin mediante MessageSource

El ApplicationContext interfaz extiende una interfaz llamada MessageSource , y por lo tanto proporciona la internacionalizacin (i18n) funcionalidad. La primavera tambin proporciona la interfaz HierarchicalMessageSource , que puede resolver los mensajes de forma jerrquica. En conjunto, estas interfaces proporcionan la base sobre la cual los efectos de primavera resolucin mensaje. Los mtodos definidos en estas interfaces incluyen:
String getMessage(String code, Object[] args, String default, Locale loc) : El mtodo bsico que se utiliza para recuperar un mensaje de la MessageSource . Cuando no se encuentra mensaje para el entorno local

especificado, el mensaje predeterminado se utiliza. Los argumentos que se pasan en los valores de reposicin se convierten, con el MessageFormat funcionalidad proporcionada por la biblioteca estndar. String getMessage(String code, Object[] args, Locale loc) : Esencialmente lo mismo que el mtodo anterior, pero con una diferencia: no hay mensaje predeterminado se puede especificar, si el mensaje no puede ser encontrado, un NoSuchMessageException es lanzada.
String getMessage(MessageSourceResolvable resolvable, Locale locale) : Todas las categoras utilizadas en los mtodos anteriores tambin estn envueltos en una clase denominada MessageSourceResolvable , que se

puede utilizar con este mtodo.

Cuando un ApplicationContext est cargado, busca automticamente una MessageSource bean definido en el contexto. El grano debe tener el nombre messageSource . Si tal frijol se encuentra, todas las llamadas a los mtodos anteriores se delegan en el origen del mensaje. Si no hay ninguna fuente del mensaje se encuentra, el ApplicationContext intenta encontrar una matriz que contiene un grano con el mismo nombre. Si lo hace, se utiliza como la que haba MessageSource . Si el ApplicationContext no puede encontrar ninguna fuente para mensajes, un vaco DelegatingMessageSource se instancia con el fin de ser capaz de aceptar llamadas a los mtodos definidos anteriormente. Spring proporciona dos MessageSource implementaciones, ResourceBundleMessageSource y StaticMessageSource . Tanto implementar HierarchicalMessageSource con el fin de hacer de mensajera anidada. El StaticMessageSource rara vez se utiliza, pero proporciona formas programticas para agregar mensajes a la fuente. El ResourceBundleMessageSource se muestra en el ejemplo siguiente:
<beans> <Bean id = "MessageSource" class = "org.springframework.context.support.ResourceBundleMessageSource"> <propiedad nombre = "basenames"> <list> <valor> formato </ value> <valor> excepciones </ value> <valor> ventanas </ value> </ List> </ Propiedad> </ Bean> </ Beans>

En el ejemplo se supone que tiene tres paquetes de recursos definidos en la ruta de clases llamado format , exceptions y windows . Las solicitudes para resolver un mensaje se manejan de manera estndar JDK de resolver a travs de mensajes ResourceBundles. Para los fines del ejemplo, asumir los contenidos de dos de los archivos de paquetes por encima de los recursos son ...
# En format.properties message = caimanes rock! # En exceptions.properties El argument.required = '{0}' argumento es necesario.

Un programa para ejecutar el MessageSource funcionalidad se muestra en el ejemplo siguiente. Recuerde que todos los ApplicationContext implementaciones son tambin MessageSource implementaciones y as se puede convertir a la MessageSource interfaz.
public static void main (String [] args) { Recursos MessageSource = new ClassPathXmlApplicationContext ("beans.xml"); Cadena message = resources.getMessage ("mensaje", null, "Default", null); System.out.println (mensaje); }

La salida resultante del anterior programa es ...


Los caimanes rock!

As que para resumir, el MessageSource se define en un archivo llamado beans.xml , que existe en la raz de la ruta de clases. El messageSource bean definicin se refiere a una serie de paquetes de recursos a travs de su basenames propiedad. Los tres archivos que se pasan en la lista a la basenames propiedad existen como archivos en la raz de la ruta de clases y se llaman format.properties , exceptions.properties y windows.properties respectivamente. El siguiente ejemplo muestra los argumentos pasados a la bsqueda de mensajes, estos argumentos se convierten en cadenas y se inserta en los marcadores de posicin en el mensaje de bsqueda.
<beans> <- Este MessageSource se utiliza en una aplicacin web -> <bean id = "messageSource" class = "org.springframework.context.support.ResourceBundleMessageSource"> <propiedad nombre = valor = "basename" "exceptions" /> </ Bean> <- Permite inyectar el MessageSource anteriormente en este POJO -> <bean id = "example" class = "com.foo.Example"> <propiedad nombre = "messages" ref = "messageSource" /> </ Bean> </ Beans> public class Ejemplo { MessageSource mensajes privados; public void Fijos (mensajes MessageSource) { estos mensajes = mensajes.; } public void execute () { String mensaje = esta messages.getMessage. ("Argument.required" new Object [] {"UserDAO"}, "REQUERIDO", null); System.out.println (mensaje); } }

La salida resultante de la invocacin del execute() mtodo ser ...


El argumento UserDao se requiere.

En cuanto a la internacionalizacin (i18n), varios de Spring MessageResource implementaciones que cumplan las resoluciones misma localidad y reglas de reserva como el estndar JDK ResourceBundle . En definitiva, y siguiendo con el ejemplo messageSource definido anteriormente, si desea resolver mensajes contra los britnicos (es-ES) lugar, debe crear archivos llamados format_en_GB.properties , exceptions_en_GB.properties y windows_en_GB.properties respectivamente.

Tpicamente, la resolucin local es administrado por el medio ambiente circundante de la aplicacin. En este ejemplo, la configuracin regional contra el cual (British) mensajes sern resueltas se especifica manualmente.
# En exceptions_en_GB.properties argument.required = Ebagum muchacho, el '{0}' argumento es necesario, digo, es necesario. public static void main (String [] args definitivo) { Recursos MessageSource = new ClassPathXmlApplicationContext ("beans.xml"); Cadena message = resources.getMessage ("argument.required" new Object [] {"UserDAO"}, "REQUERIDO", Locale.UK); System.out.println (mensaje); }

La salida resultante de la ejecucin del programa anterior ser ...


Ebagum muchacho, el argumento de la "UserDAO" es necesario, digo, es necesario.

Tambin puede utilizar el MessageSourceAware interfaz para adquirir una referencia a cualquier MessageSource que se ha definido. Cualquier grano que se define en un ApplicationContext que implementa la MessageSourceAware interfaz que se inyecta con el contexto de aplicacin de MessageSource cuando el grano est creado y configurado.
Nota

Como una alternativa a ResourceBundleMessageSource , Spring proporciona un ReloadableResourceBundleMessageSource clase. Esta variante admite el formato de archivo de paquete mismo, pero es ms flexible que el JDK estndar basado ResourceBundleMessageSource aplicacin. En particular, permite la lectura de archivos desde cualquier ubicacin del recurso de primavera (no slo desde el classpath) y soporta hot carga de archivos de propiedades de paquete (mientras eficiente entre ellos el almacenamiento en cach). Echa un vistazo a la ReloadableResourceBundleMessageSource javadoc para ms detalles.
5.14.2 Eventos estndar y personalizados

Gestin de eventos en el ApplicationContext se proporciona a travs de la ApplicationEvent clase y ApplicationListener interfaz. Si un bean que implementa la ApplicationListener interfaz se implementa en el contexto, cada vez que un ApplicationEvent se publican en el ApplicationContext , que el frijol es notificado. Esencialmente, este es el patrn Observer diseo estndar. Spring proporciona los eventos estndar siguientes: Tabla 5.7. Built-in Eventos
Evento
ContextRefreshedEvent

Explicacin Publicado en el ApplicationContext se inicializa o actualiza,

Evento

Explicacin por ejemplo, utilizando el refresh() mtodo en el ConfigurableApplicationContext interfaz. "Iniciada" aqu significa que todos los granos estn cargados, post-procesador granos se detectan y se activa, singletons son pre-instanciada, y la ApplicationContext objeto est listo para su uso. Siempre que el contexto no se ha cerrado, una actualizacin puede ser activado varias veces, siempre que los elegidos ApplicationContext apoya en realidad tales "calientes" actualiza. Por ejemplo, XmlWebApplicationContext apoya refresca calientes, pero GenericApplicationContext no lo hace. Publicado en el ApplicationContext se ha iniciado, con el start() mtodo en el ConfigurableApplicationContext interfaz. "Iniciado" aqu significa que todos los Lifecycle granos de recibir una seal de arranque explcito. Tpicamente esta seal se utiliza para reiniciar frijoles despus de una parada explcita, sino que tambin se puede utilizar para iniciar los componentes que no se han configurado para arranque automtico, por ejemplo, componentes que no han comenzado ya en la inicializacin. Publicado en el ApplicationContext se detiene, con el stop() mtodo en el ConfigurableApplicationContext interfaz. "Detenido" aqu significa que todos los Lifecycle frijoles recibir una seal de stop explcito. Un contexto parado puede ser reiniciado a travs de una start() llamada. Publicado en el ApplicationContext se cierra, usando el close() mtodo en el ConfigurableApplicationContext interfaz. "Cerrado" significa que todos los granos simples se destruyen. Un contexto cerrado llega al final de su vida, no se puede actualizar o reiniciar. Un evento en la web especfica diciendo que todos los granos de una peticin HTTP ha sido reparado. Este evento se public despus de la peticin se ha completado. Este evento slo se aplica a las aplicaciones web usando Spring DispatcherServlet .

ContextStartedEvent

ContextStoppedEvent

ContextClosedEvent

RequestHandledEvent

Tambin puede crear y publicar sus propios eventos personalizados. Este ejemplo muestra una clase simple que se extiende Spring ApplicationEvent clase base:
pblico BlackListEvent clase extiende ApplicationEvent {

direccin privada final String; private String prueba final; BlackListEvent pblico (fuente de objetos, direccin de la cadena, test String) { super (fuente); esta direccin = direccin.; este test = test.; } / / De acceso y otros mtodos ... }

Para publicar una costumbre ApplicationEvent , llame a la publishEvent() mtodo en un ApplicationEventPublisher . Normalmente esto se hace mediante la creacin de una clase que implementa ApplicationEventPublisherAware y registrarlo como frijol de primavera. El siguiente ejemplo muestra una clase:
EmailService clase pblica implementa ApplicationEventPublisherAware { Lista privado <String> lista negra; editor ApplicationEventPublisher privado; setBlackList public void (lista negra Lista <String>) { Esta lista negra = lista negra.; } public void setApplicationEventPublisher (ApplicationEventPublisher editor) { este publisher = editor.; } public void sendEmail (direccin String, String texto) { if (blackList.contains (direccin)) { BlackListEvent evento = new BlackListEvent (este, direccin, texto); publisher.publishEvent (evento); volver; } / / Enviar correo electrnico ... } }

Al momento de la configuracin, el contenedor Spring detectar que EmailService implementa ApplicationEventPublisherAware y llamar automticamente setApplicationEventPublisher() . En realidad, el parmetro pasado ser el contenedor Spring s mismo; simplemente est interactuando con el contexto de aplicacin a travs de su ApplicationEventPublisher interfaz. Para recibir el encargo ApplicationEvent , cree una clase que implementa ApplicationListener y registrarlo como un bean de Spring. El siguiente ejemplo muestra una clase:
pblico BlackListNotifier clase implementa ApplicationListener <BlackListEvent> {

notificationAddress private String; public void setNotificationAddress (String notificationAddress) { este notificationAddress = notificationAddress.; } onApplicationEvent public void (BlackListEvent evento) { / / Notificar a las partes correspondientes a travs de notificationAddress ... } }

Tenga en cuenta que ApplicationListener genricamente se parametriza con el tipo de tu evento personalizado, BlackListEvent . Esto significa que el onApplicationEvent() mtodo puede permanecer de tipo seguro, evitando cualquier necesidad de downcasting. Usted puede registrarse como detectores de eventos que lo desee, pero tenga en cuenta que por detectores de eventos predeterminados recibir eventos de forma sincrnica. Esto significa que el publishEvent() mtodo se bloquea hasta que todos los oyentes han terminado de procesar el evento. Una ventaja de este enfoque sincrnico y un solo hilo, es que cuando un oyente recibe un evento, que opera dentro del contexto de la transaccin del editor si un contexto de transaccin se encuentra disponible. Si otra estrategia para su publicacin evento se convierte en necesario, consulte el JavaDoc para la primavera de ApplicationEventMulticaster interfaz. El siguiente ejemplo muestra las definiciones de frijol utilizados para registrar y configurar cada una de las clases anteriores:
<bean id = "emailService" class = "example.EmailService"> <propiedad nombre = "blackList"> <list> <valor> known.spammer @ example.org </ value> <valor> known.hacker @ example.org </ value> <valor> john.doe @ example.org </ value> </ List> </ Propiedad> </ Bean> <bean id = "blackListNotifier" class = "example.BlackListNotifier"> <propiedad nombre = valor = "notificationAddress" "blacklist@example.org" /> </ Bean>

Poniendo todo junto, cuando el sendEmail() mtodo de la emailService frijol se llama, si hay correos electrnicos que deben ser incluidos en listas negras, un evento personalizado de tipo BlackListEvent se publica. El blackListNotifier bean est registrada como un ApplicationListener y as recibe la BlackListEvent , en cuyo punto se puede notificar a las partes apropiadas.
Nota

Mecanismo de concurso completo de Spring est diseado para la comunicacin sencilla entre granos de primavera en el contexto de la aplicacin misma. Sin embargo, para las necesidades de integracin ms sofisticados de la empresa, por

separado mantenido Spring Integration proyecto proporciona soporte completo para la construccin de peso ligero, diseo orientados , arquitecturas basadas en eventos que se basan en el modelo Spring conocido programacin.
5.14.3 La facilidad de acceso a bajo nivel de recursos

Para un uso ptimo y la comprensin de los contextos de aplicacin, los usuarios generalmente deben familiarizarse con la primavera de Resource abstraccin, como se describe en el captulo Captulo 6, Recursos . Un contexto de aplicacin es un ResourceLoader , que puede ser usado para cargar Resource s. Un Resource es esencialmente una versin ms funcional de la JDK clase java.net.URL , de hecho, las implementaciones del Resource envolver una instancia de java.net.URL donde sea apropiado. Un Resource puede obtener bajo nivel de recursos desde casi cualquier lugar de una forma transparente, incluso de la ruta de clase, en una ubicacin del sistema de archivos, en cualquier lugar se puede describir con una URL estndar, y algunas otras variaciones. Si la cadena de localizacin de recursos es un camino sencillo, sin ningn tipo de prefijos especiales, donde los recursos provienen de es especfico y adecuado para el tipo de aplicacin contexto real. Se puede configurar un bean desplegado en el contexto de aplicacin para implementar la interfaz de devolucin de llamada especial, ResourceLoaderAware , que se activa automticamente de nuevo en tiempo de inicializacin con el contexto de la aplicacin en s pasa como ResourceLoader . Tambin puede exponer las propiedades de tipo Resource , que se utiliza para acceder a los recursos estticos, sino que se inyecta en l como cualquier otra propiedad. Puede especificar los Resource propiedades como las rutas de cadena simple, y se basan en un JavaBean especial PropertyEditor que es automticamente registrado por el contexto, para convertir las cadenas de texto reales Resource objeto cuando el bean es desplegado. La ruta de ubicacin o rutas suministrada a un ApplicationContext constructor son en realidad cadenas de recursos, y en forma sencilla se tratan adecuadamente para la implementacin de contexto especfico. ClassPathXmlApplicationContext trata una va de ubicacin simple como un lugar classpath. Tambin puede utilizar las vas de ubicacin (cadenas de recursos) con prefijos especiales para forzar la carga de las definiciones de la ruta de clases o una URL, sin importar el tipo de contexto real.
5.14.4 conveniente ApplicationContext creacin de instancias para las aplicaciones web

Se puede crear ApplicationContext casos declarativa usando, por ejemplo, un ContextLoader . Por supuesto, tambin puede crear ApplicationContext casos mediante programacin con uno de los ApplicationContext implementaciones. El ContextLoader mecanismo viene en dos sabores: el ContextLoaderListener y la ContextLoaderServlet . Ellos tienen la misma funcionalidad, pero difieren en que la versin oyente no es fiable en Servlet 2,3 recipientes. En la especificacin Servlet 2.4, los oyentes de contexto servlet debe ejecutar inmediatamente despus de que el contexto de servlet de la aplicacin web se ha creado y est disponible para el servicio de la

primera solicitud (y tambin cuando el contexto servlet est a punto de ser cerrado). En tal contexto oyente Servlet es un lugar ideal para inicializar la primavera ApplicationContext . En igualdad de condiciones, probablemente preferira ContextLoaderListener , para ms informacin sobre la compatibilidad, tener una mirada en el Javadoc para la ContextLoaderServlet . Puede registrar un ApplicationContext utilizando el ContextLoaderListener de la siguiente manera:
<context-param> <param-name> contextConfigLocation </ param-name> <param-value> / WEB-INF/daoContext.xml / WEBINF/applicationContext.xml </ param-value> </ Context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </ listenerclase> </ Listener> <- O utilizar la ContextLoaderServlet en lugar del oyente por encima <servlet> <servlet-name> contexto </ servlet-name> <servlet-class> org.springframework.web.context.ContextLoaderServlet </ servlet-clase> <load-on-startup> 1 </ load-on-startup> </ Servlet> ->

El oyente inspecciona el contextConfigLocation parmetro. Si el parmetro no existe, el oyente utiliza /WEB-INF/applicationContext.xml por defecto. Cuando el parmetro no existe, el oyente separa la cadena utilizando delimitadores predeterminados (coma, punto y coma y un espacio en blanco) y utiliza los valores como lugares donde los contextos de aplicacin ser la bsqueda. Estilo Ant patrones de ruta se apoyan tambin. Algunos ejemplos son /WEB-INF/*Context.xml para todos los archivos con nombres que terminan en "context.xml", con domicilio en la "WEB-INF" del directorio y /WEB-INF/**/*Context.xml , para todos este tipo de archivos en cualquier subdirectorio de "WEB-INF". Puede utilizar ContextLoaderServlet en lugar de ContextLoaderListener . El servlet utiliza el contextConfigLocation parmetro al igual que el oyente hace.
5.14.5 Implementacin de un ApplicationContext primavera como un archivo RAR J2EE

En la primavera de 2,5 y ms tarde, es posible desplegar una ApplicationContext primavera como un archivo RAR, que encapsula el contexto y todas sus clases bean requeridos y JAR de biblioteca en una unidad de despliegue J2EE RAR. Este es el equivalente de un programa previo independiente ApplicationContext, slo alojado en entorno J2EE, ser capaz de acceder a las instalaciones J2EE servidores. RAR despliegue es una alternativa ms natural para escenario de desplegar un archivo WAR sin cabeza,

en efecto, un archivo WAR sin puntos de entrada HTTP que se utiliza slo para el arranque de un ApplicationContext primavera en un entorno J2EE. RAR despliegue es ideal para los contextos de aplicacin que no necesitan puntos de entrada HTTP, sino ms bien consistir slo en los puntos finales de mensajes y trabajos programados. Beans en este contexto puede utilizar los recursos del servidor de aplicaciones, tales como la transaccin JTA gerente y JNDI unido a fuentes de datos JDBC y casos JMS ConnectionFactory, y tambin puede registrarse con el servidor de la plataforma JMX - todo a travs de la gestin de transacciones estndar de Spring y JNDI e instalaciones JMX apoyo. Componentes de aplicaciones tambin pueden interactuar con JCA WorkManager del servidor de aplicaciones a travs de Spring TaskExecutor abstraccin. Echa un vistazo a la documentacin JavaDoc de la SpringContextResourceAdapter clase para los detalles de configuracin involucrados en el despliegue RAR. Para una implementacin simple de un ApplicationContext primavera como un archivo RAR J2EE: todas las clases del paquete de aplicaciones en un archivo RAR, que es un archivo JAR de serie con una extensin de archivo diferente. Aadir todos los archivos JAR de biblioteca necesarios en la raz del archivo RAR. Agregar un "METAINF/ra.xml" descriptor de despliegue (como se muestra en SpringContextResourceAdapter JavaDoc s) y el frijol de primavera correspondiente archivo de definicin XML (s) (por lo general "META-INF/applicationContext.xml"), y coloque los RAR resultantes presentar en el directorio de instalacin del servidor de aplicaciones.
Nota

Estas unidades de despliegue RAR suelen ser autnomo y no exponga los componentes para el mundo exterior, ni siquiera a otros mdulos de la misma aplicacin. Interaccin con un ApplicationContext RAR basado por lo general ocurre a travs de destinos de JMS que comparte con otros mdulos. A ApplicationContext RAR basado tambin puede, por ejemplo, programar algunos puestos de trabajo, en respuesta a los nuevos archivos del sistema de archivos (o similar). Si es necesario para permitir el acceso sincrnico desde el exterior, que podra, por ejemplo exportacin extremos RMI, que por supuesto puede ser utilizado por otros mdulos de aplicacin en la misma mquina.

5.15 El BeanFactory
El BeanFactory proporciona la base fundamental para la funcionalidad de Spring COI, pero slo se utiliza directamente en la integracin con otros marcos de terceras partes y es ahora en gran parte de naturaleza histrica para la mayora de los usuarios de la primavera. Los BeanFactory las interfaces y servicios relacionados, tales como BeanFactoryAware , InitializingBean , DisposableBean , an estn presentes en la primavera a los efectos de compatibilidad con versiones anteriores con el gran nmero de marcos de terceras partes que se integran con la primavera. A menudo, los componentes de terceros que no pueden utilizar los equivalentes ms modernos como

@PostConstruct

o @PreDestroy para seguir siendo compatible con JDK 1.4 o para evitar una dependencia en JSR-250. Esta seccin proporciona antecedentes adicionales sobre las diferencias entre el BeanFactory y ApplicationContext y cmo se puede acceder al contenedor IoC directamente a travs de un clsico de consulta singleton.
5.15.1 BeanFactory o ApplicationContext ?

Utilice un ApplicationContext a menos que tenga una buena razn para no hacerlo. Debido a que el ApplicationContext incluye toda la funcionalidad de la BeanFactory , en general se recomienda el BeanFactory , a excepcin de algunas situaciones, como en un Applet donde el consumo de memoria puede ser crtico y una kilobytes extra pueden hacer la diferencia. Sin embargo, para las aplicaciones empresariales ms tpicos y los sistemas, la ApplicationContext es lo que usted desea utilizar. Spring 2.0 y ms tarde hace un uso intensivo de la BeanPostProcessor punto de extensin (para efectuar el proxy y as sucesivamente). Si utiliza slo una llanura BeanFactory , una buena cantidad de apoyo, como las transacciones y AOP no entrar en vigor, al menos no sin algunos pasos extra de su parte. Esta situacin puede ser confusa porque no hay nada realmente mal con la configuracin. La siguiente tabla muestra las caractersticas integradas en el BeanFactory y ApplicationContext las interfaces e implementaciones. Cuadro 5.8. Matriz de Prestaciones
Caracterstica
BeanFactory ApplicationContext

Frijol instanciacin / cableado Automatic BeanPostProcessor registro Automatic BeanFactoryPostProcessor registro Conveniente MessageSource acceso (para i18n) ApplicationEvent publicacin

S No No No No

S S S S S

Para registrar explcitamente un grano de post-procesador con una BeanFactory implementacin, debe escribir cdigo como este:
ConfigurableBeanFactory fbrica = new XmlBeanFactory (...); / / Ahora registrar todas las instancias necesarias BeanPostProcessor Postprocesador MyBeanPostProcessor MyBeanPostProcessor = new (); factory.addBeanPostProcessor (postprocesador); / / Ahora comenzar a usar la fbrica

Para registrar explcitamente un BeanFactoryPostProcessor cuando se utiliza un BeanFactory implementacin, debe escribir cdigo como este:

XmlBeanFactory fbrica = new XmlBeanFactory (nuevo FileSystemResource ("beans.xml")); / / Traer en algunos valores de las propiedades de un archivo de propiedades Cfg = new PropertyPlaceholderConfigurer PropertyPlaceholderConfigurer (); cfg.setLocation (nuevo FileSystemResource ("jdbc.properties")); / / Ahora realmente hacer el reemplazo cfg.postProcessBeanFactory (de fbrica);

En ambos casos, la etapa de registro explcito es inconveniente, que es una razn por la cual los diversos ApplicationContext implementaciones se prefieren por encima de friccin BeanFactory implementaciones en la gran mayora de Spring respaldados por las aplicaciones, especialmente cuando se utiliza BeanFactoryPostProcessors y BeanPostProcessors . Estos mecanismos de implementar la funcionalidad ms importante, tales como el reemplazo de bienes marcador de posicin y AOP.
5.15.2 Pegue el cdigo y el mal singleton

Es mejor escribir ms cdigo de la aplicacin en una dependencia de la inyeccin (DI) estilo, donde se sirve el cdigo de un contenedor de Spring IoC, tiene sus propias dependencias suministrados por el contenedor cuando se crea, y es totalmente inconsciente del contenedor . Sin embargo, para las capas de pegamento pequeos de cdigo que son a veces necesarios para atar otro cdigo juntos, a veces se necesita un singleton (o cuasi-singleton) Acceso estilo a un contenedor de IoC primavera. Por ejemplo, el cdigo de terceros pueden tratar de construir nuevos objetos directamente ( Class.forName() estilo), sin la posibilidad de conseguir estos objetos de un contenedor de IoC primavera. Si el objeto construido por el cdigo de terceros es a trozo pequeo o proxy, que luego se utiliza un estilo singleton acceso a un contenedor de IoC Spring para obtener un objeto real para delegar, entonces la inversin de control ha podido lograrse an para la mayora de el cdigo (el objeto que sale del recipiente). As, la mayora del cdigo est todava desconocen el envase o la forma en que se accede, y permanece desacoplada de otro cdigo, con todos los beneficios consiguientes. EJBs pueden tambin utilizar este mtodo stub / proxy para delegar a un objeto de aplicacin Java simple, recuperado de un contenedor de IoC primavera. Si bien el contenedor de IoC Spring s idealmente no tiene que ser un producto nico, que puede ser poco realista en trminos de uso de memoria o tiempos de inicializacin (cuando se usa granos en el contenedor Spring COI, como un Hibernate SessionFactory ) para cada bean para utilizar su propio, no-singleton Spring COI contenedor. Al levantar el contexto de la aplicacin en un estilo servicio de localizacin es a veces la nica opcin para acceder compartidos administrados Primavera-componentes, como en un entorno EJB 2.1, o cuando se desea compartir una nica ApplicationContext como padre a travs de WebApplicationContexts archivos WAR. En este caso, usted debe buscar en clase mediante la utilidad ContextSingletonBeanFactoryLocator localizador que se describe en esta entrada de blog SpringSource equipo

6. Recursos

6.1 Introduccin
Estndar de Java java.net.URL clase y los controladores estndar para los prefijos de URL diferentes desafortunadamente no son muy adecuadas suficiente para todos los accesos a los recursos de bajo nivel. Por ejemplo, no hay estandarizado URL aplicacin que se puede utilizar para acceder a un recurso que debe ser obtenido a partir de la ruta de clase, o con relacin a una ServletContext . Mientras que es posible registrar controladores nuevos especializadas URL prefijos (similares a los controladores existentes para los prefijos tales como http: ), esto es generalmente bastante complicado, y el URL interfaz todava carece de parte de la funcionalidad deseable, tal como un mtodo para comprobar la existencia del recurso que se apunta.

6.2 El Resource de interfaz


Spring Resource interfaz est destinado a ser una interfaz ms capaz para el acceso a resmenes de bajo nivel de recursos.
public interface de Recursos extends InputStreamSource { booleano existe (); isOpen booleano (); URL getURL () throws IOException; GETFILE archivo () throws IOException; CreateRelative recursos (String relativePath) throws IOException; GetFilename String (); GetDescription String (); } pblico InputStreamSource interfaz { InputStream getInputStream () throws IOException; }

Algunos de los mtodos ms importantes de los Resource interfaz son:


getInputStream()

: localiza y abre el recurso y devolver un InputStream para leer el recurso. Se espera que cada invocacin devuelve un fresco InputStream . Es responsabilidad de la persona que llama para cerrar la secuencia. exists() : devuelve un boolean que indica si este recurso realmente existe en forma fsica. isOpen() : devuelve un boolean que indica si este recurso representa un mango con un flujo abierto. Si true , el InputStream no puede ser ledo varias veces, y se debe leer una sola vez y luego se cierra para evitar prdidas de recursos. Ser false para todas las implementaciones de recursos habituales, con la excepcin de InputStreamResource .

getDescription()

: devuelve una descripcin para este recurso, que se utilizar para la salida de error cuando se trabaja con el recurso. Esto es a menudo el nombre de archivo totalmente calificado o la direccin URL real del recurso.

Otros mtodos permiten obtener una verdadera URL o File objeto que representa el recurso (si la implementacin subyacente es compatible, y soporta esta funcionalidad). El Resource abstraccin se utiliza ampliamente en la primavera de s mismo, como un tipo de argumento en muchas firmas de mtodo cuando un recurso es necesario. Otros mtodos de algunas APIs Spring (como los constructores a varios ApplicationContext implementaciones), tome una String en la que sin adornos o forma simple se utiliza para crear un Resource adecuado para que implementacin de contexto, o por medio de prefijos especiales en la String ruta de acceso, deje la persona que llama para especificar que un determinado Resource de aplicacin debe ser creado y utilizado. Si bien el Resource de interfaz se utiliza mucho con la primavera y la primavera, en realidad es muy til utilizar como una clase de utilidad general por s mismo en su propio cdigo, para el acceso a los recursos, incluso cuando el cdigo no sabe o no se preocupan por cualquier otro partes de la primavera. Si bien estas parejas el cdigo para la primavera, en verdad no se acopla a este pequeo conjunto de clases de utilidad, que estn sirviendo como un sustituto ms capaz de URL , y puede considerarse equivalente a cualquier otra biblioteca que se uso para este propsito. Es importante sealar que el Resource abstraccin no reemplaza la funcionalidad que se envuelve en lo posible. Por ejemplo, un UrlResource envuelve una URL, y utiliza la envuelta URL para hacer su trabajo.

6.3 Built-in Resource implementaciones


Hay una serie de Resource las implementaciones que se suministran directamente de la caja en la primavera:
6.3.1 UrlResource

El UrlResource envuelve un java.net.URL , y puede ser utilizado para acceder a cualquier objeto que es normalmente accesible a travs de un URL, tales como archivos, un objetivo de HTTP, un objetivo de FTP, etc Todas las URL tienen un normalizado String representacin, de tal manera que apropiados prefijos normalizados se utilizan para indicar un tipo de URL de la otra. Esto incluye los file: para acceder a las rutas del sistema de archivos, http: para acceder a los recursos a travs del protocolo HTTP, ftp: para acceder a los recursos a travs de FTP, etc A UrlResource es creado por el cdigo Java utilizando explcitamente la UrlResource constructor, pero a menudo se crea implcitamente al llamar a un mtodo de la API que tiene una String razonamiento que se supone que representan un camino. Para este ltimo caso, una JavaBeans PropertyEditor en ltima instancia, decidir qu tipo de Resource para crear. Si la cadena de ruta de acceso contiene algunos bien conocido (a

la misma, se entiende) prefijos como classpath: , se crear un funcional especializada Resource para ese prefijo. Sin embargo, si no reconoce el prefijo, se tomar la que esto es slo una cadena de URL estndar, y se crear un UrlResource .
6.3.2 ClassPathResource

Esta clase representa un recurso que se debe obtener de la ruta de clases. Esto utiliza ya sea el contexto hilo cargador de clases, un cargador de clases dado o de una clase dada por los recursos de carga. Este Resource implementacin soporta resolucin como java.io.File si el recurso de ruta de la clase reside en el sistema de archivos, pero no por los recursos classpath que residen en un frasco y no se han ampliado (por el motor de servlets, o lo que el medio ambiente es) para el sistema de archivos. Para hacer frente a esto, los diversos Resource siempre apoyan las implementaciones de resolucin en su java.net.URL . A ClassPathResource es creado por el cdigo Java utilizando explcitamente la ClassPathResource constructor, pero a menudo se crea implcitamente al llamar a un mtodo de la API que tiene una String razonamiento que se supone que representan un camino. Para el ltimo caso, un JavaBeans PropertyEditor reconocer el prefijo especial classpath: en el camino de cadena, y crear un ClassPathResource en ese caso.
6.3.3 FileSystemResource

Este es un Resource de ejecucin de java.io.File asas. Obviamente, apoya la resolucin como un File , y como URL .
6.3.4 ServletContextResource

Este es un Resource de ejecucin de ServletContext recursos, interpretando las rutas relativas en el directorio raz de la aplicacin web correspondiente. Esto siempre apoya el acceso corriente y el acceso URL, pero slo permite java.io.File acceso cuando el archivo de la aplicacin web se expande y el recurso est fsicamente en el sistema de archivos. Sea o no est expandido y en el sistema de archivos de este tipo, o se accede directamente desde el JAR o en otro lugar como una base de datos (que es concebible) es en realidad depende del contenedor de Servlets.
6.3.5 InputStreamResource

Un Resource para una aplicacin dada InputStream . Esto slo se debe utilizar si no especfico Resource de implementacin es aplicable. En particular, preferimos ByteArrayResource o cualquiera de los basados en archivos Resource implementaciones cuando sea posible. En contraste con otros Resource implementaciones, este es un descriptor de un recurso ya abierto - por lo tanto, volver true de isOpen() . No lo use si usted necesita para

mantener el descriptor de recurso en algn lugar, o si usted necesita para leer una secuencia varias veces.
6.3.6 ByteArrayResource

Este es un Resource de ejecucin de una matriz de bytes dado. Se crea un ByteArrayInputStream para la matriz de bytes determinado. Es til para cargar el contenido de cualquier matriz de bytes determinado, sin tener que recurrir a un solo uso InputStreamResource .

6.4 El ResourceLoader
El ResourceLoader interfaz est destinado a ser implementada por los objetos que pueden devolver (carga ie) Resource instancias.
ResourceLoader interfaz pblica { Recursos getResource (ubicacin String); }

Todos los contextos de aplicacin aplicar el ResourceLoader interfaz, y por lo tanto todos los contextos de aplicacin puede ser usado para obtener Resource casos. Cuando se llama a getResource() en un contexto de aplicacin especfico, y la ruta de ubicacin especificado no tiene un prefijo especfico, pondremos un Resource tipo que sea apropiada a ese contexto aplicacin en particular. Por ejemplo, suponga que el siguiente fragmento de cdigo se ejecuta en un ClassPathXmlApplicationContext ejemplo:
Recursos template = ctx.getResource ("some / resource / ruta / myTemplate.txt");

Qu sera devuelto sera un ClassPathResource , si el mismo mtodo que se ejecuta en un FileSystemXmlApplicationContext ejemplo, que vuelva a FileSystemResource . Para un WebApplicationContext , se obtendra de nuevo una ServletContextResource , etc. Como tal, puede cargar los recursos de manera adecuada para el contexto de aplicacin particular. Por otro lado, tambin puede forzar ClassPathResource a utilizar, independientemente del tipo de contexto de aplicacin, especificando el especial classpath: prefijo:
Plantilla de recursos = ctx.getResource ("classpath: algunos recursos / / ruta / myTemplate.txt");

De manera similar, se puede obligar a un UrlResource para ser utilizado por especificar cualquiera de los estndares java.net.URL prefijos:

Plantilla de recursos = ctx.getResource ("file :/ algn / resource / ruta / myTemplate.txt"); Recursos template = ctx.getResource ("http://myhost.com/resource/path/myTemplate.txt");

La siguiente tabla resume la estrategia de convertir String s de Resource s: Tabla 6.1. Cadenas de recursos
Prefijo Ejemplo Explicacin

classpath: classpath:com/myapp/config.xml Cargado de la ruta de clases. Cargado como un URL , desde el archivo: file:/data/config.xml sistema de ficheros. [ 1 ] http://myserver/logo.png http: Cargado como un URL . Depende del subyacente (Ninguno) /data/config.xml ApplicationContext . [1] Pero vase tambin la Seccin 6.7.3, " FileSystemResource advertencias " .

6.5 El ResourceLoaderAware interfaz


El ResourceLoaderAware interfaz es una interfaz de marcador especial, la identificacin de objetos que esperan ser proporcionado con un ResourceLoader referencia.
pblico ResourceLoaderAware interfaz { vaco setResourceLoader (ResourceLoader ResourceLoader); }

Cuando una clase implementa ResourceLoaderAware y se despliega en un contexto de aplicacin (como un bean Spring gestionados), se reconoce como ResourceLoaderAware por el contexto de aplicacin. El contexto de aplicacin luego invocar el setResourceLoader(ResourceLoader) , el suministro de s misma como argumento (recuerde, todos los contextos de aplicacin en Spring implementar el ResourceLoader interfaz). Por supuesto, como un ApplicationContext es un ResourceLoader , el grano tambin podra poner en prctica la ApplicationContextAware interfaz y utilizar el contexto de aplicacin suministrada directamente para cargar los recursos, pero en general, es mejor usar el especializado ResourceLoader interfaz si eso es todo lo que se necesita. El cdigo slo se acopla a la interfaz de carga de recursos, lo que puede ser considerado como un interfaz de la utilidad, y no toda la primavera ApplicationContext interfaz. A partir de primavera de 2,5, usted puede confiar en autowiring del ResourceLoader como una alternativa a la aplicacin de la ResourceLoaderAware interfaz. El "tradicional" constructor y byType modos autowiring (como se describe en la Seccin 5.4.5, "autowiring colaboradores" ) son ahora capaces de proporcionar una dependencia de tipo ResourceLoader ya sea para un argumento de constructor o parmetro de

mtodo setter respectivamente. Para mayor flexibilidad (incluyendo la capacidad de autowire campos y mtodos mltiples parmetros), considere el uso de las nuevas caractersticas basadas en anotacin autowiring. En ese caso, el ResourceLoader se autoconectados en un campo, argumento del constructor, o parmetro del mtodo que est esperando la ResourceLoader tipo, siempre que el campo, constructor, o mtodo en cuestin lleva el @Autowired anotacin. Para obtener ms informacin, consulte la Seccin 5.9.2, " @Autowired " .

6.6 Resources como dependencias


Si el propio bean se va a determinar y suministrar la ruta del recurso a travs de algn tipo de proceso dinmico, probablemente tenga sentido para el bean de utilizar el ResourceLoader interfaz para cargar los recursos. Consideremos como ejemplo la carga de una plantilla de algn tipo, donde el recurso especfico que se necesita depende de la funcin del usuario. Si los recursos son estticos, tiene sentido para eliminar el uso de la ResourceLoader interfaz completamente, y slo tienen el grano de exponer los Resource las propiedades que necesita, y esperan que se les inyect en ella. Lo que lo hace trivial para inyectar luego estas propiedades, es que todos los contextos de aplicacin registrar y utilizar un especial JavaBeans PropertyEditor que puede convertir String rutas de acceso a Resource los objetos. As que si myBean tiene una propiedad de plantilla de tipo Resource , se puede configurar con una cadena simple para ese recurso, como sigue:
<bean id = clase = "myBean" "..."> <propiedad nombre = valor = "template" "some/resource/path/myTemplate.txt" /> </ Bean>

Tenga en cuenta que la ruta del recurso no tiene prefijo, por lo que debido a que el contexto de la aplicacin en s va a ser utilizado como la ResourceLoader , el propio recurso se cargan a travs de un ClassPathResource , FileSystemResource , o ServletContextResource (segn el caso) dependiendo del tipo exacto del contexto . Si hay una necesidad de forzar un determinado Resource tipo que se utiliza, a continuacin un prefijo puede ser usado. Los dos ejemplos siguientes muestran cmo forzar una ClassPathResource y un UrlResource (este ltimo se utiliza para acceder a un archivo de sistema de archivos).
<propiedad nombre = valor = "template" "classpath:some/resource/path/myTemplate.txt"> <propiedad nombre = valor = "template" "file:/some/resource/path/myTemplate.txt" />

6,7 contextos de aplicacin y Resource caminos

6.7.1 La construccin de contextos de aplicacin

Un constructor de contexto de aplicacin (para un tipo de contexto de aplicacin especfico) en general toma una cadena o conjunto de cadenas como la va de ubicacin (s) del recurso (s), tales como archivos XML que forman la definicin del contexto. Cuando una va de ubicacin no tiene un prefijo, la especfica Resource tipo construido a partir de ese camino y se utiliza para cargar las definiciones de frijol, depende y es apropiado para el contexto de aplicacin especfico. Por ejemplo, si crea un ClassPathXmlApplicationContext de la siguiente manera:
ApplicationContext ctx = new ClassPathXmlApplicationContext ("conf / appContext.xml");

Las definiciones de frijol se cargar desde la ruta de clases, como ClassPathResource se utilizar. Pero si se crea un FileSystemXmlApplicationContext de la siguiente manera:
ApplicationContext ctx = nuevo FileSystemXmlApplicationContext ("conf / appContext.xml");

La definicin de frijol se carga desde una ubicacin de sistema de archivos, en este caso relativa al directorio de trabajo actual. Tenga en cuenta que el uso del prefijo de ruta de clase especial o un prefijo de URL estndar en la ruta de ubicacin anular el tipo predeterminado de Resource creado para cargar la definicin. As que este FileSystemXmlApplicationContext ...
ApplicationContext ctx = nuevo FileSystemXmlApplicationContext ("classpath: conf / appContext.xml");

... en realidad se cargar sus definiciones de frijol de la ruta de clases. Sin embargo, todava es un FileSystemXmlApplicationContext . Si se utiliza a continuacin como un ResourceLoader , todas sus rutas sin prefijo todava ser tratado como rutas del sistema de archivos.
La construccin de ClassPathXmlApplicationContext casos accesos directos -

El ClassPathXmlApplicationContext expone una serie de constructores para permitir la instanciacin conveniente. La idea bsica es que un suministro ms que una matriz de cadenas que contiene slo los nombres de archivo de los archivos XML en s (sin la informacin de la ruta principal) y uno tambin proporciona una Class , el ClassPathXmlApplicationContext obtendr la informacin de la ruta de la clase suministrada. Un ejemplo se espera que haga esto en claro. Considere la posibilidad de una estructura de directorios similar a la siguiente:
com / foo /

services.xml daos.xml MessengerService.class

A ClassPathXmlApplicationContext instancia integrada por los beans definidos en el 'services.xml' y 'daos.xml' podra crear una instancia de este modo ...
ApplicationContext ctx = new ClassPathXmlApplicationContext ( new String [] {"services.xml", "daos.xml"}, MessengerService clase).;

Por favor, consulte las Javadocs para el ClassPathXmlApplicationContext clase de detalles de los diferentes constructores.
6.7.2 Los comodines en las rutas de contexto de aplicacin de recursos del constructor

Los caminos de recursos en valores de aplicacin de constructor de contexto puede ser un camino simple (como se muestra arriba), que tiene una asignacin uno a uno con un recurso de destino, o alternativamente puede contener el especial "* classpath:" prefijo y / o internos Ant- estilo de las expresiones regulares (emparejado con Spring PathMatcher utilidad). Ambos de estos ltimos son efectivamente comodines Un uso de este mecanismo es cuando se hace componente de estilo ensamblado de aplicacin. Todos los componentes pueden "publicar" fragmentos de contexto de definicin de un camino de localizacin bien conocida, y cuando el contexto de la aplicacin final se crea usando el mismo camino prefijado a travs de classpath*: fragmentos todos los componentes sern recogidos automticamente. Tenga en cuenta que este comodn es especfico para el uso de caminos de recursos en los constructores contexto de aplicacin (o cuando se utiliza el PathMatcher utilidad jerarqua de clases directamente), y se resuelve en el tiempo de construccin. No tiene nada que ver con el Resource propio tipo. No es posible utilizar el classpath*: prefijo para la construccin de un verdadero Resource , como un recurso apunta a un solo recurso a la vez.
Estilo Ant-Patrones

Cuando la ubicacin de la ruta contiene un patrn de Ant-estilo, por ejemplo:


/ WEB-INF / *-context.xml com / mycompany / ** / applicationContext.xml archivo: C :/ some / path / *-context.xml classpath: com / mycompany / ** / applicationContext.xml

... la resolucin sigue un procedimiento ms complejo, pero definida para tratar de resolver el comodn. Produce un recurso para el camino hasta el ltimo segmento nocomodn y obtiene una direccin URL de la misma. Si este URL no es un "frasco:" URL o variante especfica del contenedor (por ejemplo, " zip: "en WebLogic," wsjar "en WebSphere, etc), y luego una java.io.File se obtiene a partir de ella y se utiliza para resolver el comodn al recorrer el sistema de archivos. En el caso de una URL jar,

la resolucin de cualquiera de los dos obtiene una java.net.JarURLConnection de ella o de forma manual analiza la URL frasco y luego atraviesa el contenido del archivo jar para resolver los comodines.
Implicaciones sobre portabilidad

Si la ruta especificada es ya una direccin de fichero (ya sea explcita o implcitamente, ya que la base ResourceLoader es un sistema de ficheros, entonces comodines se garantiza que funcione de una manera totalmente porttil. Si la ruta especificada es un lugar classpath, a continuacin, la resolucin debe obtener el ltimo no-comodn URL a travs de un segmento de trazado Classloader.getResource() llamada. Dado que este es slo un nodo de la ruta (no el archivo al final) en realidad es indefinido (en los ClassLoader Javadocs) exactamente qu tipo de URL se devuelve en este caso. En la prctica, siempre es un java.io.File que representa el directorio, donde el recurso classpath se resuelve en una ubicacin del sistema de archivos, o una URL frasco de algn tipo, donde el recurso classpath se resuelve en una ubicacin frasco. Sin embargo, existe la preocupacin de portabilidad en esta operacin. Si una URL frasco se obtiene para el ltimo segmento no-comodn, la resolucin debe ser capaz de obtener una java.net.JarURLConnection de l, o manualmente analizar la URL jar, para poder caminar el contenido de la jarra, y resolver el comodn. Esto funciona en la mayora de los entornos, pero no en otros, y se recomienda que la resolucin comodn de los recursos procedentes de tarros de ser probado a fondo en su entorno especfico antes de confiar en ella.
El classpath*: prefijo

Cuando se construye un contexto de aplicacin basada en XML, una cadena de ubicacin pueden utilizar el especial classpath*: prefijo:
ApplicationContext ctx = nuevo ClassPathXmlApplicationContext ("classpath *: conf / appContext.xml");

Este prefijo especial especifica que todos los recursos de classpath que coincidan con el nombre dado debe ser obtenido (internamente, este pasa esencialmente a travs de un ClassLoader.getResources(...) de llamada), y luego se fusionaron para formar la definicin de aplicacin contexto final.
* Classpath: portabilidad

El comodn classpath depende de la getResources() mtodo del cargador de clases subyacente. Como la mayora de los servidores de aplicaciones de hoy en da su aplicacin suministrar propio cargador de clases, el comportamiento puede ser diferente, especialmente cuando se trata de archivos jar. Una simple prueba para comprobar si classpath* obras es utilizar el cargador de clases para cargar un archivo desde dentro de un tarro en el classpath: getClass().getClassLoader().getResources("<someFileInsideTheJar>") .

Haga esta prueba con los archivos que tienen el mismo nombre pero se colocan dentro de dos lugares diferentes. En el caso de un resultado apropiado sea devuelto, consulte la documentacin del servidor de aplicaciones para los ajustes que pudieran afectar el comportamiento del cargador de clases. El " classpath*: "prefijo tambin se puede combinar con un PathMatcher patrn en el resto de la va de ubicacin, por ejemplo " classpath*:META-INF/*-beans.xml ". En este caso, la estrategia de resolucin es bastante simple: un ClassLoader.getResources () se utiliza en el segmento de la trayectoria pasada no comodn para obtener todos los recursos correspondientes en la jerarqua del cargador de clases, y despus de cada recurso de la estrategia PathMatcher misma resolucin descrito anteriormente se usa para la subruta de comodn.
Otras notas relacionadas con comodines

Tenga en cuenta que " classpath*: "cuando se combina con los modelos de estilo hormiga de slo funcionar de forma fiable con el directorio raz al menos uno antes del patrn comienza, a menos que los archivos de destino real reside en el sistema de archivos. Esto significa que un patrn como " classpath*:*.xml "no va a recuperar archivos de la raz de los archivos jar sino slo a partir de la raz de directorios ampliado. Esto origina una limitacin en el JDK ClassLoader.getResources() mtodo que slo devuelve las ubicaciones de archivos de sistema para un pasado como una cadena vaca (lo que indica posibles races a la bsqueda). Estilo Ant-patrones con " classpath: "Los recursos no estn garantizados para encontrar recursos de contrapartida si el paquete raz para buscar est disponible en varias ubicaciones de ruta de clase. Esto se debe a un recurso tal como
com/mycompany/package1/service-context.xml

puede ser en una sola ubicacin, pero cuando un camino tal como
classpath: com / mycompany / ** / service-context.xml

Se utiliza para tratar de resolverlo, la resolucin va a funcionar fuera de la URL (la primera) que devuelve getResource("com/mycompany") ;. Si este nodo paquete bsico existe en mltiples ubicaciones cargador de clases, el recurso final real no puede ser inferior. Por lo tanto, preferiblemente, utilice " classpath*: "con el mismo estilo de patrn Ant-en tal caso, que buscar todas las ubicaciones de ruta de clase que contienen el paquete raz.
6.7.3 FileSystemResource advertencias

A FileSystemResource que no est unido a un FileSystemApplicationContext (es decir, un FileSystemApplicationContext no es el real ResourceLoader ) tratar rutas absolutas vs relativa como era de esperar. Las rutas relativas son relativas al directorio de trabajo actual, mientras que las rutas absolutas son relativos a la raz del sistema de archivos.

Por compatibilidad con versiones anteriores (histricos) razones sin embargo, esto cambia cuando el FileSystemApplicationContext es la ResourceLoader . El FileSystemApplicationContext simplemente obliga a todos los adjuntos FileSystemResource casos a tratar a todas las vas de ubicacin como relativa, ya sea que comience con una barra inclinada inicial o no. En la prctica, esto significa lo siguiente son equivalentes:
ApplicationContext ctx = nuevo FileSystemXmlApplicationContext ("conf / context.xml"); ApplicationContext ctx = nuevo FileSystemXmlApplicationContext ("/ conf / context.xml");

Como son los siguientes: (A pesar de que tendra sentido para ellos a ser diferente, ya que uno de los casos es relativo y absoluto del otro.)
Ctx FileSystemXmlApplicationContext = ...; ctx.getResource ("some / resource / ruta / myTemplate.txt"); Ctx FileSystemXmlApplicationContext = ...; ctx.getResource ("/ some / resource / ruta / myTemplate.txt");

En la prctica, si los verdaderos caminos del sistema de archivos absolutas son necesarios, es mejor renunciar al uso de rutas absolutas con FileSystemResource / FileSystemXmlApplicationContext , y simplemente forzar el uso de una UrlResource , utilizando el file: prefijo de URL.
/ / Tipo de contexto real no importa, el recurso ser siempre UrlResource ctx.getResource ("file :/ algn / resource / ruta / myTemplate.txt"); / / Forzar esta FileSystemXmlApplicationContext para cargar su definicin a travs de un UrlResource ApplicationContext ctx = nuevo FileSystemXmlApplicationContext ("file :/ conf / context.xml");

7. Validacin, enlace de datos y el tipo de conversin 7.1 Introduccin


JSR-303 Frijol de validacin El Spring Framework soporta JSR-303 Bean Validation adaptndolo a Spring Validator interfaz. Una aplicacin puede optar por habilitar JSR-303 Bean Validation vez a nivel mundial, tal como se describe en la Seccin 7.8, "Spring 3 Validacin" , y lo utilizan exclusivamente para todas las necesidades de validacin. Una aplicacin tambin puede registrarse adicionales primavera Validator instancias por DataBinder ejemplo, como se describe en la Seccin 7.8.3, "Configuracin de un DataBinder" . Esto puede ser til para conectar la lgica de validacin sin el uso de anotaciones.

Hay pros y contras para la valoracin de la validacin, lgica de negocio, y la primavera ofrece un diseo para su validacin (y el enlace de datos) que no excluye a ninguno de los dos. Especficamente validacin no debera estar vinculada a la capa web, deben ser fciles de localizar y que debera ser posible conectar cualquier disponible validador. Teniendo en cuenta lo anterior, la primavera ha llegado con un Validator interfaz que es a la vez ands bsicos eminentemente utilizable en todas las capas de una aplicacin. El enlace de datos es til para permitir la entrada del usuario de forma dinmica ligada al modelo de dominio de una aplicacin (o lo que sea objeto que se utiliza para procesar la entrada del usuario). Spring proporciona el llamado DataBinder para hacer exactamente eso. El Validator y el DataBinder constituyen la validation de paquetes, que se utiliza principalmente en, pero no limitado al marco MVC. El BeanWrapper es un concepto fundamental en el Spring Framework y se utiliza en muchos lugares. Sin embargo, probablemente no tendr la necesidad de utilizar el BeanWrapper directamente. Debido a que esta es la documentacin de referencia sin embargo, sentimos que una explicacin podra estar en orden. Vamos a explicar el BeanWrapper en este captulo, ya que, si se va a usar para nada, lo ms probable es hacerlo cuando se trata de enlazar los datos a objetos. DataBinder primavera y el BeanWrapper de nivel inferior tanto PropertyEditors utilizar para analizar y formato de los valores de propiedad. El PropertyEditor concepto es parte de la especificacin JavaBeans, y tambin se explica en este captulo. Spring 3 introduce un "core.convert" paquete que proporciona una instalacin de conversin de tipo general, as como un alto nivel de "formato" paquete para dar formato a los valores de la interfaz de usuario de campo. Estos nuevos paquetes pueden ser utilizados como alternativas ms simples a PropertyEditors, y tambin se tratar en este captulo.

7.2 Validacin utilizando Spring Validator interfaz


Primavera cuenta con un Validator interfaz que se puede utilizar para validar los objetos. El Validator interfaz funciona con una Errors objeto de modo que mientras que la validacin, validadores pueden informar de errores de validacin al Errors objeto. Consideremos un objeto pequeo de datos:
public class Persona { private String nombre; edad int privado; / / Los getters y setters habituales ... }

Vamos a proporcionar un comportamiento de validacin de la Person clase mediante la aplicacin de los dos mtodos siguientes de la org.springframework.validation.Validator interfaz:

supports(Class) - Puede esta Validator validar instancias del suministro Class ? validate(Object, org.springframework.validation.Errors) - valida el objeto dado y en caso de errores de validacin, los registros con el dado Errors

objeto La implementacin de un Validator es bastante sencillo, sobre todo cuando se sabe de la ValidationUtils clase de ayuda que el Spring Framework tambin proporciona.
pblico PersonValidator clase implementa Validator { / ** * Esto valida Validator * slo * Persona casos * / pblico apoyos booleano (Clase clazz) { regresar clase Person es igual a (clazz)..; } public void validar (Object obj, Errores e) { ValidationUtils.rejectIfEmpty (e, "nombre", "name.empty"); Persona p = (Persona) obj; if (p.getAge () <0) { e.rejectValue ("edad", "negativevalue"); } Else if (p.getAge ()> 110) { e.rejectValue ("edad", "too.darn.old"); } } }

Como se puede ver, la static rejectIfEmpty(..) mtodo en el ValidationUtils clase se utiliza para rechazar el 'name' propiedad si es null o una cadena vaca. Echa un vistazo a la Javadoc para la ValidationUtils clase para ver qu funcionalidad que proporciona adems el ejemplo mostrado anteriormente. Aunque ciertamente es posible implementar un nico Validator clase para validar cada uno de los objetos anidados en un objeto rico, puede ser mejor para encapsular la lgica de validacin para cada clase de objeto anidado en su propio Validator implementacin. Un ejemplo sencillo de un "rico" objeto sera un Customer que se compone de dos String propiedades (un nombre de primera y segunda) y un complejo de Address de objeto. Address objetos se pueden utilizar independientemente del Customer objetos, y as una clara AddressValidator ha sido implementado. Si desea que su CustomerValidator volver a utilizar el contenido dentro de la lgica AddressValidator clase sin tener que recurrir a copiar y pegar, se puede inyectar o dependencia-una instancia de un AddressValidator dentro de su CustomerValidator , y lo utilizan de este modo:
pblico CustomerValidator clase implementa Validator { final privado Validator addressValidator; pblico CustomerValidator (Validator addressValidator) { if (addressValidator == null) { throw new IllegalArgumentException ( "El suministrada [Validator] es obligatorio y no debe ser nulo.");

} if (! addressValidator.supports Address. (clase)) { throw new IllegalArgumentException ( "El suministrada [Validator] debe ser compatible con la validacin de la [Direccin] casos."); } este addressValidator = addressValidator.; } / ** * Este Validator valida casos de clientes, as como cualquier subclases de cliente tambin * / pblico apoyos booleano (Clase clazz) { devolver al cliente de clase IsAssignableFrom (clazz)..; } public void validate (Object target, los errores de errores) { ValidationUtils.rejectIfEmptyOrWhitespace (errores, "Nombre", "field.required"); ValidationUtils.rejectIfEmptyOrWhitespace (errores, "apellidos", "field.required"); Cliente cliente = (Cliente) de destino; try { errors.pushNestedPath ("direccin"); ValidationUtils.invokeValidator (esto addressValidator, cliente.getDireccion (), errores.); Finally {} errors.popNestedPath (); } } }

Los errores de validacin se informa al Errors objeto pasado al validador. En caso de Spring Web MVC puede utilizar <spring:bind/> etiqueta de inspeccionar los mensajes de error, pero por supuesto usted puede tambin inspeccionar los errores usted mismo objeto. Ms informacin acerca de los mtodos que ofrece se pueden encontrar en el Javadoc.

7,3 Resolver cdigos de mensajes de error


Hemos hablado de enlace de datos y validacin. Emisin de mensajes correspondientes a errores de validacin es la ltima cosa que necesitamos discutir. En el ejemplo que hemos mostrado anteriormente, se rechaz el name y la age de campo. Si vamos a enviar los mensajes de error mediante el uso de un MessageSource , lo haremos utilizando el cdigo de error que le hemos dado al rechazar el campo ("nombre" y "edad" en este caso). Cuando se llama (ya sea directamente, o indirectamente, usando por ejemplo el ValidationUtils clase) rejectValue o uno de los otros reject los mtodos de la Errors de la interfaz, la aplicacin subyacente no slo registra el cdigo que ha pasado en, sino tambin un nmero de cdigos de error adicionales. Qu cdigos de error se registra est determinada por la MessageCodesResolver que se utiliza. Por defecto, el DefaultMessageCodesResolver se utiliza, por ejemplo, que no slo registra un mensaje con el cdigo que le dio, pero tambin los mensajes que incluyan el nombre del campo que se pasa al mtodo rechazan. As que en caso de que rechace un campo utilizando rejectValue("age", "too.darn.old") , adems de la

too.darn.old cdigo, Spring tambin se registrar too.darn.old.age y too.darn.old.age.int (por lo que la primera incluir el nombre del campo

y el segundo incluir el tipo del campo), esto se hace como una conveniencia para ayudar a los desarrolladores en la orientacin de los mensajes de error y cosas por el estilo. Ms informacin en la MessageCodesResolver y la estrategia por defecto se encuentra en lnea con los Javadocs para MessageCodesResolver y DefaultMessageCodesResolver respectivamente.

7,4 haba manipulacin y el BeanWrapper


Los org.springframework.beans se adhiere a la norma del paquete JavaBeans proporcionado por Sun. Un JavaBean es simplemente una clase con un defecto constructor sin argumentos, que sigue una convencin de nomenclatura donde (a modo de ejemplo) una propiedad llamada bingoMadness tendra un mtodo setter setBingoMadness(..) y un mtodo getter getBingoMadness() . Para obtener ms informacin acerca de la especificacin JavaBeans y, por favor, consulte el sitio Web de Sun ( java.sun.com / products / JavaBeans ). Una clase muy importante en el paquete de granos es la BeanWrapper interfaz y su aplicacin correspondiente ( BeanWrapperImpl ). Como se cita en el Javadoc, el BeanWrapper ofrece funcionalidad para establecer y obtener valores de propiedad (individual o en grupo), obtener descriptores de propiedades, y para consultar las propiedades para determinar si se pueden leer o escribir. Asimismo, el BeanWrapper ofrece soporte para propiedades anidadas, lo que permite el ajuste de las propiedades en el sub-propiedades a una profundidad ilimitada. Entonces, la BeanWrapper soporta la capacidad de aadir estndar JavaBeans PropertyChangeListeners y VetoableChangeListeners , sin la necesidad de apoyar el cdigo en la clase de objetivo. Por ltimo, pero no menos importante, la BeanWrapper proporciona soporte para la configuracin de las propiedades indizadas. El BeanWrapper generalmente no se utiliza el cdigo de aplicacin directamente, sino por la DataBinder y la BeanFactory . La forma en la BeanWrapper trabaja es en parte lo indica su nombre: se envuelve un grano para realizar acciones en que el frijol, como establecer y recuperar propiedades.
7.4.1 Establecer y obtener propiedades bsicas y anidados

Establecer y obtener propiedades se realiza mediante el setPropertyValue(s) y getPropertyValue(s) que ambos mtodos vienen con un par de variantes sobrecargados. Todos estn descritos con ms detalle en la primavera viene con Javadoc. Lo que es importante saber es que hay un par de convenciones para indicar las propiedades de un objeto. Un par de ejemplos: Tabla 7.1. Ejemplos de propiedades
Expresin
name

Explicacin Indica la propiedad name correspondiente a los mtodos

Expresin

Explicacin
getName() o isName() y setName(..)

account.name

Indica la propiedad anidada name de la propiedad account por ejemplo que corresponde a los mtodos getAccount().setName() o getAccount().getName() Indica el tercer elemento de la propiedad indizada account . Las propiedades indizadas pueden ser de tipo array , list o coleccin, ya sean naturales ordenado Indica el valor de la entrada de mapa indexado por el COMPANYNAME clave de la propiedad Mapa account

account[2]

account[COMPANYNAME]

A continuacin encontrar algunos ejemplos de cmo trabajar con el BeanWrapper para obtener y establecer propiedades. (La siguiente seccin no es de vital importancia para usted si usted no est pensando en trabajar con el BeanWrapper directamente. Si ests usando el DataBinder y la BeanFactory y su aplicacin fuera de la caja, usted debe saltar al la seccin sobre PropertyEditors .) Considere las siguientes dos clases:
Compaa clase pblica { private String nombre; managingDirector Empleado privado; public String getName () { devolver este nombre.; } setName public void (String nombre) { . este nombre = nombre; } getManagingDirector public Empleado () { devuelva este managingDirector.; } setManagingDirector public void (managingDirector Empleado) { este managingDirector = managingDirector.; } } public class Empleado { private String nombre; salario flotador privado; public String getName () { devolver este nombre.; } setName public void (String nombre) { . este nombre = nombre; } getSalary flotador pblico () {

volver salario; } setSalary public void (salario float) { este sueldo = sueldo.; } }

Los siguientes fragmentos de cdigo muestran algunos ejemplos de cmo recuperar y manipular algunas de las propiedades de una instancia Companies y Employees :
Empresa BeanWrapper = BeanWrapperImpl (nueva Compaa ()); / / Establecer el nombre de la empresa .. company.setPropertyValue ("name", "Some Company Inc."); / / ... Tambin se puede hacer as: PropertyValue PropertyValue valor = new ("name", "Some Company Inc."); company.setPropertyValue (value); / / Ok, vamos a crear el director y lo atan a la empresa: BeanWrapper jim BeanWrapperImpl = (new Empleado ()); jim.setPropertyValue ("nombre", "Jim Stravinsky"); company.setPropertyValue ("managingDirector", jim.getWrappedInstance ()); / / Recuperar el salario del managingDirector travs de la empresa Float salario = (Float) company.getPropertyValue ("managingDirector.salary");

7.4.2 Built-in PropertyEditor implementaciones

Spring utiliza el concepto de PropertyEditors para efectuar la conversin entre un Object y una String . Si lo piensas bien, a veces puede ser muy til para poder representar las propiedades de una manera diferente que el objeto en s. Por ejemplo, una Date puede ser representado de una forma legible por humanos (como la String " 2007-14-09 "), ya que estamos siendo capaz de convertir el formato legible por humanos de regreso a la fecha original (o mejor an: convierte cualquier fecha consignada en un formato legible por humanos, de vuelta a Date los objetos). Este comportamiento se puede lograr mediante el registro de editores personalizados, de tipo java.beans.PropertyEditor . Registro de editores personalizados en un BeanWrapper o alternativamente en un determinado contenedor IoC como se ha mencionado en el captulo anterior, se da el conocimiento de cmo convertir propiedades para el tipo deseado. Lea ms acerca de PropertyEditors en el Javadoc de la java.beans paquete proporcionado por Sun. Un par de ejemplos en los que se utiliza la propiedad en la edicin de primavera:

establecer las propiedades de frijol se realiza mediante PropertyEditors . Al mencionar java.lang.String como el valor de una propiedad de algunos de frijol que est declarando en el archivo XML, la primavera (si el setter de la propiedad correspondiente tiene una Class -parmetro) utilizar el ClassEditor para tratar de resolver el parmetro a una Class de objetos. analizar los parametros de solicitud HTTP en Spring MVC marco se hace con todo tipo de PropertyEditors que manualmente se pueden unir en todas las subclases de la CommandController .

Primavera tiene una serie de integrados PropertyEditors para hacer la vida fcil. Cada uno de ellos se enumeran a continuacin y que estn ubicados en la org.springframework.beans.propertyeditors paquete. La mayora, pero no todos (como se indica abajo), se registr de forma predeterminada por BeanWrapperImpl . Cuando el editor de propiedades se puede configurar de alguna manera, por supuesto puede todava registrar su propia variante de anular la opcin por defecto: Tabla 7.2. Built-in PropertyEditors
Clase Explicacin

Editor de matrices de bytes. Cuerdas simplemente se ByteArrayPropertyEditor convierten en sus representaciones byte correspondiente. Registrado por defecto por BeanWrapperImpl . Analiza cadenas que representan las clases a las clases reales y al revs. Cuando una clase no se encuentra, una IllegalArgumentException es lanzada. Registrado por defecto por BeanWrapperImpl . Editor de la propiedad personalizable para Boolean propiedades. Registrado por defecto por BeanWrapperImpl , pero tambin se puede modificar mediante el registro de instancia costumbre en l como editor personalizado. Propiedad editor de colecciones, convirtiendo cualquier fuente Collection a un objetivo determinado Collection tipo. Editor de la propiedad personalizable para java.util.Date, apoyando una DateFormat personalizado. No se ha registrado de forma predeterminada. Debe ser usuario registrado, segn sea necesario con el formato adecuado. Editor de la propiedad personalizable para cualquier subclase Nmero de como Integer , Long , Float , Double . Registrado por defecto por BeanWrapperImpl , pero puede suprimirse mediante el registro de instancia costumbre en l como un editor personalizado. Capaz de resolver las cadenas a java.io.File objetos. Registrado por defecto por BeanWrapperImpl . Slo ida editor de propiedades, capaz de tomar una cadena de texto y la produccin (a travs de un intermediario ResourceEditor y Resource ) un InputStream , por lo InputStream propiedades se pueden establecer directamente como cadenas. Tenga en cuenta que el uso por defecto no se cerrar el InputStream para usted! Registrado por defecto

ClassEditor

CustomBooleanEditor

CustomCollectionEditor

CustomDateEditor

CustomNumberEditor

FileEditor

InputStreamEditor

Clase por BeanWrapperImpl .

Explicacin

LocaleEditor

Capaz de resolver las cadenas a Locale objetos y viceversa (el formato de cadena es [idioma] _ [pas] _ [variante], que es la misma cosa que el mtodo toString () de Locale proporciona). Registrado por defecto por BeanWrapperImpl . Capaz de resolver las cadenas a JDK 1.5 Pattern objetos y viceversa. Capaz de convertir cadenas (formato utilizando el formato definido en el Javadoc de la clase java.lang.Properties) a Properties los objetos. Registrado por defecto por BeanWrapperImpl . Editor de propiedades que Strings adornos. Opcionalmente permite transformar una cadena vaca en un null valor. No se ha registrado por defecto, debe ser usuario registrado segn sea necesario. Capaz de resolver una representacin de cadena de una direccin URL a un verdadero URL objeto. Registrado por defecto por BeanWrapperImpl .

PatternEditor

PropertiesEditor

StringTrimmerEditor

URLEditor

Spring utiliza el java.beans.PropertyEditorManager para establecer la ruta de bsqueda de editores de propiedades que podran ser necesarios. La ruta de bsqueda incluye tambin sun.bean.editors , que incluye PropertyEditor implementaciones para tipos como Font , Color , y la mayora de los tipos primitivos. Tenga en cuenta tambin que la norma infraestructura JavaBeans descubrir automticamente PropertyEditor clases (sin tener que registrarlos explcitamente) si se encuentran en el mismo paquete que la clase que manejan, y tienen el mismo nombre que la clase, con el 'Editor' adjunta, por ejemplo, uno poda tener la siguiente estructura de clase y el paquete, lo cual sera suficiente para la FooEditor clase a ser reconocida y utilizada como la PropertyEditor para Foo tipadas propiedades.
com chank pop Foo FooEditor / / el PropertyEditor para la clase Foo

Recuerde que tambin puede utilizar el estndar BeanInfo mecanismo JavaBeans aqu tambin (que se describe en no-amazing-detalle aqu ). Encontrar ms adelante un ejemplo del uso de la BeanInfo mecanismo para registrar explcitamente uno o ms PropertyEditor instancias con las propiedades de una clase asociada.

com chank pop Foo FooBeanInfo / / el BeanInfo para la clase Foo

Aqu est el cdigo fuente de Java para la referencia FooBeanInfo clase. Esto asociar un CustomNumberEditor con la age de la propiedad Foo clase.
FooBeanInfo clase pblica se extiende SimpleBeanInfo { PropertyDescriptor pblico [] () {getPropertyDescriptors try { ltimo PropertyEditor numberPE = new CustomNumberEditor (Integer. clase, true); PropertyDescriptor PropertyDescriptor ageDescriptor = new ("edad", Foo. Clase) { pblico PropertyEditor createPropertyEditor (Object bean) { volver numberPE; }; }; volver PropertyDescriptor new [] {} ageDescriptor; } catch (IntrospectionException ex) { tirar new Error (ex.ToString ()); } } }

Registro adicionales personalizados PropertyEditors

Al configurar las propiedades del bean como un valor de cadena, un contenedor de IoC Primavera en ltima instancia utiliza el estndar JavaBeans PropertyEditors para convertir estas cadenas al tipo complejo de la propiedad. Spring pre-registra un nmero de encargo PropertyEditors (por ejemplo, para convertir un nombre de clase expresada como una cadena en una verdadera Class de objeto). Adems, el estndar de Java JavaBeans PropertyEditor mecanismo de bsqueda permite a un PropertyEditor para una clase simplemente ser identificado adecuadamente y se coloca en el mismo paquete que la clase que proporciona soporte para, que se encuentra de forma automtica. Si hay una necesidad de registrar otras personalizados PropertyEditors , hay varios mecanismos disponibles. La aproximacin ms manual, que normalmente no es conveniente ni recomendable, es simplemente usar el registerCustomEditor() mtodo de la ConfigurableBeanFactory interfaz, suponiendo que tiene un BeanFactory referencia. Otro, ligeramente ms conveniente, el mecanismo es el uso de una fbrica de frijol especial post-procesador llamado CustomEditorConfigurer . Aunque fbrica de beans post-procesadores se puede utilizar con BeanFactory implementaciones, el CustomEditorConfigurer tiene una configuracin de propiedad anidada, por lo que se recomienda encarecidamente que se utiliza con el ApplicationContext , donde puede ser desplegado de manera similar a cualquier otro frijol, y se detecta automticamente y aplicada.

Tenga en cuenta que todas las fbricas de frijol y contextos de aplicacin automticamente utilizar un nmero de una funcin de editores de propiedades, a travs de su uso de algo llamado BeanWrapper para manejar las conversiones de propiedad. Los editores de propiedades estndar que los BeanWrapper registros enumerados en el apartado anterior . Adems, ApplicationContexts tambin anular o aadir un nmero adicional de editores para manejar bsquedas de recursos de una manera apropiada para el tipo de aplicacin contexto especfico. Estndar JavaBeans PropertyEditor casos se utilizan para convertir valores de las propiedades expresadas como cadenas en el tipo actual complejo de la propiedad. CustomEditorConfigurer , una fbrica de beans post-procesador, se puede utilizar para aadir convenientemente el soporte de varias PropertyEditor instancias a un ApplicationContext . Considere una clase de usuario ExoticType , y otra clase DependsOnExoticType que necesita ExoticType conjunto como una propiedad:
paquete de ejemplo; pblico ExoticType clase { private String nombre; pblico ExoticType (String nombre) { . este nombre = nombre; } } pblico DependsOnExoticType clase { tipo ExoticType privado; settype public void (tipo ExoticType) { este tipo = tipo.; } }

Cuando las cosas estn bien configurado, queremos ser capaces de asignar el tipo de propiedad como una cadena, que un PropertyEditor va detrs de las escenas de convertirlo en un verdadero ExoticType ejemplo:
<bean id = "sample" class = "example.DependsOnExoticType"> <propiedad nombre = valor = "type" "aNameForExoticType" /> </ Bean>

El PropertyEditor aplicacin podra ser similar a esto:


/ / Convierte la representacin de cadena de ExoticType objeto paquete de ejemplo; public class extends ExoticTypeEditor PropertyEditorSupport { public void setAsText (String text) { setValue (nuevo ExoticType (text.toUpperCase ())); }

Por ltimo, utilizamos CustomEditorConfigurer para registrar el nuevo PropertyEditor con el ApplicationContext , que entonces ser capaz de utilizarlo en caso necesario:
<bean class = "org.springframework.beans.factory.config.CustomEditorConfigurer"> <propiedad nombre = "customEditors"> <map> <entry clave = valor = "example.ExoticType" "example.ExoticTypeEditor" /> </ Map> </ Propiedad> </ Bean> Usando PropertyEditorRegistrars

Otro mecanismo para el registro de editores de propiedades con el contenedor Spring es crear y utilizar un PropertyEditorRegistrar . Esta interfaz es particularmente til cuando se necesita utilizar el mismo conjunto de editores de propiedades en varias situaciones diferentes: escribir un registrador correspondiente y volver a utilizar en cada caso. PropertyEditorRegistrars trabajan en conjunto con una interfaz llamada PropertyEditorRegistry , una interfaz que se implementa en la primavera BeanWrapper (y DataBinder .) PropertyEditorRegistrars son particularmente convenientes cuando se utiliza junto con el CustomEditorConfigurer (introducido aqu ), que expone una propiedad llamada setPropertyEditorRegistrars(..) : PropertyEditorRegistrars aadi a una CustomEditorConfigurer de esta manera se pueden compartir fcilmente con DataBinder y MVC Spring Controllers . Adems, se evita la necesidad de sincronizacin en editores: un PropertyEditorRegistrar se espera que cree frescas PropertyEditor casos por cada intento de creacin de frijol. El uso de un PropertyEditorRegistrar quiz se ilustra mejor con un ejemplo. En primer lugar, usted necesita para crear su propio PropertyEditorRegistrar ejecucin:
paquete com.foo.editors.spring; CustomPropertyEditorRegistrar public final class implementa PropertyEditorRegistrar { registerCustomEditors public void (PropertyEditorRegistry registro) { / / Se espera que los nuevos casos PropertyEditor se crean registry.registerCustomEditor (ExoticType. clase, nuevo ExoticTypeEditor ()); / / Se puede registrar tantos editores de propiedades personalizadas como se requiere aqu ... } }

Vase tambin el
org.springframework.beans.support.ResourceEditorRegistrar para un ejemplo PropertyEditorRegistrar implementacin. Note como en su aplicacin de las registerCustomEditors(..) mtodo que crea nuevas instancias de cada editor de

propiedades. A continuacin configuraremos una CustomEditorConfigurer e inyectar una instancia de nuestro CustomPropertyEditorRegistrar en l:
<bean class = "org.springframework.beans.factory.config.CustomEditorConfigurer"> <propiedad nombre = "propertyEditorRegistrars"> <list> <ref frijol = "customPropertyEditorRegistrar" /> </ List> </ Propiedad> </ Bean> <Bean id = "customPropertyEditorRegistrar" class = "com.foo.editors.spring.CustomPropertyEditorRegistrar" />

Por ltimo, y en un poco de un cambio desde el enfoque de este captulo, para aquellos de ustedes utilizando Spring MVC framework web , utilizando PropertyEditorRegistrars junto con enlace de datos Controllers (como SimpleFormController ) puede ser muy conveniente. Encontrar ms adelante un ejemplo del uso de un PropertyEditorRegistrar en la aplicacin de un initBinder(..) mtodo:
public final class extends RegisterUserController SimpleFormController { customPropertyEditorRegistrar privado PropertyEditorRegistrar final; pblico RegisterUserController (propertyEditorRegistrar PropertyEditorRegistrar) { este customPropertyEditorRegistrar = propertyEditorRegistrar.; } protected void initBinder (HttpServletRequest request, ServletRequestDataBinder aglutinante) throws Exception { this.customPropertyEditorRegistrar.registerCustomEditors (aglutinante); } / / Otros mtodos que ver con el registro de un usuario }

Este estilo de PropertyEditor registro puede llevar a cdigo conciso (la implementacin de initBinder(..) es slo una lnea de tiempo!), y permite comn PropertyEditor cdigo de registro para ser encapsulado en una clase y luego compartido entre tantos Controllers como sea necesario.

7,5 Spring 3 Tipo de conversin


Spring 3 introduce un core.convert paquete que proporciona un sistema de conversin de tipo general. El sistema define un SPI para implementar la lgica de conversin de tipo, as como una API para ejecutar conversiones de tipos en tiempo de ejecucin. Dentro de un contenedor Spring, este sistema puede ser usado como una alternativa a PropertyEditors para convertir externalizados frijol cadenas de valor de propiedad a los tipos de propiedades requeridas. La API pblica tambin se puede utilizar en cualquier lugar en su aplicacin en la conversin de tipos es necesaria.
7.5.1 Convertidor de SPI

El SPI para implementar la lgica de conversin de tipo es simple y fuertemente tipado:


paquete org.springframework.core.convert.converter; public interface Convertidor <S, T> { T convert (fuente S); }

Para crear su propio convertidor, slo tiene que implementar la interfaz anterior. Parametrizar S como el tipo que va a convertir a partir de, y T como el tipo que est convirtiendo. Para cada llamada a convertir (S), el argumento de origen se garantiza que sea NOT NULL. El convertidor puede lanzar cualquier excepcin si la conversin falla. Un IllegalArgumentException se debe tirar a un valor del origen invlido. Tenga cuidado de asegurar su aplicacin Converter es thread-safe. Varias implementaciones convertidor se proporcionan en el core.convert.support paquete para su conveniencia. Estos incluyen convertidores de cadenas en nmeros y otros tipos comunes. Considere StringToInteger como una aplicacin Convertidor de ejemplo:
paquete org.springframework.core.convert.support; ltimo StringToInteger clase implementa Convertidor <String, Integer> { pblico Integer convert (fuente String) { volver Integer.valueOf (fuente); } }

7.5.2 ConverterFactory

Cuando usted necesita para centralizar la lgica de conversin de toda una jerarqua de clases, por ejemplo, al convertir de String a objetos java.lang.Enum, implementar ConverterFactory :
paquete org.springframework.core.convert.converter;

public interface ConverterFactory <S, R> { <t Extiende R> Convertidor <S, T> GetConverter (Clase <T> targetType); }

Parametrizar S ser el tipo que va a convertir a partir de R y de ser el tipo de base que define la gama de clases que se pueden convertir. A continuacin, implemente GetConverter (Clase <T>), donde T es una subclase de R. Considere la StringToEnum ConverterFactory como un ejemplo:
paquete org.springframework.core.convert.support; ltimo StringToEnumConverterFactory clase implementa ConverterFactory <String, Enum> { pblico <t extiende Enum> Convertidor <String, T> GetConverter (Clase <T> targetType) { volver StringToEnumConverter nuevo (targetType); } privado <t ltimo StringToEnumConverter clase extiende Enum> implementa Convertidor <String, T> { Clase privada <T> enumType; StringToEnumConverter pblico (Clase <T> enumType) { este enumType = enumType.; } T pblico convert (fuente String) { retorno (T) Enum.valueOf (esto enumType, source.trim ().); } } }

7.5.3 GenericConverter

Cuando se requiere una aplicacin Convertidor sofisticado, considere la interfaz GenericConverter. Con una firma ms flexible pero menos fuertemente tipado, un GenericConverter soporta la conversin entre mltiples fuentes y tipos de destino. Adems, una fuente GenericConverter hace disponible y el contexto campo de destino se puede utilizar en la aplicacin de la lgica de su conversin. Tal contexto permite una conversin del tipo para ser accionado por una anotacin de campo, o la informacin genrica declarado en un campo de firma.
paquete org.springframework.core.convert.converter; GenericConverter interfaz pblica { pblicos getConvertibleTypes Set <ConvertiblePair> (); Objeto convert (fuente de objetos, TypeDescriptor sourceType, TypeDescriptor targetType);

Para implementar un GenericConverter, tienen getConvertibleTypes () Devuelve el apoyo source-> Tipo de destino pares. A continuacin, implemente convert (Object, TypeDescriptor, TypeDescriptor) para implementar la lgica de conversin. La fuente TypeDescriptor proporciona acceso al campo de origen que contiene el valor que se convierte. El objetivo TypeDescriptor proporciona acceso al campo de destino donde se va a establecer el valor convertido. Un buen ejemplo de un GenericConverter es un convertidor que convierte entre una matriz de Java y una coleccin. Tal ArrayToCollectionConverter introspeccin en el campo que declara el tipo Collection objetivo de resolver el tipo de elemento de coleccin. Esto permite que cada elemento de la matriz de origen que se convierte al tipo de elemento de la coleccin antes de la recogida se encuentra en el campo de destino.
Nota

Porque GenericConverter es una interfaz SPI ms compleja, slo lo uso cuando lo necesite. Favor Converter o ConverterFactory para las necesidades bsicas de conversin de tipos.
ConditionalGenericConverter

A veces usted slo quiere un convertidor que se ejecuta si una condicin especfica es cierto. Por ejemplo, es posible que slo desea ejecutar un convertidor si una anotacin especfica est presente en el campo de destino. O es posible que slo desea ejecutar un convertidor si un mtodo especfico, como mtodo valueOf esttico, se define en la clase de destino. ConditionalGenericConverter es una subinterfaz de GenericConverter que le permite definir tales criterios personalizados a juego:
ConditionalGenericConverter public interface extiende GenericConverter { partidos booleanos (TypeDescriptor sourceType, TypeDescriptor targetType); }

Un buen ejemplo de un ConditionalGenericConverter es un EntityConverter que convierte entre un identificador de entidad persistente y una referencia de entidad. Tal EntityConverter slo pueden coincidir si el tipo de entidad de destino declara un buscador por ejemplo, mtodo esttico findAccount (Long). Se podra realizar dicha comprobacin mtodo de bsqueda en la implementacin de los partidos (TypeDescriptor, TypeDescriptor).
7.5.4 ConversionService API

El ConversionService define una API unificada para la ejecucin de la lgica de conversin de tipo en tiempo de ejecucin. Convertidores de frecuencia se ejecuta detrs de esta fachada interfaz:

paquete org.springframework.core.convert; ConversionService interfaz pblica { CanConvert booleano (Clase sourceType, Clase targetType <> <>); <T> T convert (fuente Object, Class <T> targetType); CanConvert booleano (TypeDescriptor sourceType, TypeDescriptor targetType); Objeto convert (fuente de objetos, TypeDescriptor sourceType, TypeDescriptor targetType); }

La mayora de las implementaciones ConversionService tambin implementan ConverterRegistry , que proporciona un SPI para convertidores de registrarse. Internamente, a los delegados de aplicacin ConversionService a sus convertidores registrados para llevar a cabo la lgica de conversin de tipos. Una implementacin ConversionService robusto se proporciona en la core.convert.support paquete. GenericConversionService es la aplicacin de uso general adecuado para uso en la mayora de los entornos. ConversionServiceFactory proporciona una fbrica conveniente para crear configuraciones comunes ConversionService.
7.5.5 Configuracin de un ConversionService

A ConversionService es un objeto sin estado diseado para ejecutarse en el inicio de la aplicacin, y luego compartir entre varios subprocesos. En una aplicacin de primavera, normalmente se configura una instancia ConversionService por contenedor Spring (o ApplicationContext). ConversionService que ser recogido por resorte y entonces se utiliza cada vez que un tipo de conversin tiene que ser realizada por el marco. Tambin se puede inyectar esta ConversionService en cualquiera de sus granos e invocarlo directamente.
Nota

Si no ConversionService se ha registrado en primavera, el original PropertyEditor sistema basado se utiliza. Para registrar un ConversionService defecto con la primavera, agregue la siguiente definicin de frijol con identificador conversionService :
<Bean id = "conversionService" class = "org.springframework.context.support.ConversionServiceFactoryBean" />

A ConversionService defecto puede convertir entre cadenas, nmeros, enumeraciones, colecciones, mapas, y otros tipos comunes. Para complementar o reemplazar los conversores por defecto con su propio convertidor personalizado (s), ajuste el

converters

propiedad. Los valores de propiedad pueden implementar cualquiera de las Converter, ConverterFactory, o interfaces GenericConverter.
<Bean id = "conversionService" class = "org.springframework.context.support.ConversionServiceFactoryBean"> <propiedad nombre = "converters"> <list> <bean class = "example.MyCustomConverter" /> </ List> </ Propiedad> </ Bean>

Tambin es comn utilizar un ConversionService dentro de una aplicacin Spring MVC. Consulte Seccin 7.6.5, "Configuracin de formato en Spring MVC" para obtener ms informacin sobre el uso de <mvc:annotation-driven/> . En determinadas situaciones, es posible que desee aplicar el formato durante la conversin. Consulte Seccin 7.6.3, "FormatterRegistry SPI" para obtener ms informacin sobre el uso de FormattingConversionServiceFactoryBean .
7.5.6 Uso de un ConversionService programacin

Para trabajar con una instancia ConversionService programacin, simplemente inyectar una referencia a l como si se tratara de cualquier otro frijol:
@ Servicio MyService clase pblica { @ Autoconectados MyService pblico (ConversionService conversionService) { este conversionService = conversionService.; } doIt public void () { este conversionService.convert. (...) } }

7,6 Spring 3 Campo de formato


Como se discuti en la seccin anterior, core.convert es un sistema de tipo de propsito general de conversin. Proporciona una API unificada ConversionService as como con tipos Convertidor de SPI para implementar la lgica de conversin de un tipo a otro. Un contenedor Spring utiliza este sistema para enlazar los valores de propiedad de frijol. Adems, tanto el lenguaje de expresin Spring (SPEL) y DataBinder utilizar este sistema para obligar a los valores de campo. Por ejemplo, cuando Spel tiene que obligar a un Short a un Long para completar una expression.setValue(Object bean, Object value) intento, el sistema core.convert realiza la coercin. Ahora considere los requisitos de conversin de tipo de un entorno cliente tpico como una aplicacin web o de escritorio. En estos entornos, normalmente convertir de String a apoyar el proceso de devolucin de datos del cliente, as como volver a String para

apoyar el proceso de renderizado vista. Adems, a menudo es necesario localizar valores de cadena. Cuanto ms general core.convert convertidor SPI no se ocupa de estos requisitos de formato directamente. Para abordarlos directamente, Spring 3 introduce un prctico SPI Formatter que proporciona una alternativa sencilla y robusta para PropertyEditors para entornos de cliente. En general, utilice el SPI usa cuando es necesario implementar para fines generales lgica de conversin de tipo, por ejemplo, para convertir entre una y java.util.Date y java.lang.Long. Utilice el SPI Formatter cuando se trabaja en un entorno de cliente, como por ejemplo una aplicacin web, y la necesidad de analizar e imprimir los valores localizados sobre el terreno. El ConversionService proporciona una API de conversin de tipo unificado para ambos SPI.
7.6.1 Formatter SPI

El SPI Formatter para implementar la lgica campo formato es simple y fuertemente tipado:
paquete org.springframework.format; public interface Formatter <T> extiende impresora <T>, Analizador <T> { }

Donde Formatter se extiende desde la impresora y las interfaces del Analizador de bloque institucional:
public interface de impresora <T> { Cadena de impresin (T fieldValue, Locale locale); } java.text.ParseException importacin; public interface del Analizador <T> { T parse (String clientValue, Locale locale) throws ParseException; }

Para crear su propio formateador, slo tiene que implementar la interfaz Formatter arriba. Parametrizar T para el tipo de objeto que desea formatear, por ejemplo, java.util.Date . Implementar el print() para imprimir el funcionamiento de una instancia de T para mostrar en la configuracin regional del cliente. Implementar el parse() para analizar el funcionamiento de una instancia de T a partir de la representacin con formato de regresar de la configuracin regional del cliente. Su Formatter debe lanzar una IllegalArgumentException ParseException o si un intento de anlisis falla. Tenga cuidado de asegurar su aplicacin Formatter es thread-safe. Varias implementaciones Formatter se proporcionan en format subpaquetes para su conveniencia. El number paquete proporciona un NumberFormatter, CurrencyFormatter y PercentFormatter para dar formato a los objetos java.lang.Number utilizando un java.text.NumberFormat. La datetime paquete proporciona un DateFormatter para dar formato a los objetos java.util.Date con un java.text.DateFormat. El datetime.joda

paquete proporciona un amplio soporte de formato de fecha y hora basado en la biblioteca Joda Time . Considere DateFormatter como ejemplo Formatter ejecucin:
paquete org.springframework.format.datetime; DateFormatter public final class implementa Formatter <Date> { Patrn de encordado privado; DateFormatter pblico (patrn String) { este patrn = patrn.; } print public String (fecha Fecha, Locale locale) { if (fecha == null) { return ""; } volver GetDateFormat (locale) formato (fecha).; } Fecha parse (String formateado, Locale locale) throws ParseException { if (formatted.length () == 0) { return null; } volver GetDateFormat (locale) parse (formato).; } protegida DateFormat GetDateFormat (Locale locale) { DateFormat dateFormat = new SimpleDateFormat (este patrn, la configuracin regional.); dateFormat.setLenient (false); volver dateFormat; } }

El equipo da la bienvenida a la primavera de autogestin comunitaria contribuciones Formatter, ver http://jira.springframework.org que aportar.
7.6.2 Anotacin basada formato

Como se puede ver, el formato de campo se puede configurar el tipo de campo o anotaciones. Para enlazar una anotacin a un formateador, implemente AnnotationFormatterFactory:
paquete org.springframework.format; interfaz pblica <A AnnotationFormatterFactory extiende Annotation> { Set <Class <>> getFieldTypes (); Impresora GetPrinter (A anotacin, clase campTipo <>) <>; Analizador getParser (A anotacin, clase campTipo <>) <>;

Parametrizar la A a la AnnotationType campo que desea asociar con la lgica de formato, por ejemplo org.springframework.format.annotation.DateTimeFormat . Tener getFieldTypes() devuelve los tipos de campos pueden ser utilizados en la anotacin. Ha getPrinter() devuelve una impresora para imprimir el valor de un campo anotado. Ha getParser() devuelve un Parser para analizar una clientValue para un campo anotado. La implementacin de ejemplo AnnotationFormatterFactory abajo se une la anotacin @ NumberFormat a un formateador. Esta anotacin permite ya sea un estilo de nmero o patrn que se especifique:
public final class NumberFormatAnnotationFormatterFactory implementa AnnotationFormatterFactory <NumberFormat> { Set pblico <class <? >> getFieldTypes () { return new HashSet <Class <? >> (asList (nueva clase <> [] { Short. Clase Integer. Clase, la clase Long., Float. Clase, . Doble clase, clase BigDecimal, BigInteger clase}))..; } Impresora pblico <Nmero> GetPrinter (anotacin NumberFormat, Class <> campTipo) { volver configureFormatterFrom (anotacin, campTipo); } getParser pblico <Nmero> Parser (anotacin NumberFormat, Class <?> campTipo) { volver configureFormatterFrom (anotacin, campTipo); } privado Formatter <Nmero> configureFormatterFrom (anotacin NumberFormat, Class <> campTipo) { if (! annotation.pattern (). estaVacia ()) { return new NumberFormatter (annotation.pattern ()); } Else { Estilo = Estilo annotation.style (); si (== estilo Style.PERCENT) { volver PercentFormatter nuevo (); } Else if (estilo Style.CURRENCY ==) { volver CurrencyFormatter nuevo (); } Else { volver NumberFormatter nuevo (); } } } }

Para activar el formato, simplemente anotar los campos con NumberFormat @:


MyModel clase pblica { @ NumberFormat (estilo Style.CURRENCY =) BigDecimal privado decimal;

Formato API anotacin

Una API de formato porttil anotacin existe en el org.springframework.format.annotation paquete. Utilice @ NumberFormat para dar formato a los campos java.lang.Number. Utilice @ DateTimeFormat para dar formato a java.util.Date, java.util.Calendar, java.util.Long o campos Joda Time. El ejemplo siguiente utiliza DateTimeFormat @ para dar formato a un java.util.Date como una fecha ISO (AAAA-MM-dd):
MyModel clase pblica { @ DateTimeFormat (iso = ISO.DATE) Fecha Fecha privado; }

7.6.3 FormatterRegistry SPI

El FormatterRegistry es un SPI para el registro de formateadores y convertidores. FormattingConversionService es una implementacin de FormatterRegistry adecuado para la mayora de los entornos. Esta aplicacin se puede configurar mediante programacin o mediante declaracin como un bean de Spring usando FormattingConversionServiceFactoryBean . Debido a que esta aplicacin tambin implementa ConversionService , puede configurarse directamente para su uso con DataBinder Spring y el Lenguaje de expresin Spring (Spel). Revise el SPI FormatterRegistry a continuacin:
paquete org.springframework.format; FormatterRegistry public interface extiende ConverterRegistry { vaco addFormatterForFieldType (Clase campTipo, impresora impresora, analizador analizador <> <> <>); vaco addFormatterForFieldType (Clase campTipo, Formatter formateador <> <>); vaco addFormatterForFieldType (Formatter formateador <>); void addFormatterForAnnotation (AnnotationFormatterFactory fbrica <,??>); }

Como puede observarse, formateadores pueden ser registrados por campTipo o anotacin. El SPI FormatterRegistry le permite configurar reglas de formato de forma centralizada, en lugar de duplicar dicha configuracin a travs de sus controladores. Por ejemplo, es posible que desee hacer valer que todos los campos de fecha tienen el formato de una

determinada manera, o los campos con una anotacin especfica tienen el formato de una determinada manera. Con un FormatterRegistry compartida, definir estas reglas una vez y se aplican siempre que el formato que se necesita.
7.6.4 FormatterRegistrar SPI

El FormatterRegistrar es un SPI para el registro de formateadores y los convertidores a travs de la FormatterRegistry:


paquete org.springframework.format; FormatterRegistrar interfaz pblica { registerFormatters void (FormatterRegistry registro); }

A FormatterRegistrar es til cuando se registran varios convertidores relacionados y formateadores para una categora determinada de formato, como el formato de la fecha. Tambin puede ser til cuando el registro declarativo es insuficiente. Por ejemplo, cuando un formateador necesita ser indexado en virtud de un tipo de campo especfico diferente de su propio <T> o cuando se registra un par de la impresora / Parser. En la siguiente seccin se ofrece ms informacin sobre convertidor y registro formateador.
7.6.5 Configuracin de formato en Spring MVC

En una aplicacin Spring MVC, es posible configurar una instancia ConversionService personalizada de forma explcita como un atributo de la annotation-driven los elementos del espacio de nombres MVC. Esta ConversionService entonces se utilizar cada vez que una conversin de tipo es necesaria durante modelo de enlace de controlador. Si no se configura explcitamente, Spring MVC registrar automticamente formateadores predeterminados y los convertidores de tipos comunes, tales como nmeros y fechas. Contar con reglas de formato por defecto, sin necesidad de configuracin personalizada se requiere en su Spring MVC configuracin XML:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: mvc = "http://www.springframework.org/schema/mvc" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd "> <mvc:annotation-driven/> </ Beans>

Con esta lnea de configuracin, formateadores predeterminados para los nmeros y tipos de datos se instalar, incluido el apoyo a la NumberFormat y anotaciones @ @

DateTimeFormat. Soporte completo para la biblioteca formato Joda Time tambin se instala si el tiempo Joda est presente en el classpath. Para inyectar una instancia ConversionService con formateadores personalizados y convertidores registrados, establezca el atributo conversin de servicios y especifique los convertidores personalizados, formateadores, o FormatterRegistrars como propiedades del FormattingConversionServiceFactoryBean:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: mvc = "http://www.springframework.org/schema/mvc" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd "> <mvc:annotation-driven conversion-service = "conversionService" /> <Bean id = "conversionService" class = "org.springframework.format.support.FormattingConversionServiceFactory Bean"> <propiedad nombre = "converters"> <set> <bean class = "org.example.MyConverter" /> </ Set> </ Propiedad> <propiedad nombre = "formatters"> <set> <bean class = "org.example.MyFormatter" /> <bean class = "org.example.MyAnnotationFormatterFactory" /> </ Set> </ Propiedad> <propiedad nombre = "formatterRegistrars"> <set> <bean class = "org.example.MyFormatterRegistrar" /> </ Set> </ Propiedad> </ Bean> </ Beans>

Nota

Consulte Seccin 7.6.4, "FormatterRegistrar SPI" y la FormattingConversionServiceFactoryBean para obtener ms informacin sobre cundo utilizar FormatterRegistrars.

7.7 Configuracin de un formato de fecha y hora mundial

Por los campos por defecto, la fecha y hora que no estn anotados con @DateTimeFormat se convierten de cadenas mediante el la DateFormat.SHORT estilo. Si lo prefiere, puede cambiar esto al definir su propio formato global. Usted tendr que asegurarse de que la primavera no registra formateadores predeterminados, y en su lugar se debe registrar todos los formateadores manualmente. Utilizar dependiendo de si se utiliza la biblioteca de tiempo Joda. Por ejemplo, la siguiente configuracin de Java se registrar un global ' yyyyMMdd 'formato. Este ejemplo no es independiente de la biblioteca Joda Time:
@ Configuracin AppConfig clase pblica { @ Frijol conversionService FormattingConversionService pblico () { / / Utilizar el DefaultFormattingConversionService pero no se registre por defecto DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService (false); / / Asegrese de NumberFormat @ an se admite conversionService.addFormatterForFieldAnnotation (nuevo NumberFormatAnnotationFormatterFactory ()); / / Se registra conversin de la fecha con un formato especfico global Registrador DateFormatterRegistrar = DateFormatterRegistrar nuevo (); registrar.setFormatter (nuevo DateFormatter ("AAAAMMDD")); registrar.registerFormatters (conversionService); volver conversionService; } }

Si prefiere configuracin basada en XML que puede utilizar un FormattingConversionServiceFactoryBean . Aqu est el mismo ejemplo, esta vez utilizando Joda Time:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/springbeans.xsd> <Frijol <propiedad nombre = valor = "registerDefaultFormatters" "false" /> <propiedad nombre = "formatters"> <set> <bean class = "org.springframework.format.number.NumberFormatAnnotationFormatterFact ory" /> </ Set>

</ Propiedad> <propiedad nombre = "formatterRegistrars"> <set> <bean class = "org.springframework.format.datetime.joda.JodaTimeFormatterRegistrar"> <propiedad nombre = "dateFormatter"> <bean class = "org.springframework.format.datetime.joda.DateTimeFormatterFactoryBean "> <propiedad nombre = valor = "pattern" "yyyyMMdd" /> </ Bean> </ Propiedad> </ Bean> </ Set> </ Propiedad> </ Bean> </ Beans>

Nota

Joda Time ofrece distintos tipos distintos de representar date , time y date-time valores. Los dateFormatter , timeFormatter y dateTimeFormatter propiedades de la JodaTimeFormatterRegistrar debe ser utilizado para configurar los diferentes formatos para cada tipo. El DateTimeFormatterFactoryBean proporciona una forma conveniente de crear formateadores. Si est utilizando Spring MVC recordar que configurar explcitamente el servicio de conversin que se utiliza. Para Java basada @Configuration esto significa ampliar el WebMvcConfigurationSupport clase y reemplazando el mvcConversionService() mtodo. Para XML debe utilizar la 'conversion-service' atributo del mvc:annotation-driven elemento. Consulte Seccin 7.6.5, "Configuracin de formato en Spring MVC" para ms detalles.

7,8 Spring 3 Validacin


Spring 3 introduce varias mejoras a su soporte de validacin. En primer lugar, la JSR303 Frijol Validacin API es ahora totalmente compatible. En segundo lugar, cuando se utiliza programacin, DataBinder Spring ahora puede validar los objetos, as como se unen a ellos. En tercer lugar, Spring MVC ahora tiene soporte para la validacin declarativa @ entradas del controlador.
7.8.1 Descripcin general de la API JSR-303 Frijol de validacin

JSR-303 estandariza declaracin de validacin y restriccin de metadatos para la plataforma Java. Con esta API, anotar las propiedades de modelo de dominio con restricciones de validacin declarativa y el tiempo de ejecucin las hace cumplir. Hay una serie de limitaciones incorporadas que usted puede tomar ventaja de. Tambin puede definir sus propias restricciones personalizadas. Como ejemplo, consideremos un modelo PersonForm simple con dos propiedades:
pblico PersonForm clase { private String nombre;

edad int privado; }

JSR-303 le permite definir restricciones de validacin declarativa contra dichas propiedades:


pblico PersonForm clase { @ NotNull @ Size (max = 64) private String nombre; @ Min (0) edad int privado; }

Cuando una instancia de esta clase ha sido validado por un validador JSR-303, estas restricciones se aplican. Para obtener informacin general sobre el JSR-303, consulte la especificacin Bean Validation . Para obtener informacin sobre las capacidades especficas de la implementacin de referencia predeterminado, consulte el Hibernate Validator documentacin. Para aprender a configurar una implementacin JSR-303 como un bean de Spring, siga leyendo.
7.8.2 Configuracin de una aplicacin Bean Validation

Primavera es totalmente compatible con la especificacin JSR-303 API haba validacin. Esto incluye el apoyo conveniente para el arranque de una implementacin JSR-303 como un bean de Spring. Esto permite una javax.validation.ValidatorFactory o javax.validation.Validator a inyectar donde la validacin es necesaria en su aplicacin. Utilice el LocalValidatorFactoryBean para configurar un defecto JSR-303 Validator como un bean de Spring:
<Bean id = "validador" class = "org.springframework.validation.beanvalidation.LocalValidatorFactoryBe an" />

La configuracin bsica anteriormente dar lugar a JSR-303 para inicializar utilizando el mecanismo de arranque por defecto. Un proveedor de JSR-303, como Hibernate Validator, se espera que estn presentes en la ruta de clase y se detectarn automticamente.
La inyeccin de un validador
LocalValidatorFactoryBean implementa tanto javax.validation.ValidatorFactory y javax.validation.Validator , as como Spring org.springframework.validation.Validator . Usted puede inyectar una

referencia a cualquiera de estas interfaces en granos que necesita para invocar la lgica de validacin. Inyectar una referencia a javax.validation.Validator si usted prefiere trabajar con la API JSR-303 directamente:
javax.validation.Validator importacin; @ Servicio MyService clase pblica { @ Autoconectados privado validador Validator;

Inyectar una referencia a org.springframework.validation.Validator si el bean requiere la validacin de primavera API:


org.springframework.validation.Validator importacin; @ Servicio MyService clase pblica { @ Autoconectados privado validador Validator; }

Configuracin de restricciones personalizadas

Cada restriccin de validacin JSR-303 consta de dos partes. En primer lugar, una anotacin @ restriccin que declara la restriccin y sus propiedades configurables. En segundo lugar, una implementacin de la javax.validation.ConstraintValidator interfaz que implementa el comportamiento de la restriccin. Para asociar una declaracin con una implementacin, cada anotacin @ referencias de restriccin a una clase ValidationConstraint aplicacin correspondiente. En tiempo de ejecucin, un ConstraintValidatorFactory instancia de la aplicacin hace referencia cuando la anotacin restriccin se encuentra en el modelo de dominio. Por defecto, el LocalValidatorFactoryBean configura un SpringConstraintValidatorFactory que utiliza Spring para crear instancias ConstraintValidator. Esto permite que sus ConstraintValidators personalizados para beneficiarse de la inyeccin de dependencia como cualquier otro frijol de primavera. A continuacin se muestra un ejemplo de una declaracin de restricciones personalizadas @, seguido de un asociado ConstraintValidator aplicacin que utiliza Spring para la inyeccin de dependencia:
@ Target ({ElementType.METHOD, ElementType.FIELD}) @ Retention (RetentionPolicy.RUNTIME) @ Restriccin (validatedBy = MyConstraintValidator.class) public @ interface MyConstraint { } javax.validation.ConstraintValidator importacin;

pblico MyConstraintValidator clase implementa ConstraintValidator { @ Autoconectados; privado aDependency Foo; ... }

Como se puede ver, una aplicacin ConstraintValidator puede tener sus dependencias @ autoconectados como cualquier otro frijol de primavera.
Opciones de configuracin adicionales

El valor predeterminado LocalValidatorFactoryBean configuracin debera ser suficiente para la mayora de los casos. Hay un nmero de otras opciones de configuracin para diversos constructos JSR-303, a partir de la interpolacin mensaje a traversal resolucin. Ver las JavaDocs de LocalValidatorFactoryBean para obtener ms informacin sobre estas opciones.
7.8.3 Configuracin de un DataBinder

Desde Spring 3, un ejemplo DataBinder se puede configurar con un validador. Una vez configurado, el Validador podr ser invocado llamando binder.validate() . Los errores de validacin se agregan automticamente a la carpeta de BindingResult. Cuando se trabaja con la DataBinder programacin, este puede ser usado para invocar la lgica de validacin despus de la unin a un objeto de destino:
Foo target = new Foo (); DataBinder carpeta = new DataBinder (objetivo); binder.setValidator (nuevo FooValidator ()); / / Bind al objeto de destino binder.bind (propertyValues); / / Validar el objeto de destino binder.validate (); / / Obtener BindingResult que incluye los errores de validacin Resultados BindingResult = binder.getBindingResult ();

Un DataBinder tambin puede ser configurado con mltiples Validator casos a travs de dataBinder.addValidators y dataBinder.replaceValidators . Esto es til cuando se combina el mundo configurado JSR-303 Bean Validation con un resorte Validator configurado de forma local en una instancia DataBinder. Consulte la seccin "Configuracin de un validador para el uso de Spring MVC" .
7.8.4 Spring MVC 3 Validacin

Comenzando con Spring 3, Spring MVC tiene la capacidad de validar automticamente @ entradas del controlador. En versiones anteriores era responsabilidad del desarrollador para invocar manualmente la lgica de validacin.

Disparo @ validacin de entrada del controlador

Para activar la validacin de una entrada del controlador @, simplemente anotar el argumento de entrada como @ vlido:
@ Controller pblico myController clase { @ RequestMapping ("/ foo", method = RequestMethod.POST) public void processFoo (@ foo Vlido Foo) {/ * ... * /}

Spring MVC validar un objeto vlido @ despus de la unin tan largo como apropiado Validator se ha configurado.
Nota

La anotacin @ Vlido es parte del estndar JSR-303 API de haba de validacin, y no es un constructo Spring especfica.
Configuracin de un validador para el uso de Spring MVC

La instancia Validator invoca cuando un argumento @ mtodo vlido es detectado puede ser configurado de dos maneras. En primer lugar, puede llamar binder.setValidator (Validator) dentro de un controlador @ @ InitBinder de devolucin de llamada. Esto le permite configurar una instancia de la clase Validator por @ Controller:
@ Controller pblico myController clase { @ InitBinder protected void initBinder (WebDataBinder aglutinante) { binder.setValidator (nuevo FooValidator ()); } @ RequestMapping ("/ foo", method = RequestMethod.POST) public void processFoo (@ foo Vlido Foo) {... } }

En segundo lugar, usted puede llamar setValidator (Validator) en el WebBindingInitializer global. Esto le permite configurar una instancia de validador a travs de todos los controladores @. Esto se puede conseguir fcilmente mediante el uso del espacio de nombres Spring MVC:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: mvc = "http://www.springframework.org/schema/mvc" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd ">

<mvc:annotation-driven validador = "globalValidator" /> </ Beans>

Para combinar una global y local validador, configurar el validador global, como se muestra arriba y luego agregar un local validador:
@ Controller pblico myController clase { @ InitBinder protected void initBinder (WebDataBinder aglutinante) { binder.addValidators (nuevo FooValidator ()); } }

Configuracin de un validador de JSR-303 para el uso de Spring MVC

Con JSR-303, un solo javax.validation.Validator ejemplo tpicamente valida todos los objetos del modelo que declaran restricciones de validacin. Para configurar un validador JSR-303-respaldado con Spring MVC, slo tiene que aadir un proveedor de JSR-303, como Hibernate Validator, a su ruta de clase. Spring MVC lo detectar automticamente y permitir JSR-303 de apoyo a travs de todos los controladores. La configuracin de Spring MVC necesaria para permitir JSR-303 de soporte se muestra a continuacin:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: mvc = "http://www.springframework.org/schema/mvc" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd "> <- JSR-303 de apoyo se detecta en classpath y activar automticamente -> <mvc:annotation-driven/> </ Beans>

Con esta configuracin mnima, cada vez que un @ @ Vlido entrada del controlador se encuentra, ser validado por el proveedor de JSR-303. JSR-303, a su vez, har cumplir las restricciones declaradas contra la entrada. Cualquier ConstraintViolations automticamente se exponen como errores en la BindingResult renderizable por etiquetas estndar de la forma del resorte MVC.

8. Spring Expression Language (SPEL) 8.1 Introduccin

El lenguaje de expresin Spring (SPEL para abreviar) es un lenguaje de expresin de gran alcance que permite consultar y manipular un grfico de objetos en tiempo de ejecucin. La sintaxis del lenguaje es similar a EL Unificado, pero ofrece caractersticas adicionales, la invocacin sobre todo mtodo y la funcionalidad cadena bsica de plantillas. Si bien hay varios otros idiomas expresin Java disponibles, OGNL, MVEL, y EL JBoss, por nombrar unos pocos, el lenguaje de expresin de Primavera fue creado para proporcionar a la comunidad de Primavera con un lenguaje de expresin individual y apoyo que se puede utilizar en todos los productos de la cartera de primavera. Sus caractersticas lingsticas son impulsadas por las necesidades de los proyectos de la cartera de primavera, incluyendo requerimientos de herramientas de apoyo terminacin de cdigo dentro de la suite de herramientas SpringSource basado en Eclipse. Dicho esto, Spel se basa en una tecnologa agnstica API que permite a otras implementaciones de lenguajes de expresin para ser integrados en caso de necesidad. Mientras Spel sirve como base para la evaluacin de expresiones dentro de la cartera de primavera, que no est directamente ligado a la primavera y se puede utilizar de forma independiente. Con el fin de ser autnomos, muchos de los ejemplos de este uso Spel captulo como si se tratara de un lenguaje de expresin independiente. Esto requiere la creacin de clases de bootstrapping pocas infraestructuras, como el analizador. La mayora de los usuarios de primavera no tendr que hacer frente a esta infraestructura y la voluntad cadenas de autor en lugar de expresin slo para su evaluacin. Un ejemplo de este uso tpico es la integracin de SPEL en la creacin de definiciones basadas en XML o anotaciones de frijol, como se muestra en la seccin de soporte de expresiones para definir las definiciones de frijol. Este captulo trata sobre las caractersticas del lenguaje de expresin, su API, y su sintaxis del lenguaje. En varios lugares, un inventor y clase Inventor de la Sociedad se utilizan como objetos de destino para la evaluacin de la expresin. Estas declaraciones de clases y los datos utilizados para poblar figuran al final del captulo.

8.2 Descripcin general de caractersticas


El lenguaje de expresiones admite las siguientes funciones

Expresiones literales Los operadores booleanos y relacionales Las expresiones regulares Expresiones de clase Acceso a las propiedades, matrices, listas, mapas Mtodo de invocacin Los operadores relacionales Asignacin Constructores de llamadas Referencias de frijol Matriz construccin Listas Inline Ternario operador Variables

Funciones definidas por el usuario Coleccin proyeccin Coleccin de seleccin Expresiones con plantilla

8.3 Evaluacin de expresiones con la interfaz de Spring Expresin


Esta seccin presenta el simple uso de interfaces Spel y su lenguaje de expresin. La referencia completa del lenguaje se pueden encontrar en la seccin de referencia del lenguaje . El siguiente cdigo presenta el API Spel para evaluar 'Hello World' la expresin de cadena literal.
Analizador ExpressionParser SpelExpressionParser = new (); Exp = Expresin parser.parseExpression ("'Hola Mundo'"); String mensaje = (String) exp.getValue ();

El valor de la variable mensaje es simplemente 'Hello World'. Las clases e interfaces que Spel son ms propensos a utilizar se encuentran en el org.springframework.expression paquetes y sus paquetes y sub spel.support. La interfaz ExpressionParser es responsable de analizar una cadena de expresin. En este ejemplo, la cadena de expresin es una cadena literal denota por las comillas simples circundantes. La interfaz de Expression es responsable de evaluar la cadena de expresin previamente definido. Hay dos excepciones que pueden ser lanzadas, ParseException y EvaluationException cuando se llama ' parser.parseExpression 'y' exp.getValue ', respectivamente. Spel es compatible con una amplia gama de funciones, como las llamadas a los mtodos, el acceso a las propiedades y llamar a constructores. Como ejemplo de invocacin de mtodo, que llamamos el "concat" mtodo de la cadena literal.
Analizador ExpressionParser SpelExpressionParser = new (); Exp = Expresin parser.parseExpression ("'Hola Mundo' concat (). '!'"); String mensaje = (String) exp.getValue ();

El valor del mensaje es ahora 'Hello World!'. Como un ejemplo de llamada a una propiedad JavaBean, 'bytes' la propiedad de la cadena se puede llamar como se muestra a continuacin.
Analizador ExpressionParser SpelExpressionParser = new (); / / Invoca getBytes '()' Exp = Expresin parser.parseExpression ("'Hola Mundo' bytes.");

byte [] bytes = (byte []) exp.getValue ();

Spel tambin admite propiedades anidadas utilizando la notacin de 'punto' estndar, es decir, prop1.prop2.prop3 y el ajuste de los valores de propiedad Los campos pblicos tambin se puede acceder a ella.
Analizador ExpressionParser SpelExpressionParser = new (); / / Invoca 'getBytes (). Length' Exp = Expresin parser.parseExpression ("'Hola Mundo' bytes.length."); int longitud = (Integer) exp.getValue ();

Constructor de la cadena puede ser llamado en lugar de utilizar una cadena literal.
Analizador ExpressionParser SpelExpressionParser = new (); Exp Expresin parser.parseExpression = ("new String (" hola mundo ") toUpperCase ()."); String mensaje = exp.getValue (String. clase);

Observe el uso del mtodo genrico public <T> T getValue(Class<T> desiredResultType) . El uso de este mtodo elimina la necesidad de convertir el valor de la expresin para el tipo de resultado deseado. Un EvaluationException se produce si el valor no se puede convertir al tipo T o convertidos utilizando el convertidor de tipo social. El uso ms comn de Spel es proporcionar una cadena de expresin que se evala contra una instancia de objeto especfico (llamado el objeto raz). Hay dos opciones aqu y los que elegir depende de si el objeto contra el que se est evaluando la expresin se van a cambiar con cada llamada para evaluar la expresin. En el siguiente ejemplo se recupera el name la propiedad de una instancia de la clase Inventor.
/ / Crear y establecer un calendario GregorianCalendar c = new GregorianCalendar (); c.set (1856, 7, 9); / / Los argumentos del constructor son: nombre, fecha de nacimiento y nacionalidad. Inventor tesla = new Inventor ("Nikola Tesla", c.getTime (), "serbio"); Analizador ExpressionParser SpelExpressionParser = new (); Exp = Expresin parser.parseExpression ("nombre"); EvaluationContext contexto = new StandardEvaluationContext (tesla); String nombre = (String) exp.getValue (contexto);

En la ltima lnea, el valor de la variable de cadena "nombre" se ajusta a "Nikola Tesla". El StandardEvaluationContext clase es donde se puede especificar el objeto de la propiedad "nombre" se evaluar en contra. Este es el mecanismo a utilizar si el objeto raz es poco probable que cambie, simplemente se puede establecer una vez en el contexto de evaluacin. Si el objeto raz es probable que cambie en repetidas ocasiones,

se puede suministrar en cada llamada a getValue , como este ejemplo siguiente muestra:
/ Crear y establecer un calendario GregorianCalendar c = new GregorianCalendar (); c.set (1856, 7, 9); / / Los argumentos del constructor son: nombre, fecha de nacimiento y nacionalidad. Inventor tesla = new Inventor ("Nikola Tesla", c.getTime (), "serbio"); Analizador ExpressionParser SpelExpressionParser = new (); Exp = Expresin parser.parseExpression ("nombre"); String nombre = (String) exp.getValue (tesla);

En este caso, el inventor tesla haya sido suministrado directa a getValue y la infraestructura de evaluacin de la expresin crea y administra un contexto de evaluacin defecto interno - no requiere de uno a suministrar. El StandardEvaluationContext es relativamente caros de construir y durante el uso repetido se acumula estado almacenado en cach que permite evaluaciones posteriores de expresin para llevar a cabo ms rpidamente. Por esta razn, es mejor almacenar en cach y volver a utilizarlos cuando sea posible, en lugar de construir uno nuevo para cada evaluacin de la expresin. En algunos casos puede ser deseable usar un contexto de evaluacin configurado y an as proporcionar un objeto raz diferente en cada llamada a getValue . getValue permite tanto a ser especificado en la misma llamada. En estas situaciones, el objeto raz pas la llamada se considera de anular dicha (que puede ser nulo) especificada en el contexto de evaluacin.
Nota

En el uso independiente de Spel es necesario para crear el programa de anlisis, analizar expresiones y tal vez proporcionar contextos de evaluacin y un objeto raz de contexto. Sin embargo, el uso ms comn es permitir slo la cadena de expresin Spel como parte de un archivo de configuracin, por ejemplo para la primavera de frijol o definiciones Spring Web Flow. En este caso, el analizador, contexto de evaluacin, objeto raz y cualquier variables predefinidas se ajustan hasta implcitamente, lo que requiere que el usuario especifique otra cosa que las expresiones. Como un ejemplo de introduccin final, el uso de un operador booleano se muestra mediante el objeto de Inventor en el ejemplo anterior.
Exp = Expresin parser.parseExpression ("nombre == 'Nikola Tesla'"); resultado booleano exp.getValue = (contexto, Boolean clase.) / / resultado verdadero

8.3.1 La interfaz EvaluationContext

La interfaz EvaluationContext se utiliza en la evaluacin de una expresin para resolver las propiedades, mtodos, campos, y para ayudar a realizar la conversin de tipos. La puesta en prctica fuera de la caja, StandardEvaluationContext , utiliza la reflexin para manipular el objeto, el almacenamiento en cach java.lang.reflect 's Method , Field y Constructor instancias para un mayor rendimiento. El StandardEvaluationContext es donde usted puede especificar el objeto raz a evaluar en comparacin con el mtodo setRootObject() o pasando el objeto raz en el constructor. Tambin puede especificar variables y funciones que se utilizan en la expresin usando los mtodos setVariable() y registerFunction() . El uso de variables y funciones que se describen en las secciones lingsticas de referencia Variables y Funciones . El StandardEvaluationContext es tambin donde usted puede registrarse costumbre ConstructorResolver s, MethodResolver s, y PropertyAccessor s de extender cmo Spel evala expresiones. Por favor, consulte el JavaDoc de estas clases para obtener ms detalles.
Conversin de tipos

Por defecto Spel utiliza el servicio de conversin disponible en el ncleo de la primavera ( org.springframework.core.convert.ConversionService ). Este servicio de conversin viene con muchos convertidores incorporados para conversiones comunes pero tambin es totalmente extensible para conversiones entre tipos personalizados se pueden aadir. Adicionalmente tiene la capacidad clave que es consciente de los genricos. Esto significa que cuando se trabaja con tipos genricos en expresiones, Spel intentar conversiones para mantener la correccin del tipo de objetos que encuentra. Qu significa esto en la prctica? Supongamos asignacin, utilizando setValue() , se utiliza para establecer una List materiales. El tipo de la propiedad es en realidad List<Boolean> . Spel reconocer que los elementos de la lista se deben convertir a Boolean antes de ser colocado en ella. Un simple ejemplo:
Clase A simple { Lista pblica <boolean> booleanList = new ArrayList <boolean> (); } Simple simple simple = new (); simple.booleanList.add (true); StandardEvaluationContext simpleContext = new StandardEvaluationContext (simple); / / False se pasa por aqu como una cadena. Spel y el servicio de conversin / / Correctamente reconocer que tiene que ser un valor booleano y convertirlo . parser.parseExpression ("booleanList [0]") setValue (simpleContext, "false"); / / B ser falsa

Boolean b = simple.booleanList.get (0);

8,4 Expresin soporte para definir las definiciones de frijol


Expresiones Spel se puede utilizar con los metadatos XML de configuracin o anotacin basada en la definicin de BeanDefinitions. En ambos casos, la sintaxis para definir la expresin es de la forma #{ <expression string> } .
8.4.1 configuracin basado en XML

Un valor de propiedad o constructor arg-se puede establecer utilizando expresiones como se muestra a continuacin
<bean id = "numberGuess" class = "org.spring.samples.NumberGuess"> <propiedad nombre = valor = "randomNumber" "#{ T(java.lang.Math).random() * 100,0 }" /> <- Otras propiedades -> </ Bean>

'SystemProperties' La variable est predefinido, as que usted puede utilizar en sus expresiones, como se muestra a continuacin. Tenga en cuenta que usted no tiene el prefijo de la variable predefinida con el smbolo "#" en este contexto.
<bean id = "taxCalculator" class = "org.spring.samples.TaxCalculator"> <propiedad nombre = valor = "defaultLocale" "#{ systemProperties['user.region'] }" /> <- Otras propiedades -> </ Bean>

Tambin puede hacer referencia a las propiedades del bean otros por su nombre, por ejemplo.
<bean id = "numberGuess" class = "org.spring.samples.NumberGuess"> <propiedad nombre = valor = "randomNumber" "#{ T(java.lang.Math).random() * 100,0 }" /> <- Otras propiedades -> </ Bean> <bean id = "shapeGuess" class = "org.spring.samples.ShapeGuess"> <propiedad nombre = valor = "initialShapeSeed" "#{ numberGuess.randomNumber }" /> <- Otras propiedades -> </ Bean>

8.4.2 Anotacin de configuracin basada en

El @Value anotacin se pueden colocar en los campos, mtodos y parmetros de mtodo / constructor para especificar un valor por defecto. He aqu un ejemplo para establecer el valor predeterminado de una variable de campo.
FieldValueTestBean public class esttico @ Value ("# {systemProperties ['user.region']}") private String defaultLocale; public void setDefaultLocale (String defaultLocale) { este defaultLocale = defaultLocale.; } public String getDefaultLocale () { devuelva este defaultLocale.; } }

El equivalente pero en un mtodo establecedor de propiedades se muestra a continuacin.


PropertyValueTestBean public class esttico private String defaultLocale; @ Value ("# {systemProperties ['user.region']}") public void setDefaultLocale (String defaultLocale) { este defaultLocale = defaultLocale.; } public String getDefaultLocale () { devuelva este defaultLocale.; } }

Autoconectados mtodos y constructores tambin pueden utilizar el @Value anotacin.


pblico SimpleMovieLister clase { MovieFinder MovieFinder privado; private String defaultLocale; @ Autoconectados configure public void (MovieFinder MovieFinder, @ Value ("# {systemProperties ['user.region']}"} Cadena defaultLocale) { este MovieFinder = MovieFinder.; este defaultLocale = defaultLocale.;

} / / ... } MovieRecommender clase pblica { private String defaultLocale; customerPreferenceDao CustomerPreferenceDao privado; @ Autoconectados pblico MovieRecommender (CustomerPreferenceDao customerPreferenceDao, @ Value ("# {systemProperties ['user.country']}"} Cadena defaultLocale) { este customerPreferenceDao = customerPreferenceDao.; este defaultLocale = defaultLocale.; } / / ... }

8.5 Referencia del lenguaje


8.5.1 expresiones literales

Los tipos de expresiones literales admitidos son cadenas, fechas, valores numricos (int, real y hex), booleanos y nulos. Las cadenas son delimitados por comillas simples. Para poner una comilla simple en s en una cadena de utilizar dos caracteres de comillas simples. El siguiente listado muestra el uso sencillo de literales. Tpicamente no sera utilizado en el aislamiento de este tipo, sino como parte de una expresin ms compleja, por ejemplo usando un literal en un lado de un operador de comparacin lgica.
Analizador ExpressionParser SpelExpressionParser = new (); / / Evals a "Hello World" Cadena helloWorld = (String) parser.parseExpression ("'Hello World'") getValue ().; doble avogadrosNumber = (Doble) parser.parseExpression ("6.0221415E 23") getValue ().; / / Evals a 2147483647 maxValue int = (Integer) parser.parseExpression ("0x7FFFFFFF") getValue ().; TrueValue = booleano (Boolean) parser.parseExpression ("true") getValue ().; Objeto nullValue = parser.parseExpression ("null") getValue ().;

Los nmeros respaldan el uso del signo negativo, la notacin exponencial, y los decimales. Por defecto los nmeros reales se analizan mediante Double.parseDouble ().

8.5.2 Propiedades, matrices, listas, mapas, indexadores

Navegando con referencias de propiedades es fcil, slo tiene que utilizar un punto para indicar un valor de propiedad anidada. Las instancias de la clase Inventor, Pupin y tesla, se rellena con los datos que figuran en la seccin Clases utilizadas en los ejemplos . Para navegar hacia "abajo" y obtener aos de Tesla de nacimiento y ciudad de nacimiento de Pupin las siguientes expresiones se utilizan.
/ / Evals a 1856 int ao = (Integer) parser.parseExpression ("Birthdate.Year + 1900") getValue (contexto).; Cadena ciudad = (String) parser.parseExpression ("placeOfBirth.City") getValue (contexto).;

Insensibilidad de casos se permiti la primera letra de los nombres de las propiedades. El contenido de las matrices y listas, se obtienen usando la notacin de corchetes.
Analizador ExpressionParser SpelExpressionParser = new (); / / Matriz de Invenciones StandardEvaluationContext teslaContext = new StandardEvaluationContext (tesla); / / Se evala como "motor de induccin" Invencin String = parser.parseExpression ("invenciones [3]"). GetValue (teslaContext, Cadena de clase).; / / Lista de usuarios StandardEvaluationContext societyContext = new StandardEvaluationContext (IEEE); / / Se evala como "Nikola Tesla" . String nombre parser.parseExpression = (". Miembros [0] Nombre") getValue (societyContext, la clase String.); / / Lista de matriz y navegacin / / Se evala como "comunicacin inalmbrica" Invencin String = parser.parseExpression ("los Miembros [0]. Invenciones [6]"). GetValue (societyContext, Cadena de clase).;

El contenido de los mapas se obtienen especificando el valor literal clave dentro de los corchetes. En este caso, porque las claves para el mapa oficiales son cadenas, podemos especificar literales de cadena.
/ / Oficial del Diccionario Inventor Pupin parser.parseExpression = ("Los oficiales ['presidente']"). GetValue (societyContext, Inventor clase).;

/ / Se evala como "Idvor" Cadena ciudad = parser.parseExpression ("Los oficiales ['presidente']. PlaceOfBirth.City"). getValue (societyContext, Cadena de clase).; / / Valores de ajuste parser.parseExpression ("Los oficiales ['asesores'] [0]. PlaceOfBirth.Country"). setValue (societyContext, "Croacia");

8.5.3 listas Inline

Las listas pueden ser expresados directamente en una expresin utilizando la notacin {}.
/ / Resultado una lista Java que contiene los cuatro nmeros Lista de nmeros = (List) parser.parseExpression ("{1,2,3,4}") getValue (contexto).; ListOfLists Marcar = (List) parser.parseExpression ("{{'a', 'b'}, {'x', 'y'}}") getValue (contexto).;

{} Por si solo significa una lista vaca. Por motivos de rendimiento, si la lista es en s mismo enteramente compuesta de literales fijos y luego una lista constante se crea para representar la expresin, en lugar de construir una nueva lista en cada evaluacin.
8.5.4 Matriz construccin

Las matrices pueden ser construidos mediante la conocida sintaxis de Java, opcionalmente suministrar un inicializador para tener la matriz rellena en tiempo de construccin.
int [] numbers1 = (int []) parser.parseExpression ("new int [4]") getValue (contexto).; / / Array con inicializador int [] numbers2 = (int []) parser.parseExpression ("new int [] {1,2,3}") getValue (contexto).; / / Array multidimensional int [] [] numbers3 = (int [] []) parser.parseExpression ("new int [4] [5]") getValue (contexto).;

No est permitido suministrar un inicializador en la construccin de una matriz multidimensional.


8.5.5 Mtodos

Los mtodos se invocan usando la sintaxis tpica de programacin Java. Tambin puede invocar mtodos en literales. Varargs tambin estn soportados.

/ / Cadena literal, se evala como "bc" . Cadena parser.parseExpression c = (". 'Abc' subcadena (2, 3)") getValue (String. clase); / / Resultado verdadero booleano isMember parser.parseExpression = ("isMember (" Mihajlo Pupin ') "). getValue (societyContext, Boolean clase).;

8.5.6 Operadores Los operadores relacionales

Los operadores relacionales; igual, no igual, menor que, menor o igual que, mayor que, mayor o igual son compatibles usando la notacin de operador estndar.
/ / Resultado verdadero booleano TrueValue parser.parseExpression = ("2 == 2") getValue (Boolean. clase).; / / Se evala como false booleano FalseValue parser.parseExpression = ("2 <-5,0") getValue (Boolean. clase).; / / Resultado verdadero booleano TrueValue parser.parseExpression = ("'negro' <'block'") getValue (Boolean. clase).;

Adems de los operadores relacionales estndar Spel apoya el "instanceof" y la expresin regular basada operador partidos.
/ / Se evala como false booleano FalseValue parser.parseExpression = ("'xyz' instanceof T (int)") getValue (Boolean. clase).; / / Resultado verdadero booleano TrueValue = parser.parseExpression ("'coincidencias' '5 .00 ^ - \ \ d + (\ \ \ \ d {2}) $ '?.?") getValue (Boolean. clase).; / / Se evala como false booleano FalseValue = parser.parseExpression ("'coincidencias' '5 .0067 ^ - \ \ d + (\ \ \ \ d {2}) $ '?.?") getValue (Boolean. clase).;

Cada operador simblico tambin se puede especificar como un equivalente puramente alfabtico. Esto evita problemas en los que los smbolos utilizados tienen un significado especial para el tipo de documento en el que se inserta la expresin (por ejemplo, un documento XML). Los equivalentes textuales se muestra aqu: lt ('<'), gt ('>'), le ('<='), ge ('> ='), eq ('=='), ne ('= ), div ('/'), mod ('%'), no ('!'). Estos pueden utilizarse indistintamente.

Los operadores lgicos

Los operadores lgicos que se admiten son and, or y not. Su uso se demuestra a continuacin.
/ / - Y / / Se evala como false booleano FalseValue parser.parseExpression = ("verdadero y falso") getValue (Boolean. clase).; / / Resultado verdadero Expresin String = "isMember ('Nikola Tesla') y isMember (" Mihajlo Pupin ') "; booleano TrueValue = parser.parseExpression (expresin) getValue (societyContext, Boolean clase.).; / / - O / / Resultado verdadero booleano TrueValue parser.parseExpression = ("verdadero o falso") getValue (Boolean. clase).; / / Resultado verdadero Expresin String = "isMember ('Nikola Tesla') o isMember ('Albert Einstein')"; booleano TrueValue = parser.parseExpression (expresin) getValue (societyContext, Boolean clase.).; / / - NO / / Se evala como false booleano FalseValue parser.parseExpression = ("true") getValue (Boolean. clase).; / / - AND y NOT Expresin String = "isMember ('Nikola Tesla') y isMember (" Mihajlo Pupin ') "; booleano FalseValue = parser.parseExpression (expresin) getValue (societyContext, Boolean clase.).;

Los operadores matemticos

El operador tambin puede utilizarse en nmeros, cadenas y fechas. Resta se puede utilizar en nmeros y fechas. La multiplicacin y la divisin slo se puede utilizar en los nmeros. Otros operadores matemticos admitidos son los mdulo (%) y el poder exponencial (^). Estndar precedencia del operador se hace cumplir. Estos operadores se demuestra a continuacin.
/ / Suma int dos parser.parseExpression = ("1 + 1") getValue (Integer. clase),. / / 2 Cadena TestString = parser.parseExpression ("'test' + '' + 'cadena'".) getValue (String. clase); / / cadena 'test'

/ / Resta int cuatro = parser.parseExpression ("1 - 3") getValue (Integer. clase),. / / 4 doble d parser.parseExpression = ("1000.00 - 1E4") getValue (Double. clase),. / / -9000 / / Multiplicacin int seis = parser.parseExpression ("-2 * 3") getValue (Integer. clase),. / / 6 . doble veinticuatro parser.parseExpression = ("2,0 * 3E0 * 4") getValue (Double. clase); / / 24,0 / / Divisin int minusTwo parser.parseExpression = ("6/3") getValue (Integer. clase),. / / -2 . parser.parseExpression un doble = ("8,0 / 4e0 / 2") getValue (Double. clase); / / 1,0 / / Mdulo int tres = parser.parseExpression ("7% 4") getValue (Integer. clase),. / / 3 int uno = parser.parseExpression ("8.5% 2") getValue (Integer. clase),. / / 1 / / La precedencia de operadores int minusTwentyOne parser.parseExpression = ("1 2-3 * 8") getValue (Integer. clase),. / / -21

8.5.7 Asignacin

Configuracin de una propiedad se realiza mediante el operador de asignacin. Esto normalmente se hace dentro de una llamada a setValue pero tambin se puede hacer dentro de una llamada a getValue .
Inventor Inventor inventor = new (); StandardEvaluationContext inventorContext = new StandardEvaluationContext (inventor); . parser.parseExpression ("Nombre") setValue (inventorContext, "Alexander Seovic2"); / / Alternativamente Aleks String = parser.parseExpression ("Nombre = 'Alexandar Seovic'"). GetValue (inventorContext, Cadena de clase).;

8.5.8 Tipos

El operador especial 'T' se puede utilizar para especificar una instancia de java.lang.Class (el "tipo"). Los mtodos estticos se llaman utilizando este operador tambin. El StandardEvaluationContext utiliza un TypeLocator para encontrar tipos y la StandardTypeLocator (que puede ser sustituido) se construye con una

comprensin del paquete java.lang. Esto significa que T () hace referencia a los tipos dentro java.lang no tiene que ser completo, pero todas las otras referencias de tipo debe ser.
Clase dateClass = parser.parseExpression ("T (java.util.Date)") getValue (Class. clase).; Clase stringClass = parser.parseExpression ("T (String)") getValue (Class. clase).; booleano TrueValue = parser.parseExpression ("T (java.math.RoundingMode). TECHO <T (java.math.RoundingMode). SUELO") . GetValue (Boolean. clase);

8.5.9 Constructores

Los constructores pueden invocar utilizando el operador new. El nombre completo de la clase debe ser utilizado para todos, pero el tipo primitivo y String (donde int, float, etc, se puede utilizar).
Inventor einstein = p.parseExpression ("org.spring.samples.spel.inventor.Inventor nuevo ('Albert Einstein', 'Alemn') ") . GetValue (Inventor. clase); / / Crear instancia inventor nuevo mtodo add dentro de la lista p.parseExpression ("Members.add (nuevo org.spring.samples.spel.inventor.Inventor ('Albert Einstein', 'Alemn')) ") . GetValue (societyContext);

8.5.10 Variables

Las variables pueden ser referenciada en la expresin que utiliza la sintaxis # variableName. Las variables se establece mediante el mtodo de la setVariable StandardEvaluationContext.
Inventor tesla = new Inventor ("Nikola Tesla", "serbio"); StandardEvaluationContext contexto = new StandardEvaluationContext (tesla); context.setVariable ("newName", "Mike Tesla"); . parser.parseExpression ("Nombre = # newName") getValue (contexto); System.out.println (tesla.getName ()) / / "Tesla Mike"

Las variables de raz y # # esto

La variable # esto siempre se define y se refiere al objeto de la evaluacin actual (contra la que se resuelven las referencias no calificadas). La variable root # siempre se define y se refiere al objeto de contexto raz. Aunque esto puede variar # como componentes de una expresin se evalan, # raz siempre se refiere a la raz.
/ / Crear una matriz de enteros

Lista de los nmeros primos <Integer> = new ArrayList <Integer> (); primes.addAll (Arrays.asList (2, 3, 5, 7, 11, 13, 17)); / / Crear analizador y establecer variables "primos" como el conjunto de los nmeros enteros Analizador ExpressionParser SpelExpressionParser = new (); StandardEvaluationContext contexto = new StandardEvaluationContext (); context.setVariable ("primos", los nmeros primos); / / Todos los nmeros primos> 10 de la lista (utilizando la seleccin? {...}) / / Se evala como [11, 13, 17] Lista <Integer> primesGreaterThanTen = (<Integer> List) parser.parseExpression ("prepara [# # esto> 10].?") GetValue (contexto).;

8.5.11 Funciones

Puede ampliar Spel mediante el registro de funciones definidas por el usuario que se puede llamar dentro de la cadena de expresin. La funcin se ha registrado en el StandardEvaluationContext utilizando el mtodo.
registerFunction public void (String nombre, Mtodo m)

Una referencia a un mtodo Java proporciona la implementacin de la funcin. Por ejemplo, un mtodo de utilidad para revertir una cadena se muestra a continuacin.
pblicas StringUtils clase abstracta { reverseString public static String (entrada de cadena) { StringBuilder hacia atrs = new StringBuilder (); for (int i = 0; i <input.length (); i + +) backwards.append (input.charAt (input.length () - 1 - i)); } volver backwards.toString (); } }

Este mtodo se ha registrado en el contexto de evaluacin y se puede utilizar dentro de una cadena de expresin.
Analizador ExpressionParser SpelExpressionParser = new (); StandardEvaluationContext contexto = new StandardEvaluationContext (); context.registerFunction ("reverseString", StringUtils. Clase. GetDeclaredMethod ("reverseString" nueva clase [] {String clase.})); Cadena helloWorldReversed = . parser.parseExpression ("# reverseString ('hola')") getValue (contexto, la clase String.);

8.5.12 frijol referencias

Si el contexto de evaluacin se ha configurado con una resolucin de frijol es posible bsqueda de frijoles de una expresin usando el smbolo (@).
Analizador ExpressionParser SpelExpressionParser = new (); StandardEvaluationContext contexto = new StandardEvaluationContext (); context.setBeanResolver (MyBeanResolver nuevo ()); / / Esto va a terminar llamando a resolver (contexto, "foo") en MyBeanResolver durante la evaluacin . Objeto frijol = parser.parseExpression ("@ foo") getValue (contexto);

8.5.13 Operador Ternario (If-Then-Else)

Usted puede utilizar el operador ternario para realizar if-then-else lgica condicional dentro de la expresin. Un ejemplo mnimo es:
Cadena FalseString = parser.parseExpression ("falso" trueExp ':' falseExp '? ") getValue (String. clase);.

En este caso, los resultados booleanos falsos en la devolucin del valor de la cadena "falseExp '. Un ejemplo ms realista se muestra a continuacin.
. parser.parseExpression ("Nombre") setValue (societyContext, "IEEE"); societyContext.setVariable ("QueryName", "Nikola Tesla"); = expresin "isMember (# QueryName)? # QueryName + 'es miembro de la'" + "Nombre + + 'Sociedad': # QueryName + 'no es un miembro de la' + nombre + 'Sociedad'"; Cadena queryResultString = . parser.parseExpression (expresin) getValue (societyContext, la clase String.); / / QueryResultString = "Nikola Tesla es un miembro de la Sociedad IEEE"

Tambin vea la siguiente seccin sobre el operador de Elvis para una sintaxis an ms corto que el operador ternario.
8.5.14 El operador Elvis

El operador Elvis es un acortamiento de la sintaxis del operador ternario y se utiliza en el Groovy idioma. Con la sintaxis del operador ternario lo general tienen que repetir dos veces una variable, por ejemplo:
Name String = "Elvis Presley"; DisplayName Cadena name =! = Null? nombre: "Desconocido";

En su lugar se puede utilizar el operador de Elvis, llamado as por el parecido con el peinado de Elvis.
Analizador ExpressionParser SpelExpressionParser = new (); String nombre = parser.parseExpression: getValue (String. clase); ("null" Desconocido "?"). System.out.println (nombre) / / 'Unknown'

He aqu un ejemplo ms complejo.


Analizador ExpressionParser SpelExpressionParser = new (); Inventor tesla = new Inventor ("Nikola Tesla", "serbio"); StandardEvaluationContext contexto = new StandardEvaluationContext (tesla); Name String = parser.parseExpression ("Nombre: 'Elvis Presley'?") GetValue (contexto, la clase String.),. System.out.println (nombre) / / Mike Tesla tesla.setName (null); . nombre parser.parseExpression = ("Nombre: 'Elvis Presley'") getValue (contexto, la clase String.); System.out.println (nombre) / / Elvis Presley

8.5.15 operador navegacin segura

El operador de navegacin segura se utiliza para evitar una NullPointerException y viene de la maravillosa lengua. Normalmente, cuando se tiene una referencia a un objeto que puede ser que necesite para comprobar que no es nulo antes de acceder a mtodos o propiedades del objeto. Para evitar esto, el operador de navegacin segura simplemente devolver un valor nulo en lugar de lanzar una excepcin.
Analizador ExpressionParser SpelExpressionParser = new (); Inventor tesla = new Inventor ("Nikola Tesla", "serbio"); tesla.setPlaceOfBirth (nuevo PlaceOfBirth ("Smiljan")); StandardEvaluationContext contexto = new StandardEvaluationContext (tesla); Cadena ciudad = parser.parseExpression ("PlaceOfBirth City?"). GetValue (contexto, la clase String.).; System.out.println (ciudad) / / Smiljan tesla.setPlaceOfBirth (null); ciudad = parser.parseExpression ("PlaceOfBirth City?"). getValue (contexto, la clase String.).; System.out.println (ciudad) / / null - no lanza NullPointerException!

Nota

El operador de Elvis se puede utilizar para aplicar los valores predeterminados en las expresiones, por ejemplo en un @Value expresin:
@ Value ("# {systemProperties ['pop3.port']: 25}")

Esto le inyectar una propiedad del sistema pop3.port si se define o 25 si no.


8.5.16 seleccin Coleccin

La seleccin es una caracterstica de expresin del lenguaje de gran alcance que le permite transformar alguna coleccin de origen a otro mediante la seleccin de sus entradas. Seleccin utiliza la sintaxis ?[selectionExpression] . Esto filtra la coleccin y devolver una coleccin nueva que contiene un subconjunto de los elementos originales. Por ejemplo, la seleccin nos permitir obtener fcilmente una lista de inventores de Serbia:
Lista lista = <Inventor> (<Inventor> List) parser.parseExpression ("los Miembros [Nacionalidad == 'Serbia'].?") getValue (societyContext).;

La seleccin es posible en ambas listas y mapas. En el primer caso, los criterios de seleccin se evala en cada elemento de la lista individuo mientras que frente a un mapa de los criterios de seleccin se evala en cada entrada del mapa (los objetos del tipo Java Map.Entry ). Las entradas del mapa tienen su clave y el valor accesibles como propiedades para su uso en la seleccin. Esta expresin devolver un nuevo mapa compuesta por los elementos del mapa original en el que el valor de entrada es inferior a 27.
Mapa newMap = parser.parseExpression ("mapa [valor <27].?") GetValue ().;

Adems de devolver todos los elementos seleccionados, es posible recuperar slo la primera o el ltimo valor. To obtain the first entry matching the selection the syntax is ^[...] whilst to obtain the last matching selection the syntax is $[...] .
8.5.17 Proyeccin Collection

Proyeccin permite una coleccin de conducir la evaluacin de una expresin sub-y el resultado es una nueva coleccin. La sintaxis para la proyeccin es ![projectionExpression] . Ms fcil de entender por ejemplo, supongamos que tenemos una lista de inventores, pero desea que la lista de las ciudades donde nacieron. Efectivamente queremos evaluar 'placeOfBirth.city' para cada entrada en la lista inventor. Usando proyeccin:
/ / Devuelve ['Smiljan', 'Idvor']

PlacesOfBirth = Lista (List) parser.parseExpression ("los Miembros [placeOfBirth.city].");

Un mapa tambin puede ser usado para conducir la proyeccin y en este caso la proyeccin expresin se evala en cada entrada en el mapa (representado como un Java Map.Entry ). El resultado de una proyeccin a travs de un mapa es una lista que consiste en la evaluacin de la expresin de proyeccin en cada entrada del mapa.
8.5.18 Expresin de plantillas

Plantillas de expresiones permitir una mezcla de texto literal con uno o ms bloques de evaluacin. Cada bloque de evaluacin se delimita con caracteres de prefijo y un sufijo que se pueden definir, una eleccin comn es usar #{ } como delimitadores. Por ejemplo,
Cadena randomPhrase = parser.parseExpression ("nmero aleatorio es # {T (java.lang.Math). random ()}", TemplateParserContext nuevo ()) getValue (String. clase).; / / Se evala como "nmeros aleatorios es 0.7038186818312008"

La cadena es evaluada mediante la concatenacin del texto literal 'nmero aleatorio es' con el resultado de evaluar la expresin dentro de la delimitador # {}, en este caso el resultado de la llamada que el mtodo aleatorio (). El segundo argumento del mtodo parseExpression() es del tipo ParserContext . El ParserContext interfaz se utiliza para influir en cmo analizar la expresin con el fin de apoyar la funcionalidad expresin de plantillas. La definicin de TemplateParserContext se muestra a continuacin.
pblico TemplateParserContext clase implementa ParserContext { pblico getExpressionPrefix String () { return "# {"; } getExpressionSuffix public String () { return "}"; } public boolean isTemplate () { return true; } }

8,6 Clases utilizadas en los ejemplos


Inventor.java
paquete org.spring.samples.spel.inventor; importacin java.util.Date; importar java.util.GregorianCalendar;

Inventor clase pblica { private String nombre; nacionalidad private String; private String [] invenciones; Fecha de nacimiento privado; placeOfBirth PlaceOfBirth privado; Inventor pblico (String nombre, nacionalidad String) { GregorianCalendar c = new GregorianCalendar (); . este nombre = nombre; esta nacionalidad = nacionalidad.; . este nacimiento c.getTime = (); } Inventor pblico (String nombre, fecha de nacimiento Fecha, nacionalidad String) { . este nombre = nombre; esta nacionalidad = nacionalidad.; esta fecha de nacimiento fecha de nacimiento =.; } Inventor pblico () { } public String getName () { devolver el nombre; } setName public void (String nombre) { . este nombre = nombre; } getNationality public String () { devolver la nacionalidad; } setNationality public void (nacionalidad String) { esta nacionalidad = nacionalidad.; } getBirthdate Fecha pblico () { volver fecha de nacimiento; } public void setBirthdate (fecha de nacimiento Fecha) { esta fecha de nacimiento fecha de nacimiento =.; } pblico getPlaceOfBirth PlaceOfBirth () { volver placeOfBirth; } public void setPlaceOfBirth (PlaceOfBirth placeOfBirth) { este placeOfBirth = placeOfBirth.; } setInventions public void (String [] invenciones) { estos inventos = invenciones.; } public String [] () {getInventions volver invenciones; } }

PlaceOfBirth.java

paquete org.spring.samples.spel.inventor; PlaceOfBirth clase pblica { ciudad cadena privada; pas private String; pblico PlaceOfBirth (String ciudad) { esta ciudad = ciudad.; } pblico PlaceOfBirth (String ciudad, pas String) { este (ciudad); este pas = pas.; } getCity public String () { regresar de la ciudad; } setCity public void (String s) { esta ciudad = s.; } getCountry public String () { regresar pas; } setCountry public void (pas String) { este pas = pas.; }

Society.java
paquete org.spring.samples.spel.inventor; java.util import *.; pblica Sociedad de la clase { private String nombre; Asesores pblicos static String = "asesores"; Presidente public static String = "presidente"; Lista de miembros privados <Inventor> = new ArrayList <Inventor> (); agentes privados mapa = new HashMap (); GetMembers public List () { elementos de retorno; } pblicos getOfficers del mapa () { devolver la Mesa; } public String getName () { devolver el nombre;

} setName public void (String nombre) { . este nombre = nombre; } isMember pblica booleano (String nombre) { booleano encontrado = false; para (inventor Inventor: miembros) { if (inventor.getName (). igual a (nombre)) { encontrado = true; break; } } volver encontrado; } }

9. Programacin Orientada a Aspectos con Spring 9.1 Introduccin


Programacin orientada a aspectos (AOP) complementa Programacin orientada a objetos (POO), proporcionando otra manera de pensar acerca de la estructura del programa. La unidad clave de la modularidad en programacin orientada a objetos es la clase, mientras que en el POA de la unidad de la modularidad es el aspecto. Aspectos permitir la modularizacin de preocupaciones tales como la gestin de transacciones que abarcan mltiples tipos y objetos. (Estas preocupaciones se llaman a menudo crosscutting concerns en la literatura AOP). Uno de los componentes clave de la primavera es el marco AOP. Mientras que el contenedor Spring COI no depende de la AOP, lo que significa que no es necesario utilizar AOP si usted no quiere, AOP Spring complementa la COI para proporcionar una solucin de middleware muy capaz. AOP Spring 2.0 Spring 2.0 introduce una forma ms simple y ms potente de la escritura aspectos personalizados utilizando ya sea un enfoque basado en esquemas o el estilo @ AspectJ anotacin . Ambos estilos ofrecen asesoramiento totalmente escrito y el uso del lenguaje AspectJ pointcut, sin dejar de utilizar Spring AOP para tejer. El Spring 2.0 de esquema y @ AspectJ apoyo basado en AOP se trata en este captulo. Spring 2.0 AOP sigue siendo totalmente compatible con Spring AOP 1,2, y el soporte de nivel inferior AOP ofrece el API de Spring 1.2 se analiza en el captulo siguiente . AOP se utiliza en el Spring Framework para ...

... proporcionar servicios declarativas de la empresa, especialmente como un reemplazo para servicios EJB declarativas. El servicio de este tipo ms importante es la gestin de transacciones declarativa . ... permite a los usuarios implementar aspectos personalizados, complementando su uso de la programacin orientada a objetos con AOP.

Si usted est interesado slo en los servicios genricos declarativos u otros preempaquetados servicios middleware declarativos como de fondo comn, que no es necesario trabajar directamente con Spring AOP, y puede pasar la mayor parte de este captulo.
9.1.1 AOP conceptos

Comencemos por definir algunos conceptos centrales de AOP y la terminologa. Estos trminos no son especficos de la primavera ... desafortunadamente, AOP terminologa no es particularmente intuitiva, sin embargo, sera an ms confuso si Primavera us su propia terminologa.

Aspecto: una modularizacin de una preocupacin que atraviesa varias clases. Gestin de transacciones es un buen ejemplo de una preocupacin transversal en las aplicaciones empresariales Java. En la primavera de AOP, los aspectos se implementan mediante clases regulares (el enfoque basado en esquema ) o clases regulares anotados con el @Aspect anotacin (el @AspectJ estilo ). Ingreso punto: un punto durante la ejecucin de un programa, tal como la ejecucin de un mtodo o el manejo de una excepcin. En la primavera de AOP, un punto de unin siempre representa una ejecucin del mtodo. Consejo: accin tomada por un aspecto en un punto de unin en particular. Los diferentes tipos de asesoramiento incluyen "alrededor", "antes" y "despus" de asesoramiento. (Tipos de Asesoramiento se discuten a continuacin.) Muchos marcos AOP, incluyendo Spring, modelo de un consejo como un interceptor, el mantenimiento de una cadena de interceptores en torno al punto de unin. Punto de corte: un predicado que coincida con puntos de unin. Consejos se asocia con una expresin pointcut y funciona a cualquier punto de unin corresponde con el punto de corte (por ejemplo, la ejecucin de un mtodo con un cierto nombre). El concepto de unir puntos como corresponde con expresiones pointcut es fundamental para AOP y Spring utiliza el lenguaje AspectJ pointcut expresin por defecto. Introduccin: La declaracin de mtodos adicionales o campos en nombre de un tipo. Spring AOP le permite introducir nuevas interfaces (y una aplicacin correspondiente) a cualquier objeto aconsejado. Por ejemplo, podra utilizar una introduccin para que un grano de implementar un IsModified interfaz, para simplificar el almacenamiento en cach. (Una introduccin se conoce como una declaracin inter-tipo en la comunidad AspectJ.) Objeto de destino: objeto que est siendo asesorado por uno o ms aspectos. Tambin se lo conoce como el objeto aconsejado. Desde Spring AOP se implementa utilizando proxies de tiempo de ejecucin, este objeto ser siempre un objeto proxy. AOP proxy: un objeto creado por el marco de AOP para la aplicacin de los contratos de aspecto (asesorar ejecuciones mtodo y as sucesivamente). En el

Spring Framework, un proxy AOP ser un proxy dinmico JDK o un proxy CGLIB. Tejido: vincular aspectos con otros tipos de aplicaciones u objetos para crear un objeto aconsejado. Esto se puede hacer en tiempo de compilacin (usando el compilador AspectJ, por ejemplo), el tiempo de carga, o en tiempo de ejecucin. Spring AOP, al igual que otros marcos de Java puro AOP, realiza tejidos en tiempo de ejecucin.

Tipos de consejo:

Antes de asesoramiento: Consulta que se ejecuta antes de un punto de unin, pero que no tiene la capacidad de impedir el flujo de ejecucin de proceder al punto de unin (a menos que se produce una excepcin). Despus de regresar consejos: Consejos para ser ejecutado despus de un punto de unin se completa con normalidad: por ejemplo, si un mtodo devuelve sin lanzar una excepcin. Despus de lanzar consejos: Consejos para ser ejecutado si un mtodo sale por una excepcin. Despus (fin) consejo: Consejos para ser ejecutado independientemente de los medios por los cuales se unen a las salidas puntuales (rendimiento normal o excepcional). Alrededor de consejos: Consejos que rodea a un punto de unin, como una invocacin del mtodo. Este es el tipo ms poderoso de asesoramiento. Alrededor de asesoramiento puede realizar un comportamiento personalizado antes y despus de la invocacin del mtodo. Tambin es responsable de elegir si se debe proceder a la unin o punto de acceso directo a la ejecucin del mtodo aconsejado por devolver su valor propio regreso o lanzar una excepcin.

Alrededor del consejo es el tipo ms general de asesoramiento. Desde la primavera de AOP, como AspectJ, ofrece una amplia gama de tipos de consejos, le recomendamos que utilice el tipo de asesoramiento por lo poderosa que puede implementar el comportamiento deseado. Por ejemplo, si usted slo tiene que actualizar una memoria cach con el valor de retorno de un mtodo, que es mejor implementar un consejo despus de regresar de un torno consejo, aunque alrededor de un consejo puede lograr lo mismo. Utilizando el tipo de asesoramiento ms especfico proporciona un modelo de programacin ms simple, con menos posibilidad de errores. Por ejemplo, no es necesario invocar el proceed() mtodo en el JoinPoint utilizado por alrededor de consejo, y por lo tanto no puede dejar de invocarlo. En la primavera de 2,0, todos los parmetros se proporciona esttico de tipos, por lo que se trabaja con parmetros consejos del tipo adecuado (el tipo del valor de retorno de un mtodo de ejecucin, por ejemplo) en lugar de Object arrays. El concepto de unir puntos, igualado por puntos de corte, es la clave de la AOP que la distingue de las tecnologas ms antiguas que ofrecen nica intercepcin. Puntos de corte permiten asesorar a ser dirigido de manera independiente de la jerarqua orientada a objetos. Por ejemplo, un consejo alrededor de proporcionar gestin de transacciones declarativa se puede aplicar a un conjunto de mtodos que abarcan mltiples objetos (por ejemplo, todas las operaciones de negocios en la capa de servicio).

9.1.2 Spring AOP capacidades y objetivos

Spring AOP est implementado en Java puro. No hay necesidad de un proceso de compilacin especial. Spring AOP no es necesario para controlar la jerarqua de cargador de clases, y es por tanto adecuado para su uso en un contenedor de Servlets o servidor de aplicaciones. Spring AOP actualmente slo es compatible con la ejecucin del mtodo join (puntos asesorar la ejecucin de mtodos en los granos de primavera). Interceptacin de campo no se aplica, aunque el apoyo a la interceptacin campo podra aadirse sin romper el ncleo Spring AOP APIs. Si tiene que asesorar acceso al campo y actualizar unir puntos, considere un lenguaje como AspectJ. Enfoque Spring AOP para AOP difiere de la de la mayora de los otros marcos de AOP. El objetivo no es proporcionar la ms completa aplicacin AOP (aunque Spring AOP es muy capaz), sino ms bien proporcionar una estrecha integracin entre la aplicacin y la COI AOP Spring para ayudar a resolver problemas comunes en las aplicaciones empresariales. As, por ejemplo, la funcionalidad de la infraestructura Spring de AOP se utiliza normalmente junto con el contenedor Spring COI. Los aspectos se configura mediante la sintaxis normal definicin de frijol (aunque esto permite poderosos "autoproxying" capacidades): esta es una diferencia crucial desde otras implementaciones de AOP. Hay algunas cosas que no puedes hacer fcilmente o de manera eficiente con Spring AOP, tales como asesorar de grano muy fino objetos (tales como objetos de dominio general): AspectJ es la mejor opcin en estos casos. Sin embargo, nuestra experiencia es que Spring AOP ofrece una excelente solucin para la mayora de los problemas en las aplicaciones empresariales Java que son susceptibles de AOP. Spring AOP nunca se esfuerzan por competir con AspectJ para proporcionar una solucin completa de AOP. Creemos que ambos marcos basado en proxy como Spring AOP y en toda regla marcos como AspectJ son valiosos, y que son complementarias ms que en la competencia. Spring 2.0 se integra perfectamente Spring AOP y la COI con AspectJ, para permitir que todos los usos de AOP para ser atendidas dentro de una arquitectura de aplicacin consistente Primavera-based. Esta integracin no afecta a la primavera de AOP API o la API de AOP Alliance: Spring AOP sigue siendo compatible con versiones anteriores. Vase el siguiente captulo para una discusin de las API de Spring AOP.
Nota

Uno de los principios centrales de la Spring Framework es el de la no invasividad, esta es la idea de que no deben ser forzados a introducir determinadas marco clases e interfaces en su negocio / modelo de dominio. Sin embargo, en algunos lugares el Spring Framework te da la opcin de introducir Spring Framework dependencias especficas en el cdigo base de una exposicin de motivos en la que le da estas opciones se debe a que en ciertos escenarios que podra ser simplemente ms fcil de leer o codificar alguna parte especfica de funcionalidad de tal manera. El Spring Framework (casi) siempre le ofrece la opcin sin embargo: usted tiene la libertad de tomar una decisin informada en cuanto a la opcin que mejor se adapte a su caso

en particular o escenario. Una de las opciones que tiene relacin con este captulo es el de que AOP marco (y qu estilo AOP) para elegir. Usted tiene la opcin de AspectJ y / o AOP Spring, y tambin tiene la posibilidad de elegir la anotacin @ AspectJ estilo de enfoque o el enfoque Spring XML de configuracin de estilo. El hecho de que este captulo elige para introducir el @ AspectJ de estilo primer enfoque no debe ser tomado como una indicacin de que el equipo Spring favorece la anotacin @ AspectJ estilo de enfoque sobre el resorte de XML configuracin de estilo. Consulte Seccin 9.4, "Eleccin de qu estilo AOP declaracin de usar" para una discusin ms completa de las causas y los motivos de cada estilo.
9.1.3 AOP Proxies

Spring AOP estndar es usar proxies estndar J2SE dinmicas para servidores proxy AOP. Esto permite a cualquier interfaz (o conjunto de interfaces) para ser aproximados. Spring AOP tambin pueden usar proxies CGLIB. Esto es necesario para las clases de proxy, en lugar de interfaces. CGLIB se utiliza de forma predeterminada si un objeto comercial no implementa una interfaz. Como se trata de una buena prctica para programar interfaces ms que clases, clases de negocios normalmente implementar una o ms interfaces de negocio. Es posible forzar el uso de CGLIB , en esos casos raros (esperemos) en que es necesario aconsejar a un mtodo que no se ha declarado en una interfaz, o donde tiene que pasar un objeto de proxy a un mtodo como un tipo concreto. Es importante comprender el hecho de que la primavera AOP est basado en proxy. Consulte Seccin 9.6.1, "Descripcin de proxies AOP" para un examen a fondo de lo que esto significa en realidad detalle de implementacin.

9,2 @ AspectJ apoyo


@ AspectJ se refiere a un estilo de declarar aspectos como las clases regulares de Java anotadas con Java 5 anotaciones. El estilo @ AspectJ fue introducido por el proyecto AspectJ como parte de la liberacin AspectJ 5. Spring 2,0 interpreta las anotaciones mismas AspectJ 5, usando una biblioteca suministrada por AspectJ para pointcut analizar y coincidente. El tiempo de ejecucin de AOP es todava puro Spring AOP sin embargo, y no hay dependencia del compilador AspectJ o tejedor. Usando el compilador AspectJ y tejedor permite el uso de todo el lenguaje AspectJ, y se discute en la Seccin 9.8, "Uso de AspectJ con aplicaciones de primavera" .
9.2.1 Habilitacin @ AspectJ Support

Para utilizar @ aspectos AspectJ en una configuracin de Spring que necesita para habilitar el soporte para la configuracin de Spring Spring AOP sobre la base de aspectos @ AspectJ y frijoles autoproxying en funcin de si son o no son asesorados por esos aspectos. Por autoproxying queremos decir que si la primavera determina que

un grano es asesorado por uno o ms aspectos, se generar automticamente un proxy para que el frijol para interceptar llamadas a mtodos y garantizar que el asesoramiento se ejecuta segn sea necesario. El apoyo @ AspectJ se puede activar con XML o configuracin Java estilo. En cualquier caso, tambin tendr que asegurarse de que AspectJ de aspectjweaver.jar biblioteca est en la classpath de la aplicacin (versin 1.6.8 o posterior). Esta biblioteca est disponible en el 'lib' directorio de una distribucin AspectJ oa travs del repositorio de Maven Central.
Habilitacin @ Soporte AspectJ con Java configuracin

Para habilitar @ AspectJ apoyo con Java @Configuration aadir la @EnableAspectJAutoProxy anotacin:
@ Configuracin @ EnableAspectJAutoProxy AppConfig clase pblica { }

Habilitacin @ Soporte de configuracin XML con AspectJ

Para habilitar @ AspectJ apoyo con configuracin basada en XML utiliza el aop:aspectj-autoproxy elemento:
<aop:aspectj-autoproxy/>

Esto supone que se est utilizando el soporte de esquema como se describe en el Apndice E, esquema XML de configuracin basada en . Consulte la Seccin E.2.7, "El aop esquema " de cmo importar las etiquetas en el espacio de nombres AOP. Si est utilizando la DTD, todava es posible habilitar @ AspectJ apoyo al agregar la siguiente definicin de su contexto de aplicacin:
<bean class = "org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAuto ProxyCreator" />

9.2.2 La declaracin de un aspecto

Con el apoyo @ AspectJ activada, cualquier bean definido en el contexto de la aplicacin con una clase que es un aspecto @ AspectJ (tiene el @Aspect anotacin) ser detectada automticamente por resorte y se utiliza para configurar Spring AOP. El siguiente ejemplo muestra la definicin mnima requerida para un aspecto no muy til: Una definicin de frijol regular en el contexto de aplicacin, sealando a una clase de bean que tiene el @Aspect anotacin:
<bean id = "myAspect" class = "org.xyz.NotVeryUsefulAspect"> <- Configurar propiedades de aspecto tan normal aqu -> </ Bean>

Y el NotVeryUsefulAspect definicin de clase, anotado con org.aspectj.lang.annotation.Aspect anotacin;


paquete org.xyz; importar org.aspectj.lang.annotation.Aspect; Aspecto @ pblico NotVeryUsefulAspect clase { }

Aspectos (clases anotadas con @Aspect ) pueden tener mtodos y campos al igual que cualquier otra clase. Tambin pueden contener pointcut, el asesoramiento y la introduccin (inter-type) declaraciones.
Autodeteccin aspectos a travs del escaneo componente

Usted puede registrar clases de aspecto como frijoles regulares en su primavera configuracin XML, o detectar automticamente a travs de los anlisis classpath al igual que cualquier otro Primavera-bean gestionado. Sin embargo, tenga en cuenta que la anotacin Aspecto @ no es suficiente para la deteccin automtica de la ruta de clases: Para ello, es necesario agregar una anotacin @ Component separado (o alternativamente una anotacin estereotipo personalizado que rene los requisitos, de acuerdo con las reglas del escner componente de Primavera).
Asesoramiento aspectos con otros aspectos?

En la primavera de AOP, no es posible tener aspectos s mismos ser objetivo de consejos de otros aspectos. La anotacin @ Aspecto de una clase de la marca como un aspecto, y por lo tanto, que excluye de la auto-proxy.
9.2.3 La declaracin de un punto de corte

Recuerde que puntos de corte determinar unir puntos de inters, por lo que nos permitir controlar cundo asesoramiento ejecuta. Spring AOP slo es compatible con la ejecucin del mtodo unir puntos para el frijol de primavera, as que usted puede pensar en un punto de corte como la equiparacin de la ejecucin de mtodos en los granos de primavera. Una declaracin pointcut tiene dos partes: una firma que comprende un nombre y los parmetros, y una expresin de punto de corte que determina exactamente qu mtodo de ejecuciones que se interese en la anotacin @ AspectJ al estilo de AOP, se proporciona una firma pointcut por un mtodo regular definicin, y la expresin punto de corte se indica utilizando el @Pointcut anotacin (el mtodo que sirve como punto de corte de la firma debe tener un void tipo de retorno). Un ejemplo ayudar a hacer esta distincin entre una firma pointcut y una expresin clara pointcut. En el ejemplo siguiente se define un punto de corte llamado 'anyOldTransfer' que coincidir con la realizacin de cualquier mtodo llamado 'transfer' :
@ Pointcut ("ejecucin (* Transferencia (..))") / / La expresin pointcut anyOldTransfer private void () {} / / de la firma pointcut

La expresin punto de corte que forma el valor del @Pointcut anotacin es una expresin regular de AspectJ 5 pointcut. Para una discusin completa del lenguaje AspectJ pointcut, consulte la Gua de programacin de AspectJ (y para Java 5 extensiones basadas en la AspectJ 5 Notebook Desarrolladores ) o uno de los libros de AspectJ como "Eclipse AspectJ" por Colyer et. al. o "AspectJ en accin" por Ramnivas Laddad.
Compatibles Designadores pointcut

Spring AOP soporta los siguientes designadores pointcut AspectJ (PCD) para su uso en expresiones pointcut: Otros tipos pointcut El pleno del lenguaje AspectJ pointcut apoya designadores adicionales punto de corte que no se admiten en la primavera. Estos son: call, get, set,
preinitialization, staticinitialization, initialization, handler, adviceexecution, withincode, cflow, cflowbelow, if, @this , y @withincode . El uso de estos designadores de punto de corte en las expresiones

pointcut interpretados por Spring AOP se traducir en una IllegalArgumentException siendo lanzada. El conjunto de los designadores pointcut soportados por Spring AOP puede ampliarse en futuras versiones para apoyar a ms de los designadores de AspectJ punto de corte.

ejecucin - para adaptar la ejecucin del mtodo unir puntos, este es el designador de punto de corte primario que va a utilizar cuando se trabaja con Spring AOP dentro - los lmites de contrapartida para unir puntos dentro de ciertos tipos (simplemente la ejecucin de un mtodo declarado en un tipo de juego al usar Spring AOP) este - los lmites de contrapartida para unir puntos (la ejecucin de mtodos cuando se utiliza Spring AOP) donde la referencia de frijol (Spring AOP proxy) es una instancia del tipo dado objetivo - los lmites de contrapartida para unir los puntos (la ejecucin de mtodos cuando se utiliza Spring AOP) en el objeto de destino (objeto de solicitud en el proxy) es una instancia del tipo dado args - limita a juego para unir los puntos (la ejecucin de mtodos cuando se utiliza Spring AOP), donde los argumentos son instancias de los tipos dados @target - los lmites de contrapartida para unir los puntos (la ejecucin de mtodos cuando se utiliza Spring AOP) en la clase del objeto de ejecucin tiene una anotacin del tipo dado @args - lmites de contrapartida para unir puntos (la ejecucin de mtodos cuando se utiliza Spring AOP) donde el tipo de tiempo de ejecucin de los argumentos reales han pasado anotaciones del tipo especificado (s) @within - los lmites de contrapartida para unir puntos dentro de los tipos que tienen la anotacin dada (la ejecucin de los mtodos declarados en los tipos con la anotacin dado al usar Spring AOP)

Anotacin @ - los lmites de contrapartida para unir puntos donde el sujeto del punto de unin (mtodo que se ejecuta en la primavera de AOP) ha dado la anotacin

Debido a Spring AOP limita a juego para la ejecucin del mtodo slo unir puntos, la discusin de los designadores pointcut anteriores da una definicin ms restringida de lo que encontrars en la gua de programacin AspectJ. Adems, AspectJ s mismo tiene el tipo de base de la semntica y de una ejecucin unirse punto tanto ' this 'y' target 'se refieren al mismo objeto - el objeto de ejecutar el mtodo. Spring AOP es un sistema basado en proxy y diferencia entre el objeto propio proxy (ligado a ' this ') y el objeto de destino detrs del proxy (ligado a' target ').
Nota

Debido a la naturaleza basada en proxy de AOP Spring marco, los mtodos protegidos son por definicin no interceptada, ni para proxies JDK (si esto no es aplicable) ni de proxies CGLIB (siempre que sea tcnicamente posible, pero no es recomendable para los propsitos AOP). En consecuencia, cualquier punto de corte determinado se compara con los mtodos pblicos solamente! Si sus necesidades de intercepcin incluyen mtodos protegidos / privadas e incluso constructores, considere el uso de la Primavera impulsado por AspectJ tejido nativo en lugar de basado en proxy Spring AOP marco. Esto constituye un modo diferente de uso AOP con caractersticas diferentes, as que asegrese de que se familiarice con el tejido antes de tomar una decisin. Spring AOP tambin soporta un PCD adicional denominado ' bean '. Esta PCD permite limitar la adecuacin de puntos de unin a un bean Spring especial nombrado, o un conjunto de granos de primavera con nombre (cuando especifique comodines). El ' bean 'PCD tiene la siguiente forma:
frijol (idOrNameOfBean)

El ' idOrNameOfBean token 'puede ser el nombre de cualquier frijol de primavera: un apoyo limitado usando el comodn' * 'personaje se proporciona, por lo que si usted establecer algunas convenciones de nomenclatura para las semillas de tu primavera es bastante fcil escribir un " bean expresin PCD para recoger hacia fuera. Como es el caso con los designadores pointcut otros, el " bean PCD puede ser && 'ed, | |' ed, y! (Negado) tambin.
Nota

Tenga en cuenta que el " bean "PCD slo se admite en la primavera de AOP - y no en el tejido nativo AspectJ. Se trata de una extensin del resorte-especficos de los PCDs estndar que define AspectJ. El " bean PCD opera a nivel de instancia (sobre la base del concepto de primavera nombre del bean) en lugar de en el nivel de tipo nico (que es lo que teje a base AOP se limita a). Basados en instancia designadores punto de corte son una

capacidad especial de proxy basada en Spring AOP marco y su estrecha integracin con la fbrica de beans Spring, donde es natural y fcil de identificar frijoles especficos por su nombre.
Combinando las expresiones pointcut

Pointcut expresiones pueden combinarse mediante '&&', '| |' y '!'. Tambin es posible hacer referencia a expresiones pointcut por su nombre. El siguiente ejemplo muestra tres expresiones: pointcut anyPublicOperation (que coincide con la ejecucin de un mtodo si unirse punto representa la ejecucin de cualquier mtodo pblico); inTrading (que coincide con la ejecucin de un mtodo si se encuentra en el mdulo de comercio), y tradingOperation (que coincide si un mtodo ejecucin representa cualquier mtodo pblico en el mdulo de negociacin).
@ Pointcut ("ejecucin (pblica ** (..))") anyPublicOperation private void () {} @ Pointcut ("dentro de (com.xyz.someapp.trading .. *)") inTrading private void () {} @ Pointcut ("anyPublicOperation () inTrading && ()") tradingOperation private void () {}

Es una buena prctica para construir expresiones ms complejas pointcut de componentes ms pequeos llamados como se muestra arriba. Cuando se hace referencia a puntos de corte por su nombre, las reglas normales de visibilidad Java aplicar (se puede ver puntos de corte privado en el mismo tipo, puntos de corte protegidas en la jerarqua, puntos de corte pblicos en cualquier lugar y as sucesivamente). La visibilidad no afecta a juego pointcut.
Compartiendo definiciones comunes pointcut

Cuando se trabaja con aplicaciones empresariales, a menudo se desea hacer referencia a los mdulos de la aplicacin y conjuntos particulares de operaciones desde varios aspectos. Se recomienda definir un "SystemArchitecture" aspecto que capta expresiones comunes pointcut para este propsito. Un aspecto tan tpico sera el siguiente:
paquete com.xyz.someapp; importar org.aspectj.lang.annotation.Aspect; importar org.aspectj.lang.annotation.Pointcut; Aspecto @ SystemArchitecture clase pblica { / ** * Un punto de unin se encuentra en la capa web, si el mtodo est definido * En un tipo en el paquete com.xyz.someapp.web o cualquier otro paquete de sub* En eso. * / @ Pointcut ("dentro de (com.xyz.someapp.web .. *)") inWebLayer public void () {}

/ ** * Un punto de unin est en la capa de servicio si el mtodo est definido * En un tipo en el paquete com.xyz.someapp.service o cualquier otro paquete de sub* En eso. * / @ Pointcut ("dentro de (com.xyz.someapp.service .. *)") inServiceLayer public void () {} / ** * Un punto de unin est en la capa de acceso de datos si el mtodo se define * En un tipo en el paquete com.xyz.someapp.dao o cualquier otro paquete de sub* En eso. * / @ Pointcut ("dentro de (com.xyz.someapp.dao .. *)") inDataAccessLayer public void () {} / ** * Un servicio de negocio es la ejecucin de cualquier mtodo definido en un servicio * Interfaz. Esta definicin supone que las interfaces se colocan en el * "Servicio" del paquete, y que los tipos de implementacin se encuentran en los sub-paquetes. * * Si agrupa interfaces de servicios por reas funcionales (por ejemplo, * En paquetes com.xyz.someapp.abc.service y com.xyz.def.service) luego * El punto de corte expresin "ejecucin (* com.xyz.someapp .. servicio. *. * (..))" * Puede utilizarse en su lugar. * * Si lo prefiere, puede escribir la expresin a travs del "frijol" * PCD, as como "bean (Service *)". (Esto supone que tiene * Nombre de sus granos de servicio de Primavera de una manera coherente.) * / @ Pointcut ("ejecucin (* com.xyz.someapp.service. *. * (..))") BusinessService public void () {} / ** * Una operacin de acceso de datos es la ejecucin de cualquier mtodo definido en una * Dao interfaz. Esta definicin supone que las interfaces se colocan en el * "Dao" del paquete, y que los tipos de implementacin se encuentran en los sub-paquetes. * / @ Pointcut ("ejecucin (* com.xyz.someapp.dao. *. * (..))") dataAccessOperation public void () {} }

Los puntos de corte definidos en ese aspecto se puede hacer referencia a cualquier lugar que usted necesita una expresin pointcut. Por ejemplo, para hacer que la capa de servicios transaccionales, se podra escribir:
<aop:config> <Aop: asesor pointcut = "com.xyz.someapp.SystemArchitecture.businessService ()" consejos-ref = "tx-consejos" /> </ Aop: config> <tx:advice id = "tx-advice"> <tx:attributes> nombre = <tx:method "*" propagacin = "REQUIRED" /> </ Tx: attributes> </ Tx: advice>

El <aop:config> y <aop:advisor> elementos se discuten en la Seccin 9.3, "Esquema de apoyo basado en AOP" . Los elementos de transaccin se discuten en el Captulo 12, Gestin de Operaciones .
Ejemplos

Spring AOP usuarios tienden a utilizar la execution designador de punto de corte con mayor frecuencia. El formato de una expresin de ejecucin es:
ejecucin (modificadores de patrn? ret tipo de patrn se declara de tipo de patrn? nombre de patrn (par-patrn) tiros de patrn?)

Todas las piezas, excepto el patrn de tipo retorno (ret tipo de patrn en el fragmento anterior), el patrn de nombre, y el patrn de los parmetros son opcionales. El patrn tipo devolver determina el tipo de retorno del mtodo debern ser para que un punto de unin para ser igualado. Lo ms frecuente es que va a utilizar * como patrn de tipo volver, que coincide con cualquier tipo de retorno. Un nombre de tipo completo coincidir slo cuando el mtodo devuelve el tipo dado. El patrn de nombre coincide con el nombre del mtodo. Usted puede utilizar el * comodn como la totalidad o parte de un patrn de nombre. El patrn de los parmetros es un poco ms complejo: () coincide con un mtodo que no requiera parmetros, mientras que (..) coincide con cualquier nmero de parmetros (cero o ms). El patrn (*) coincide con un mtodo que tenga un parmetro de cualquier tipo, (*,String) coincide con un mtodo de tomar dos parmetros, el primero puede ser de cualquier tipo, el segundo debe ser una cadena. Consulte la Lengua Semntica de la Gua de Programacin AspectJ para ms informacin. Algunos ejemplos de expresiones pointcut comunes se dan a continuacin.

la ejecucin de cualquier mtodo pblico:


ejecucin (** pblica (..))

la ejecucin de cualquier mtodo con un nombre que comienza con "set":

ejecucin (* set * (..))

la ejecucin de cualquier mtodo definido por el AccountService interfaz:


ejecucin (* com.xyz.service.AccountService. * (..))

la ejecucin de cualquier mtodo definido en el paquete de servicios:


ejecucin (* com.xyz.service. *. * (..))

la ejecucin de cualquier mtodo definido en el paquete de servicio o un subpaquete:


ejecucin (* com.xyz.service .. *. * (..))

cualquier punto de unin (nico mtodo de ejecucin en la primavera de AOP) dentro del paquete de servicios:
dentro de (com.xyz.service. *)

cualquier punto de unin (nico mtodo de ejecucin en la primavera de AOP) en el paquete de servicio o un sub-paquete:
dentro de (com.xyz.service .. *)

cualquier punto de unin (nico mtodo de ejecucin en la primavera de AOP) en el proxy implementa el AccountService interfaz:
este (com.xyz.service.AccountService)

"Esto" es ms comnmente utilizado en una forma solemne: - vase la siguiente seccin sobre consejos sobre cmo hacer que el objeto proxy disponible en el cuerpo consejo.

cualquier punto de unin (nico mtodo de ejecucin en la primavera de AOP) en el objeto de destino implementa el AccountService interfaz:
objetivo (com.xyz.service.AccountService)

'Target' es ms comnmente utilizado en una forma solemne: - vase la siguiente seccin sobre consejos sobre cmo hacer que el objeto de destino disponible en el cuerpo consejo.

cualquier punto de unin (nico mtodo de ejecucin en la primavera de AOP) que toma un solo parmetro, y donde el argumento pasado en tiempo de ejecucin es Serializable :
args (java.io.Serializable)

"Args" es ms comnmente utilizado en una forma solemne: - vase la siguiente seccin sobre consejos sobre cmo hacer que los argumentos de los mtodos disponibles en el cuerpo consejo. Tenga en cuenta que el punto de corte dado en este ejemplo es diferente de execution(* *(java.io.Serializable)) : los partidos versin args si el argumento pasado en tiempo de ejecucin es Serializable, los partidos versin de ejecucin si la firma del mtodo declara un nico parmetro de escriba Serializable .

cualquier punto de unin (nico mtodo de ejecucin en la primavera de AOP) en el objeto de destino tiene un @Transactional anotacin:
@ Objetivo (org.springframework.transaction.annotation.Transactional)

'@ Target' tambin puede ser utilizado en una forma solemne: - vase la siguiente seccin sobre consejos sobre cmo hacer que el objeto de anotacin disponible en el cuerpo consejo.

cualquier punto de unin (nico mtodo de ejecucin en la primavera de AOP) en el tipo declarado del objeto de destino tiene un @Transactional anotacin:
@ Dentro (org.springframework.transaction.annotation.Transactional)

'@ Dentro "tambin puede ser utilizado en una forma solemne: - vase la siguiente seccin sobre consejos sobre cmo hacer que el objeto de anotacin disponible en el cuerpo consejo.

cualquier punto de unin (nico mtodo de ejecucin en la primavera de AOP), donde el mtodo de ejecucin tiene un @Transactional anotacin:
@ Anotacin (org.springframework.transaction.annotation.Transactional)

"Anotacin @ 'tambin puede ser utilizado en una forma solemne: - ver la siguiente seccin sobre consejos sobre cmo hacer que el objeto de anotacin disponible en el cuerpo consejo.

cualquier punto de unin (nico mtodo de ejecucin en la primavera de AOP) que toma un solo parmetro, y donde el tipo de tiempo de ejecucin del argumento pasado tiene el @Classified anotacin:
@ Args (com.xyz.security.Classified)

'@' Args tambin puede ser utilizado en una forma solemne: - vase la siguiente seccin sobre consejos sobre cmo hacer que el objeto de anotacin (s) disponible en el cuerpo consejo.

cualquier punto de unin (nico mtodo de ejecucin en la primavera de AOP) en el frijol de primavera llamado ' tradeService ':
frijol (TradeService)

cualquier punto de unin (nico mtodo de ejecucin en la primavera de AOP) en el frijol de primavera que tienen nombres que coinciden con "la expresin comodn *Service ':
frijol (Service *)

Escribir buenos puntos de corte

Durante la compilacin, AspectJ procesa puntos de corte con el fin de tratar de optimizar el rendimiento del juego. Examinando el cdigo y determinar si cada uno de unirse a partidos puntuales (esttica o dinmica) un punto de corte determinado es un proceso costoso. (Un partido dinmico significa que el partido no puede ser completamente determinado a partir de anlisis esttico y la prueba se coloca en el cdigo para determinar si hay una coincidencia real cuando se ejecuta el cdigo). En su primer encuentro con una declaracin pointcut, AspectJ lo reescribir en una forma ptima para el proceso de casacin. Qu quiere decir esto? Bsicamente puntos de corte se vuelven a escribir en DNF (forma normal disyuntiva) y los componentes del punto de corte se ordena de modo que los componentes que son ms baratas a evaluar se comprueban primero. Esto significa que usted no tiene que preocuparse acerca de la comprensin del funcionamiento de los designadores punto de corte diferentes y los suministra en cualquier orden en una declaracin pointcut. Sin embargo, AspectJ slo puede trabajar con lo que se le dice, y para obtener un rendimiento ptimo del juego usted debe pensar en lo que estn tratando de lograr y reducir el espacio de bsqueda de coincidencias tanto como sea posible en la definicin. Los designadores existentes naturalmente se dividen en tres grupos: kinded, alcance y contexto:

Designadores Kinded son aquellos que seleccionar un determinado tipo de punto de unin. Por ejemplo: ejecucin, obtener, establecer, llame, handler Designadores Scoping son los que seleccione un grupo de puntos de unin de intereses (probablemente de muchos tipos). Por ejemplo: en el interior, withincode Designadores contextuales son aquellos que responden (y, opcionalmente, se unen) en funcin del contexto. Por ejemplo, este, blanco, anotacin @

Un punto de corte bien escrito debe tratar de incluir por lo menos los dos primeros tipos (kinded y alcance), mientras que los designadores contextuales pueden incluirse si quisiera igualar basado en unirse contexto puntos, o enlazar este contexto para su uso en el consejo. El suministro sea slo un designador kinded o simplemente un indicador contextual funciona, pero podra afectar a tejer el rendimiento (tiempo y la memoria utilizada) debido a todo el procesamiento adicional y anlisis. Designadores de alcance son muy rpidos para que coincida y su utilizacin significa AspectJ puede muy rpidamente que el de los grupos de puntos de unin que no deben ser procesados adicionalmente - que es la razn por un punto de corte bien siempre debe incluir uno si es posible.

9.2.4 La declaracin de asesoramiento

Consejos se asocia con una expresin pointcut, y se ejecuta antes de, despus de, o alrededor de ejecuciones mtodo igualado por el punto de corte. La expresin pointcut puede ser una simple referencia a un punto de corte con nombre o una expresin pointcut declarado en su lugar.
Antes de asesoramiento

Antes de asesoramiento se declara en un aspecto utilizando el @Before anotacin:


importar org.aspectj.lang.annotation.Aspect; importar org.aspectj.lang.annotation.Before; Aspecto @ pblico BeforeExample clase { @ Antes ("com.xyz.myapp.SystemArchitecture.dataAccessOperation ()") doAccessCheck public void () { / / ... } }

Si se utiliza una expresin pointcut en el lugar que podra reescribir el ejemplo anterior como:
importar org.aspectj.lang.annotation.Aspect; importar org.aspectj.lang.annotation.Before; Aspecto @ pblico BeforeExample clase { @ Antes ("ejecucin (* com.xyz.myapp.dao. *. * (..))") doAccessCheck public void () { / / ... } }

Despus de regresar asesoramiento

Tras escuchar la opinin de regresar cuando se ejecuta un mtodo de ejecucin coincide devuelve normalmente. Se declaran usando la @AfterReturning anotacin:
importar org.aspectj.lang.annotation.Aspect; importar org.aspectj.lang.annotation.AfterReturning; Aspecto @ pblico AfterReturningExample clase { @ AfterReturning ("com.xyz.myapp.SystemArchitecture.dataAccessOperation ()") doAccessCheck public void () { / / ... }

Nota: es posible, naturalmente, tienen mltiples declaraciones consejos, y otros miembros, as, todo dentro del mismo aspecto. Estamos mostrando una declaracin consejo solo en estos ejemplos para centrarse en el tema que se est discutiendo en ese momento. A veces es necesario el acceso en el cuerpo de asesoramiento con el valor real que se devolvi. Usted puede utilizar el formulario de @AfterReturning que se une el valor devuelto por la siguiente:
importar org.aspectj.lang.annotation.Aspect; importar org.aspectj.lang.annotation.AfterReturning; Aspecto @ pblico AfterReturningExample clase { @ AfterReturning ( pointcut = "com.xyz.myapp.SystemArchitecture.dataAccessOperation ()", volviendo = "retVal") public void doAccessCheck (Object retVal) { / / ... } }

El nombre utilizado en la returning atributo debe coincidir con el nombre de un parmetro en el mtodo de asesoramiento. Cuando una ejecucin vuelve mtodo, el valor de retorno se pasa al mtodo asesoramiento como el valor del argumento correspondiente. Un returning clusula tambin restringe a juego solamente a aquellos ejecuciones mtodos que devuelven un valor del tipo especificado ( Object , en este caso, que coincidir con cualquier valor de retorno). Tenga en cuenta que no es posible devolver una referencia totalmente diferente cuando se utiliza despus de regresar consejo.
Despus de lanzar asesoramiento

Despus de lanzar consejo se ejecuta cuando se sale de ejecucin de los mtodos combinados por una excepcin. Se declaran usando la @AfterThrowing anotacin:
importar org.aspectj.lang.annotation.Aspect; importar org.aspectj.lang.annotation.AfterThrowing; Aspecto @ pblico AfterThrowingExample clase { @ AfterThrowing ("com.xyz.myapp.SystemArchitecture.dataAccessOperation ()") doRecoveryActions public void () { / / ... } }

A menudo se desea que el consejo se ejecute slo cuando las excepciones de un tipo determinado se lanzan, y tambin a menudo necesitan tener acceso a la excepcin que se produce en el cuerpo consejo. Utilice el throwing de atributo para restringir tanto a juego (si lo desea, utilice Throwable como el tipo de excepcin no) y obligar a la excepcin que se produce a un parmetro de asesoramiento.
importar org.aspectj.lang.annotation.Aspect; importar org.aspectj.lang.annotation.AfterThrowing; Aspecto @ pblico AfterThrowingExample clase { @ AfterThrowing ( pointcut = "com.xyz.myapp.SystemArchitecture.dataAccessOperation ()", arrojando = "ex") doRecoveryActions public void (DataAccessException ex) { / / ... } }

El nombre utilizado en el throwing atributo debe coincidir con el nombre de un parmetro en el mtodo de asesoramiento. Cuando sale un mtodo de ejecucin de una excepcin, la excepcin se pasa al mtodo de asesoramiento como el valor del argumento correspondiente. Un throwing clusula tambin restringe a juego solamente a aquellos ejecuciones mtodo que lanzan una excepcin del tipo especificado ( DataAccessException en este caso).
Despus (por fin) el asesoramiento

Despus (por fin) el asesoramiento corre sin embargo al salir un mtodo combinado de ejecucin. Se declaran usando la @After anotacin. Despus de asesoramiento debe estar preparado para manejar las condiciones de retorno, tanto normales como excepcin. Se utiliza tpicamente para los recursos de liberacin, etc
importar org.aspectj.lang.annotation.Aspect; org.aspectj.lang.annotation.After importacin; Aspecto @ pblico AfterFinallyExample clase { @ After ("com.xyz.myapp.SystemArchitecture.dataAccessOperation ()") doReleaseLock public void () { / / ... } }

Alrededor de asesoramiento

El tipo de consejo final es de alrededor de consejo. Alrededor de asesoramiento corre "en torno a" la ejecucin de un mtodo coincidente. Tiene la oportunidad de hacer trabajar tanto antes como despus de que el mtodo se ejecuta, y para determinar cundo, cmo y si es par, el mtodo en realidad llega a ejecutar en absoluto. Alrededor

de asesoramiento se usa a menudo si tiene que compartir el estado antes y despus de la ejecucin de un mtodo de una manera segura para subprocesos (iniciar y detener un temporizador, por ejemplo). Utilice siempre la forma menos potente de asesoramiento acorde con sus necesidades (es decir, no utilizar alrededor de consejo si es simple consejo es que antes de hacerlo). Alrededor de asesoramiento se declaran usando la @Around anotacin. El primer parmetro del mtodo consejo debe ser de tipo ProceedingJoinPoint . Dentro del cuerpo de la asesora, llamando a proceed() en el ProceedingJoinPoint hace que el mtodo subyacente a ejecutar. El proceed mtodo tambin se puede llamar pasando un Object[] - los valores de la matriz se utilizan como argumentos para la ejecucin del mtodo cuando proceda. El comportamiento de proceder cuando se le llama con un Object [] es un poco diferente que el comportamiento de proceder por alrededor de asesoramiento compilado por el compilador AspectJ. Por alrededor de opinin por escrito utilizando el lenguaje AspectJ tradicional, el nmero de argumentos pasados a proceder debe coincidir con el nmero de argumentos pasados al consejo alrededor (no el nmero de argumentos tomados por el subyacente unirse punto), y el valor que se pasa a proceder de dado suplanta argumento de posicin el valor original en el punto de unin de la entidad fue obligado el valor a (No se preocupe si no tiene sentido en este momento!). El enfoque adoptado para la primavera es ms simple y una mejor adaptacin a su semntica basada en proxy, ejecucin solamente. Slo es necesario tener en cuenta esta diferencia si est compilando @ aspectos AspectJ escritas para la primavera y el uso de proceder con las discusiones con el compilador AspectJ y tejedora. Hay una manera de escribir aquellos aspectos que es 100% compatible a travs de ambos Spring AOP y AspectJ, y esto se discute en la siguiente seccin sobre parmetros consejos.
importar org.aspectj.lang.annotation.Aspect; importar org.aspectj.lang.annotation.Around; org.aspectj.lang.ProceedingJoinPoint importacin; Aspecto @ pblico AroundExample clase { @ Around ("com.xyz.myapp.SystemArchitecture.businessService ()") doBasicProfiling public Object (ProceedingJoinPoint PJP) throws Throwable { / / Activar el cronmetro Objeto retVal pjp.proceed = (); / / Detener el cronmetro volver retVal; } }

El valor devuelto por el consejo alrededor ser el valor devuelto visto por el llamador del mtodo. Un aspecto sencillo, por ejemplo, el almacenamiento en cach podra devolver un valor desde una memoria cach si lo tiene, e invocar proceder () si no lo hace. Tenga en cuenta que proceder puede ser invocado una vez, muchas veces, o no del todo dentro del cuerpo de la cerca de consejos, todo esto es completamente legal.

Consejos parmetros

Spring 2.0 ofrece asesoramiento totalmente escrito - lo que significa que se declaran los parmetros necesarios en la firma de asesoramiento (como vimos para la devolucin y arrojando ejemplos anteriores) en lugar de trabajar con Object[] arrays todo el tiempo. Vamos a ver cmo hacer que el argumento y otros valores contextuales disponibles para el cuerpo consejo en un momento. En primer lugar vamos a echar un vistazo a cmo escribir asesoramiento genrico que se puede encontrar informacin sobre el mtodo que el consejo est asesorando.
El acceso a la corriente JoinPoint

Cualquier mtodo consejo puede declarar como primer parmetro, un parmetro de tipo org.aspectj.lang.JoinPoint (tenga en cuenta que alrededor del consejo tiene la obligacin de declarar el primer parmetro de tipo ProceedingJoinPoint , que es una subclase de JoinPoint . El JoinPoint interfaz proporciona un nmero de mtodos tiles, tales como getArgs() (devuelve los argumentos del mtodo), getThis() (devuelve el objeto proxy), getTarget() (devuelve el objeto de destino), getSignature() (devuelve una descripcin del mtodo que se est aconsejado ) y toString() (imprime una til descripcin del mtodo que se recomienda). Hgalo, por favor consulte los Javadocs para ms detalles.
Paso de parmetros a los consejos

Ya hemos visto cmo enlazar el valor devuelto o excepcin valor (utilizando su regreso y despus de lanzar asesoramiento). Para hacer que los valores de argumentos disponible para el cuerpo consejo, usted puede utilizar el formulario de unin de args . Si un nombre de parmetro se utiliza en lugar de un nombre de tipo en una expresin args, entonces el valor del argumento correspondiente se pasa como el valor del parmetro cuando el consejo se invoca. Un ejemplo debera hacer esto ms claro. Suponga que desea aconsejar a la ejecucin de las operaciones de DAO que tomar un objeto de la cuenta como el primer parmetro, y necesita tener acceso a la cuenta en el cuerpo consejo. Se puede escribir lo siguiente:
@ Antes ("com.xyz.myapp.SystemArchitecture.dataAccessOperation () &&" + "Args (cuenta, ..)") public void validateAccount (cuenta Account) { / / ... }

Los args(account,..) forman parte de la expresin pointcut sirve para dos propsitos: en primer lugar, restringe slo a aquellos que emparejan ejecuciones mtodo cuando el mtodo de toma por lo menos un parmetro, y el argumento pasado a ese parmetro es una instancia de Account , en segundo lugar , hace que la actual Account objeto disponible para el asesoramiento a travs de la account parmetro. Otra forma de escribir esto es para declarar un punto de corte que "ofrece" la Account objeto de valor cuando coincide con un punto de unin, y luego simplemente se refieren al punto de corte con nombre del consejo. Esto se vera de la siguiente manera:

@ Pointcut ("com.xyz.myapp.SystemArchitecture.dataAccessOperation () &&" + "Args (cuenta, ..)") accountDataAccessOperation private void (cuenta Account) {} @ Antes ("accountDataAccessOperation (cuenta)") public void validateAccount (cuenta Account) { / / ... }

El lector interesado puede una vez ms se refiri a la gua de programacin AspectJ para ms detalles. El objeto proxy ( this ), objeto de destino ( target ) y anotaciones ( @within, @target, @annotation, @args ) todo se puede enlazar de una manera similar. El siguiente ejemplo muestra cmo podra coincidir con la ejecucin de los mtodos anotados con un @Auditable anotacin, y extraer el cdigo de auditora. En primer lugar la definicin de la @Auditable anotacin:
@ Retention (RetentionPolicy.RUNTIME) @ Target (ElementType.METHOD) public @ interface Auditable { Valor AuditCode (); }

Y entonces el consejo que coincide con la ejecucin de @Auditable mtodos:


@ Antes ("com.xyz.lib.Pointcuts.anyPublicMethod () &&" + "@ Anotacin (auditable)") auditora public void (Auditable auditable) { AuditCode cdigo auditable.value = (); / / ... } Consejos de parmetros y los genricos

Spring AOP puede manejar genricos utilizados en las declaraciones de clase y los parmetros del mtodo. Suponga que tiene un tipo genrico de esta manera:
public interface Muestra <T> { sampleGenericMethod vaco (T param); vaco sampleGenericCollectionMethod (Coleccin> T param>); }

Puede restringir la interceptacin de tipos de mtodos para ciertos tipos de parmetros, simplemente escribiendo el parmetro consejos para el tipo de parmetro que desea interceptar el mtodo para:
@ Antes ("ejecucin (* .. Sample +. SampleGenericMethod (*)) && args (param)") beforeSampleMethod public void (MyType param) { / / Consejos de la aplicacin }

Que esto funciona es bastante obvio como ya se discuti anteriormente. Sin embargo, vale la pena sealar que esto no funcionar para las colecciones genricas. As que no se puede definir un punto de corte de esta manera:
@ Antes ("ejecucin (* .. Sample +. SampleGenericCollectionMethod (*)) && args (param)") public void beforeSampleMethod (Coleccin <MyType> param) { / / Consejos de la aplicacin }

Para hacer este trabajo se tendra que inspeccionar cada elemento de la coleccin, que no es razonable, ya que tambin no puede decidir cmo tratar null valores en general. Para lograr algo similar a esto usted tiene que escribir el parmetro Collection<?> y comprobar manualmente el tipo de los elementos.
Determinar nombres de los argumentos

El parmetro obligatorio en invocaciones asesoramiento se basa en la coincidencia de nombres que se utilizan en expresiones pointcut a nombres de parmetros declarados en firmas de mtodo (asesoramiento y punto de corte). Los nombres de parmetros no estn disponibles a travs de la reflexin de Java, por lo Spring AOP utiliza las siguientes estrategias para determinar los nombres de parmetros: 1. Si los nombres de los parmetros se han especificado por el usuario de forma explcita, a continuacin, los nombres de los parmetros especificados se utilizan: tanto el asesoramiento y las anotaciones pointcut tener una opcin "argNames" atributo que se puede utilizar para especificar los nombres de los argumentos del mtodo comentado - estos argumentos Los nombres estn disponibles en tiempo de ejecucin. Por ejemplo:
2. 3. 4. 5. 6. 7. @ Antes ( value = "com.xyz.lib.Pointcuts.anyPublicMethod () && (frijol blanco) && @ anotacin (auditable)", argNames = "bean, auditable") auditora public void (Object bean, Auditable auditable) { AuditCode cdigo auditable.value = (); / / ... use el cdigo y frijol }

Si el primer parmetro es de la JoinPoint , ProceedingJoinPoint o JoinPoint.StaticPart tipo, puede dejar el nombre del parmetro desde el valor de la "argNames" atributo. Por ejemplo, si se modifica el anterior consejo para recibir el objeto de punto de unin, el "argNames" atributo no es necesario que se incluyen:
@ Antes ( value = "com.xyz.lib.Pointcuts.anyPublicMethod () && (frijol blanco) && @ anotacin (auditable)", argNames = "bean, auditable") auditora public void (joinpoint jp, objeto bean, Auditable auditable) { AuditCode cdigo auditable.value = (); / / ... use el cdigo, frijol y jp }

El trato especial otorgado al primer parmetro de la JoinPoint , ProceedingJoinPoint y JoinPoint.StaticPart tipos es particularmente conveniente para el consejo que no recogen ningn otro contexto unirse punto. En tales situaciones, usted puede simplemente omitir el "argNames" atributo. Por ejemplo, el siguiente consejo no necesita declarar el "argNames" atributo:
@ Antes ( "Com.xyz.lib.Pointcuts.anyPublicMethod ()") auditora public void (joinpoint jp) { / / ... utilizar jp }

8. Usando los 'argNames' atributo es un poco torpe, as que si los 'argNames' atributo no se ha especificado, Spring AOP se ver en la informacin de depuracin para la clase y tratar de determinar los nombres de los parmetros de la tabla de variables locales. Esta informacin estar presente siempre que las clases han sido compiladas con informacin de depuracin ( '-g:vars' en un mnimo). Las consecuencias de compilar con esta bandera en son: (1) su cdigo ser un poco ms fcil de entender (ingeniera inversa), (2) el tamao del archivo de clase ser muy poco ms grande (por lo general sin consecuencias), (3) la optimizacin para eliminar sin usar variables locales no sern aplicadas por el compilador. En otras palabras, usted debe encontrar ninguna dificultad con la construccin de este indicador en. Si un aspecto @ AspectJ ha sido compilado por el compilador AspectJ (AJC), incluso sin la informacin de depuracin, entonces no hay necesidad de agregar el atributo argNames como el compilador retener la informacin necesaria. 9. Si el cdigo ha sido compilado sin la informacin de depuracin es necesario, a continuacin, Spring AOP intentar deducir la vinculacin de las variables de unin a los parmetros (por ejemplo, si slo una variable est ligada en la expresin punto de corte, y el mtodo de asesoramiento slo toma un parmetro, la pareja es obvio!). Si el enlace de variables es ambigua dada la informacin disponible, entonces un AmbiguousBindingException ser lanzada. 10. Si todas estas estrategias fallan, una IllegalArgumentException ser lanzada.
Continuando con argumentos

Hemos sealado anteriormente que nos describen cmo escribir una llamada proceder con argumentos que trabaja consistentemente a travs de Spring AOP y AspectJ. La solucin es simplemente para garantizar que la firma asesoramiento une a cada uno de los parmetros del mtodo en orden. Por ejemplo:
@ Around ("ejecucin (Lista <Cuenta> encontrar * (..)) &&" + "Com.xyz.myapp.SystemArchitecture.inDataAccessLayer () &&" + "Args (accountHolderNamePattern)") pblico preProcessQueryPattern Object (ProceedingJoinPoint pjp, String accountHolderNamePattern) lanza Throwable { Cadena newPattern = preproceso (accountHolderNamePattern); volver pjp.proceed (new Object [] {} newPattern); }

En muchos casos usted va a hacer esta unin de todos modos (como en el ejemplo anterior).
Consejos de pedido

Qu ocurre cuando varias piezas de asesoramiento todos queremos correr en el mismo punto de unirse? Spring AOP sigue las mismas reglas de precedencia como AspectJ para determinar el orden de ejecucin consejo. El mayor consejo prioridad se ejecuta primero "en el camino en" (tan dado dos pedazos de consejo antes, el de mayor prioridad se ejecuta en primer lugar). "En el camino" desde un punto de unin, la ms alta prioridad asesoramiento corre pasada (tan dado dos pedazos de consejo despus, el que tiene la prioridad ms alta se ejecutar segundo). Cuando dos consejos se definen en diferentes aspectos tanto que ejecutar en el mismo punto de unirse, a menos que se especifique lo contrario, el orden de ejecucin es indefinido. Puede controlar el orden de ejecucin especificando prioridad. Esto se hace de la manera normal de primavera ya sea siguiendo el org.springframework.core.Ordered interfaz en la clase de aspecto o anotndolo con la Order anotacin. Teniendo en cuenta dos aspectos, el aspecto de devolver el valor ms bajo desde Ordered.getValue() (o el valor de anotacin) tiene la prioridad ms alta. Cuando dos consejos se definen en el mismo aspecto tanto que ejecutar en el mismo punto de unirse, el orden es indefinido (ya que no hay forma de recuperar el orden de la declaracin a travs de la reflexin para javac-compilados clases). Considere la posibilidad de colapso de estos mtodos asesoramiento en el mtodo de asesoramiento por un punto de unin en cada clase de aspecto, o refactorizar los consejos en clases separadas de aspecto - que pueden pedirse a nivel de aspecto.
9.2.5 Introducciones

Presentaciones (conocidos como de tipo inter declaraciones en AspectJ) permiten un aspecto a declarar que los objetos aconsejables implementar una interfaz dada, y para proporcionar una implementacin de esta interfaz en nombre de esos objetos. Una introduccin se realiza mediante el @DeclareParents anotacin. Esta anotacin se utiliza para declarar que los tipos de juego tiene un nuevo padre (de ah el nombre). Por ejemplo, dada una interfaz UsageTracked , y una implementacin de esta interfaz DefaultUsageTracked , el aspecto siguiente se declara que todos los ejecutores de interfaces de servicios tambin implementan la UsageTracked interfaz. (Con el fin de exponer las estadsticas a travs de JMX por ejemplo.)
Aspecto @ UsageTracking clase pblica { @ DeclareParents (value = "com.xzy.myapp.service. * +", defaultImpl = DefaultUsageTracked.class) pblico mixin UsageTracked esttica; @ Antes ("com.xyz.myapp.SystemArchitecture.businessService () &&" + "Esto (usageTracked)") recordUsage public void (UsageTracked usageTracked) {

usageTracked.incrementUseCount (); } }

La interfaz que se implementa es determinado por el tipo del campo anotado. El value del atributo @DeclareParents anotacin es un patrn de tipo AspectJ: - cualquier bean de un tipo de coincidencias se implementa la interfaz UsageTracked. Tenga en cuenta que en el consejo antes de el ejemplo anterior, las habas de servicio puede ser utilizado directamente como las implementaciones de la UsageTracked interfaz. Si desea acceder a un bean de programacin debera escribir lo siguiente:
UsageTracked usageTracked = (UsageTracked) context.getBean ("myService");

9.2.6 Aspecto modelos de instancias

(Este es un tema avanzado, as que si usted est recin empezando con AOP que con seguridad puede saltar hasta ms tarde.) Por defecto, habr una sola instancia de cada aspecto dentro del contexto de aplicacin. AspectJ llama a esto el modelo de instancia singleton. Es posible definir los aspectos con los ciclos de vida alternativos: - Spring soporta AspectJ de perthis y pertarget modelos de instancias ( percflow, percflowbelow, y pertypewithin no son compatibles actualmente). A "perthis" aspecto se declara especificando un perthis clusula en el @Aspect anotacin. Veamos un ejemplo, y luego vamos a explicar cmo funciona.
Aspecto @ ("perthis (com.xyz.myapp.SystemArchitecture.businessService ())") pblico MyAspect clase { private int someState; @ Antes (com.xyz.myapp.SystemArchitecture.businessService ()) recordServiceUsage public void () { / / ... } }

El efecto de la 'perthis' clusula es que un aspecto instancia se crear para cada servicio nico objeto la ejecucin de un servicio de negocio (cada objeto nico obligado a "esto" a unir puntos coincidentes con la expresin pointcut). La instancia de aspecto se crea la primera vez que se invoca un mtodo en el objeto de servicio. El aspecto queda fuera del mbito cuando el objeto de servicio est fuera de mbito. Antes de la instancia de aspecto es creado, ninguno de los consejos dentro se ejecuta. Tan pronto como la instancia aspecto ha sido creado, el asesoramiento declarado dentro se ejecutar en emparejado unir puntos, pero slo cuando el objeto de servicio es la que se asocia con este aspecto. Consulte la gua de programacin AspectJ para obtener ms informacin sobre la per-clusulas.

El 'pertarget' modelo instanciacin funciona exactamente de la misma manera que perthis, sino que crea una instancia para cada aspecto objeto de destino nico en puntos coincidentes unirse.
9.2.7 Ejemplo

Ahora que ha visto cmo todas las partes constituyentes trabajar, vamos a ponerlos juntos para hacer algo til! La ejecucin de los servicios empresariales a veces puede fallar debido a problemas de concurrencia (por ejemplo, perdedor punto muerto). Si se reintenta la operacin, es muy probable que tenga xito la prxima vez. Para los servicios a las empresas en las que es apropiado para volver a intentar en estas condiciones (operaciones idempotentes que no es necesario ir de nuevo al usuario para la resolucin de conflictos), nos gustara volver a intentar la operacin de forma transparente para evitar que el cliente ver un PessimisticLockingFailureException . Este es un requisito que claramente corta a travs de mltiples servicios en la capa de servicio, y por lo tanto, es ideal para la aplicacin a travs de un aspecto. Porque queremos volver a intentar la operacin, tendremos que utilizar alrededor de consejo para que podamos proceder llamar varias veces. As es como la implementacin aspecto bsico es:
Aspecto @ ConcurrentOperationExecutor clase pblica implementa Pedido { private static final int DEFAULT_MAX_RETRIES = 2; privadas MaxRetries int = DEFAULT_MAX_RETRIES; Para private int = 1; setMaxRetries public void (int MaxRetries) { esta MaxRetries = MaxRetries.; } getOrder public int () { devuelva este orden.; } setOrder public void (int fin) { . este orden = orden; } @ Around ("com.xyz.myapp.SystemArchitecture.businessService ()") doConcurrentOperation public Object (ProceedingJoinPoint PJP) throws Throwable { numAttempts int = 0; PessimisticLockingFailureException lockFailureException; do { numAttempts + +; try { volver pjp.proceed (); } catch (PessimisticLockingFailureException ex) { lockFailureException = ex; }

} while (<= numAttempts esta MaxRetries.); tirar lockFailureException; } }

Tenga en cuenta que el aspecto implementa la Ordered interfaz para que podamos establecer la prioridad de los aspectos ms alta que el consejo transaccin (queremos una transaccin de nuevo cada vez que vuelva a intentar). Los maxRetries y order propiedades se pueden configurar tanto para la primavera. La principal accin que ocurre en el doConcurrentOperation alrededor consejo. Tenga en cuenta que por el momento estamos aplicando la lgica de reintento para todos businessService()s . Nosotros tratamos de seguir adelante, y si no con un PessimisticLockingFailureException simplemente tratamos de nuevo a menos que hayamos agotado todos nuestros reintentos. La configuracin de Spring correspondiente es:
<aop:aspectj-autoproxy/> <Bean id = "concurrentOperationExecutor" class = "com.xyz.myapp.service.impl.ConcurrentOperationExecutor"> <propiedad nombre = valor = "maxRetries" "3" /> <propiedad nombre = valor = "order" "100" /> </ Bean>

Para refinar la forma para que slo reintentos de operaciones idempotentes, podramos definir un Idempotent anotacin:
@ Retention (RetentionPolicy.RUNTIME) public @ interface idempotente { / / Marcador anotacin }

y el uso de la anotacin para anotar la ejecucin de las operaciones de servicio. El cambio en el aspecto para reintentar operaciones idempotentes slo implica simplemente el perfeccionamiento de la expresin pointcut para que slo @Idempotent operaciones partido:
@ Around ("com.xyz.myapp.SystemArchitecture.businessService () &&" + "@ Anotacin (com.xyz.myapp.service.Idempotent)") doConcurrentOperation public Object (ProceedingJoinPoint PJP) throws Throwable { ... }

9,3 esquema basado en AOP apoyo


Si usted es incapaz de utilizar Java 5, o simplemente prefieren un formato basado en XML, a continuacin, Spring 2.0 tambin ofrece soporte para la definicin de los aspectos con los nuevos "AOP" etiquetas de espacio de nombres. Las expresiones exactamente el mismo punto de corte y tipos asesoramiento se admiten como cuando se utiliza el estilo @ AspectJ, por lo tanto, en esta seccin nos centraremos en la nueva

sintaxis y remite al lector a la discusin de la seccin anterior ( Seccin 9.2, "@ AspectJ apoyo" ) para la comprensin de la escritura de expresiones punto de corte y la unin de los parmetros de recomendaciones. Para utilizar las etiquetas de espacio de nombres AOP descritos en esta seccin, es necesario importar el esquema de primavera-aop como se describe en el Apndice E, esquema XML de configuracin basada en . Consulte la Seccin E.2.7, "El aop esquema " de cmo importar las etiquetas en el espacio de nombres AOP. Dentro de sus configuraciones de primavera, todos los elementos de aspecto y asesor debe ser colocado dentro de un <aop:config> elemento (puede tener ms de un <aop:config> elemento en una configuracin de contexto de aplicacin). Un <aop:config> elemento puede contener pointcut, asesor, y los elementos de aspecto (tenga en cuenta estos deben ser declarados en ese orden).
Advertencia

El <aop:config> estilo de configuracin hace un uso intensivo de la primavera de auto-proxy mecanismo. Esto puede causar problemas (como el consejo no se teje) si usted ya est usando explcito auto-proxy a travs del uso de BeanNameAutoProxyCreator o cosas por el estilo. El patrn de uso recomendado es utilizar slo el <aop:config> estilo, o simplemente el AutoProxyCreator estilo.
9.3.1 La declaracin de un aspecto

Con el apoyo de esquema, un aspecto es simplemente un objeto normal Java define como un grano en el contexto de la aplicacin de Primavera. El estado y el comportamiento se refleja en los campos y mtodos del objeto, y el punto de corte y la informacin de asesoramiento se captura en el XML. Un aspecto se declara utilizando el elemento <aop:aspect>, y el bean de respaldo se hace referencia con la ref atributo:
<aop:config> <aop:aspect id = "myAspect" ref = "aBean"> ... </ Aop: Aspecto> </ Aop: config> <bean id = clase = "aBean" "..."> ... </ Bean>

El bean de respaldo del aspecto (" aBean "en este caso) puede, por supuesto, puede configurar y dependencia inyectado como cualquier otro frijol de primavera.

9.3.2 La declaracin de un punto de corte

Un punto de corte con nombre puede ser declarado dentro de un elemento <aop:config>, lo que permite la definicin de punto de corte para ser compartido a travs de varios aspectos y asesores. Un punto de corte que representa la ejecucin de cualquier servicio de negocio en la capa de servicio se puede definir como sigue:
<aop:config> <Aop: pointcut id = "BusinessService" = expresin "ejecucin (* com.xyz.myapp.service. *. * (..))" /> </ Aop: config>

Tenga en cuenta que el punto de corte expresin en s est utilizando el mismo lenguaje AspectJ expresin pointcut como se describe en la Seccin 9.2, "@ AspectJ apoyo" . Si est utilizando el estilo de esquema declaracin basada en Java 5, puede hacer referencia a puntos de corte con nombre definidos en los tipos (@ Aspectos) dentro de la expresin pointcut, pero esta caracterstica no est disponible en JDK 1.4 y por debajo (que se basa en el Java 5 especfico AspectJ reflexin API). En JDK 1,5 por lo tanto, otra manera de definir el punto de corte sera:
<aop:config> <Aop: pointcut id = "BusinessService" = expresin "com.xyz.myapp.SystemArchitecture.businessService ()" /> </ Aop: config>

Asumiendo que tiene un SystemArchitecture aspecto como se describe en la seccin llamada "Compartiendo pointcut definiciones comunes" . La declaracin de un punto de corte en el interior de un aspecto es muy similar a la declaracin de un punto de corte de nivel superior:
<aop:config> <aop:aspect id = "myAspect" ref = "aBean"> <Aop: pointcut id = "BusinessService" = expresin "ejecucin (* com.xyz.myapp.service. *. * (..))" /> ... </ Aop: Aspecto> </ Aop: config>

De la misma manera en un aspecto @ AspectJ, puntos de corte declara con el estilo de definicin de esquema basado puede recoger unirse contexto puntos. Por ejemplo, el

punto de corte siguiente recoge el "este" objeto como el punto de unin contexto y lo pasa al consejo:
<aop:config> <aop:aspect id = "myAspect" ref = "aBean"> <Aop: pointcut id = "BusinessService" = expresin "ejecucin (* com.xyz.myapp.service. *. * (..)) && esto (servicio)" /> <aop:before pointcut-ref = "businessService" method = "monitor" /> ... </ Aop: Aspecto> </ Aop: config>

Los consejos deben ser declarados para recibir el punto recogido contexto unirse mediante la inclusin de parmetros de los nombres coincidentes:
public void monitor (objeto de servicio) { ... }

Cuando se combinan pointcut sub-expresiones, '&&' es torpe dentro de un documento XML, por lo que las palabras 'y', 'o' y 'no' se puede utilizar en lugar de '&&', '| |' '!' Y respectivamente. Por ejemplo, el punto de corte anterior puede estar mejor escrito como:
<aop:config> <aop:aspect id = "myAspect" ref = "aBean"> <Aop: pointcut id = "BusinessService" = expresin "ejecucin (* com.xyz.myapp.service. *. * (..)) y esta (servicio)"> / <aop:before pointcut-ref = "businessService" method = "monitor" /> ... </ Aop: Aspecto> </ Aop: config>

Tenga en cuenta que pointcuts definidos de esta manera se denominan por su id XML y no se pueden utilizar como puntos de corte para formar puntos de corte mencionados compuestos. El apoyo pointcut nombrado en el estilo de definicin de esquemas basados tanto, es ms limitada que la que ofrece el estilo @ AspectJ.
9.3.3 La declaracin de asesoramiento

Los mismos cinco tipos consejos son compatibles como para el estilo @ AspectJ, y tienen exactamente la misma semntica.

Antes de asesoramiento

Antes de asesoramiento se ejecuta antes de la ejecucin de un mtodo coincidente. Se declara dentro de un <aop:aspect> usando el elemento <aop:before>.
<aop:aspect id = "beforeExample" ref = "aBean"> <Aop: antes pointcut-ref = "dataAccessOperation" method = "doAccessCheck" /> ... </ Aop: Aspecto>

Aqu dataAccessOperation es la identificacin de un punto de corte definido en la parte superior ( <aop:config> ) nivel. Para definir el punto de corte en lnea en lugar, cambiar el pointcut-ref atributo con un pointcut atributo:
<aop:aspect id = "beforeExample" ref = "aBean"> <Aop: antes pointcut = "ejecucin (* com.xyz.myapp.dao. *. * (..))" method = "doAccessCheck" /> ... </ Aop: Aspecto>

Como sealamos en el debate sobre el estilo @ AspectJ, utilizando puntos de corte mencionados pueden mejorar la legibilidad del cdigo. El atributo de mtodo identifica un mtodo ( doAccessCheck ) que proporciona el cuerpo de los consejos. Este mtodo debe ser definida para el bean referenciado por el elemento que contiene el aspecto consejo. Antes de una operacin de acceso de datos se ejecuta (un mtodo de ejecucin unirse punto coincide con la expresin pointcut), el "doAccessCheck" mtodo del bean aspecto ser invocada.
Despus de regresar asesoramiento

Tras escuchar la opinin de regresar cuando se ejecuta un mtodo de ejecucin coincide completa normalidad. Se declara dentro de un <aop:aspect> en la misma forma que antes de asesoramiento. Por ejemplo:
<aop:aspect id = "afterReturningExample" ref = "aBean"> <Aop: despus de regresar pointcut-ref = "dataAccessOperation" method = "doAccessCheck" /> ... </ Aop: Aspecto>

Al igual que en el estilo @ AspectJ, es posible hacerse con el valor de retorno dentro del cuerpo consejo. Utilice el atributo de volver a especificar el nombre del parmetro al que se debe el valor de retorno se pasa:
<aop:aspect id = "afterReturningExample" ref = "aBean"> <Aop: despus de regresar pointcut-ref = "dataAccessOperation" volviendo = "retVal" method = "doAccessCheck" /> ... </ Aop: Aspecto>

El mtodo doAccessCheck debe declarar un parmetro con nombre retVal . El tipo de este parmetro limita a juego de la misma manera como se describe para AfterReturning @. Por ejemplo, la firma del mtodo puede ser declarado como:
public void doAccessCheck (Object retVal) {...

Despus de lanzar asesoramiento

Despus de lanzar consejo se ejecuta cuando un emparejados salidas ejecucin de los mtodos por lanzar una excepcin. Se declara dentro de un <aop:aspect> usando el elemento despus del lanzamiento:
<aop:aspect id = "afterThrowingExample" ref = "aBean"> <Aop: despus de lanzamiento de pointcut-ref = "dataAccessOperation" method = "doRecoveryActions" /> ... </ Aop: Aspecto>

Al igual que en el estilo @ AspectJ, es posible apoderarse de la excepcin lanzada dentro del cuerpo consejo. Utilice el atributo tirar para especificar el nombre del parmetro al que se debe la excepcin se pasa:
<aop:aspect id = "afterThrowingExample" ref = "aBean"> <Aop: despus de lanzamiento de pointcut-ref = "dataAccessOperation" tirar = "dataAccessEx" method = "doRecoveryActions" /> ... </ Aop: Aspecto>

El mtodo doRecoveryActions debe declarar un parmetro con nombre dataAccessEx . El tipo de este parmetro limita a juego de la misma manera como se describe para @ AfterThrowing. Por ejemplo, la firma del mtodo puede ser declarado como:

doRecoveryActions public void (DataAccessException dataAccessEx) {...

Despus (por fin) el asesoramiento

Despus (por fin) el asesoramiento corre sin embargo al salir un mtodo combinado de ejecucin. Se declara con el after elemento:
<aop:aspect id = "afterFinallyExample" ref = "aBean"> <Aop: despus pointcut-ref = "dataAccessOperation" method = "doReleaseLock" /> ... </ Aop: Aspecto>

Alrededor de asesoramiento

El tipo de consejo final es de alrededor de consejo. Alrededor de asesoramiento corre "en torno a" la ejecucin de un mtodo coincidente. Tiene la oportunidad de hacer trabajar tanto antes como despus de que el mtodo se ejecuta, y para determinar cundo, cmo y si es par, el mtodo en realidad llega a ejecutar en absoluto. Alrededor de asesoramiento se usa a menudo si tiene que compartir el estado antes y despus de la ejecucin de un mtodo de una manera segura para subprocesos (iniciar y detener un temporizador, por ejemplo). Utilice siempre la forma menos potente de asesoramiento acorde con sus necesidades y no utilice alrededor consejo si es simple consejo antes de hacer. Alrededor de asesoramiento se declara con el aop:around del elemento. El primer parmetro del mtodo consejo debe ser de tipo ProceedingJoinPoint . Dentro del cuerpo de la asesora, llamando a proceed() en el ProceedingJoinPoint hace que el mtodo subyacente a ejecutar. El proceed mtodo tambin puede estar llamando de paso en un Object[] - los valores de la matriz se utilizan como argumentos para la ejecucin del mtodo cuando proceda. Vea la seccin titulada "Around consejos" para las notas en llamar a proceder con un Object[] .
<aop:aspect id = "aroundExample" ref = "aBean"> <Aop: en torno a pointcut-ref = "BusinessService" method = "doBasicProfiling" /> ... </ Aop: Aspecto>

La aplicacin de la doBasicProfiling consejo sera exactamente el mismo que en el ejemplo @ AspectJ (menos la anotacin de curso):
doBasicProfiling public Object (ProceedingJoinPoint PJP) throws Throwable { / / Activar el cronmetro Objeto retVal pjp.proceed = ();

/ / Detener el cronmetro volver retVal; }

Consejos parmetros

El estilo de declaracin de esquema basado apoya asesoramiento totalmente con tipo de la misma manera como se describe para el apoyo @ AspectJ - haciendo coincidir los parmetros de punto de corte por su nombre en contra de los parmetros del mtodo de asesoramiento. Vea la seccin titulada "Parmetros de consejos" para ms detalles. Si desea especificar explcitamente los nombres de argumento para los mtodos de asesoramiento (no depender de las estrategias de deteccin descritos anteriormente), entonces esto se hace utilizando el arg-names atributo del elemento de asesoramiento, que se trata de la misma manera a la "argNames" atributo en una anotacin asesoramiento como se describe en la seccin titulada "Determinacin de los nombres de los argumentos" . Por ejemplo:
<Aop: antes pointcut = "com.xyz.lib.Pointcuts.anyPublicMethod () y @ anotacin (auditable)" method = "auditora" arg-names = "auditable" />

El arg-names atributo acepta una lista delimitada por comas de nombres de parmetros. Encontrar ms adelante un ejemplo algo ms complicado del enfoque basado en XSD que ilustra algunos consejos alrededor utiliza en conjuncin con una serie de parmetros inflexible de tipos.
paquete xyservice; FooService interfaz pblica { Foo getFoo (String fooName, int edad); } DefaultFooService clase pblica implementa FooService { pblico Foo getFoo (String nombre, int edad) { return new Foo (nombre, edad); } }

El siguiente es el aspecto. Ntese el hecho de que el profile(..) mtodo acepta un nmero de parmetros de tipo fuerte, el primero de los cuales pasa a ser el punto de combinacin utilizada para proceder con la llamada al mtodo: la presencia de este parmetro es una indicacin de que el profile(..) es para ser utilizado como around asesoramiento:
paquete xy; org.aspectj.lang.ProceedingJoinPoint importacin; org.springframework.util.StopWatch importacin; pblico SimpleProfiler clase {

perfil public Object (llamada ProceedingJoinPoint, String nombre, int edad) throws Throwable { StopWatch StopWatch nuevo reloj = ( "Perfilando por '" + nombre + "' y '" + edad + "'"); try { clock.start (call.toShortString ()); volver call.proceed (); Finally {} clock.stop (); System.out.println (clock.prettyPrint ()); } } }

Por ltimo, aqu est la configuracin XML que se requiere para llevar a cabo la ejecucin de los consejos anteriores para un punto de unin particular:
<Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <- Este es el objeto que se aproxima por la infraestructura de Spring AOP -> <bean id = "fooService" class = "xyservice.DefaultFooService" /> <- Este es el consejo en s -> <bean id = "profiler" class = "xySimpleProfiler" /> <aop:config> <aop:aspect ref = "profiler"> <Aop: pointcut id = "theExecutionOfSomeFooServiceMethod" = expresin "ejecucin (* xyservice.FooService.getFoo (String, int)) y args (nombre, edad) "/> <Aop: alrededor pointcut-ref = "theExecutionOfSomeFooServiceMethod" method = "perfil" /> </ Aop: Aspecto> </ Aop: config> </ Beans>

Si tuviramos el guin siguiente controlador, obtendramos algo una salida como sta en la salida estndar:
org.springframework.beans.factory.BeanFactory importacin; org.springframework.context.support.ClassPathXmlApplicationContext importacin; importar xyservice.FooService;

Boot public final class { public static void main (String [] args definitivo) throws Exception { BeanFactory ctx = new ClassPathXmlApplicationContext ("x / y / plain.xml"); FooService foo = (FooService) ctx.getBean ("fooService"); foo.getFoo ("Pengo", 12); } } "Perfiles de 'StopWatch Pengo' y '12'': Se acaba el tiempo (millis) = 0 ----------------------------------------% ms Tarea nombre ----------------------------------------00000? ejecucin (getFoo)

Consejos de pedido

Cuando asesoramiento mltiple tiene que ejecutar en el mismo punto de unin (mtodo de ejecucin) las reglas de ordenacin son los descritos en la seccin titulada "Consejos ordenamiento" . La precedencia entre los aspectos se determina ya sea por la adicin de la Order anotacin para el bean de respaldo el aspecto o haciendo que el grano de aplicar el Ordered interfaz.
9.3.4 Introducciones

Presentaciones (conocidos como de tipo inter declaraciones en AspectJ) permiten un aspecto a declarar que los objetos aconsejables implementar una interfaz dada, y para proporcionar una implementacin de esta interfaz en nombre de esos objetos. Una introduccin se realiza mediante el aop:declare-parents dentro de un elemento aop:aspect Este elemento se utiliza para declarar que los tipos de juego tiene un nuevo padre (de ah el nombre). Por ejemplo, dada una interfaz UsageTracked , y una implementacin de esta interfaz DefaultUsageTracked , el aspecto siguiente se declara que todos los ejecutores de interfaces de servicios tambin implementan la UsageTracked interfaz. (Con el fin de exponer las estadsticas a travs de JMX por ejemplo.)
<aop:aspect id = "usageTrackerAspect" ref = "usageTracking"> <Aop: declaran-padres tipos de coincidencia = "com.xzy.myapp.service. * +" implemento-interface = "com.xyz.myapp.service.tracking.UsageTracked" default-impl = "com.xyz.myapp.service.tracking.DefaultUsageTracked" /> <Aop: antes pointcut = "com.xyz.myapp.SystemArchitecture.businessService () y esta (usageTracked) " method = "recordUsage" /> </ Aop: Aspecto>

La clase que respaldan la usageTracking frijol contendra el mtodo:

recordUsage public void (UsageTracked usageTracked) { usageTracked.incrementUseCount (); }

La interfaz que se implementa es determinada por implement-interface atributo. El valor del types-matching atributo es un patrn de tipo AspectJ: - cualquier bean de un tipo coincidente implementar la UsageTracked interfaz. Tenga en cuenta que en el consejo antes de el ejemplo anterior, las habas de servicio puede ser utilizado directamente como las implementaciones de la UsageTracked interfaz. Si desea acceder a un bean de programacin debera escribir lo siguiente:
UsageTracked usageTracked = (UsageTracked) context.getBean ("myService");

9.3.5 Aspecto modelos de instancias

El modelo de instancia slo se admite para el esquema definidos aspectos es el modelo singleton. Otros modelos de instancias se admita en futuras versiones.
9.3.6 Asesores

El concepto de "asesores" se adelanta con el apoyo AOP se define en la primavera de 1,2 y no tiene un equivalente directo en AspectJ. Un asesor es como un pequeo autnomo aspecto que tiene una sola pieza de consejo. El mismo consejo se representa con un frijol, y debe implementar una de las interfaces recomendaciones descritas en la Seccin 10.3.2, "Tipos de asesoramiento en primavera" . Los consejeros pueden aprovechar AspectJ expresiones pointcut embargo. Spring 2.0 apoya el concepto de asesor con el <aop:advisor> elemento. Lo ms comn ver que se utiliza junto con el asesoramiento transaccional, que tambin tiene su propio espacio de nombres apoyo en la primavera de 2,0. As es como se ve:
<aop:config> <Aop: pointcut id = "BusinessService" = expresin "ejecucin (* com.xyz.myapp.service. *. * (..))" /> <Aop: asesor pointcut-ref = "BusinessService" consejos-ref = "tx-consejos" /> </ Aop: config> <tx:advice id = "tx-advice"> <tx:attributes> nombre = <tx:method "*" propagacin = "REQUIRED" /> </ Tx: attributes> </ Tx: advice>

As como el pointcut-ref atributo utilizado en el ejemplo anterior, tambin puede utilizar el pointcut para definir un atributo inline expresin pointcut.

Para definir la prioridad de un asesor para que el consejo pueda participar en el pedido, utilice el order de definir el atributo Ordered valor del asesor.
9.3.7 Ejemplo

Vamos a ver cmo el fracaso de bloqueo simultneo de reintento ejemplo de la seccin 9.2.7, "Ejemplo" se ve cuando reescritas con el apoyo de esquema. La ejecucin de los servicios empresariales a veces puede fallar debido a problemas de concurrencia (por ejemplo, perdedor punto muerto). Si se reintenta la operacin, es muy probable que tenga xito la prxima vez. Para los servicios a las empresas en las que es apropiado para volver a intentar en estas condiciones (operaciones idempotentes que no es necesario ir de nuevo al usuario para la resolucin de conflictos), nos gustara volver a intentar la operacin de forma transparente para evitar que el cliente ver un PessimisticLockingFailureException . Este es un requisito que claramente corta a travs de mltiples servicios en la capa de servicio, y por lo tanto, es ideal para la aplicacin a travs de un aspecto. Porque queremos volver a intentar la operacin, tendremos que utilizar alrededor de consejo para que podamos proceder llamar varias veces. As es como la implementacin aspecto bsico es (es slo una clase de Java utilizando el soporte de esquema):
ConcurrentOperationExecutor clase pblica implementa Pedido { private static final int DEFAULT_MAX_RETRIES = 2; privadas MaxRetries int = DEFAULT_MAX_RETRIES; Para private int = 1; setMaxRetries public void (int MaxRetries) { esta MaxRetries = MaxRetries.; } getOrder public int () { devuelva este orden.; } setOrder public void (int fin) { . este orden = orden; } doConcurrentOperation public Object (ProceedingJoinPoint PJP) throws Throwable { numAttempts int = 0; PessimisticLockingFailureException lockFailureException; do { numAttempts + +; try { volver pjp.proceed (); } catch (PessimisticLockingFailureException ex) { lockFailureException = ex; } } while (<= numAttempts esta MaxRetries.); tirar lockFailureException;

} }

Tenga en cuenta que el aspecto implementa la Ordered interfaz para que podamos establecer la prioridad de los aspectos ms alta que el consejo transaccin (queremos una transaccin de nuevo cada vez que vuelva a intentar). Los maxRetries y order propiedades se pueden configurar tanto para la primavera. La principal accin que ocurre en el doConcurrentOperation alrededor mtodo consejo. Nosotros tratamos de seguir adelante, y si no con un PessimisticLockingFailureException simplemente tratamos de nuevo a menos que hayamos agotado todos nuestros reintentos. Esta clase es idntica a la utilizada en el ejemplo @ AspectJ, pero con las anotaciones eliminado. La configuracin de Spring correspondiente es:
<aop:config> <aop:aspect id = "concurrentOperationRetry" ref = "concurrentOperationExecutor"> <Aop: pointcut id = "idempotentOperation" = expresin "ejecucin (* com.xyz.myapp.service. *. * (..))" /> <Aop: en torno a pointcut-ref = "idempotentOperation" method = "doConcurrentOperation" /> </ Aop: Aspecto> </ Aop: config> <Bean id = "concurrentOperationExecutor" class = "com.xyz.myapp.service.impl.ConcurrentOperationExecutor"> <propiedad nombre = valor = "maxRetries" "3" /> <propiedad nombre = valor = "order" "100" /> </ Bean>

Tenga en cuenta que por el momento se supone que todos los servicios de negocio son idempotentes. Si este no es el caso, podemos refinar la forma para que slo reintentos de operaciones verdaderamente idempotentes, mediante la introduccin de un Idempotent anotacin:
@ Retention (RetentionPolicy.RUNTIME) public @ interface idempotente { / / Marcador anotacin }

y el uso de la anotacin para anotar la ejecucin de las operaciones de servicio. El cambio en el aspecto de reintento slo las operaciones idempotentes implica simplemente perfeccionar la expresin pointcut para que slo @Idempotent operaciones partido:

<Aop: pointcut id = "idempotentOperation" = expresin "ejecucin (* com.xyz.myapp.service. *. * (..)) y @ Anotacin (com.xyz.myapp.service.Idempotent) "/>

9.4 Elegir qu tipo de declaracin a utilizar AOP


Una vez que usted ha decidido que un aspecto es el mejor enfoque para la implementacin de un requisito dado, cmo decidir entre usar Spring AOP o AspectJ, y entre el lenguaje de Aspecto (cdigo) estilo, estilo anotacin @ AspectJ, o el estilo de la primavera XML? Estas decisiones estn influenciadas por una serie de factores, incluyendo los requisitos de aplicaciones, herramientas de desarrollo, y la familiaridad con el equipo de AOP.
9.4.1 Spring AOP o AspectJ completo?

Utilice la cosa ms simple que puede funcionar. Spring AOP es ms simple que el uso completo AspectJ ya que no hay necesidad de introducir el compilador AspectJ / tejedor en su desarrollo y construccin de procesos. Si slo necesita para asesorar a la ejecucin de las operaciones en el frijol de primavera, luego Spring AOP es la eleccin correcta. Si tiene que asesorar objetos no gestionados por el contenedor Spring (tales como objetos de dominio por lo general), entonces usted tendr que utilizar AspectJ. Usted tambin tendr que utilizar AspectJ si desea unirse a asesorar puntos distintos de ejecuciones de mtodos simples (por ejemplo, el campo obtener o establecer puntos de unin, y as sucesivamente). Cuando se utiliza AspectJ, usted tiene la opcin de la sintaxis del lenguaje AspectJ (tambin conocido como el "estilo cdigo") o el estilo @ AspectJ anotacin. Es evidente que si usted no est usando Java 5 + entonces la eleccin se ha hecho para ti ... utiliza el estilo de cdigo. Si los aspectos juegan un papel muy importante en su diseo, y que son capaces de utilizar el AspectJ Development Tools (AJDT) plugin para Eclipse, entonces la sintaxis del lenguaje AspectJ es la opcin preferida: es ms limpio y ms sencillo porque el lenguaje fue diseado a propsito para la escritura aspectos. Si usted no est usando Eclipse, o tienen slo unos pocos aspectos que no juegan un papel importante en su aplicacin, entonces es posible que desee considerar el uso del estilo @ AspectJ y la pervivencia de una recopilacin regular de Java en el IDE, y la adicin de un aspecto tejer fase de la secuencia de comandos de generacin.
9.4.2 @ AspectJ o XML para Spring AOP?

Si ha optado por utilizar Spring AOP, entonces usted tiene la opcin de @ AspectJ o estilo XML. Es evidente que si no se ejecuta en Java 5 +, luego el estilo de XML es la opcin adecuada; para Java 5 proyectos hay ventajas y desventajas diferentes a considerar. El estilo XML ser ms familiar para los usuarios de primavera existentes. Se puede utilizar con cualquier nivel de JDK (en referencia a puntos de corte con nombre de punto de corte dentro de las expresiones es an requieren Java 5 +, aunque) y est respaldado por POJOs genuinos. Cuando se utiliza AOP como una herramienta para configurar los servicios de la empresa a continuacin XML puede ser una buena opcin

(una buena prueba es si se tiene en cuenta la expresin pointcut a ser parte de su configuracin es posible que desee cambiar de forma independiente). Con el estilo XML podra decirse que es ms evidente a partir de la configuracin de qu aspectos estn presentes en el sistema. El estilo XML tiene dos desventajas. En primer lugar, no es totalmente encapsular la aplicacin del requisito que aborda en un solo lugar. El principio DRY dice que debe haber una nica representacin inequvoca y autorizada de cualquier pieza de conocimiento dentro de un sistema. Cuando se utiliza el estilo XML, el conocimiento de cmo se implementa el requisito se divide en la declaracin de la clase bean de respaldo, y el XML en el archivo de configuracin. Al utilizar el estilo @ AspectJ hay un solo mdulo - el aspecto - en el que se encapsula esta informacin. En segundo lugar, el estilo XML es ligeramente ms limitado en lo que puede expresar que el estilo @ AspectJ: slo el "singleton" modelo de instancias aspecto est soportado, y no es posible combinar puntos de corte mencionados declaradas en XML. Por ejemplo, en el estilo @ AspectJ puede escribir algo como:
@ Pointcut (ejecucin (* get * ())) PropertyAccess public void () {} @ Pointcut (ejecucin (org.xyz.Account + * (..)) operationReturningAnAccount public void () {} @ Pointcut (PropertyAccess () && operationReturningAnAccount ()) accountPropertyAccess public void () {}

En el estilo XML puedo declarar los dos primeros puntos de corte:


<Aop: pointcut id = "PropertyAccess" = expresin "ejecucin (* get * ())" /> <Aop: pointcut id = "operationReturningAnAccount" = expresin "ejecucin (org.xyz.Account + * (..))" />

La desventaja del enfoque de XML es que no se puede definir el ' accountPropertyAccess 'punto de corte mediante la combinacin de estas definiciones. El estilo @ AspectJ soporta otros modelos de instancias, y ms rica composicin pointcut. Tiene la ventaja de mantener el aspecto como una unidad modular. Tambin tiene la ventaja de los aspectos @ AspectJ puede entenderse (y por tanto consume) a la vez en la primavera de AOP y AspectJ - as que si ms adelante decide que necesita las capacidades de AspectJ para aplicar los requisitos adicionales, entonces es muy fcil de migrar a un AspectJ enfoque basado en. En definitiva, el equipo Primavera prefieren el estilo @ AspectJ cada vez que tienen aspectos que hacen ms que simple "configuracin" de los servicios de la empresa.

9.5 Mezcla de tipos de aspecto


Es perfectamente posible mezclar @ aspectos de estilo AspectJ utilizando el soporte autoproxying, el esquema definido por el <aop:aspect> aspectos, <aop:advisor> declarado consejeros y apoderados pares e interceptores define utilizando la Primavera

1,2 de estilo en la misma configuracin. Todos estos se implementan usando el mismo mecanismo de soporte subyacente y coexistirn sin ninguna dificultad.

9.6 Uso de proxy mecanismos


Spring AOP o bien utiliza JDK proxies dinmicos o CGLIB para crear el proxy para un objeto de destino determinado. (JDK proxies dinmicos son los preferidos cuando usted tiene una opcin). Si el objeto de destino para ser implementos proxy al menos una interfaz a continuacin, un proxy JDK dinmico se utilizar. Todas las interfaces implementadas por el tipo de destino ser proxy. Si el objeto de destino no implementa las interfaces entonces un proxy CGLIB se crear. Si desea forzar el uso de CGLIB proxy (por ejemplo, para proxy cada mtodo definido para el objeto de destino, no slo los ejecutados por sus interfaces) puede hacerlo. Sin embargo, hay algunas cuestiones a tener en cuenta:
final

mtodos no pueden ser advertidos, ya que no se puede anular. Desde la primavera 3.2, ya no es necesario aadir a su proyecto CGLIB ruta de clases, como las clases CGLIB son reenvasados con org.springframework y directamente en la primavera JAR-core. Esto significa que el soporte de proxy CGLIB basada en "slo funciona" de la misma manera que los proxies dinmicos JDK siempre. El constructor del objeto de proxy se llamar dos veces. Esto es una consecuencia natural del modelo de poder CGLIB por el que se genera una subclase para cada objeto proxy. Para cada instancia de servidor proxy, dos objetos son creados, el objeto real proxy y una instancia de la subclase que implemente el consejo. Este comportamiento no se expone al utilizar proxies JDK. Por lo general, una llamada al constructor de la clase proxy dos veces, no es un problema, ya que hay tareas por lo general slo tienen lugar y no verdadera lgica se implementa en el constructor.

Para forzar el uso de proxies CGLIB establecer el valor de la proxy-target-class atributo de la <aop:config> elemento en true:
<aop:config proxy-target-class "true" => <- Otros beans definidos aqu ... -> </ Aop: config>

Para forzar CGLIB proxy cuando se utiliza el @ AspectJ apoyo autoproxy, establezca el 'proxy-target-class' atributo del <aop:aspectj-autoproxy> elemento de true :
<aop:aspectj-autoproxy proxy-target-class = "true" />

Nota

Mltiples <aop:config/> secciones se colapsan en una sola unificada de proxy automtico creador en tiempo de ejecucin, que se aplica la configuracin de proxy ms fuertes que cualquiera de los <aop:config/> secciones (tpicamente de diferentes archivos XML de definicin de frijol) especificados. Esto tambin se

aplica a la <tx:annotation-driven/> y <aop:aspectj-autoproxy/> elementos. Para que quede claro: el uso de ' proxy-target-class="true" 'en <tx:annotation-driven/> , <aop:aspectj-autoproxy/> o <aop:config/> elementos har que el uso de proxies para CGLIB los tres de ellos.
9.6.1 Comprensin de AOP proxies

Spring AOP est basado en proxy. Es muy importante que usted comprender la semntica de lo que realmente significa la ltima declaracin antes de escribir sus propios aspectos o utilizar cualquiera de los Spring AOP basados en aspectos suministrados con la Spring Framework. Consideremos en primer lugar la situacin en la que usted tiene un llano-vainilla, sin proxy, nada-especial-sobre-it, referencia de objeto directo, como lo demuestra el siguiente fragmento de cdigo.
pblico SimplePojo clase implementa Pojo { pblico foo vaco () { / / Este mtodo de invocacin siguiente es un directo un llamado a la 'esto' de referencia este bar ().; } bar public void () { / / Algo de lgica ... } }

Si se invoca un mtodo en un objeto de referencia, el mtodo se invoca directamente sobre esa referencia de objeto, como puede verse a continuacin.

pblico principal de la clase { public static void main (String [] args) { Pojo pojo = new SimplePojo (); / / Esto es una llamada a un mtodo directo en la 'pojo' referencia pojo.foo (); }

Las cosas cambian un poco cuando la referencia que tiene el cdigo de cliente es un proxy. Considere el siguiente diagrama y fragmento de cdigo.

pblico principal de la clase { public static void main (String [] args) { ProxyFactory fbrica = new ProxyFactory (nuevo SimplePojo ()); factory.addInterface (Pojo. clase); factory.addAdvice (nuevo RetryAdvice ()); Pojo pojo = (Pojo) factory.getProxy (); / / Esto es una llamada a un mtodo en el proxy! pojo.foo (); } }

La clave para entender aqu es que el cdigo de cliente dentro de la main(..) de la Main clase tiene una referencia al proxy. Esto significa que el mtodo hace un llamamiento a que hacen referencia a objeto se pide al proxy, y como tal, el apoderado podr delegar en todos los interceptores (consejo) que son relevantes para la llamada al mtodo en particular. Sin embargo, una vez que la llamada ha alcanzado finalmente el objeto de destino, el SimplePojo referencia en este caso, cualquier mtodo llama que puede hacer sobre s mismo, como this.bar() o this.foo() , van a ser obstculo para la this referencia, y no el proxy. Esto tiene implicaciones importantes. Esto significa que la auto-invocacin no va a resultar en el asesoramiento relacionado con la invocacin de un mtodo de tener la oportunidad de ejecutar. Bueno, y qu va a hacer al respecto? El mejor enfoque (el mejor trmino se utiliza libremente aqu) es refactorizar su cdigo de manera que la propia invocacin no sucede. Por supuesto, esto no implicara algn trabajo de su parte, pero es lo mejor, menos invasivo. El siguiente enfoque es absolutamente terrible, y estoy casi reticente a sealar precisamente porque es tan horrible. Usted puede (choke!) totalmente atar la lgica dentro de su clase en Spring AOP haciendo lo siguiente:
pblico SimplePojo clase implementa Pojo { pblico foo vaco () { / / Esto funciona, pero ... gah!

((Pojo) AopContext.currentProxy ()) bar ().; } bar public void () { / / Algo de lgica ... } }

Esta totalmente su cdigo para parejas Spring AOP, y hace que la propia clase consciente del hecho de que est siendo utilizada en un contexto AOP, que va en contra de AOP. Tambin se requiere una configuracin adicional cuando el proxy se est creando:
pblico principal de la clase { public static void main (String [] args) { ProxyFactory fbrica = new ProxyFactory (nuevo SimplePojo ()); factory.adddInterface (Pojo. clase); factory.addAdvice (nuevo RetryAdvice ()); factory.setExposeProxy (true); Pojo pojo = (Pojo) factory.getProxy (); / / Esto es una llamada a un mtodo en el proxy! pojo.foo (); } }

Por ltimo, hay que sealar que AspectJ no tiene este problema auto-invocacin porque no es un marco basado en proxy AOP.

9,7 creacin programtica de los Proxies @ AspectJ


Adems de declarar los aspectos de la configuracin usando ya sea <aop:config> o <aop:aspectj-autoproxy> , tambin es posible mediante programacin para crear proxies que asesoran a los objetos de destino. Para los detalles completos de AOP Spring API, consulte el captulo siguiente. Aqu queremos centrarnos en la capacidad de crear automticamente utilizando proxies @ aspectos AspectJ. La clase org.springframework.aop.aspectj.annotation.AspectJProxyFactory se puede utilizar para crear un proxy para un objeto de destino que es asesorado por uno o ms aspectos @ AspectJ. El uso bsico para esta clase es muy simple, como se ilustra a continuacin. Ver las Javadocs para obtener informacin completa.
/ / Crear una fbrica que puede generar un proxy para el objeto de destino dado AspectJProxyFactory fbrica = new AspectJProxyFactory (targetObject); / / Aadir un aspecto, la clase debe ser un aspecto @ AspectJ / / Se puede llamar a esto tantas veces como usted necesita con diferentes aspectos factory.addAspect (SecurityManager. clase);

/ / Tambin puede aadir las instancias existentes de aspecto, el tipo de objeto especificado debe ser un aspecto @ AspectJ factory.addAspect (usageTracker); / / Ahora obtener el objeto proxy ... MyInterfaceType proxy = factory.getProxy ();

9.8 Uso de AspectJ con las aplicaciones de primavera


Todo lo que hemos cubierto hasta ahora en este captulo es puro Spring AOP. En esta seccin, vamos a ver cmo se puede utilizar el compilador AspectJ / tejedor en lugar de, o adems de, Spring AOP si sus necesidades van ms all de las facilidades que ofrece Spring AOP solo. Buques de primavera con una biblioteca pequea AspectJ aspecto, que es independiente disponible en su distribucin como spring-aspects.jar ;. tendrs que agregar esto a su ruta de clase con el fin de utilizar los aspectos en los que la Seccin 9.8.1, "Utilizacin de AspectJ a la dependencia inyectar objetos de dominio con la primavera " y la Seccin 9.8.2, "Otros aspectos de primavera para AspectJ" discutir el contenido de esta biblioteca y cmo se puede utilizar. Seccin 9.8.3, "Configuracin de los aspectos AspectJ utilizando Spring COI" se explica cmo dependencia inyectar aspectos AspectJ que se tejen usando el compilador AspectJ. Por ltimo, la Seccin 9.8.4, "en tiempo de carga de tejer con AspectJ en la infraestructura Spring" ofrece una introduccin a tiempo de carga para aplicaciones de tejer resorte con AspectJ.
9.8.1 Uso de AspectJ a la dependencia inyectar objetos de dominio con la primavera

El contenedor de Spring y configura una instancia beans definidos en su contexto de aplicacin. Tambin es posible hacer una fbrica de beans para configurar un objeto preexistente dado el nombre de una definicin de bean que contiene la configuracin que debe aplicarse. El spring-aspects.jar contiene un aspecto anotacin impulsada que explota esta capacidad para permitir la inyeccin de dependencia de cualquier objeto. El soporte est destinado a ser utilizado para objetos creados fuera del control de cualquier contenedor. Objetos de dominio a menudo caen en esta categora, ya que a menudo se crean mediante programacin con el new operador, o por una herramienta ORM como resultado de una consulta de base de datos. El @Configurable anotacin marca una clase como elegible para la Primaveraimpulsada configuracin. En el caso ms simple puede ser utilizado slo como una anotacin de marcador:
paquete com.xyz.myapp.domain; importar org.springframework.beans.factory.annotation.Configurable; @ Configurable Cuenta public class { / / ... }

Cuando se utiliza como una interfaz de marcador de este modo, la primavera va a configurar nuevas instancias del tipo anotado ( Account en este caso) utilizando una

definicin de bean con mbito de prototipo con el mismo nombre que el nombre de tipo completo ( com.xyz.myapp.domain.Account ). Dado que el nombre predeterminado para un bean es el nombre completo de su tipo, una forma conveniente de declarar la definicin prototipo es simplemente omitir la id atributo:
<bean class = "com.xyz.myapp.domain.Account" scope = "prototype"> <propiedad nombre = "fundsTransferService" ref = "fundsTransferService" /> </ Bean>

Si desea especificar explcitamente el nombre de la definicin de bean prototipo de usar, puede hacerlo directamente en la anotacin:
paquete com.xyz.myapp.domain; importar org.springframework.beans.factory.annotation.Configurable; @ Configurable ("cuenta") Cuenta public class { / / ... }

Primavera ahora se busca una definicin de bean llamado " account "y usar eso como la definicin de configurar nuevas Account de los casos. Tambin puede utilizar autoconexin para evitar tener que especificar una definicin de bean con mbito de prototipo en absoluto. Tener Spring aplicar autowiring utilizar el " autowire propiedad "de la @Configurable anotacin: especifique @Configurable(autowire=Autowire.BY_TYPE) o @Configurable(autowire=Autowire.BY_NAME . autoconexin para por tipo o por nombre, respectivamente, como una alternativa, en la primavera de 2,5, es preferible especificar explcitamente, anotacin impulsada por la inyeccin de dependencia para el @Configurable mediante el uso de granos de @Autowired o @Inject a nivel de campo o mtodo (ver Seccin 5.9, "Anotacin de configuracin basada en contenedor" para ms detalles) . Por ltimo, puede habilitar la comprobacin de dependencia primavera las referencias de objeto en el objeto recin creado y configurado utilizando el dependencyCheck atributo (por ejemplo: @Configurable(autowire=Autowire.BY_NAME,dependencyCheck=true) ). Si este atributo se establece en true, Spring validar despus de la configuracin que todas las propiedades (que no son primitivas o colecciones) se han establecido. Con la anotacin en su propia no hace nada por supuesto. Es la AnnotationBeanConfigurerAspect en spring-aspects.jar que acta sobre la presencia de la anotacin. En esencia, el aspecto dice "despus de regresar de la inicializacin de un nuevo objeto de tipo anotada con @Configurable , configure el objeto recin creado usando Spring, de acuerdo con las propiedades de la anotacin ". En este contexto, la inicializacin se refiere a los nuevos objetos instanciados (por ejemplo, los objetos instanciados con el " new "operador), as como a Serializable objetos que estn sometidos a deserializacin (por ejemplo, a travs de readResolve () ).

Nota

Una de las frases claves en el prrafo anterior es "en esencia". Para la mayora de los casos, la semntica exacta de "despus de regresar de la inicializacin de un objeto nuevo" va a estar bien ... en este contexto, "despus de la inicializacin" significa que las dependencias van a ser inyectadas despus de que el objeto ha sido construido - esto significa que las dependencias no estarn disponibles para su uso en los rganos constructor de la clase. Si desea que las dependencias que se inyecta antes de que los rganos de ejecucin del constructor, por lo que estar disponible para su uso en el cuerpo de los constructores, entonces usted necesita para definir esto en el @Configurable declaracin de este modo:
@ Configurable (preconstruccin = true)

Usted puede encontrar ms informacin acerca de la semntica del lenguaje de los tipos de punto de corte diferentes AspectJ en este apndice de la Gua de programacin de AspectJ . Para que esto funcione los tipos anotados deben ser tejido con el tejedor de AspectJ - se puede utilizar una Ant build-tiempo o tarea Maven para hacer esto (ver por ejemplo el Desarrollo: Gua para AspectJ ) o la carga de tiempo de tejer (ver seccin 9.8. 4, "en tiempo de carga de tejer con AspectJ en el Marco de la primavera" ). El AnnotationBeanConfigurerAspect en s necesita configurar por el resorte (con el fin de obtener una referencia a la fbrica de beans que se va a utilizar para configurar los objetos nuevos). Si est utilizando la configuracin basada en Java, slo tiene que aadir @EnableSpringConfigured a cualquier @Configuration clase.
@ Configuracin @ EnableSpringConfigured AppConfig clase pblica { }

Si prefiere configuracin basada en XML, la primavera context espacio de nombres define un cmodo context:spring-configured elemento:
<context:spring-configured/>

Si est utilizando la DTD en lugar de esquema, la definicin equivalente es:


<Frijol class = "org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAsp ect" fbrica method = "aspectOf" />

Las instancias de @Configurable objetos creados antes de que el aspecto se ha configurado resultar en un aviso se emite para el registro y ninguna configuracin del objeto teniendo lugar. Un ejemplo podra ser un grano en la configuracin de Spring que crea objetos de dominio cuando se inicia la primavera. En este caso se puede utilizar el "depends-on" atributo de frijol para especificar manualmente que el grano depende de la configuracin de aspecto.

<Bean id = "myService" class = "com.xzy.myapp.service.MyService" depends-on = "org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAsp ect"> <-! ... </ Bean> ->

Nota

No active @Configurable procesamiento a travs del aspecto configurer frijol a menos que realmente significa confiar en su semntica en tiempo de ejecucin. En particular, asegrese de que usted no usa @Configurable en las clases de frijol que estn registrados como granos de primavera regulares con el contenedor: Se termina la inicializacin del doble de lo contrario, una vez que a travs del envase y una vez a travs del aspecto.
Las pruebas unitarias @Configurable objetos

Uno de los objetivos de la @Configurable apoyo es permitir a la unidad de pruebas independiente de los objetos de dominio sin las dificultades asociadas con codificadas de bsquedas. Si @Configurable tipos no se han tejido por AspectJ entonces la anotacin no tiene ningn efecto durante las pruebas unitarias, y slo tiene que establecer referencias de propiedad falsos o ramal en el objeto bajo prueba y proceder como de costumbre. Si @Configurable tipos han sido tejidas por AspectJ entonces usted puede todava prueba de la unidad exterior del contenedor de forma normal, pero usted ver un mensaje de advertencia cada vez que se construye un @Configurable objeto que indica que no se ha configurado para la primavera.
Trabajar con mltiples contextos de aplicacin

El AnnotationBeanConfigurerAspect usado para implementar el @Configurable soporte es un aspecto AspectJ singleton. El mbito de aplicacin de un aspecto singleton es el mismo que el mbito de static miembros, es decir, hay una instancia de aspecto por cargador de clases que define el tipo. Esto significa que si usted define mltiples contextos de aplicacin dentro de la jerarqua del cargador de clases misma debe tener en cuenta que para definir el @EnableSpringConfigured frijol y dnde colocar spring-aspects.jar en la ruta de clase. Considere la posibilidad de una primavera tpica aplicacin Web de configuracin con un contexto padre aplicacin compartida definir los servicios empresariales comunes y todo lo necesario para apoyarlos, y un contexto de aplicacin nio por las definiciones que contienen servlets particulares de ese servlet. Todos estos contextos coexistirn dentro de la jerarqua del cargador de clases misma, y as la AnnotationBeanConfigurerAspect slo puede contener una referencia a uno de ellos. En este caso se recomienda definir el @EnableSpringConfigured frijol en el contexto de la aplicacin compartida (padre): define los servicios que usted probablemente desea inyectar en objetos de dominio. Una consecuencia es que no se puede configurar objetos de dominio con referencias a beans definidos en el nio (servlet-contextos especficos)

utilizando el mecanismo configurable @ (probablemente no es algo que usted quiere hacer de todos modos!). Al implementar mltiples aplicaciones web dentro del mismo contenedor, asegurarse de que cada aplicacin en red, carga los tipos de spring-aspects.jar utilizando su propio cargador de clases (por ejemplo, mediante la colocacin de springaspects.jar en 'WEB-INF/lib' ) . Si spring-aspects.jar slo se agrega al classpath recipiente amplio (y por tanto cargado por el cargador de clases padre compartida), todas las aplicaciones web compartirn el ejemplo mismo aspecto que probablemente no es lo que quieres.
9.8.2 Otros aspectos de primavera AspectJ

Adems de la @Configurable aspecto, spring-aspects.jar contiene un aspecto AspectJ que se puede utilizar para conducir la gestin del resorte de transaccin para los tipos y los mtodos anotados con la @Transactional anotacin. Esto est pensado principalmente para los usuarios que quieran utilizar el soporte de transacciones de Spring Framework exterior del contenedor Spring. El aspecto que interpreta @Transactional anotaciones es el AnnotationTransactionAspect . Cuando se utiliza este aspecto, se debe anotar la clase de implementacin (y / o mtodos dentro de esa clase), no la interfaz (si los hay) que la clase implementa. AspectJ sigue la regla de que las anotaciones de Java en las interfaces no se heredan. A @Transactional anotacin en una clase especifica la semntica de transaccin por defecto para la ejecucin de cualquier operacin pblica en la clase. A @Transactional anotacin en un mtodo dentro de la clase anula la semntica de transaccin por defecto dados por la anotacin de clase (si existe). Los mtodos con public , protected la visibilidad, y por defecto todos sean anotados. Anotar protected y mtodos predeterminadas de visibilidad directa es la nica manera de conseguir la demarcacin de transaccin para la ejecucin de tales mtodos. Para los programadores AspectJ que desean utilizar la configuracin de Spring y soporte de gestin de transacciones pero no quieren (o no pueden) anotaciones de uso, spring-aspects.jar tambin contiene abstract aspectos que se pueden extender a proporcionar sus propias definiciones de punto de corte. Ver las fuentes de los AbstractBeanConfigurerAspect y AbstractTransactionAspect aspectos para ms informacin. Como ejemplo, el siguiente fragmento muestra cmo se podra escribir un aspecto a configurar todas las instancias de los objetos definidos en el modelo de dominio utilizando definiciones prototipo de frijol que responden a los nombres de clase completamente cualificado:
DomainObjectConfiguration aspecto pblico se extiende AbstractBeanConfigurerAspect { DomainObjectConfiguration pblico () { setBeanWiringInfoResolver (ClassNameBeanWiringInfoResolver nuevo ()); }

/ / Crear un nuevo bean (cualquier objeto en el modelo de dominio) pointcut protegido beanCreation (Object beanInstance): inicializacin (nueva (..)) && SystemArchitecture.inDomainModel () && este (beanInstance); }

9.8.3 Configuracin de los aspectos AspectJ utilizando Spring COI

Cuando se utiliza aspectos AspectJ con aplicaciones de primavera, es natural que tanto desea y espera ser capaz de configurar estos aspectos con Spring. El tiempo de ejecucin AspectJ s es responsable de la creacin de aspecto, y los medios para configurar los aspectos AspectJ creados a travs del resorte depende del modelo de instancia AspectJ (el " per-xxx clusula ') utilizado por el aspecto. La mayora de los aspectos AspectJ son aspectos nicos. La configuracin de estos aspectos es muy fcil: basta con crear una definicin de bean referencia al tipo de aspecto normal, e incluyen el atributo bean 'factory-method="aspectOf"' . Esto asegura que Spring obtiene la instancia de aspecto pidiendo AspectJ para que en lugar de tratar de crear una propia instancia. Por ejemplo:
<Bean id = "profiler" class = "com.xyz.profiler.Profiler" fbrica method = "aspectOf"> <propiedad nombre = "profilingStrategy" ref = "jamonProfilingStrategy" /> </ Bean>

No nicos aspectos son ms difciles de configurar: sin embargo, es posible hacerlo mediante la creacin de prototipos de las definiciones de frijol y el uso de la @Configurable apoyo de spring-aspects.jar para configurar las instancias de aspecto una vez que tienen haba creado por el tiempo de ejecucin AspectJ. Si usted tiene algunos aspectos @ AspectJ que desea tejer con AspectJ (por ejemplo, el uso en tiempo de carga de tejer para los tipos de modelo de dominio) y otros aspectos @ AspectJ que desea utilizar con Spring AOP, y estos aspectos se configuran todos usando Spring , entonces usted tendr que decirle a la primavera AOP @ AspectJ autoproxying apoyo que debe subconjunto exacto de los aspectos @ AspectJ definidos en la configuracin utilizada para autoproxying. Usted puede hacer esto mediante el uso de uno o ms <include/> elementos dentro de la <aop:aspectj-autoproxy/> declaracin. Cada <include/> elemento especifica un patrn de nombre, y frijoles slo con nombres coincidentes por lo menos uno de los patrones se utilizan para Spring AOP autoproxy configuracin:
<aop:aspectj-autoproxy> nombre = <aop:include "thisBean" /> nombre = <aop:include "thatBean" /> </ Aop: AspectJ-autoproxy>

Nota

No se deje engaar por el nombre de la <aop:aspectj-autoproxy/> elemento: el uso que se traducir en la creacin de proxies Spring AOP. El estilo de la

declaracin @ AspectJ aspecto est siendo utilizado aqu, pero el tiempo de ejecucin de AspectJ no est involucrado.
9.8.4 Carga en tiempo tejiendo con AspectJ en el Spring Framework

Tiempo de carga de tejer (LTW) se refiere al proceso de tejer aspectos AspectJ en archivos de clase de una aplicacin a medida que se carga en la mquina virtual Java (JVM). El objetivo de esta seccin es sobre la configuracin y el uso de LTW en el contexto especfico de la Spring Framework: esta seccin no es una introduccin a LTW embargo. Para ms detalles sobre las caractersticas especficas de LTW y LTW configuracin con slo AspectJ (con resorte no participar en absoluto), consulte la seccin LTW de la Gua Ambiental para el Desarrollo AspectJ . El valor aadido que aporta el Spring Framework para AspectJ LTW es mucho ms fino para permitir un control detallado sobre el proceso de tejido. 'Vanilla' AspectJ LTW se efecta utilizando un Java (5 +) agente, que se activa mediante la especificacin de un argumento VM cuando se cree una JVM. Es por lo tanto un ajuste de JVM-ancho, lo que puede resultar til en algunas situaciones, pero a menudo es un poco demasiado grueso. Primavera-enabled LTW le permite encender LTW en funcin de cada ClassLoader base, lo que obviamente es ms fino y que puede tener ms sentido en un entorno de 'single-JVM-multiple-aplicacin' (tal como se encuentra en un tpico entorno de servidor de aplicaciones). Adems, en ciertos ambientes , este soporte permite en tiempo de carga tejido sin realizar ninguna modificacin al guin de inicio del servidor de aplicaciones que sern necesarios para agregar -javaagent:path/to/aspectjweaver.jar o (como se describe ms adelante en esta seccin) javaagent:path/to/org.springframework.instrument-{version}.jar (anteriormente denominado spring-agent.jar ). Los desarrolladores simplemente

modificar uno o ms archivos que forman el contexto de la aplicacin para habilitar la carga en tiempo tejer en lugar de depender de los administradores que tpicamente estn a cargo de la configuracin de implementacin, tales como la secuencia de comandos de lanzamiento. Ahora que el argumento de venta es superior, primero vamos a caminar a travs de un ejemplo rpido de AspectJ LTW usando la primavera, seguida de detalles especficos acerca de los elementos introducidos en el siguiente ejemplo. Para obtener un ejemplo completo, consulte el Petclinic muestra la aplicacin.
Un ejemplo primero

Supongamos que usted es un desarrollador de la aplicacin que se ha encargado de diagnosticar la causa de algunos problemas de rendimiento en un sistema. En lugar de romper con una herramienta de perfiles, lo que vamos a hacer es cambiar un aspecto de perfiles simple que nos permitir obtener muy rpidamente algunas medidas de rendimiento, por lo que podemos entonces aplicar un grano fino herramienta de perfiles para esa rea especfica inmediatamente despus.
Nota

El ejemplo que aqu se presenta utiliza la configuracin de estilo XML, tambin es posible configurar y usar @ AspectJ con configuracin de Java . Especficamente el @EnableLoadTimeWeaving anotacin se puede utilizar como una alternativa a <context:load-time-weaver/> (vase a continuacin para ms detalles). Este es el aspecto de perfiles. Nada demasiado lujoso, slo una rpida y sucia basada en el tiempo de perfiles, utilizando la @ AspectJ declaracin de estilo de aspecto.
paquete foo; org.aspectj.lang.ProceedingJoinPoint importacin; importar org.aspectj.lang.annotation.Aspect; importar org.aspectj.lang.annotation.Around; importar org.aspectj.lang.annotation.Pointcut; org.springframework.util.StopWatch importacin; org.springframework.core.annotation.Order importacin; Aspecto @ pblico ProfilingAspect clase { @ Around ("methodsToBeProfiled ()") perfil public Object (ProceedingJoinPoint PJP) throws Throwable { StopWatch StopWatch sw = new (. GetClass () getSimpleName ()); try { sw.start (. pjp.getSignature () getName ()); volver pjp.proceed (); Finally {} sw.stop (); System.out.println (sw.prettyPrint ()); } } @ Pointcut ("ejecucin (pblico .. * foo *. * (..))") methodsToBeProfiled public void () {} }

Tambin tendr que crear una " META-INF/aop.xml archivo ', para informar a la tejedora AspectJ que queremos tejer nuestro ProfilingAspect en nuestras clases. Esta convencin archivo, es decir, la presencia de un archivo (o archivos) en la ruta de clase Java llamada " META-INF/aop.xml 'es estndar AspectJ.
<! DOCTYPE AspectJ PBLICA "- / / AspectJ / / DTD / / EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> <aspectj> <weaver> <- Slo en nuestras clases de tejidos especficos de la aplicacin de paquetes -> <include dentro = "foo.*" /> </ Tejedor> <aspects> <- Tejer en slo este aspecto ->

nombre = <aspecto "foo.ProfilingAspect" /> </ Aspectos> </ AspectJ>

Ahora, para la parte de resorte especfica de la configuracin. Tenemos que configurar un LoadTimeWeaver (todo se explica ms adelante, tmalo en la confianza por ahora). El tejedor en tiempo de carga es el componente esencial para el tejido responsable de la configuracin de aspecto en una o ms " META-INF/aop.xml 'archivos en las clases de la aplicacin. Lo bueno es que no requiere una gran cantidad de configuracin, como puede verse a continuacin (hay algunas opciones ms que se pueden especificar, pero estos se detallan ms adelante).
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: context = "http://www.springframework.org/schema/context" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <- Un objeto de servicio, vamos a perfilar sus mtodos -> <Bean id = "entitlementCalculationService" class = "foo.StubEntitlementCalculationService" /> <- Esto activa el tiempo de carga tejido -> <context:load-time-weaver/> </ Beans>

Ahora que todos los artefactos necesarios estn en su lugar - el aspecto, el " METAINF/aop.xml archivo ', y la configuracin de primavera -, vamos a crear una clase sencilla con un conductor main(..) mtodo para demostrar la LTW en accin.
paquete foo; org.springframework.context.support.ClassPathXmlApplicationContext importacin; public final class principal { public static void main (String [] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext ("beans.xml", Main clase.); EntitlementCalculationService entitlementCalculationService = (EntitlementCalculationService) ctx.getBean ("entitlementCalculationService"); / / El aspecto de perfiles es "tejido" en torno a este mtodo de ejecucin entitlementCalculationService.calculateEntitlement ();

} }

Hay una ltima cosa que hacer. La introduccin de esta seccin me dijo que se poda encender LTW selectivamente en funcin de cada ClassLoader base con la primavera, y esto es cierto. Sin embargo, slo para este ejemplo, vamos a utilizar un agente de Java (suministrado con resorte) para encender el LTW. Esta es la lnea de comandos que se utiliza para ejecutar lo anterior Main clase:
java-javaagent: C :/ proyectos / foo / lib / global / muelles instrument.jar foo.Main

El ' -javaagent 'es una bandera Java 5 + para especificar y habilitar a los agentes que ejecutan los programas de instrumento en la JVM . Las naves marco de primavera con dicho agente, la InstrumentationSavingAgent , que se envasa en la springinstrument.jar que se proporciona como el valor de la -javaagent argumento en el ejemplo anterior. El resultado de la ejecucin del Main programa se ver algo como eso a continuacin. (He introducido un Thread.sleep(..) en la declaracin calculateEntitlement() de modo que la aplicacin de perfiles realmente capta algo distinto de 0 milisegundos - las 01234 milisegundos no es una sobrecarga introducida por la AOP :))
Clculo de derecho StopWatch 'ProfilingAspect': Se acaba el tiempo (millis) = 1234 --------------------------------------% ms Tarea nombre --------------------------------------01234 calculateEntitlement 100%

Desde este LTW se efecta usando AspectJ en toda regla, no se limita slo a aconsejar granos de primavera, la siguiente variacin leve en el Main programa dar el mismo resultado.
paquete foo; org.springframework.context.support.ClassPathXmlApplicationContext importacin; public final class principal { public static void main (String [] args) { nuevo ClassPathXmlApplicationContext ("beans.xml", la clase principal.); EntitlementCalculationService entitlementCalculationService = StubEntitlementCalculationService nuevo (); / / El aspecto de perfiles se "tejen" en torno a este mtodo de ejecucin entitlementCalculationService.calculateEntitlement (); } }

Note como en el anterior programa, simplemente estamos bootstrapping el contenedor Spring, y luego crear una nueva instancia de la StubEntitlementCalculationService totalmente fuera del contexto de la Primavera ... el consejo de perfiles todava se tejen pulg El ejemplo es ciertamente simplista ... sin embargo los fundamentos del apoyo LTW en la primavera han sido introducidas en el ejemplo anterior, y el resto de esta seccin se explicar el por qu detrs de cada bit de configuracin y uso en detalle.
Nota

El ProfilingAspect utilizado en este ejemplo pueden ser bsicos, pero es bastante til. Es un buen ejemplo de un aspecto de desarrollo en tiempo que los desarrolladores pueden utilizar durante el desarrollo (por supuesto), y luego con bastante facilidad excluir de las versiones de la aplicacin que se implementa en UAT o de produccin.
Aspectos

Los aspectos que se utilizan en LTW tiene que ser aspectos AspectJ. Pueden ser escritos en el lenguaje AspectJ s mismo o usted puede escribir sus aspectos en el @ AspectJstyle. Esta ltima opcin es, por supuesto, slo una opcin si usted est usando Java 5 +, pero s significa que sus aspectos son vlidos entonces ambos aspectos AspectJ y Spring AOP. Por otra parte, las clases compiladas aspecto deben estar disponibles en la ruta de clase.
' META-INF/aop.xml '

La infraestructura AspectJ LTW se configura mediante una o ms " META-INF/aop.xml "archivos, que estn en la ruta de clases Java (ya sea directamente, o ms tpicamente en archivos jar). La estructura y el contenido de este archivo se detalla en la documentacin de referencia principal AspectJ, y el lector interesado se refiere a ese recurso . (Soy consciente de que esta seccin es breve, pero el ' aop.xml 'archivo es 100% AspectJ - no hay informacin especfica de primavera o la semntica que le sean aplicables, por lo que no hay ningn valor adicional que puede contribuir, ya sea como resultado), as que en lugar de la seccin de repeticin muy satisfactorio que los desarrolladores de AspectJ escribi, solo estoy dirigiendo all.)
Bibliotecas necesarias (JARS)

Como mnimo, necesitar las siguientes bibliotecas a utilizar el apoyo de la Spring Framework para AspectJ LTW: 1. spring-aop.jar (versin 2.5 o posterior, adems de todas las dependencias obligatorias) 2. aspectjweaver.jar (versin 1.6.8 o posterior)

Si est utilizando el agente Primavera-proporciona para permitir la instrumentacin , tambin necesitar: 1. spring-instrument.jar
Primavera configuracin

El componente clave en apoyo Spring LTW es la LoadTimeWeaver interfaz (en el org.springframework.instrument.classloading paquete), y las numerosas implementaciones de lo que se distribuyen con la distribucin de primavera. Un LoadTimeWeaver es responsable de la adicin de uno o ms java.lang.instrument.ClassFileTransformers a un ClassLoader en tiempo de ejecucin, lo que abre la puerta a todo tipo de aplicaciones interesantes, uno de los cuales pasa a ser el LTW de aspectos.
Punta

Si no est familiarizado con la idea de la transformacin de tiempo de ejecucin del archivo de clase, se le anima a leer la documentacin de la API Javadoc para la java.lang.instrument paquete antes de continuar. Esto no es una tarea enorme, porque no es - y no molesto - Documentacin muy poco all ... los principales interfaces y clases al menos se puso en frente de usted para la referencia a medida que lea esta seccin. Configuracin de un LoadTimeWeaver para un determinado ApplicationContext puede ser tan fcil como aadir una lnea. (Por favor, tenga en cuenta que es casi seguro que tendr que utilizar un ApplicationContext como su contenedor Spring tpicamente un BeanFactory no ser suficiente porque el apoyo LTW hace uso de BeanFactoryPostProcessors .) Para habilitar la compatibilidad con el Marco de Spring LTW, es necesario configurar un LoadTimeWeaver , que normalmente se realiza utilizando la @EnableLoadTimeWeaving anotacin.
@ Configuracin @ EnableLoadTimeWeaving AppConfig clase pblica { }

Alternativamente, si prefiere configuracin basado en XML, utilice el <context:loadtime-weaver/> elemento. Tenga en cuenta que el elemento se define en el " context espacio de nombres '.
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: context = "http://www.springframework.org/schema/context" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <context:load-time-weaver/> </ Beans>

La configuracin anterior definir y registrar un nmero de granos de infraestructura LTW-especficas de forma automtica, como un LoadTimeWeaver y un AspectJWeavingEnabler . El valor predeterminado LoadTimeWeaver es la DefaultContextLoadTimeWeaver clase, que trata de decorar un detecta automticamente LoadTimeWeaver : el tipo exacto de LoadTimeWeaver que ser "automticamente detectado 'depende de su entorno de ejecucin (que se resumen en la siguiente tabla). Tabla 9.1. DefaultContextLoadTimeWeaver LoadTimeWeavers
Runtime Environment
LoadTimeWeaver aplicacin WebLogicLoadTimeWeaver WebSphereLoadTimeWeaver OC4JLoadTimeWeaver GlassFishLoadTimeWeaver JBossLoadTimeWeaver

Correr en Weblogic de BEA 10 Correr en IBM WebSphere Application Server 7 Correr en OC4J Oracle Correr en GlassFish Correr en JBoss AS JVM comenz con la primavera
InstrumentationSavingAgent (java -javaagent:path/to/springinstrument.jar)

InstrumentationLoadTimeWeaver

Fallback, esperando que el cargador de clases subyacente a seguir las convenciones comunes (por ReflectiveLoadTimeWeaver ejemplo, aplicable a TomcatInstrumentableClassLoader y resina )

Tenga en cuenta que estos son slo los LoadTimeWeavers que sean detectado automticamente cuando se utiliza el DefaultContextLoadTimeWeaver : es por supuesto posible especificar exactamente qu LoadTimeWeaver aplicacin que desea utilizar. Para especificar un determinado LoadTimeWeaver con Java implementar la configuracin LoadTimeWeavingConfigurer interfaz y anular la getLoadTimeWeaver() mtodo:
@ Configuracin @ EnableLoadTimeWeaving AppConfig clase pblica implementa LoadTimeWeavingConfigurer { @ Override pblico LoadTimeWeaver getLoadTimeWeaver () { volver ReflectiveLoadTimeWeaver nuevo (); }

Si est utilizando la configuracin basada en XML, puede especificar el nombre de clase completamente calificado como el valor de la ' weaver-class atributo 'en la <context:load-time-weaver/> elemento:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: context = "http://www.springframework.org/schema/context" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> Contexto <: en tiempo de carga-tejedor tejedor-class = "org.springframework.instrument.classloading.ReflectiveLoadTimeWeaver" /> </ Beans>

El LoadTimeWeaver que est definida y registrada por la configuracin puede ser posteriormente recuperado del contenedor del resorte con el nombre bien conocido " loadTimeWeaver '. Recuerde que el LoadTimeWeaver existe slo como un mecanismo para la infraestructura LTW Spring para aadir una o ms ClassFileTransformers . El actual ClassFileTransformer que hace el LTW es el ClassPreProcessorAgentAdapter (del org.aspectj.weaver.loadtime paquete) de clase. Ver el Javadoc de nivel de clase para la ClassPreProcessorAgentAdapter clase para ms detalles, porque los detalles de cmo el tejido se efecta en realidad est ms all del alcance de esta seccin. Hay un atributo final de la configuracin que discutir: el " aspectjWeaving 'atributo (o " aspectj-weaving "si usted est usando XML). Este es un atributo simple que controla si LTW est habilitado o no, es tan simple como eso. Se acepta uno de tres valores posibles, que se resumen a continuacin, con el valor por defecto si el atributo no est presente ser " autodetect " Tabla 9.2. AspectJ tejer valores de atributos
Valor de anotacin
ENABLED

XML Valor

Explicacin

AspectJ tejido est encendido, y aspectos se tejen en tiempo de carga, segn corresponda. LTW est apagado ... ningn aspecto se tejen en tiempo de DISABLED off carga. Si la infraestructura LTW primavera puede encontrar por lo AUTODETECT autodetect menos un ' META-INF/aop.xml 'archivo y AspectJ tejido est activado, de lo contrario est apagado. Este es el valor
on

Valor de anotacin

XML Valor

Explicacin

predeterminado.
Medio Ambiente configuracin especfica

Esta ltima seccin contiene ningn ajuste adicional y la configuracin que se necesita cuando se utiliza el apoyo LTW Primavera en entornos como servidores de aplicaciones y contenedores web.
Gato

Apache Tomcat default 's cargador de clases no es compatible con transformacin clase por lo que Spring ofrece una implementacin mejorada que aborda esta necesidad. Nombrado TomcatInstrumentableClassLoader , el cargador funciona en Tomcat 5.0 y superiores y pueden ser registrados individualmente para cada aplicacin web de la siguiente manera:

Tomcat 6.0.x o superior 1. Copia org.springframework.instrument.tomcat.jar en $ CATALINA_HOME / lib, donde $ CATALINA_HOME representa la raz de la instalacin de Tomcat) 2. Instruya a Tomcat para utilizar el cargador de clases personalizado (en lugar del predeterminado) editando el archivo de contexto de aplicaciones web:
3. <context Path = "/myWebApp" docBase "/my/webApp/location" => 4. <Cargadora 5. loaderClass = "org.springframework.instrument.classloading.tomcat.Tomcat InstrumentableClassLoader" /> </ Context>

Apache Tomcat 6.0.x (similar a 5.0.x/5.5.x) Series soporta varios lugares de contexto:
o o

servidor de archivos de configuracin - $ CATALINA_HOME / conf / server.xml configuracin por defecto de contexto - $ CATALINA_HOME / conf / context.xml - que afecta a todas las aplicaciones Web desplegadas por aplicacin web de configuracin que se pueden implementar tanto en el lado del servidor en $ CATALINA_HOME / conf / [enginename] / [nombre de host] / [aplicacin web]-context.xml o incrustado dentro del archivo web-app en META-INF/context . xml

Por eficiencia, el integrado por-web-app estilo de configuracin es recomendable ya que afectar slo las aplicaciones que utilizan el

cargador de clases personalizado y no requiere ningn cambio en la configuracin del servidor. Ver el Tomcat 6.0.x documentacin para obtener ms detalles acerca de la ubicacin de contexto disponibles.

Tomcat 5.0.x/5.5.x 1. Copia org.springframework.instrument.tomcat.jar en $ CATALINA_HOME / server / lib, donde $ CATALINA_HOME representa la raz de la instalacin de Tomcat. 2. Instruya a Tomcat para utilizar el cargador de clases personalizado en lugar de la predeterminada editando el archivo de contexto de aplicaciones web:
3. <context Path = "/myWebApp" docBase "/my/webApp/location" => 4. <Cargadora 5. loaderClass = "org.springframework.instrument.classloading.tomcat.Tomcat InstrumentableClassLoader" /> </ Context>

5.0.x Tomcat y la serie 5.5.x soporta varios lugares de contexto:


o o

servidor de archivos de configuracin - $ CATALINA_HOME / conf / server.xml configuracin por defecto de contexto - $ CATALINA_HOME / conf / context.xml - que afecta a todas las aplicaciones Web desplegadas por aplicacin web de configuracin que se pueden implementar tanto en el lado del servidor en $ CATALINA_HOME / conf / [enginename] / [nombre de host] / [aplicacin web]-context.xml o incrustado dentro del archivo web-app en META-INF/context . xml

Por eficiencia, el incrustado web-app estilo de configuracin se recomienda recomendable ya que afectar slo las aplicaciones que utilizan el cargador de clases. Ver el Tomcat 5.x documentacin para obtener ms detalles acerca de la ubicacin de contexto disponibles. Tomcat versiones anteriores a 5.5.20 contena un error en el anlisis sintctico XML de configuracin que impide el uso del Loader etiqueta en el interior de configuracin server.xml, independientemente de si un cargador de clases se especifica o si es el oficial o uno personalizado. Ver bugzilla de Tomcat para obtener ms detalles . En Tomcat 5.5.x versiones 5.5.20 o posterior, debe establecer useSystemClassLoaderAsParent a false para solucionar este problema:
<context Path = "/myWebApp" docBase "/my/webApp/location" => <Cargadora loaderClass = "org.springframework.instrument.classloading.tomcat.Tomcat InstrumentableClassLoader" useSystemClassLoaderAsParent = "false" />

</ Context>

Este ajuste no es necesario en Tomcat 6 o superior. Como alternativa, considere el uso de la coleccin Primavera-VM proporcionado agente genrico, que se especifica en el guin de inicio de Tomcat (vase ms arriba). Esto har que los instrumentos a disposicin de todas las aplicaciones web desplegadas, no importa lo que suceda ClassLoader que se ejecuta.
WebLogic, WebSphere, OC4J, Resina, GlassFish, JBoss

Las versiones recientes de BEA WebLogic (versin 10 y superiores), IBM WebSphere Application Server (versin 7 o superior), Oracle Containers for Java EE (OC4J 10.1.3.1 y superior), Resina (3,1 o ms) y JBoss (5.xo arriba) proporcionar un cargador de clases que es capaz de instrumentacin local. LTW nativo de Spring aprovecha estos cargadores de clases para que AspectJ tejer. Puede activar LTW, simplemente activando en tiempo de carga tejer como se describe anteriormente. En concreto, no es necesario modificar el script de inicio para aadir -javaagent:path/to/springinstrument.jar . Tenga en cuenta que GlassFish instrumentacin capaz ClassLoader slo est disponible en su entorno EAR. Para GlassFish aplicaciones web, siga las instrucciones de configuracin de Tomcat como se indica anteriormente. Tenga en cuenta que en JBoss 6.x, el servidor de aplicaciones de escaneado tiene que ser desactivado para evitar que la carga de las clases antes de la aplicacin se inicie realmente. Una solucin rpida es aadirlo a su artefacto un archivo llamado WEBINF/jboss-scanning.xml con el siguiente contenido:
<scanning xmlns = "urn:jboss:scanning:1.0" /> Genricos aplicaciones Java

Cuando se requiere la instrumentacin de clase en ambientes que no son compatibles o no son compatibles con los existentes LoadTimeWeaver implementaciones, un agente de JDK puede ser la nica solucin. Para estos casos, Spring ofrece InstrumentationLoadTimeWeaver , que requiere un resorte especfico (pero muy general) como agente de VM, org.springframework.instrument-{version}.jar (anteriormente denominado spring-agent.jar ). Para usarlo, debe iniciar la mquina virtual con el agente de Primavera, mediante el suministro de las siguientes opciones de JVM:
-Javaagent :/ path/to/org.springframework.instrument- {version}. Jar

Tenga en cuenta que esto requiere una modificacin de la secuencia de comandos de lanzamiento VM que puede impedir que utilice esto en entornos de servidores de aplicaciones (dependiendo de sus polticas de funcionamiento). Adems, el agente JDK instrumento toda la mquina virtual que puede resultar caro.

Por motivos de rendimiento, se recomienda utilizar esta configuracin slo si el entorno de destino (como Jetty ) no tiene (o no admite) un LTW dedicado.

9.9 Recursos adicionales


Ms informacin sobre AspectJ se puede encontrar en el sitio web AspectJ . El libro Eclipse AspectJ por Adrian Colyer et. al. (Addison-Wesley, 2005) ofrece una introduccin general y de referencia para el lenguaje AspectJ. El libro AspectJ in Action Ramnivas Laddad (Manning, 2003) es muy recomendable, el enfoque del libro est en AspectJ, pero una gran cantidad de temas generales

10. Spring AOP APIs 10.1 Introduccin


El captulo anterior describi la Primavera 2.0 y versiones posteriores para AOP utilizando @ AspectJ y esquemas basados en definiciones de aspecto. En este captulo se discute el nivel inferior Spring AOP API y el apoyo AOP utilizado en Spring 1.2 aplicaciones. Para nuevas aplicaciones, se recomienda el uso de la Primavera 2.0 y versiones posteriores admiten AOP se describe en el captulo anterior, pero cuando se trabaja con aplicaciones existentes, o cuando la lectura de libros y artculos, usted puede venir a travs de ejemplos de primavera estilo 1.2. Spring 3.0 es compatible hacia atrs con Spring 1.2 y todo lo descrito en este captulo es totalmente compatible en Spring 3.0.

10,2 pointcut API en la primavera


Echemos un vistazo a cmo se maneja el concepto de primavera pointcut crucial.
10.2.1 Conceptos

Modelo de Spring pointcut permite la reutilizacin pointcut independiente de los tipos de consejos. Es posible dirigir consejo diferente utilizando el mismo punto de corte. El org.springframework.aop.Pointcut interfaz es la interfaz central, utilizada para combatir consejos a las clases y mtodos particulares. La interfaz completa se muestra a continuacin:
pblico pointcut interfaz { ClassFilter getClassFilter (); GetMethodMatcher MethodMatcher (); }

La divisin de la Pointcut interfaz en dos partes permite la reutilizacin de las piezas de la clase y el mtodo de comparacin, y de grano fino operaciones de composicin (como la realizacin de una "unin" con otro mtodo matcher). El ClassFilter interfaz se utiliza para restringir el punto de corte para un determinado conjunto de clases objetivo. Si matches() mtodo devuelve siempre true, todas las clases de objetivos ser igualada:
pblico ClassFilter interfaz { partidos booleanos (Clase clazz); }

El MethodMatcher interfaz es normalmente ms importante. La interfaz completa se muestra a continuacin:


MethodMatcher interfaz pblica { partidos booleanos (Mtodo m, targetClass clase); booleano isRuntime (); partidos booleanos (Mtodo m, targetClass Class, Object [] args); }

Los matches(Method, Class) mtodo se utiliza para probar si este punto de corte siempre coincidir con un mtodo dado en una clase de destino. Esta evaluacin se puede realizar cuando un proxy AOP se crea, para evitar la necesidad de una prueba en cada llamada de mtodo. Si el mtodo de 2 partidos argumento devuelve true para un mtodo dado, y el isRuntime() mtodo para la MethodMatcher devuelve true, el mtodo 3-argumento partidos se invoca en cada invocacin del mtodo. Esto permite un punto de corte para mirar los argumentos pasados a la invocacin del mtodo inmediatamente antes del consejo objetivo es ejecutar. La mayora de MethodMatchers son estticos, lo que significa que su isRuntime() mtodo devuelve false. En este caso, el mtodo 3-argumento partidos nunca ser invocado.
Punta

Si es posible, trate de hacer puntos de corte esttico, permitiendo que el marco AOP para almacenar en cach los resultados de la evaluacin pointcut cuando un proxy AOP se crea.
10.2.2 Operaciones con puntos de corte

Spring soporta operaciones en puntos de corte: en particular, la unin y la interseccin.


Unin: los mtodos que, o bien los partidos pointcut. Interseccin: los mtodos que los dos puntos de corte igualar. Unin es generalmente ms til.

Puntos de corte puede estar compuesto utilizando los mtodos estticos de la clase org.springframework.aop.support.Pointcuts, o mediante la clase ComposablePointcut en el mismo paquete. Sin embargo, usando AspectJ expresiones punto de corte es generalmente un mtodo ms sencillo.

10.2.3 AspectJ puntos de corte de expresin

Dado que 2.0, el tipo ms importante de punto de corte utilizado para la primavera es org.springframework.aop.aspectj.AspectJExpressionPointcut . Este es un punto de corte que utiliza una biblioteca de AspectJ suministrado para analizar una cadena AspectJ pointcut expresin. Consulte el captulo anterior para una discusin sobre apoyados por AspectJ primitivas punto de corte.
10.2.4 implementaciones de Conveniencia pointcut

Spring proporciona varias implementaciones pointcut convenientes. Algunos pueden ser utilizados fuera de la caja, mientras que otros estn destinados a ser una subclase de puntos de corte especficos de la aplicacin.
Puntos de corte esttico

Puntos de corte estticas se basa en el mtodo y la clase de destino, y no puede tener en cuenta los argumentos del mtodo. Puntos de corte estticas son suficientes - y mejor para la mayora de usos. Es posible que para la primavera para evaluar un punto de corte esttico slo una vez, cuando un mtodo se invoc por primera vez: despus de eso, no hay necesidad de evaluar el punto de corte de nuevo con cada invocacin del mtodo. Vamos a considerar algunas implementaciones de punto de corte estticos incluidos en primavera.
Puntos de corte de expresiones regulares

Una manera obvia de especificar puntos de corte estticas es expresiones regulares. Varios marcos AOP Spring adems de que esto sea posible. org.springframework.aop.support.JdkRegexpMethodPointcut es un punto de corte genrico expresin regular, utilizando el soporte de expresiones regulares en el JDK 1.4 +. Usando el JdkRegexpMethodPointcut clase, puede proporcionar una lista de cadenas de patrones. Si alguno de ellos es una coincidencia, el punto de corte se evaluar como true. (As, el resultado es efectivamente la unin de estos puntos de corte.) El uso se muestra a continuacin:
<Bean id = "settersAndAbsquatulatePointcut" class = "org.springframework.aop.support.JdkRegexpMethodPointcut"> <propiedad nombre = "patterns"> <list>

<valor>. * juego *. </ value> <valor>. * absquatulate </ value> </ List> </ Propiedad> </ Bean>

Spring proporciona una clase de conveniencia, RegexpMethodPointcutAdvisor , que nos permite hacer referencia tambin un Consejo (recordemos que un consejo puede ser un interceptor, antes de asesoramiento, lanza consejos, etc.) Detrs de las escenas, la primavera va a utilizar un JdkRegexpMethodPointcut . Usando RegexpMethodPointcutAdvisor simplifica el cableado, como el grano de una encapsula pointcut y asesoramiento, como se muestra a continuacin:
<Bean id = "settersAndAbsquatulateAdvisor" class = "org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <propiedad nombre = "advice"> <ref local = "beanNameOfAopAllianceInterceptor" /> </ Propiedad> <propiedad nombre = "patterns"> <list> <valor>. * juego *. </ value> <valor>. * absquatulate </ value> </ List> </ Propiedad> </ Bean>

RegexpMethodPointcutAdvisor se puede utilizar con cualquier tipo de Consejos.


Impulsadas en atributos puntos de corte

Un tipo importante de punto de corte esttico es un punto de corte controlado por metadatos. Este sistema utiliza los valores de atributos de metadatos: por lo general, a nivel de fuente de metadatos.
Puntos de corte dinmico

Puntos de corte dinmicos son ms costosas de evaluar que los puntos de corte estticas. Toman en cuenta los argumentos del mtodo, as como informacin esttica. Esto significa que deben ser evaluados con cada llamada de mtodo, el resultado no puede ser almacenado en cach, como argumentos pueden variar. El principal ejemplo es el control flow punto de corte.
Puntos de corte de flujo de control

Spring puntos de corte de control de flujo son conceptualmente similares a AspectJ pointcuts cflow, aunque menos potente. (En este momento no hay forma de especificar que un punto de corte se ejecuta por debajo de un punto de unin igualada por otro punto de corte.) Un punto de corte de flujo de control coincide con la pila de llamadas actual. Por ejemplo, podra disparar si el punto de unin se invoc mediante un mtodo en el com.mycompany.web paquete, o por el SomeCaller clase. Puntos de corte de flujo

de control se especifican mediante la


org.springframework.aop.support.ControlFlowPointcut

clase.

Nota

Puntos de corte de control de flujo son mucho ms caros para evaluar en tiempo de ejecucin que incluso los puntos de corte dinmico. En Java 1.4, el costo es de aproximadamente 5 veces mayor que la de otros puntos de corte dinmico.
10.2.5 superclases pointcut

Spring proporciona tiles superclases punto de corte para ayudarle a poner en prctica sus propios puntos de corte. Debido puntos de corte estticos son ms tiles, es probable que StaticMethodMatcherPointcut subclase, como se muestra a continuacin. Para ello es necesario aplicar un solo mtodo abstracto (aunque es posible reemplazar otros mtodos para personalizar el comportamiento):
clase TestStaticPointcut extiende StaticMethodMatcherPointcut { pblicas partidos booleanos (Mtodo m, targetClass Class) { / / Devuelve verdadero si coincide con los criterios personalizados } }

Hay tambin superclases para puntos de corte dinmico. Puede utilizar puntos de corte a medida con cualquier tipo de asesoramiento en la primavera de 1.0 RC2 o ms.
10.2.6 puntos de corte personalizados

Debido puntos de corte en Spring AOP son clases Java, en lugar de caractersticas de lenguaje (como en AspectJ) es posible declarar puntos de corte personalizados, ya sea esttica o dinmica. Puntos de corte a medida en primavera puede ser arbitrariamente compleja. Sin embargo, utilizando el lenguaje AspectJ pointcut expresin se recomienda si es posible.
Nota

Las versiones posteriores de primavera pueden ofrecer apoyo a "puntos de corte" semnticos como los ofrecidos por JAC: ". Todos los mtodos que cambian las variables de instancia en el objeto de destino", por ejemplo,

Consejos de 10,3 API en la primavera


Ahora vamos a ver cmo Spring AOP maneja consejo.

10.3.1 ciclos de vida de Asesoramiento

Cada consejo es un frijol de primavera. Una instancia de asesoramiento se pueden compartir entre todos los objetos asesorados, o nico a cada objeto se aconseja. Esto corresponde al consejo por clase o por instancia. Por consejo de clase se utiliza con mayor frecuencia. Es apropiado para el asesoramiento genrico como asesores de transaccin. Estos no dependen del estado del objeto proxy o aadir nuevo Estado, sino que simplemente actan sobre el mtodo y los argumentos. Por ejemplo consejo es adecuado para las presentaciones, para apoyar mixins. En este caso, el consejo estatal agrega al objeto proxy. Es posible utilizar una mezcla de consejo compartida y por ejemplo en el mismo servidor proxy AOP.
10.3.2 tipos Asesoramiento en Spring

Spring proporciona varios tipos de asesoramiento fuera de la caja, y es extensible para soportar tipos arbitrarios consejos. Echemos un vistazo a los conceptos bsicos y los tipos estndar consejos.
Interceptacin alrededor asesoramiento

El tipo de consejo ms fundamental en la primavera es la interceptacin alrededor consejo. La primavera es compatible con la interfaz de Alliance AOP por alrededor de asesoramiento mediante la interceptacin de mtodo. MethodInterceptors implementar alrededor consejo debe implementar la siguiente interfaz:
MethodInterceptor public interface extiende Interceptor { Object invoke (MethodInvocation invocacin) throws Throwable; }

El MethodInvocation argumento al invoke() mtodo expone el mtodo que se invoca, el objetivo de unir punto, el proxy AOP, y los argumentos del mtodo. El invoke() mtodo debe devolver el resultado de la invocacin: el valor de retorno del punto de unin. Un simple MethodInterceptor aplicacin es el siguiente:
DebugInterceptor clase pblica implementa MethodInterceptor { public Object invoke (MethodInvocation invocacin) throws Throwable { System.out.println ("Antes: invocacin = [" + invocacin + "]"); Objeto rval invocation.proceed = (); System.out.println ("Invocacin devuelto");

volver rval; } }

Tenga en cuenta la llamada a la MethodInvocation de proceed() mtodo. Esto procede en la cadena de interceptores hacia el punto de unin. La mayora de los interceptores se invoca este mtodo, y devolver su valor de retorno. Sin embargo, un MethodInterceptor, como cualquier otra en torno a consejos, puede devolver un valor diferente o una excepcin en lugar de invocar el mtodo de proceder. Sin embargo, no quiero hacer esto sin una buena razn!
Nota

MethodInterceptors oferta interoperabilidad con otros AOP Alliance compatibles con las implementaciones de AOP. Los tipos proporciona otros discutidos en el resto de esta seccin implementar conceptos comunes de AOP, pero de una manera especfica de primavera. Si bien existe una ventaja en el uso del tipo de asesoramiento ms especfico, se adhieren con MethodInterceptor alrededor consejo si es probable que desee ejecutar el aspecto en otro marco AOP. Tenga en cuenta que puntos de corte no son actualmente compatibles entre marcos, y la Alianza AOP no tiene actualmente definir interfaces de punto de corte.
Antes de asesoramiento

Un tipo ms simple consejo es un consejo antes. Esto no necesita un MethodInvocation objeto, ya que slo ser llamado antes de entrar en el mtodo. La principal ventaja de un consejo antes es que no hay necesidad de invocar el proceed() mtodo, y por lo tanto no hay posibilidad de inadvertidamente no acudi abajo de la cadena interceptor. El MethodBeforeAdvice interfaz se muestra a continuacin. (Diseo del resorte de la API permitira campo antes de consejo, aunque los objetos usuales se aplican a la interceptacin de campo y es poco probable que la primavera nunca lo incorpora).
MethodBeforeAdvice public interface extiende BeforeAdvice { vaco antes (Mtodo m, Object [] args, Object target) throws Throwable; }

Tenga en cuenta el tipo de retorno es void . Antes de asesoramiento puede insertar comportamiento personalizado antes de que el punto de unin se ejecuta, pero no puede cambiar el valor de retorno. Si un consejo antes de inicia una excepcin, esta voluntad abortar la ejecucin ulterior de la cadena de interceptor. La excepcin se propagar una copia de seguridad de la cadena de interceptor. Si no est marcada, o en la firma del mtodo invocado, se pasar directamente al cliente, de lo contrario se ver envuelto en una excepcin sin control por el proxy AOP. Un ejemplo de un consejo antes de la primavera, que cuenta con todas las invocaciones de mtodo:

CountingBeforeAdvice clase pblica implementa MethodBeforeAdvice { int cuenta privada; public void antes (Mtodo m, Object [] args, Object target) throws Throwable { + + Cuenta; } getCount public int () { volver cuentan; } }

Punta

Antes de asesoramiento se puede utilizar con cualquier punto de corte.


Emite consejo

Emite consejo se invoca despus de la vuelta del punto de unin si el punto de unin produjo una excepcin. Spring ofrece escribi lanza consejo. Ntese que esto significa que la org.springframework.aop.ThrowsAdvice interfaz no contiene mtodos: Se trata de una interfaz de etiqueta de identificacin que el objeto dado implementa uno o ms mtodos de tipado lanza recomendaciones. Estos deben estar en la forma de:
afterThrowing ([Mtodo, args, objetivo], subclassOfThrowable)

Slo el ltimo argumento es necesario. Las firmas de mtodo podr disponer de una o cuatro argumentos, dependiendo de si el mtodo de asesoramiento est interesado en el mtodo y los argumentos. Las clases siguientes son ejemplos de consejos lanzamientos. Los consejos a continuacin se invoca si un RemoteException se lanza (incluyendo subclases):
RemoteThrowsAdvice clase pblica implementa ThrowsAdvice { public void afterThrowing (RemoteException ex) throws Throwable { / / Hacer algo con excepcin remoto } }

Los siguientes consejos se invoca si un ServletException es lanzada. A diferencia de los consejos anteriores, declara cuatro argumentos, por lo que no tiene acceso al mtodo invocado, el mtodo y los argumentos objeto de destino:
ServletThrowsAdviceWithArguments public class implementa ThrowsAdvice { public void afterThrowing (Mtodo m, Object [] args, blanco Objeto, ServletException ex) { / / Hacer algo con todos los argumentos } }

El ltimo ejemplo ilustra cmo estos dos mtodos puede ser utilizado en una sola clase, que maneja tanto RemoteException y ServletException . Cualquier nmero de lanzamientos mtodos recomendaciones pueden combinarse en una sola clase.
CombinedThrowsAdvice pblico static class implementa ThrowsAdvice { public void afterThrowing (RemoteException ex) throws Throwable { / / Hacer algo con excepcin remoto } public void afterThrowing (Mtodo m, Object [] args, blanco Objeto, ServletException ex) { / / Hacer algo con todos los argumentos } }

Nota: Si un mtodo tiros de asesoramiento se produce una excepcin en s, prevalecer la excepcin original (es decir, cambiar la excepcin lanzada para el usuario). La excepcin principal ser tpicamente un RuntimeException, lo que es compatible con cualquier firma de mtodo. Sin embargo, si un mtodo tiros de asesoramiento lanza una excepcin comprobada, se tendr que adaptarse a las excepciones declaradas del mtodo objetivo y es por lo tanto, hasta cierto punto, junto a firmas especficas de destino mtodos. No arroje una excepcin no declarado comprobado que es incompatible con el firma del mtodo objetivo!
Punta

Tira asesoramiento se puede utilizar con cualquier punto de corte.


Despus de regresar asesoramiento

Un consejo despus de regresar en la primavera debe implementar la interfaz org.springframework.aop.AfterReturningAdvice, que se muestra a continuacin:
AfterReturningAdvice public interface extiende Consejos { vaco afterReturning (Object returnValue, Mtodo m, Object [] args, Object target) lanza Throwable; }

Un consejo a su regreso tiene acceso al valor de retorno (que no se puede modificar), mtodo invocado, los argumentos de los mtodos y de destino. El siguiente consejo despus de regresar cuenta todas las invocaciones de mtodos exitosos que no han arrojado excepciones:
CountingAfterReturningAdvice clase pblica implementa AfterReturningAdvice { int cuenta privada; afterReturning public void (Object returnValue, Mtodo m, Object [] args, target Object)

lanza Throwable { + + Cuenta; } getCount public int () { volver cuentan; } }

Este consejo no cambia la ruta de ejecucin. Si se produce una excepcin, este ser lanzado en la cadena de interceptores en lugar del valor de retorno.
Punta

Despus de volver asesoramiento se puede utilizar con cualquier punto de corte.


Introduccin consejo

Primavera trata consejo introduccin como un tipo especial de asesoramiento intercepcin. Introduccin requiere una IntroductionAdvisor , y un IntroductionInterceptor , implementar la siguiente interfaz:
IntroductionInterceptor public interface extiende MethodInterceptor { booleano implementsInterface (Clase intf); }

El invoke() mtodo heredado de la AOP Alliance MethodInterceptor interfaz debe implementar la introduccin: es decir, si el mtodo invocado es introducido en una interfaz, el interceptor de introduccin es responsable de manejar la llamada al mtodo no puede invocar proceed() . Asesoramiento introduccin no puede ser utilizado con cualquier punto de corte, tal como se aplica slo a la clase, en lugar del mtodo, el nivel. Slo se puede utilizar con el asesoramiento introduccin IntroductionAdvisor , que tiene los siguientes mtodos:
public interface extends IntroductionAdvisor Advisor, IntroductionInfo { ClassFilter getClassFilter (); validateInterfaces vaco () throws IllegalArgumentException; } pblico IntroductionInfo interfaz { Clase [] GetInterfaces (); }

No hay MethodMatcher , y por lo tanto no Pointcut , asociado con consejos introduccin. Slo el filtrado de clase es lgico. El getInterfaces() mtodo devuelve las interfaces introducidas por este asesor. El validateInterfaces() mtodo se utiliza internamente para ver si las interfaces introducidas pueden ser implementadas por el configurado IntroductionInterceptor . Veamos un ejemplo sencillo de la serie de pruebas de primavera. Supongamos que queremos introducir la siguiente interfaz a uno o ms objetos:
interfaz pblica con llave { bloqueo de vaco (); desbloqueo de vaco (); booleano bloqueado (); }

Esto ilustra un mixin. Queremos ser capaces de lanzar objetos aconseja cerradura, cualquiera que sea su tipo, y llamar a los mtodos de bloqueo y desbloqueo. Si llamamos al mtodo lock (), queremos que todos los mtodos de establecimiento de lanzar una LockedException . As, podemos aadir un aspecto que ofrece la posibilidad de hacer que los objetos inmutables, sin que tengan ningn conocimiento de ello: un buen ejemplo de AOP. En primer lugar, vamos a necesitar un IntroductionInterceptor que hace el trabajo pesado. En este caso, se ampla el org.springframework.aop.support.DelegatingIntroductionInterceptor clase de conveniencia. Podramos implementar IntroductionInterceptor directamente, pero utilizando DelegatingIntroductionInterceptor que es mejor para la mayora de los casos. El DelegatingIntroductionInterceptor est diseado para delegar una introduccin a una implementacin real de la interfaz introducido (s), ocultando el uso de la interceptacin de hacerlo. El delegado se puede ajustar a cualquier objeto utilizando un argumento del constructor; el delegado predeterminado (cuando el constructor no-arg se utiliza) es el siguiente. As, en el ejemplo siguiente, el delegado es el LockMixin subclase de DelegatingIntroductionInterceptor . Dado un delegado (por defecto en s mismo), un DelegatingIntroductionInterceptor ejemplo busca todas las interfaces implementadas por el delegado (que no sea IntroductionInterceptor), y apoyar la introduccin en contra de ninguno de ellos. Es posible para las subclases tales como LockMixin para llamar la suppressInterface(Class intf) mtodo para suprimir interfaces que no deben ser expuestos. Sin embargo, no importa cuntas interfaces una IntroductionInterceptor est dispuesta a apoyar el IntroductionAdvisor utilizado controlar que las interfaces estn realmente expuestos. Una interfaz se introdujo ocultar cualquier aplicacin de la misma interfaz por el objetivo. As LockMixin subclases DelegatingIntroductionInterceptor e implementos cerradura en s. La superclase captura automticamente con cerradura que puede ser

apoyado por la introduccin, por lo que no es necesario especificarlo. Se podra introducir cualquier nmero de interfaces de esta manera. Observe el uso de la locked variable de instancia. Esto efectivamente agrega estatal adicional a la realizada en el objeto de destino.
pblico LockMixin clase extiende DelegatingIntroductionInterceptor implementos cerradura { booleano privado cerrado; bloqueo public void () { esta bloqueado = true.; } desbloqueo public void () { esta bloqueado = false.; } public boolean bloqueado () { devolver esta bloqueado.; } public Object invoke (MethodInvocation invocacin) throws Throwable { if (bloqueado () && invocation.getMethod (). getName (). indexOf ("set") == 0) tirar LockedException nuevo (); volver sper invoke (invocacin).; } }

A menudo no es necesario reemplazar el invoke() mtodo: el DelegatingIntroductionInterceptor implementacin - que llama al mtodo delegado si el mtodo se introdujo, de lo contrario se camina hacia el punto de registrarse - es generalmente suficiente. En el presente caso, hay que aadir un cheque: no existe un mtodo setter se puede invocar si est en modo bloqueado. El asesor de introduccin requiere es simple. Todo lo que tiene que hacer es mantener una clara LockMixin ejemplo, y especificar las interfaces introducidas - en este caso, slo Lockable . Un ejemplo ms complejo podra tomar una referencia al interceptor introduccin (que se define como un prototipo): en este caso, no hay ninguna configuracin relevantes para un LockMixin , por lo que slo tiene que crear utilizando new .
public class extends LockMixinAdvisor DefaultIntroductionAdvisor { pblico LockMixinAdvisor () { super (nuevo LockMixin (), con cierre de clase.); } }

Podemos aplicar este asesor es muy simple: no requiere ninguna configuracin. (Sin embargo, es necesario: Es imposible utilizar un IntroductionInterceptor . sin IntroductionAdvisor) Como es habitual en las presentaciones, el asesor debe ser por

instancia, como lo es con estado. Necesitamos una instancia diferente de LockMixinAdvisor , y por lo tanto LockMixin , para cada objeto aconsejado. El asesor comprende parte del estado del objeto aconsejado a. Podemos aplicar este asesor mediante programacin, utilizando el Advised.addAdvisor() mtodo, o (la manera recomendada) en la configuracin XML, como cualquier otro asesor. Todas las opciones de creacin de proxy se discute ms adelante, incluidos los "creadores automtica del proxy", manejar correctamente las introducciones y mixins con estado.

10,4 Advisor API en la primavera


En la primavera, un Asesor es un aspecto que slo contiene un objeto nico consejo asociado con una expresin de punto de corte. Aparte del caso especial de introducciones, cualquier asesor puede ser utilizado con cualquier consejo. org.springframework.aop.support.DefaultPointcutAdvisor es la clase de asesor ms comnmente utilizado. Por ejemplo, se puede utilizar con un MethodInterceptor , BeforeAdvice o ThrowsAdvice . Es posible mezclar tipos de consejero y asesoramiento en primavera en el mismo servidor proxy AOP. Por ejemplo, podra utilizar una intercepcin alrededor consejo, lanza consejos y asesoramiento antes en una configuracin de proxy: Spring crear automticamente la cadena de interceptores necesarios.

Uso del 10,5 ProxyFactoryBean para crear proxies AOP


Si est utilizando la primavera COI contenedor (un ApplicationContext o BeanFactory) para los objetos de su negocio - y usted debe ser! - Usted tendr que usar uno de AOP Spring FactoryBeans. (Recuerde que un grano de fbrica introduce una capa de indireccin, lo que le permite crear objetos de un tipo diferente.)
Nota

El apoyo AOP Spring 2.0 tambin utiliza granos de fbrica bajo las sbanas. La forma bsica de crear un proxy en la primavera de AOP es utilizar el org.springframework.aop.framework.ProxyFactoryBean. Esto le da un control completo sobre los puntos de corte y consejos que se aplicarn, y ordenar. Sin embargo, hay opciones ms sencillas que son preferibles si no es necesario dicho control.
10.5.1 Conceptos bsicos

El ProxyFactoryBean , al igual que otros Primavera FactoryBean implementaciones, introduce un nivel de indireccin. Si se define una ProxyFactoryBean con el nombre foo , qu objetos referencia a foo ver no es la ProxyFactoryBean instancia s mismo,

sino un objeto creado por el ProxyFactoryBean aplicacin 's de la getObject() mtodo. Este mtodo crear un proxy AOP envolver un objeto de destino. Una de las ventajas ms importantes de usar un ProxyFactoryBean u otra clase de IoCaware para crear proxies AOP, es que significa que los consejos y puntos de corte tambin se pueden gestionar por la COI. Esta es una caracterstica de gran alcance, permitiendo que ciertos enfoques que son difciles de alcanzar con otros marcos de AOP. Por ejemplo, un mismo consejo puede hacer referencia a objetos de aplicaciones (adems de la de destino, que debe estar disponible en cualquier marco AOP), en beneficio de toda la enchufabilidad proporcionada por inyeccin de dependencias.
10.5.2 propiedades JavaBean

En comn con la mayora de FactoryBean implementaciones proporcionadas con la primavera, el ProxyFactoryBean clase en s es un JavaBean. Sus propiedades se utilizan para:

Especifique el destino que desea proxy. Especifique si desea utilizar CGLIB (ver ms abajo y tambin la Seccin 10.5.3, "jdk-y CGLIB basadas en proxies" ).

Algunas propiedades importantes son heredados de


org.springframework.aop.framework.ProxyConfig

(la superclase de todas las fbricas de proxy AOP en primavera). Estas propiedades fundamentales son:
proxyTargetClass : true

si la clase de destino es ser proxy, en lugar de las interfaces de la clase de destino. Si este valor de la propiedad se establece en true , entonces proxies CGLIB ser creado (pero ver tambin la Seccin 10.5.3, "jdk-y CGLIB basadas en proxies" ). optimize : controla si las optimizaciones agresivas se aplican a los poderes creados por CGLIB. Uno no alegremente debera utilizar este ajuste a menos que uno entiende perfectamente cmo la correspondiente representacin AOP se encarga de la optimizacin. Esto se utiliza actualmente slo para proxies CGLIB; no tiene ningn efecto con los proxies de JDK dinmicos. frozen : si una configuracin de proxy se frozen , entonces los cambios en la configuracin ya no se permite. Esto es til tanto como una optimizacin ligera y, en los casos cuando no se desea que los llamantes ser capaz de manipular el proxy (a travs de la Advised interfaz) despus de la representacin se ha creado. El valor predeterminado de esta propiedad es false , por lo que cambios como la adicin de consejos adicionales son permitidos. exposeProxy : determina si o no el proxy actual debe ser expuesto en una ThreadLocal de modo que se puede acceder por el objetivo. Si un objetivo tiene que obtener el poder y la exposeProxy propiedad se establece en true , el objetivo puede utilizar el AopContext.currentProxy() mtodo.

Otras propiedades especficas para ProxyFactoryBean incluyen:


proxyInterfaces

: array de nombres de interfaz de cadena. Si no se suministra, un proxy CGLIB para la clase de destino se usar (pero ver tambin la Seccin 10.5.3, "jdk-y CGLIB basadas en proxies" ).

interceptorNames

: matriz de cadenas de Advisor nombres consejos, interceptores o de otro tipo a aplicar. Ordenar es importante, en un primer llegado, primer servido base. Es decir que el interceptor primero en la lista ser el primero en ser capaz de interceptar la invocacin. Los nombres son nombres de frijol en la fbrica actual, incluidos los nombres de las fbricas de frijol ancestrales. No se puede hablar de referencias de frijol aqu ya que hacerlo podra resultar en la ProxyFactoryBean ignorando el valor singleton del consejo. Se puede aadir un nombre de interceptor con un asterisco ( * ). Esto dar lugar a la aplicacin de todos los granos de asesor con nombres que comienzan con la parte antes del asterisco a aplicar. Un ejemplo del uso de esta caracterstica se puede encontrar en la Seccin 10.5.6, "Uso de" global "asesores" .

singleton: si la fbrica debe devolver un solo objeto, no importa cuntas veces la getObject() se llama al mtodo. Varios FactoryBean implementaciones ofrecer tal mtodo. El valor predeterminado es true . Si desea utilizar el asesoramiento de estado - por ejemplo, para mixins con estado - utilice consejos prototipo junto con un valor singleton de false .

10.5.3 JDK y proxies basados CGLIB

Esta seccin sirve como la documentacin definitiva sobre cmo el ProxyFactoryBean elige crear uno cualquiera de un JDK-y CGLIB basados proxy para un objeto de destino particular (es decir para ser aproximados).
Nota

El comportamiento de la ProxyFactoryBean con respecto a la creacin de JDK-o proxies CGLIB basados cambiado entre versiones 1.2.x y 2,0 de la primavera. El ProxyFactoryBean ahora exhibe una semntica similar con respecto a la deteccin automtica de interfaces como las de la TransactionProxyFactoryBean clase. Si la clase de un objeto de destino que se va a aplicar proxy (en adelante referido simplemente como la clase de objetivo) no implementa ninguna interfaz, a continuacin, un proxy basado CGLIB se crear. Este es el escenario ms fcil, porque proxies JDK interfaz basada, y no hay interfaces significa proxy JDK no es ni siquiera posible. Uno simplemente se enchufa en el frijol blanco, y especifica la lista de interceptores a travs de la interceptorNames propiedad. Tenga en cuenta que un proxy basado en CGLIB se crear incluso si el proxyTargetClass propiedad de la ProxyFactoryBean se ha establecido en false . (Obviamente esto no tiene sentido, y es mejor eliminar de la definicin de frijol, ya que es el mejor de los despedidos, y en el peor confuso.) Si la clase de destino implementa uno (o ms) interfaces, entonces el tipo de proxy que se crea depende de la configuracin de la ProxyFactoryBean .

Si el proxyTargetClass propiedad de la ProxyFactoryBean se ha establecido en true , entonces un proxy basado en CGLIB se crear. Esto tiene sentido, y est en consonancia con el principio de mnima sorpresa. Incluso si el proxyInterfaces propiedad de la ProxyFactoryBean se ha establecido uno o varios nombres de interfaz completos, el hecho de que la proxyTargetClass propiedad se establece en true causar CGLIB basada en proxy de estar en vigor. Si el proxyInterfaces caracterstica de la ProxyFactoryBean se ha establecido en uno o ms nombres de interfaz totalmente cualificados, a continuacin, un proxy JDK basado se crear. El proxy creado implementar todas las interfaces que se especificaron en el proxyInterfaces propiedad, si la clase de destino pasa a poner en prctica un conjunto mucho ms interfaces de los especificados en el proxyInterfaces propiedad, que est muy bien, pero esas interfaces adicionales no sern implementado por el proxy devuelto. Si el proxyInterfaces caracterstica de la ProxyFactoryBean no se ha establecido, pero la clase de objetivo hace aplicar una (o ms) interfaces, entonces el ProxyFactoryBean se auto-detectar el hecho de que la clase de objetivo es en realidad implementar al menos una interfaz, y un-JDK basados en proxy ser creado. Las interfaces que son realmente proxy ser todas las interfaces que implementa la clase de objetivo; en efecto, este es el mismo que el simple suministro de una lista de interfaz de todos y cada uno que implementa la clase objetivo a la proxyInterfaces propiedad. Sin embargo, es significativamente menos trabajo, y menos propenso a errores tipogrficos.
10.5.4 interfaces de conexiones proxy

Veamos un ejemplo sencillo de ProxyFactoryBean en accin. Este ejemplo se refiere a:


Un bean de destino que ser proxy. Este es el "personTarget" definicin de frijol en el siguiente ejemplo. Un asesor y un interceptor utiliza para proporcionar consejo. Una definicin de proxy AOP frijol especificar el objeto de destino (el frijol personTarget) y las interfaces de proxy, junto con los consejos para aplicar.

<bean id = "personTarget" class = "com.mycompany.PersonImpl"> <propiedad nombre = valor = "name" "Tony" /> <propiedad nombre = valor = "age" "51" /> </ Bean> <bean id = "myAdvisor" class = "com.mycompany.MyAdvisor"> <propiedad nombre = valor = "someProperty" propiedad de cadena "Custom value" /> </ Bean> <bean id = "debugInterceptor" class = "org.springframework.aop.interceptor.DebugInterceptor"> </ Bean> <Bean id = "persona" class = "org.springframework.aop.framework.ProxyFactoryBean">

<propiedad nombre = valor = "proxyInterfaces" "com.mycompany.Person" /> <propiedad nombre = "target" ref = "personTarget" /> <propiedad nombre = "interceptorNames"> <list> <valor> myAdvisor </ value> <valor> debugInterceptor </ value> </ List> </ Propiedad> </ Bean>

Tenga en cuenta que el interceptorNames propiedad tiene una lista de String: los nombres de frijol del interceptor o asesores en la fbrica actual. Asesores, interceptores, antes, los objetos que regresan despus y arroja consejos pueden ser utilizados. La clasificacin de los asesores es importante.
Nota

Usted podra preguntarse por qu la lista no tiene referencias de frijol. La razn de esto es que si la propiedad singleton ProxyFactoryBean se establece en false, debe ser capaz de devolver instancias independientes del poder. Si cualquiera de los asesores en s es un prototipo, una instancia independiente tendra que ser devueltos, por lo que es necesario ser capaz de obtener una instancia del prototipo de la fbrica, la celebracin de una referencia no es suficiente. La "persona" definicin de bean anterior se puede utilizar en lugar de una implementacin persona, de la siguiente manera:
Persona persona = (Persona) factory.getBean ("persona");

Las dems judas en el mismo contexto COI puede expresar una dependencia inflexible de tipos en l, como con un objeto normal Java:
<bean id = "personUser" class = "com.mycompany.PersonUser"> <propiedad nombre "person" => <ref local = "person" /> </ propiedad> </ Bean>

El PersonUser clase en este ejemplo sera exponer una propiedad de tipo Person. En cuanto a lo que est en cuestin, el proxy AOP puede usar de forma transparente en lugar de una aplicacin "real". Sin embargo, su clase sera una clase de proxy dinmico. Se podra echarlo a la Advised interfaz (vase ms adelante). Es posible ocultar la distincin entre el objetivo y proxy utilizando un bean interna annima, como sigue. Slo el ProxyFactoryBean definicin es diferente, el consejo se incluye slo para la integridad:
<bean id = "myAdvisor" class = "com.mycompany.MyAdvisor"> <propiedad nombre = valor = "someProperty" propiedad de cadena "Custom value" /> </ Bean>

<bean id = "debugInterceptor" class = "org.springframework.aop.interceptor.DebugInterceptor" /> <bean id = "person" class = "org.springframework.aop.framework.ProxyFactoryBean"> <propiedad nombre = valor = "proxyInterfaces" "com.mycompany.Person" /> <- Usar bean interna, no referencia local a destino -> <propiedad nombre = "target"> <bean class = "com.mycompany.PersonImpl"> <propiedad nombre = valor = "name" "Tony" /> <propiedad nombre = valor = "age" "51" /> </ Bean> </ Propiedad> <propiedad nombre = "interceptorNames"> <list> <valor> myAdvisor </ value> <valor> debugInterceptor </ value> </ List> </ Propiedad> </ Bean>

Esto tiene la ventaja de que slo hay un objeto de tipo Person : til si queremos evitar que los usuarios del contexto de aplicacin de la obtencin de una referencia al objeto sin aconsejado, o la necesidad de evitar toda ambigedad con la primavera COI autowiring. Tambin hay sin duda una ventaja en que la definicin ProxyFactoryBean es autnomo. Sin embargo, hay veces en que ser capaz de obtener el objetivo de la ONU aconsejada de la fbrica en realidad podra ser una ventaja: por ejemplo, en ciertos escenarios de prueba.
10.5.5 Uso de proxy clases

Qu pasa si usted necesita un proxy de clase, en lugar de una o ms interfaces? Imagina que en el ejemplo anterior, no haba Person interfaz: necesitbamos para asesorar a una clase llamada Person que no aplic ninguna interfaz de negocios. En este caso, puede configurar Spring para utilizar proxies CGLIB proxy, en lugar de dinmica. Basta con establecer la proxyTargetClass propiedad en la ProxyFactoryBean arriba en true. Aunque lo mejor es programar las interfaces, en lugar de clases, la capacidad para asesorar a las clases que no implementan interfaces puede ser til cuando se trabaja con cdigo heredado. (En general, la primavera no es preceptivo. Si bien hace que sea fcil de aplicar buenas prcticas, evita forzar un enfoque particular.) Si lo desea, puede forzar el uso de CGLIB en cualquier caso, incluso si usted tiene interfaces. CGLIB obras proxy mediante la generacin de una subclase de la clase de destino en tiempo de ejecucin. Primavera configura esta subclase generada a delegar las llamadas a mtodos con el objetivo original: la subclase se utiliza para implementar el patrn Decorator, tejiendo en el consejo. CGLIB proxy debe ser generalmente transparente para los usuarios. Sin embargo, hay algunas cuestiones a tener en cuenta:

Final

mtodos no pueden ser advertidos, ya que no se puede anular. No hay necesidad de agregar CGLIB a su classpath. Como Spring de 3,2, y se vuelve a empaquetar CGLIB incluido en el JAR resorte de ncleo. En otras palabras, CGLIB basada en AOP funciona "out of the box" tal como lo hacen JDK proxies dinmicos.

Hay poca diferencia de rendimiento entre CGLIB proxies proxy y dinmica. A partir de primavera de 1,0, proxies dinmicos son un poco ms rpido. Sin embargo, esto puede cambiar en el futuro. El rendimiento no debe ser un factor decisivo en este caso.
10.5.6 Uso de "globales" asesores

Aadiendo un asterisco al nombre de un interceptor, todos los asesores con nombres que coinciden con la parte de frijol antes del asterisco, se aadir a la cadena de asesor. Esto puede ser til si tiene que agregar un conjunto estndar de "globales" asesores:
<bean id = "proxy" class = "org.springframework.aop.framework.ProxyFactoryBean"> <propiedad nombre = "target" ref = "service" /> <propiedad nombre = "interceptorNames"> <list> <valor> global * </ value> </ List> </ Propiedad> </ Bean> <bean id = "global_debug" class = "org.springframework.aop.interceptor.DebugInterceptor" />

10,6 definiciones concisas de proxy


Sobre todo en la definicin de proxies transaccionales, usted puede terminar con muchas definiciones de proxy similares. El uso de definiciones de frijol primarios y secundarios, junto con las definiciones de frijol interiores, puede dar lugar a definiciones de proxy mucho ms limpias y ms concisa. En primer lugar uno de los padres, plantilla, frijol definicin se crea para el proxy:
<Bean id = "txProxyTemplate" abstract = "true" class = "org.springframework.transaction.interceptor.TransactionProxyFactoryBe an"> <propiedad nombre = "transactionManager" ref = "transactionManager" /> <propiedad nombre = "transactionAttributes"> <props> <prop clave = "*"> PROPAGATION_REQUIRED </ prop> </ Accesorios> </ Propiedad> </ Bean>

Esto nunca ser instanciada en s, por lo que en realidad puede ser incompleta. A continuacin, cada proxy que necesita ser creado es slo una definicin de frijol nio,

que envuelve el objetivo del proxy como una definicin de bean interior, ya que el objetivo nunca se utiliza en monoterapia de todos modos.
<bean id = padres = "myService" "txProxyTemplate"> <propiedad nombre = "target"> <bean class = "org.springframework.samples.MyServiceImpl"> </ Bean> </ Propiedad> </ Bean>

Por supuesto, es posible reemplazar las propiedades de la plantilla padre, como en este caso, los valores de propagacin de transacciones:
<bean id = padres = "mySpecialService" "txProxyTemplate"> <propiedad nombre = "target"> <bean class = "org.springframework.samples.MySpecialServiceImpl"> </ Bean> </ Propiedad> <propiedad nombre = "transactionAttributes"> <props> <prop clave = "get*"> PROPAGATION_REQUIRED, readOnly </ prop> <prop clave = "find*"> PROPAGATION_REQUIRED, readOnly </ prop> <prop clave = "load*"> PROPAGATION_REQUIRED, readOnly </ prop> <prop clave = "store*"> PROPAGATION_REQUIRED </ prop> </ Accesorios> </ Propiedad> </ Bean>

Tenga en cuenta que en el ejemplo anterior, hemos marcado explcitamente la definicin de bean padre como abstracta mediante el atributo abstracto, como se describe anteriormente , de modo que en realidad no puede nunca ser instanciada. Contextos de aplicacin (pero no las fbricas de frijol simples) tendr por defecto preinstantiate todos nicos. Por eso es importante (al menos para los frijoles nico) que si usted tiene una definicin (padre) de frijol que se va a utilizar slo como una plantilla, y esta definicin especifica una clase, usted debe asegurarse de establecer el atributo abstracto en true, de lo contrario el contexto de la aplicacin en realidad se trate de preinstancia.

10.7 Creacin de servidores proxy AOP mediante programacin con el ProxyFactory


Es fcil crear servidores proxy AOP mediante programacin utilizando la primavera. Esto le permite usar Spring AOP sin la dependencia de primavera COI. El siguiente listado muestra la creacin de un proxy para un objeto de destino, con un interceptor y un asesor. Las interfaces implementadas por el objeto de destino de forma automtica a travs del proxy:
ProxyFactory fbrica = new ProxyFactory (myBusinessInterfaceImpl); factory.addAdvice (myMethodInterceptor); factory.addAdvisor (myAdvisor); Tb MyBusinessInterface = (MyBusinessInterface) factory.getProxy ();

El primer paso es la construccin de un objeto de tipo


org.springframework.aop.framework.ProxyFactory

. Se puede crear este objeto con un objetivo, como en el ejemplo anterior, o especificar las interfaces para ser aproximados en un constructor alternativo. Puede aadir consejos (con interceptores como un tipo especializado de asesoramiento) y / o asesores, y manipularlos para la vida de la ProxyFactory. Si agrega una IntroductionInterceptionAroundAdvisor, puede hacer que el proxy para implementar interfaces adicionales. Tambin existen mtodos de conveniencia en ProxyFactory (heredado de AdvisedSupport ) que le permiten agregar otros tipos de asesoramiento como antes y lanza consejo. AdvisedSupport es la superclase de ambos ProxyFactory y ProxyFactoryBean.
Punta

La integracin de creacin AOP proxy con el marco de la COI es la mejor prctica en la mayora de las aplicaciones. Le recomendamos que exteriorizar configuracin de Java de cdigo con AOP, como en general.

10.8 Manipulacin de objetos aconsejables


Sin embargo, se crea proxies AOP, se pueden manipular usando el org.springframework.aop.framework.Advised interfaz. Toda carta poder AOP se puede convertir a esta interfaz, lo que otras interfaces que implementa. Esta interfaz incluye los mtodos siguientes:
Advisor [] getAdvisors (); vaco addAdvice (asesoramiento Asesoramiento) throws AopConfigException; addAdvice vaco (int pos, consejos Consejos) lanza AopConfigException; vaco addAdvisor (Asesor asesor) throws AopConfigException; addAdvisor vaco (int pos, Consejero asesor) throws AopConfigException; int indexOf (Consejero asesor); booleano removeAdvisor (Asesor asesor) throws AopConfigException; removeAdvisor vaco (int index) throws AopConfigException; booleano replaceAdvisor (Asesora a, b Advisor) throws AopConfigException; IsFrozen booleano ();

Los getAdvisors() mtodo devolver un consejero por cada consejero, interceptor o escribe el otro consejo que se ha aadido a la fbrica. Si ha aadido un asesor, el asesor regres a este ndice ser el objeto que ha agregado. Si ha aadido un interceptor o escribe el otro consejo, Spring se han envuelto en esto un asesor con un punto de corte que siempre devuelve true. As, si se ha aadido un MethodInterceptor , el asesor de este ndice devuelto ser un DefaultPointcutAdvisor devolver su MethodInterceptor y un punto de corte que corresponda a todas las clases y mtodos. El addAdvisor() mtodos se pueden utilizar para agregar cualquier Advisor. Por lo general, el punto de corte que sostiene asesor y consejo ser el genrico DefaultPointcutAdvisor , que se puede utilizar con cualquier consejo o punto de corte (pero no para la introduccin). De forma predeterminada, es posible aadir o quitar asesores o interceptores ni una sola vez de un proxy se ha creado. La nica restriccin es que es imposible agregar o quitar un asesor de introduccin, como indicadores existentes de la fbrica no mostrar el cambio de interfaz. (Usted puede obtener un nuevo proxy de la fbrica para evitar este problema.) Un ejemplo simple de lanzar un proxy AOP a la Advised interfaz y el examen y la manipulacin de su consejo:
Asesora aconseja = (recomendado) myObject; Advisor [] = advised.getAdvisors asesores (); int = oldAdvisorCount advisors.length; System.out.println (oldAdvisorCount + "asesores"); / / Aadir un consejo como un interceptor sin un punto de corte / / Se coincide con todos los mtodos de proxy / / Se puede usar para interceptores, antes, despus de regresar o lanza consejos advised.addAdvice (nuevo DebugInterceptor ()); / / Aadir consejos selectiva utilizando un punto de corte advised.addAdvisor (nuevo DefaultPointcutAdvisor (mySpecialPointcut, myAdvice)); assertEquals ("Se han aadido dos asesores", oldAdvisorCount + 2, advised.getAdvisors () de longitud).;

Nota

Es cuestionable si es conveniente (sin juego de palabras) para modificar consejo sobre un objeto de negocio en la produccin, aunque no hay casos de duda justificada uso. Sin embargo, puede ser muy til en el desarrollo: por ejemplo, en las pruebas. A veces me he encontrado muy til ser capaz de agregar cdigo de prueba en la forma de un interceptor o el otro consejo, conseguir dentro de una invocacin de mtodo que desea probar. (Por ejemplo, el consejo puede entrar en una transaccin creada para ese mtodo: por ejemplo, para ejecutar SQL para comprobar que una base de datos se actualiz correctamente, antes de marcar la transaccin para hacer retroceder). Dependiendo de cmo se cre el proxy, por lo general puede fijar un frozen bandera, en cuyo caso la Advised isFrozen() mtodo devolver true, y cualquier intento de

modificacin de asesoramiento a travs de la adicin o supresin dar lugar a un AopConfigException . La capacidad de congelar el estado de un objeto aconseja es til en algunos casos, por ejemplo, para evitar la eliminacin de un cdigo de llamada interceptor de seguridad. Tambin puede ser utilizado en la primavera de 1,1 para permitir la optimizacin agresiva si la modificacin de tiempo de ejecucin asesoramiento se sabe que no se requiere.

10.9 Utilizar el "autoproxy" instalacin


Hasta ahora hemos considerado la creacin explcita de poderes AOP utilizando un ProxyFactoryBean o frijol fbrica similar. La primavera tambin nos permite utilizar "AutoProxy" definiciones de frijol, lo que puede automticamente proxy seleccionado definiciones de frijol. Esto se basa en la primavera "post procesador de frijol" infraestructura, lo que permite la modificacin de cualquier definicin de frijol como las cargas de contenedores. En este modelo, se configura algunas definiciones de frijol especiales en el archivo XML de definicin de bean para configurar la infraestructura de proxy automtico. Esto permite que usted acaba de declarar los objetivos elegibles para autoproxying: no es necesario utilizar ProxyFactoryBean . Hay dos maneras de hacerlo:

El uso de un creador autoproxy que se refiere a granos especficos en el contexto actual. Un caso especial de la creacin autoproxy que merece ser considerado por separado, la creacin autoproxy impulsado por los atributos de metadatos a nivel de cdigo fuente.

10.9.1 AutoProxy frijol definiciones

El org.springframework.aop.framework.autoproxy paquete proporciona los siguientes creadores estndar AutoProxy.


BeanNameAutoProxyCreator

El BeanNameAutoProxyCreator clase es un BeanPostProcessor que crea automticamente servidores proxy AOP para los granos con nombres que coincidan con los valores literales o comodines.
<bean class = "org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" > <propiedad nombre = valor = "beanNames" "jdk*,onlyJdk" /> <propiedad nombre = "interceptorNames"> <list> <valor> myInterceptor </ value> </ List> </ Propiedad> </ Bean>

Como con ProxyFactoryBean , hay una interceptorNames propiedad en lugar de una lista de interceptores, para permitir un comportamiento correcto para asesores prototipo. Nombrado "interceptores" puede ser asesores o cualquier tipo de asesoramiento. Como con auto proxy en general, el punto principal de usar BeanNameAutoProxyCreator es aplicar la misma configuracin uniforme a mltiples objetos, con volumen mnimo de configuracin. Es una opcin popular para la aplicacin de transacciones declarativas a varios objetos. Definiciones de frijol cuyos nombres coinciden, como "jdkMyBean" y "onlyJdk" en el ejemplo anterior, son simples definiciones de frijol de edad con la clase de objetivo. Un proxy AOP se crear automticamente por el BeanNameAutoProxyCreator . El mismo consejo se aplica a todos los granos coincidentes. Tenga en cuenta que si se utilizan asesores (en lugar del interceptor en el ejemplo anterior), los puntos de corte pueden aplicarse de manera diferente a diferentes granos.
DefaultAdvisorAutoProxyCreator

Un creador automtica del proxy ms general y muy potente es DefaultAdvisorAutoProxyCreator . Esta automgicamente se aplicar asesores elegibles en el contexto actual, sin la necesidad de incluir nombres especficos de frijol en grano de la definicin de consejero autoproxy. Ofrece el mismo mrito de configuracin coherente y evitar la duplicacin como BeanNameAutoProxyCreator . El uso de este mecanismo consiste en:

Especificacin de un DefaultAdvisorAutoProxyCreator definicin de frijol. Especificar cualquier nmero de asesores en los contextos idnticos o similares. Tenga en cuenta que estos deben ser consejeros no slo interceptores o consejos de otros. Esto es necesario porque debe haber un punto de corte para evaluar, para comprobar la elegibilidad de cada consejo a las definiciones de frijol candidatos.

El DefaultAdvisorAutoProxyCreator evaluar automticamente el punto de corte que contiene cada consejero, para ver lo que (en su caso) el asesoramiento que debe aplicarse a cada objeto de negocio (por ejemplo, "businessObject1" y "businessObject2" en el ejemplo). Esto significa que cualquier nmero de asesores se pueden aplicar automticamente a cada objeto de negocio. Si no hay ningn punto de corte en cualquiera de los consejeros coincide con cualquier mtodo en un objeto de negocio, el objeto no ser proxy. Como las definiciones de frijol se agregan los objetos de negocio, automticamente por el proxy si es necesario. Autoproxying en general tiene la ventaja de hacer que sea imposible para las personas que llaman o dependencias para obtener un objeto des-aconsejable. Calling getBean ("businessObject1") en este ApplicationContext volver un proxy AOP, no el objeto de negocio objetivo. (El "grano de interior" idioma mostrado anteriormente tambin ofrece este beneficio.)

<bean class = "org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCr eator" /> <bean class = "org.springframework.transaction.interceptor.TransactionAttributeSourc eAdvisor"> <propiedad nombre = "transactionInterceptor" ref = "transactionInterceptor" /> </ Bean> <bean id = "customAdvisor" class = "com.mycompany.MyAdvisor" /> <bean id = "businessObject1" class = "com.mycompany.BusinessObject1"> <- Propiedades omitido -> </ Bean> <bean id = "businessObject2" class = "com.mycompany.BusinessObject2" />

El DefaultAdvisorAutoProxyCreator es muy til si desea aplicar el mismo consejo constantemente a los objetos de muchos negocios. Una vez que las definiciones de infraestructura estn en su lugar, puede simplemente agregar nuevos objetos de negocio sin incluir configuracin de proxy especfico. Tambin puede dejar en aspectos adicionales muy fcilmente - por ejemplo, la localizacin o los aspectos de supervisin del rendimiento - con cambios mnimos en la configuracin. El DefaultAdvisorAutoProxyCreator ofrece soporte para el filtrado (utilizando una convencin de nomenclatura de modo que slo ciertos asesores se evalan, permitiendo el uso de mltiples, configuradas de forma diferente, AdvisorAutoProxyCreators en la misma fbrica) y el pedido. Los consejeros pueden implementar la org.springframework.core.Ordered interfaz para efectuar correctamente un pedido si esto es un problema. El TransactionAttributeSourceAdvisor utilizado en el ejemplo anterior tiene un valor de orden configurable, la configuracin por defecto no est ordenado.
AbstractAdvisorAutoProxyCreator

Esta es la superclase de DefaultAdvisorAutoProxyCreator. Usted puede crear sus propios creadores AutoProxy por medio de subclases esta clase, en el improbable caso de que las definiciones asesor ofrecemos la personalizacin insuficiente para el comportamiento de la estructura DefaultAdvisorAutoProxyCreator .
10.9.2 Uso de metadatos basada en auto-proxy

Un tipo particularmente importante de autoproxying es impulsado por los metadatos. Esto produce un modelo de programacin similar a NET. ServicedComponents . En lugar de utilizar descriptores de despliegue XML como en EJB, la configuracin para la gestin de transacciones y otros servicios de la empresa se lleva a cabo en los atributos de nivel de fuente. En este caso, se utiliza el DefaultAdvisorAutoProxyCreator , en combinacin con los Asesores que entienden los atributos de metadatos. Los detalles especficos de

metadatos se llevan a cabo en la parte de punto de corte de los asesores candidatos, en lugar de en la clase creacin autoproxy s mismo. Esto es realmente un caso especial de la DefaultAdvisorAutoProxyCreator , pero merece consideracin por s sola. (El cdigo de metadatos es consciente de los puntos de corte que figuran en los asesores, no en el marco AOP s mismo.) El /attributes directorio de la aplicacin de ejemplo JPetStore muestra el uso del atributo impulsada autoproxying. En este caso, no hay necesidad de utilizar el TransactionProxyFactoryBean . Basta con definir los atributos de transaccin en los objetos de negocio es suficiente, debido a la utilizacin de metadatos conscientes puntos de corte. Las definiciones de frijol incluir el siguiente cdigo en /WEBINF/declarativeServices.xml . Tenga en cuenta que este es genrico y puede ser utilizado fuera del JPetStore:
<bean class = "org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCr eator" /> <bean class = "org.springframework.transaction.interceptor.TransactionAttributeSourc eAdvisor"> <propiedad nombre = "transactionInterceptor" ref = "transactionInterceptor" /> </ Bean> <Bean id = "TransactionInterceptor" class = "org.springframework.transaction.interceptor.TransactionInterceptor"> <propiedad nombre = "transactionManager" ref = "transactionManager" /> <propiedad nombre = "transactionAttributeSource"> <bean class = "org.springframework.transaction.interceptor.AttributesTransactionAttr ibuteSource"> <propiedad nombre = "attributes" ref = "attributes" /> </ Bean> </ Propiedad> </ Bean> <bean id = "attributes" class = "org.springframework.metadata.commons.CommonsAttributes" />

El DefaultAdvisorAutoProxyCreator definicin de frijol (el nombre no es importante, por lo que incluso puede ser omitido) recoger todos los puntos de corte admisibles en el contexto de la aplicacin actual. En este caso, la "transactionAdvisor" grano de definicin, de tipo TransactionAttributeSourceAdvisor , se aplicarn a las clases o los mtodos que llevan un atributo de transaccin. El TransactionAttributeSourceAdvisor depende de una TransactionInterceptor, a travs de la dependencia constructor. El ejemplo resuelve esta va autowiring. El AttributesTransactionAttributeSource depende de una implementacin de la org.springframework.metadata.Attributes interfaz. En este fragmento, el "atributos" bean satisface este, usando el Jakarta Commons atributos API para obtener la informacin de atributos. (El cdigo de la aplicacin debe haber sido compilado con la tarea Atributos Comunes de compilacin.)

El /annotation del directorio de la aplicacin de ejemplo JPetStore contiene un ejemplo anlogo para auto-proxy impulsados por JDK 1.5 + anotaciones. La siguiente configuracin permite la deteccin automtica de Spring Transactional anotacin, lo que lleva a los poderes implcitos para los granos que contengan dicha anotacin:
<bean class = "org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCr eator" /> <bean class = "org.springframework.transaction.interceptor.TransactionAttributeSourc eAdvisor"> <propiedad nombre = "transactionInterceptor" ref = "transactionInterceptor" /> </ Bean> <Bean id = "TransactionInterceptor" class = "org.springframework.transaction.interceptor.TransactionInterceptor"> <propiedad nombre = "transactionManager" ref = "transactionManager" /> <propiedad nombre = "transactionAttributeSource"> <bean class = "org.springframework.transaction.annotation.AnnotationTransactionAttri buteSource" /> </ Propiedad> </ Bean>

El TransactionInterceptor define aqu depende de una PlatformTransactionManager definicin, que no se incluye en el archivo genrico (aunque podra ser), ya que ser especfica para requisitos de las transacciones de la aplicacin (tpicamente JTA, como en este ejemplo, o Hibernate, JDO o JDBC) :
<Bean id = "TransactionManager" class = "org.springframework.transaction.jta.JtaTransactionManager" />

Punta

Si requiere una administracin nica transaccin declarativa, utilizando estas definiciones XML genricos se traducir en la primavera de proxy automticamente todas las clases o los mtodos con los atributos de transaccin. Usted no tendr que trabajar directamente con AOP, y el modelo de programacin es similar a la de. ServicedComponents NET. Este mecanismo es extensible. Es posible hacer autoproxying basa en los atributos personalizados. Usted necesita:

Definir el atributo personalizado. Especifique un asesor con el asesoramiento necesario, incluyendo un punto de corte que se desencadena por la presencia del atributo personalizado en una clase o mtodo. Usted puede ser capaz de utilizar un consejo existente, simplemente la implementacin de un punto de corte esttico que toma el atributo personalizado.

Es posible que esos asesores que ser nico para cada clase aconseja (por ejemplo, mixins): simplemente tienen que ser definidos como prototipo, en lugar de singleton, las definiciones de frijol. Por ejemplo, la LockMixin interceptor introduccin del conjunto de pruebas de primavera, que se muestra ms arriba, podra ser usado en conjuncin con un punto de corte atributo orientado para dirigir un mixin, como se muestra aqu. Nosotros usamos el genrico DefaultPointcutAdvisor , configurado mediante las propiedades JavaBean:
<Bean id = "lockMixin" class = "org.springframework.aop.LockMixin" scope = "prototype" /> <Bean id = "lockableAdvisor" class = "org.springframework.aop.support.DefaultPointcutAdvisor" scope = "prototipo"> <propiedad nombre = "pointcut" ref = "myAttributeAwarePointcut" /> <propiedad nombre = "advice" ref = "lockMixin" /> </ Bean> <Bean id = "anyBean" class = "anyclass" ...

Si el punto de corte atributo consciente coincide cualquier mtodo en la anyBean definiciones de frijol o de otro tipo, el mixin se aplicar. Tenga en cuenta que ambos lockMixin y lockableAdvisor definiciones son prototipos. El myAttributeAwarePointcut pointcut puede ser una definicin singleton, ya que no se mantiene el estado para que los distintos objetos aconseja.

10.10 Con TargetSources


Spring ofrece el concepto de un TargetSource, expresada en la org.springframework.aop.TargetSource interfaz. Esta interfaz es responsable de devolver el "objeto destino" de aplicacin el punto de unin. El TargetSource aplicacin se le pide una instancia de destino cada vez que el proxy AOP maneja una invocacin del mtodo. Los desarrolladores que utilizan Spring AOP normalmente no necesitan trabajar directamente con TargetSources, pero este es un medio poderoso de apoyar la puesta en comn, objetivos intercambiables en caliente sofisticados y otros. Por ejemplo, una agrupacin de TargetSource puede devolver una instancia de destino diferente para cada invocacin, utilizando una agrupacin para administrar instancias. Si no se especifica un TargetSource, una implementacin por defecto se usa que envuelve un objeto local. El mismo objetivo se devuelve para cada invocacin (como cabra esperar). Echemos un vistazo a las fuentes de destino estndar proporcionados con la primavera, y cmo puede utilizarlos.
Punta

Cuando se utiliza una fuente de destino personalizada, el objetivo general tendr que ser un prototipo y no una definicin singleton frijol. Esto permite que la

primavera para crear una instancia nueva meta cuando sea necesario.
10.10.1 fuentes calientes objetivo intercambiable

El org.springframework.aop.target.HotSwappableTargetSource existe para permitir que el objetivo de un proxy AOP para activarse al mismo tiempo a las personas que llaman a mantener sus referencias a la misma. El cambio de destino de la fuente de destino tiene lugar inmediatamente. El HotSwappableTargetSource es multi-hilo. Se puede cambiar el destino por medio del swap() mtodo en HotSwappableTargetSource de la siguiente manera:
HotSwappableTargetSource swapper = (HotSwappableTargetSource) beanFactory.getBean ("intercambiador"); Objeto oldTarget = swapper.swap (newTarget);

Las definiciones XML requiere tener el siguiente aspecto:


<bean id = "initialTarget" class = "mycompany.OldTarget" /> <bean id = "swapper" class = "org.springframework.aop.target.HotSwappableTargetSource"> <constructor-arg ref = "initialTarget" /> </ Bean> <bean id = "swappable" class = "org.springframework.aop.framework.ProxyFactoryBean"> <propiedad nombre = "targetSource" ref = "swapper" /> </ Bean>

Lo anterior swap() llamada cambia el destino del grano de intercambio activo. Los clientes que posean una referencia a que el frijol no sern conscientes del cambio, pero inmediatamente se empieza a golpear el nuevo objetivo. Aunque en este ejemplo no aade ningn consejo - y no es necesario aadir consejo de usar un TargetSource - por supuesto cualquier TargetSource se puede utilizar en conjuncin con el asesoramiento arbitraria.
10.10.2 Puesta en comn de fuentes de destino

Uso de una fuente objetivo agrupacin proporciona un modelo de programacin similar a EJBs de sesin sin estado, en el que un grupo de instancias idnticas se mantiene, con invocaciones del mtodo va a objetos libres en la piscina. Una diferencia crucial entre la primavera de puesta en comn y la puesta en comn SLSB es que la primavera la puesta en comn se puede aplicar a cualquier POJO. Como con el resorte en general, este servicio se puede aplicar de una manera no invasiva.

Spring ofrece fuera de la caja de apoyo a Jakarta Commons piscina 1.3, que proporciona una implementacin de la agrupacin bastante eficiente. Usted necesitar el tarro commons-pool en classpath de la aplicacin para utilizar esta funcin. Tambin es posible crear subclases org.springframework.aop.target.AbstractPoolingTargetSource para apoyar cualquier otra agrupacin de API. Ejemplo de configuracin se muestra a continuacin:
<Bean id = "businessObjectTarget" class = "com.mycompany.MyBusinessObject" scope = "prototipo"> ... propiedades omitidas </ Bean> <bean id = "poolTargetSource" class = "org.springframework.aop.target.CommonsPoolTargetSource"> <propiedad nombre = valor = "targetBeanName" "businessObjectTarget" /> <propiedad nombre = valor = "maxSize" "25" /> </ Bean> <bean id = "businessObject" class = "org.springframework.aop.framework.ProxyFactoryBean"> <propiedad nombre = "targetSource" ref = "poolTargetSource" /> <propiedad nombre = valor = "interceptorNames" "myInterceptor" /> </ Bean>

Tenga en cuenta que el objeto de destino - "businessObjectTarget" en el ejemplo - debe ser un prototipo. Esto permite que el PoolingTargetSource aplicacin para crear nuevas instancias de la meta de hacer crecer la piscina si es necesario. Ver el javadoc para AbstractPoolingTargetSource y la subclase concreta que desee utilizar para obtener informacin sobre sus propiedades: "MAXSIZE" es el ms bsico, y siempre se garantiza para estar presentes. En este caso, "myInterceptor" es el nombre de un interceptor que sera necesario definir en el mismo contexto de IoC. Sin embargo, no es necesario especificar interceptores de usar la agrupacin. Si desea que slo la puesta en comn, y ningn otro consejo, no establezca la propiedad interceptorNames en absoluto. Es posible configurar Spring para que sea capaz de lanzar cualquier objeto agrupado a la org.springframework.aop.target.PoolingConfig interfaz, que expone informacin sobre el tamao y la configuracin actual de la piscina a travs de una introduccin. Tendr que definir un asesor de la siguiente manera:
<propiedad nombre = "targetObject" ref = "poolTargetSource" /> <propiedad nombre = valor = "targetMethod" "getPoolingConfigMixin" /> </ Bean>

Este asesor se obtiene llamando a un mtodo de conveniencia en el AbstractPoolingTargetSource clase, de ah el uso de MethodInvokingFactoryBean. El nombre de este asesor ("poolConfigAdvisor" aqu) debe estar en la lista de nombres de interceptores en el ProxyFactoryBean exponiendo el objeto agrupado.

El reparto se ver de la siguiente manera:


PoolingConfig conf = (PoolingConfig) beanFactory.getBean ("BusinessObject"); System.out.println ("Tamao mximo de la piscina es" + conf.getMaxSize ());

Nota

Agrupacin de objetos sin estado de servicio no suele ser necesario. No creemos que debera ser la opcin por defecto, como la mayora de los objetos sin estado son, naturalmente, hilo de seguridad, y la instancia de puesta en comn es problemtico si los recursos se almacenan en cach. Simplificacin de la agrupacin est disponible utilizando autoproxying. Es posible ajustar el TargetSources utilizado por cualquier creador autoproxy.
10.10.3 fuentes prototipo de destino

La creacin de un "prototipo" fuente de destino es similar a una puesta en comn TargetSource. En este caso, una nueva instancia de la meta se crear en cada invocacin del mtodo. Aunque el costo de la creacin de un nuevo objeto no es muy alta en un moderno JVM, el costo de cableado hasta el nuevo objeto (la satisfaccin de sus dependencias COI) pueden ser ms caros. Por lo tanto usted no debe usar este mtodo sin razn muy buena. Para ello, se podra modificar el poolTargetSource definicin se muestra arriba de la siguiente manera. (Tambin he cambiado el nombre, para mayor claridad.)
<bean id = "prototypeTargetSource" class = "org.springframework.aop.target.PrototypeTargetSource"> <propiedad nombre = "targetBeanName" ref = "businessObjectTarget" /> </ Bean>

Slo hay una propiedad: el nombre del bean de destino. La herencia se utiliza en las implementaciones TargetSource para asegurar nomenclatura coherente. Al igual que con la fuente objetivo comn, la haba de destino debe ser una definicin de bean prototipo.
10.10.4 ThreadLocal fuentes de destino
ThreadLocal

fuentes destinatarios son tiles si usted necesita un objeto que se crea para cada solicitud entrante (por hilo que es). El concepto de un ThreadLocal proporcionar una instalacin de JDK-gama para almacenar de forma transparente recursos junto con un hilo. La creacin de un ThreadLocalTargetSource es ms o menos la misma que se explic para los otros tipos de fuente deseado:
<bean id = "threadlocalTargetSource" class = "org.springframework.aop.target.ThreadLocalTargetSource"> <propiedad nombre = valor = "targetBeanName" "businessObjectTarget" /> </ Bean>

Nota

ThreadLocals vienen con problemas graves (potencialmente resultando en prdidas de memoria) cuando no es correctamente utilizando en entornos multi-hilo y multicargador de clases. Siempre hay que considerar envolver un ThreadLocal de alguna otra clase y nunca directamente utilice el ThreadLocal s mismo (excepto, por supuesto, en la clase de contenedor). Tambin, uno debe recordar siempre para configurar correctamente y unset (cuando este ltimo slo afectaron a una llamada a ThreadLocal.set(null) ) el recurso local al hilo. La desconexin se debe hacer en cualquier caso, ya no desconexin que podra resultar en un comportamiento problemtico. Apoyo ThreadLocal primavera hace esto para usted y debe considerarse siempre en favor de la utilizacin de otro tipo de cdigo ThreadLocals sin manejo adecuado.

10.11 Definicin de nuevos Advice tipos


Spring AOP est diseado para ser extensible. Si bien la estrategia de implementacin intercepcin en la actualidad se usa internamente, es posible admitir tipos arbitrarios asesoramiento, adems de la interceptacin fuera de la caja alrededor de consejo, antes, arroja asesoramiento y consejo a su regreso. El org.springframework.aop.framework.adapter paquete es un paquete de SPI que permite soporte para nuevos tipos de consejos personalizados que aadir sin cambiar la estructura del ncleo. La nica limitacin en una costumbre Advice tipo es que se debe implementar el org.aopalliance.aop.Advice interfaz tag. Por favor refirase a la org.springframework.aop.framework.adapter Javadocs paquete para obtener ms informacin.

10,12 Otros recursos


Por favor refirase a las aplicaciones de primavera de la muestra para otros ejemplos de Spring AOP:

La configuracin por defecto de JPetStore ilustra el uso de la TransactionProxyFactoryBean para la gestin de transacciones declarativa. El /attributes de directorio del JPetStore muestra el uso del atributo impulsado por la gestin de transacciones declarativa.

11. Pruebas 11.1 Introduccin a las pruebas de primavera


Las pruebas son una parte integral del desarrollo de software empresarial. Este captulo se centra en el valor aadido del principio de la COI para las pruebas unitarias y de los beneficios del apoyo Spring Framework para las pruebas de integracin . (Un

tratamiento exhaustivo de las pruebas en la empresa est ms all del alcance de este manual de referencia.)

11.2 Pruebas unitarias


Inyeccin de Dependencia debe hacer que su cdigo sea menos dependiente del recipiente de lo que sera con el tradicional desarrollo de Java EE. Los POJOs que componen la aplicacin debe ser comprobable en JUnit o pruebas TestNG, con objetos simplemente se crea con el new operador, sin Spring o cualquier otro recipiente. Puede utilizar los objetos de imitacin (en combinacin con otras tcnicas de anlisis de valor) para probar su cdigo en forma aislada. Si usted sigue las recomendaciones de la arquitectura para la primavera, la estratificacin resultante limpia y modularidad de su cdigo base facilitar ms fcil las pruebas unitarias. Por ejemplo, usted puede probar los objetos de servicio de capa de tropezar o burlarse de interfaces de DAO o depsito, sin necesidad de acceder a datos persistentes durante la ejecucin de pruebas unitarias. Verdaderas pruebas unitarias suelen correr muy rpidamente, ya que no existe una infraestructura de tiempo de ejecucin de configurar. Haciendo hincapi en verdaderas pruebas unitarias como parte de su metodologa de desarrollo, aumentar su productividad. Puede que no necesite esta seccin del captulo de pruebas para ayudarle a escribir las pruebas unitarias eficaces para sus aplicaciones basadas en la COI. Para ciertos escenarios de pruebas unitarias, sin embargo, el Spring Framework proporciona los siguientes objetos simulados y clases de pruebas de apoyo.
11.2.1 Objetos Mock Medio ambiente

El org.springframework.mock.env paquete contiene implementaciones simuladas del Environment y PropertySource abstracciones introducidas en la primavera de 3,1 (ver Seccin 3.3, "Abstraccin Medio Ambiente" y Seccin 3.4, "Abstraccin PropertySource" ). MockEnvironment y MockPropertySource son tiles para el desarrollo fuera contenedores de pruebas para el cdigo que depende de las propiedades especficas del entorno.
JNDI

El org.springframework.mock.jndi paquete contiene una implementacin de la SPI de JNDI, que se puede utilizar para crear un sencillo entorno JNDI para bancos de pruebas o aplicaciones independientes. Si, por ejemplo, JDBC DataSource s conseguir unido a los mismos nombres JNDI en el cdigo de prueba como dentro de un contenedor Java EE, se puede reutilizar tanto el cdigo de aplicacin y la configuracin de las pruebas de escenarios sin modificacin.
Servlet API

El org.springframework.mock.web paquete contiene un conjunto completo de API Servlet objetos de imitacin, dirigido a su uso con framework Spring Web MVC, que son tiles para probar contextos web y controladores. Estos objetos de imitacin son

generalmente ms conveniente de usar que los objetos de imitacin dinmicos tales como EasyMock o existentes Servlet objetos de la API simuladas como MockObjects .
Portlet API

El org.springframework.mock.web.portlet paquete contiene un conjunto de API de portlet objetos de imitacin, dirigidos a su uso con Portlet Spring Framework MVC.
11.2.2 Unidad de prueba Clases de apoyo Utilidades Generales

El org.springframework.test.util paquete contiene ReflectionTestUtils , que es una coleccin de mtodos de utilidad basados en la reflexin. Los desarrolladores utilizan estos mtodos en los escenarios de pruebas unitarias y de integracin en el que se necesita para crear un no- public o invocar un campo no public mtodo setter al probar el cdigo de aplicacin que implica, por ejemplo:

ORM marcos como JPA y Hibernate que aconseja private o protected el acceso de campo en lugar de public mtodos setter para las propiedades de una entidad de dominio. Soporte de Spring para anotaciones como @Autowired , @Inject y @Resource, que proporciona la inyeccin de dependencia para private o protected campos, mtodos setter y los mtodos de configuracin.

Spring MVC

El org.springframework.test.web paquete contiene ModelAndViewAssert , que se puede utilizar en combinacin con JUnit, TestNG, o cualquier otro framework de pruebas para las pruebas unitarias que se ocupan de Spring MVC ModelAndView objetos.
Pruebas unitarias Spring MVC Controladores

Para probar el Spring MVC Controller s, use ModelAndViewAssert combinado con MockHttpServletRequest , MockHttpSession , y as sucesivamente de la org.springframework.mock.web paquete.

11.3 Pruebas de Integracin


11.3.1 Visin general

Es importante ser capaz de realizar algunas pruebas de integracin sin necesidad de implantacin en el servidor de aplicacin o la conexin a la infraestructura de otra empresa. Esto le permitir poner a prueba las cosas tales como:

El cableado correcto de sus contextos contenedor Spring IoC.

Acceso a los datos utilizando JDBC o una herramienta ORM. Esto incluye cosas tales como la correccin de las sentencias SQL, consultas Hibernate, las asignaciones de entidad JPA, etc

El Spring Framework proporciona soporte de primera clase para las pruebas de integracin en la spring-test mdulo. El nombre del archivo JAR real podra incluir la versin de lanzamiento y tambin podra ser en el largo org.springframework.test forma, dependiendo de donde se obtiene a partir de (ver la seccin sobre gestin de la dependencia para una explicacin). Esta biblioteca incluye la org.springframework.test paquete, que contiene clases valiosos para las pruebas de integracin con un contenedor de Spring. Esta prueba no se basa en un servidor de aplicacin o entorno de despliegue de otro. Estas pruebas son ms lentos para ejecutar las pruebas unitarias que pero mucho ms rpido que las pruebas de Cactus equivalentes o pruebas remotas que dependen de la implementacin en un servidor de aplicaciones. En la primavera de 2,5 y ms tarde, la unidad de apoyo y pruebas de integracin se proporciona en la forma de la anotacin impulsada Spring TestContext marco . El marco TestContext es agnstico del marco de prueba real en uso, permitiendo as que la instrumentacin de pruebas en diversos entornos incluyendo JUnit, TestNG, y as sucesivamente.
JUnit 3,8 apoyo est en desuso

A partir de Spring 3.0, el legado JUnit 3.8 jerarqua de clases base (es decir, AbstractDependencyInjectionSpringContextTests , AbstractTransactionalDataSourceSpringContextTests , etc) est oficialmente obsoleto y se quitar en una versin posterior. Cualquier clase de prueba basados en el cdigo deben migrar a la Spring Framework TestContext . A partir de primavera de 3,1, los 3,8 JUnit clases base en el Spring Framework TestContext (es decir, AbstractJUnit38SpringContextTests y AbstractTransactionalJUnit38SpringContextTests ) y @ExpectedException han sido oficialmente obsoleto y se quitar en una versin posterior. Cualquier clase de prueba basados en el cdigo deben migrar al JUnit 4 o TestNG apoyo proporcionado por el Spring Framework TestContext . Del mismo modo, los mtodos de ensayo anotado con @ExpectedException debe ser modificado para utilizar el soporte integrado para las excepciones previstas en JUnit y TestNG.
11.3.2 Metas de Pruebas de Integracin

Soporte de Spring pruebas de integracin tiene como objetivos principales los siguientes:

Para gestionar el almacenamiento en cach de primavera contenedor IoC entre la ejecucin de prueba. Para proporcionar la inyeccin de dependencia de las instancias de soporte del ensayo . Para proporcionar la administracin de transacciones apropiado a las pruebas de integracin.

Para suministrar especficos Primavera-clases base que ayudan a los desarrolladores a escribir las pruebas de integracin.

Las siguientes secciones describen cada meta y proporcionar enlaces a la aplicacin y detalles de configuracin.
Contexto y almacenamiento en cach

La primavera TestContext marco proporciona una carga constante de resorte ApplicationContext s y WebApplicationContext s, as como el almacenamiento en cach de esos contextos. Soporte para el almacenamiento en cach de contextos cargados es importante, ya que el tiempo de inicio puede convertirse en un problema no a causa de la sobrecarga de la primavera en s, sino porque los objetos instanciados por el contenedor Spring tener tiempo para crear una instancia. Por ejemplo, un proyecto con 50 a 100 archivos de mapeo de Hibernate puede tardar de 10 a 20 segundos para cargar los archivos de asignacin y de incurrir en ese costo antes de ejecutar cada prueba en cada dispositivo de prueba conduce a ms lentas las ejecuciones de prueba generales que reducen la productividad del desarrollador. Las clases de prueba suele declarar ya sea una serie de lugares de recursos para los metadatos de configuracin XML - a menudo en la ruta de clases - o un conjunto de clases anotadas que se utiliza para configurar la aplicacin. Estas ubicaciones o clases son los mismos o similares a los especificados en web.xml archivos de configuracin o de otro tipo de implementacin. De forma predeterminada, una vez instalada, la configuracin ApplicationContext se vuelve a utilizar para cada prueba. As, el coste de instalacin se incurre una sola vez por cada conjunto de pruebas, y la ejecucin de la prueba posterior es mucho ms rpido. En este contexto, el conjunto de pruebas trmino significa todas las pruebas se ejecutan en la misma JVM - por ejemplo, todas las pruebas se ejecutan desde una Ant, Maven, o construir Gradle para un determinado proyecto o mdulo. En el caso poco probable de que una prueba corrompe el contexto de la aplicacin y requiere volver a cargar - por ejemplo, mediante la modificacin de una definicin de bean o el estado de un objeto de aplicacin - el marco TestContext se puede configurar para volver a cargar la configuracin y reconstruir el contexto de la aplicacin antes de ejecutar el siguiente prueba. Vea gestin de contexto y almacenamiento en cach con el marco TestContext .
Inyeccin de Dependencia de accesorios de prueba

Cuando el marco TestContext carga su contexto de aplicacin, de manera opcional, puede configurar las instancias de las clases de la prueba a travs de la inyeccin de dependencias. Esto proporciona un mecanismo conveniente para la creacin de accesorios de prueba utilizando frijoles preconfigurados de su contexto de aplicacin. Un gran beneficio es que se puede reutilizar contextos de aplicacin a travs de escenarios de pruebas diferentes (por ejemplo, para la configuracin gestionados por Spring-grficos de objetos, poderes transaccionales, DataSource s, etc), evitando as la necesidad de duplicar la configuracin compleja instalacin de prueba para los casos de prueba individuales .

Como ejemplo, considere la situacin donde tenemos una clase, HibernateTitleRepository , que implementa la lgica de acceso a datos para un Title entidad de dominio. Queremos escribir pruebas de integracin que ponen a prueba las siguientes reas:

La configuracin de Spring: bsicamente, es todo lo relacionado con la configuracin de la HibernateTitleRepository frijol correcta y actual? El mapeo Hibernate Archivo de configuracin: todo est asignado correctamente, y son los correctos ajustes de carga diferida en el lugar? La lgica de la HibernateTitleRepository : la instancia configurada de esta clase funcione como previsto?

Ver inyeccin de dependencias de accesorios de prueba con el marco TestContext .


Gestin de transacciones

Un tema comn en las pruebas que acceden a una base de datos real es su efecto sobre el estado del almacn de persistencia. Incluso cuando usted est utilizando una base de datos de desarrollo, los cambios en el estado puede afectar las pruebas futuras. Adems, muchas de las operaciones - tales como la insercin o la modificacin de los datos persistentes - no puede realizarse (o verificadas) fuera de una transaccin. El marco TestContext aborda esta cuestin. De forma predeterminada, el marco crear y deshacer una transaccin para cada prueba. Slo tiene que escribir el cdigo que puede suponer la existencia de una transaccin. Si se llama a objetos transaccionalmente proxy en las pruebas, se comportarn correctamente, de acuerdo a sus configurados semntica transaccional. Adems, si un mtodo de prueba borra el contenido de las tablas seleccionadas mientras se ejecuta dentro de la transaccin gestionada para la prueba, la transaccin se deshar por defecto, y la base de datos volver a su estado anterior a la ejecucin de la prueba. Soporte transaccional se proporciona a travs de una prueba de un PlatformTransactionManager bean define en el contexto de aplicacin de la prueba. Si quieres una transaccin de cometer - inusual, pero til en ocasiones cuando se desea una prueba en particular para rellenar o modificar la base de datos - el marco TestContext puede ser instruido para hacer que la transaccin se confirme en vez de hacer retroceder a travs de la @TransactionConfiguration y @Rollback anotaciones . Ver la gestin de transacciones con el marco TestContext .
Las clases de apoyo para las pruebas de integracin

El Spring Framework proporciona varias TestContext abstract clases de apoyo que facilitan la escritura de pruebas de integracin. Estas clases de prueba de base proporcionan enlaces bien definidos en el marco de pruebas, as como las variables de instancia y los mtodos convenientes, que le permiten acceder a:

El ApplicationContext , para realizar bsquedas explcitas de frijol o probar el estado del contexto en su conjunto.

A JdbcTemplate , para ejecutar sentencias SQL para consultar la base de datos. Dichas consultas se pueden utilizar para confirmar el estado de base de datos, tanto antes como despus de la ejecucin de la base de datos relacionada con el cdigo de la aplicacin, y resorte garantiza que dichas consultas realizada en el mbito de la misma transaccin que el cdigo de aplicacin. Cuando se utiliza junto con una herramienta ORM, asegrese de evitar falsos positivos .

Adems, es posible que desee crear su propia aplicacin en toda la superclase con variables de instancia y los mtodos especficos de su proyecto. Ver las clases de apoyo para el marco TestContext .
11.3.3 Compatibilidad con JDBC Pruebas

El org.springframework.test.jdbc paquete contiene JdbcTestUtils , que es una coleccin de funciones de JDBC de utilidad relacionados con la intencin de simplificar escenarios de pruebas estndar de base de datos. Nota mtodos de conveniencia que delegar en JdbcTestUtils internamente. El spring-jdbc mdulo proporciona soporte para la configuracin y el lanzamiento de una base de datos integrada que se puede utilizar en pruebas de integracin que interactan con una base de datos. Para obtener ms informacin, consulte la Seccin 14.8, "Embedded soporte de base de datos" y Seccin 14.8.8, "Prueba de lgica de acceso a datos con una base de datos integrada" .
11.3.4 Anotaciones Anotaciones Primavera Pruebas

El Spring Framework proporciona el siguiente conjunto de determinadas Primaveraanotaciones que se pueden utilizar en la unidad y pruebas de integracin, en relacin con el marco TestContext. Consulte el Javadoc correspondiente para obtener informacin adicional, incluyendo los valores de atributos por defecto, alias atributos, y as sucesivamente.
@ContextConfiguration

Define a nivel de clase de metadatos que se utiliza para determinar cmo cargar y configurar un ApplicationContext para las pruebas de integracin. En concreto, @ContextConfiguration declara bien los recursos de aplicacin de contexto locations o las anotaciones classes que se utilizan para cargar el contexto. Ubicaciones de recursos suelen ser archivos XML de configuracin ubicados en la ruta de clases, mientras que, las clases anotadas suelen @Configuration clases. Sin embargo, la ubicacin de recursos tambin puede hacer referencia a los archivos del sistema de archivos y clases anotadas pueden ser clases de componentes, etc
@ ContextConfiguration ("/ test-config.xml")

XmlApplicationContextTests public class { / / Clase cuerpo ... } @ ContextConfiguration (clases = TestConfig. Clase) ConfigClassApplicationContextTests public class { / / Clase cuerpo ... }

Como alternativa o como complemento a las localizaciones de los recursos que declaran o clases anotadas, @ContextConfiguration pueden utilizarse para declarar ApplicationContextInitializer clases.
@ ContextConfiguration (inicializadores = CustomContextIntializer. Clase) ContextInitializerTests public class { / / Clase cuerpo ... } @ContextConfiguration opcionalmente se pueden usar para declarar el ContextLoader estrategia. Tenga en cuenta, sin embargo, que por lo general

no es necesario configurar explcitamente el cargador ya que el gestor de recursos, ya sea por defecto soporta locations o anotados classes , as como initializers .
@ ContextConfiguration (ubicaciones = "/ test-context.xml" loader = CustomContextLoader. Clase) CustomLoaderXmlApplicationContextTests public class { / / Clase cuerpo ... }

Nota
@ContextConfiguration

proporciona soporte para heredar ubicaciones de recursos o clases de configuracin, as como inicializadores contexto declarados por superclases de forma predeterminada. Ver la gestin y el almacenamiento en cach de contexto y el Javadoc para @ContextConfiguration para ms detalles.
@WebAppConfiguration

Una anotacin de nivel de clase que se utiliza para declarar que el ApplicationContext cargado para una prueba de integracin debe ser un WebApplicationContext . La mera presencia de @WebAppConfiguration en una clase de prueba asegura que un WebApplicationContext se carga de la prueba, utilizando el valor por defecto de "file:src/main/webapp" para la ruta a la raz de la aplicacin web (es decir, el recurso ruta de la base). La ruta de la base de recursos se utiliza detrs de las escenas para crear un MockServletContext que sirve de ServletContext para la prueba de WebApplicationContext .
@ ContextConfiguration @ WebAppConfiguration WebAppTests public class {

/ / Clase cuerpo ... }

Para reemplazar el valor predeterminado, especifique una ruta diferente a travs de la base de recursos de la implcita value de atributo. Tanto classpath: y file: prefijos recursos son compatibles. Si no hay ningn recurso prefijo se suministra el camino se supone que es un recurso de sistema de archivos.
@ ContextConfiguration @ WebAppConfiguration ("classpath: test-web-recursos") WebAppTests public class { / / Clase cuerpo ... }

Tenga en cuenta que @WebAppConfiguration debe ser usado en conjuncin con @ContextConfiguration , ya sea dentro de una clase de prueba nico o dentro de una jerarqua de clases de prueba. Consulte el Javadoc para @WebAppConfiguration para ms detalles.
@ActiveProfiles

Una anotacin de nivel de clase que se utiliza para declarar que haba perfiles definicin debera estar activa cuando se carga un ApplicationContext para las clases de prueba.
@ ContextConfiguration @ ActiveProfiles ("dev") DeveloperTests public class { / / Clase cuerpo ... } @ ContextConfiguration @ ActiveProfiles ({"dev", "integracin"}) DeveloperIntegrationTests public class { / / Clase cuerpo ... }

Nota
@ActiveProfiles

proporciona soporte para heredar perfiles activos definicin de frijol declarados por superclases de forma predeterminada. Ver configuracin de contexto con los perfiles del entorno y el Javadoc para @ActiveProfiles para ver ejemplos y ms detalles.
@DirtiesContext

Indica que el subyacente Spring ApplicationContext se ha ensuciado (es decir, modificada o daado de alguna manera) durante la ejecucin de una prueba y debera estar cerrado, independientemente de si ha pasado la prueba. @DirtiesContext se apoya en los siguientes escenarios:
o

Despus de la clase de prueba actual, cuando se declaran en una clase con el modo de clase establecido en AFTER_CLASS , que es el modo por defecto de clase.

Despus de cada mtodo en la clase de prueba actual, cuando se declaran en una clase con el modo de clase establecido en
AFTER_EACH_TEST_METHOD.

Despus de la prueba actual, cuando declar en un mtodo.

Utilice esta anotacin Si una prueba ha modificado el contexto (por ejemplo, mediante la sustitucin de una definicin de bean). Pruebas posteriores se suministran un nuevo contexto. Con JUnit 4.5 + o TestNG puede utilizar @DirtiesContext tanto como un nivel de clase y de nivel de mtodo anotacin dentro de la clase misma prueba. En tales escenarios, el ApplicationContext se marca como sucia despus de cualquiera de estos mtodos anotados, as como despus de toda la clase. Si el ClassMode se establece AFTER_EACH_TEST_METHOD , el contexto est marcado como sucio despus de cada mtodo en la clase.
@ DirtiesContext ContextDirtyingTests public class { / / Algunas de las pruebas que se traducen en el contenedor Spring est ensuciado } @ DirtiesContext (classMode = ClassMode.AFTER_EACH_TEST_METHOD) ContextDirtyingTests public class { / / Algunas de las pruebas que se traducen en el contenedor Spring est ensuciado } @ DirtiesContext @ Test testProcessWhichDirtiesAppCtx public void () { / / Alguna lgica que resulta en el contenedor Spring est ensuciado }

Cuando un contexto de aplicacin se marca como sucio, es eliminado de la cach del marco de pruebas y cerrado, por lo que el contenedor Spring subyacente se vuelve a generar para cualquier prueba posterior que requiere un contexto con el mismo conjunto de ubicaciones de recursos.
@TestExecutionListeners

Define la clase de metadatos de nivel para la configuracin que TestExecutionListener s deben estar registrados en el TestContextManager . Tpicamente, @TestExecutionListeners se utiliza en conjuncin con @ContextConfiguration .
@ ContextConfiguration @ TestExecutionListeners ({CustomTestExecutionListener. Clase, AnotherTestExecutionListener. Clase}) CustomTestExecutionListenerTests public class { / / Clase cuerpo ... }

@TestExecutionListeners

apoya oyentes heredados por defecto. Consulte el Javadoc para un ejemplo y obtener ms informacin.
@TransactionConfiguration

Define la clase de metadatos de nivel para la configuracin de las pruebas transaccionales. Especficamente, el nombre de la haba PlatformTransactionManager que se debe utilizar para impulsar las transacciones se puede especificar explcitamente si hay granos mltiples de tipo PlatformTransactionManager en la prueba de ApplicationContext y si el nombre de la haba deseado PlatformTransactionManager no es "TransactionManager". Adems, puede cambiar el defaultRollback bandera false . Tpicamente, @TransactionConfiguration se utiliza en conjuncin con @ContextConfiguration .
@ ContextConfiguration @ TransactionConfiguration (TransactionManager = "txMgr", defaultRollback = false) CustomConfiguredTransactionalTests public class { / / Clase cuerpo ... }

Nota

Si las convenciones predeterminadas son suficientes para la configuracin de prueba, se puede evitar el uso de @TransactionConfiguration por completo. En otras palabras, si usted tiene slo una transaccin pesebre - o si usted tiene mltiples gestores de transacciones, pero el administrador de transacciones para las pruebas se denomina "TransactionManager" o especificado a travs de un TransactionManagementConfigurer - y si quieres transacciones para hacer retroceder de forma automtica, entonces no hay necesidad de anotar su clase de prueba con @TransactionConfiguration .
@Rollback

Indica si la transaccin por el mtodo de ensayo anotado debera deshacer despus el mtodo de prueba se ha completado. Si true , la transaccin se deshace de lo contrario, se confirma la transaccin. Utilice @Rollback para reemplazar la bandera de reversin predeterminada configurada en el nivel de clase.
@ Rollback (false) @ Test testProcessWithoutRollback public void () { / / ... } @BeforeTransaction

Indica que la anotada public void mtodo se debe ejecutar antes de una transaccin se inicia por los mtodos de prueba configuradas para ejecutarse dentro de una transaccin a travs del @Transactional anotacin.
@ BeforeTransaction beforeTransaction public void () { / / La lgica que se ejecuta antes de una transaccin se inicia } @AfterTransaction

Indica que la anotada public void mtodo debe ser ejecutado despus de una transaccin ha terminado para los mtodos de prueba configuradas para ejecutarse dentro de una transaccin a travs del @Transactional anotacin.
@ AfterTransaction afterTransaction public void () { / / La lgica para ser ejecutado despus de una transaccin ha terminado } @NotTransactional

La presencia de esta anotacin indica que el mtodo de ensayo anotado no deben ejecutar en un contexto transaccional.
@ NotTransactional @ Test testProcessWithoutTransaction public void () { / / ... }

@ NotTransactional est en desuso

A partir de primavera de 3,0, @NotTransactional est en desuso en favor de trasladar el mtodo de ensayo no transaccional a una clase de prueba independiente (no transaccional) oa un @BeforeTransaction o @AfterTransaction mtodo. Como alternativa a la anotacin de toda una clase con @Transactional , considere anotar mtodos individuales con @Transactional ; ello permite una combinacin de mtodos transaccionales y no transaccionales en la misma clase de prueba sin la necesidad de utilizar @NotTransactional .
Soporte de anotacin estndar

Las anotaciones siguientes son compatibles con la semntica estndar para todas las configuraciones de Spring Framework TestContext. Tenga en cuenta que estas anotaciones no son especficos de las pruebas y se puede utilizar en cualquier lugar en el marco de la Primavera.
@Autowired @Qualifier @Resource (javax.annotation)

si JSR-250 est presente

@Inject (javax.inject) si JSR-330 est presente @Named (javax.inject) si JSR-330 est presente @PersistenceContext (javax.persistence) si la APP est presente @PersistenceUnit (javax.persistence) si la APP est presente @Required @Transactional

JSR-250 Anotaciones del ciclo de vida

En el marco Spring TestContext @PostConstruct y @PreDestroy puede ser utilizado con la semntica estndar en cualquiera de los componentes de aplicaciones configurados en el ApplicationContext , sin embargo, estas anotaciones del ciclo de vida han limitado el uso dentro de una clase de prueba real. Si un mtodo dentro de una clase de prueba est anotado con @PostConstruct , ese mtodo se ejecutar antes de que cualquiera de las anteriores mtodos de la infraestructura de pruebas subyacente (por ejemplo, los mtodos anotados con JUnit @Before ), y que se aplicar a todos los mtodos de prueba en la clase de prueba . Por otro lado, si un mtodo dentro de una clase de prueba est anotado con @PreDestroy , ese mtodo no se ejecutar. Dentro de una clase de prueba por lo que se recomienda utilizar devoluciones de llamada de prueba del ciclo de vida del framework de pruebas subyacente en lugar de @PostConstruct y @PreDestroy .
Primavera Pruebas JUnit Anotaciones

Las anotaciones siguientes slo se admite cuando se usa en conjuncin con el SpringJUnit4ClassRunner o los JUnit clases de apoyo.
@IfProfileValue

Indica que la prueba anotada est habilitada para un entorno de prueba especfica. Si la configuracin ProfileValueSource devuelve una coincidencia value proporcionado para el name , la prueba est habilitada. Esta anotacin se puede aplicar a toda una clase o a los mtodos individuales. Clase nivel de uso sustituye el mtodo de nivel de uso.
@ IfProfileValue (name = "java.vendor" value = "Sun Microsystems Inc.") @ Test testProcessWhichRunsOnlyOnSunJvm public void () { / / Algo de lgica que se debe ejecutar slo en mquinas virtuales Java de Sun Microsystems }

Como alternativa, puede configurar @IfProfileValue con una lista de values (con o semntica) para lograr TestNG-como apoyo a los grupos de prueba en un entorno JUnit. Consideremos el siguiente ejemplo:
@ IfProfileValue (name = "grupos de prueba", valores = {"unidad de anlisis", "las pruebas de integracin"}) @ Test

testProcessWhichRunsForUnitOrIntegrationTestGroups public void () { / / Algo de lgica que se debe ejecutar slo para la unidad y la integracin de los grupos de prueba } @ProfileValueSourceConfiguration

Clase de nivel de anotacin que especifica el tipo de ProfileValueSource para utilizar al recuperar valores de perfil configuradas a travs del @IfProfileValue anotacin. Si @ProfileValueSourceConfiguration no se ha declarado para un examen, SystemProfileValueSource se utiliza por defecto.
@ ProfileValueSourceConfiguration (CustomProfileValueSource. clase) CustomProfileValueSourceTests public class { / / Clase cuerpo ... } @Timed

Indica que el mtodo de ensayo anotado debe finalizar la ejecucin en un perodo de tiempo especificado (en milisegundos). Si el tiempo de ejecucin texto supera el perodo de tiempo especificado, la prueba falla. El perodo de tiempo incluye la ejecucin del mtodo de prueba en s, las repeticiones de la prueba (ver @Repeat ), as como cualquier conjunto o derribar del dispositivo de prueba.
@ Temporizado (millis = 1000) testProcessWithOneSecondTimeout public void () { / / Algo de lgica que no debe tomar ms de 1 segundo para ejecutar }

Spring @Timed anotacin tiene una semntica distinta de JUnit @Test(timeout=...) de apoyo. Concretamente, debido a la manera en que maneja JUnit tiempos de espera de ejecucin de pruebas (es decir, mediante la ejecucin del mtodo de ensayo en una separada Thread ), @Test(timeout=...) se aplica a cada iteracin en el caso de repeticiones y preventivamente la falla comprobar si la prueba se prolonga. Spring @Timed , por otra parte, los tiempos de la prueba de tiempo de ejecucin total (incluyendo todas las repeticiones) y no preventivamente no pasan la prueba, sino que espera a que finalice la prueba antes de fallar.
@Repeat

Indica que el mtodo de ensayo anotado debe ser ejecutado repetidamente. El nmero de veces que el mtodo de prueba se va a ejecutar se especifica en la anotacin.

El mbito de aplicacin de ejecucin que se repita incluye la ejecucin del mtodo de ensayo en s, as como cualquier conjunto o derribar del dispositivo de prueba.
@ Repita (10) @ Test public void testProcessRepeatedly () { / / ... }

11.3.5 Spring Framework TestContext

El Spring TestContext Framework (situado en el org.springframework.test.context paquete) proporciona genrico, anotacin impulsada por unidad de apoyo y pruebas de integracin que es agnstico del marco de pruebas en uso. El marco TestContext tambin pone gran importancia a la convencin sobre configuracin con valores predeterminados razonables que se pueden reemplazar por medio de anotacin basado en configuracin. Adems de la infraestructura de pruebas genrico, el marco TestContext proporciona apoyo explcito a JUnit y TestNG en forma de abstract clases de apoyo. Para JUnit, Spring tambin ofrece una costumbre JUnit Runner que permite escribir las llamadas clases de prueba POJO. Clases POJO de prueba no se requiere para extender una jerarqua de clase particular. La siguiente seccin proporciona una visin general de las partes internas del marco TestContext. Si slo est interesado en el uso de la estructura y no necesariamente interesados en ampliar con sus propios oyentes personalizados o cargadores de encargo, no dude en ir directamente a la configuracin ( gestin de contexto , inyeccin de dependencias , gestin de transacciones ), clases de apoyo y soporte de anotaciones secciones.
Abstracciones clave

El ncleo de la estructura se compone de los TestContext y TestContextManager clases y la TestExecutionListener , ContextLoader y SmartContextLoader interfaces. A TestContextManager se crea en funcin de cada prueba (por ejemplo, para la ejecucin de un mtodo nico en JUnit). El TestContextManager a su vez dirige una TestContext que mantiene el contexto de la corriente de prueba. El TestContextManager tambin actualiza el estado de la TestContext medida que avanza el ensayo y los delegados a TestExecutionListener s, que instrumento de la ejecucin de la prueba real, proporcionando la inyeccin de dependencia, la gestin de las transacciones, y as sucesivamente. A ContextLoader (o SmartContextLoader ) es el responsable de cargar un ApplicationContext para una clase de prueba determinado. Consulte el Javadoc y la suite de pruebas de la primavera para obtener ms informacin y ejemplos de implementaciones diferentes.
TestContext

: Encapsula el contexto en el que se ejecuta una prueba, agnstico del marco de pruebas reales en uso, y ofrece gestin de contexto y soporte de almacenamiento en cach para la instancia de prueba para la que es responsable.

El TestContext tambin delegados a una ContextLoader (o SmartContextLoader ) para cargar un ApplicationContext si se solicita. TestContextManager : El punto de entrada principal a la Spring Framework TestContext, que gestiona un nico TestContext eventos y seales a todos los inscritos TestExecutionListener s en puntos bien definidos de ejecucin de pruebas: o antes de que cualquiera de las anteriores mtodos de la clase de un marco de pruebas especial o preparacin de la prueba instancia o antes de que cualquiera de las anteriores modalidades de un marco de pruebas especial o despus de algn mtodo despus de un determinado marco de pruebas o despus de cualquier mtodo de clase despus de un determinado marco de pruebas TestExecutionListener : define una API de escucha para poner a prueba la reaccin de los eventos publicados por la ejecucin TestContextManager con la que se registr el detector. Spring proporciona cuatro TestExecutionListener implementaciones que se configuran y TransactionalTestExecutionListener . Respectivamente, se burla de ellos apoyan Servlet API para un WebApplicationContext , inyeccin de dependencia de la instancia de prueba, manejo de la @DirtiesContext anotacin, y la ejecucin de pruebas transaccional con semntica de reversin por defecto.

ContextLoader : Interfaz Estrategia introducido en Spring 2.5 para cargar un ApplicationContext para una prueba de integracin gestionados por Spring

Framework TestContext. Desde la primavera 3.1, implementar SmartContextLoader en lugar de la interfaz de este fin de proporcionar apoyo a las clases de activos anotados y perfiles de definicin de frijol.
SmartContextLoader

: Ampliacin de la ContextLoader interfaz introducido

en la primavera de 3,1. El SmartContextLoader SPI sustituye a la ContextLoader SPI que fue introducido en la primavera de 2,5. En concreto, un SmartContextLoader puede optar por procesar recursos locations , anotados classes , o el contexto initializers . Por otra parte, un SmartContextLoader puede establecer perfiles activos definicin de frijol en el contexto que lo carga. Spring proporciona las siguientes implementaciones:
o DelegatingSmartContextLoader

: uno de los dos cargadores predeterminados que delegados internamente a un AnnotationConfigContextLoader o un GenericXmlContextLoader dependiendo ya sea en la configuracin declaradas para la clase de ensayo o en la presencia de lugares predeterminados o clases de configuracin por defecto.

WebDelegatingSmartContextLoader

o o o o o

: uno de los dos cargadores predeterminados que delegados internamente a un AnnotationConfigWebContextLoader o un GenericXmlWebContextLoader dependiendo ya sea en la configuracin declaradas para la clase de ensayo o en la presencia de lugares predeterminados o clases de configuracin por defecto. Una web ContextLoader solo se utilizan si @WebAppConfiguration est presente en la clase de prueba. AnnotationConfigContextLoader : carga un estndar ApplicationContext de clases anotadas. AnnotationConfigWebContextLoader : carga un WebApplicationContext de clases anotadas. GenericXmlContextLoader : carga un estndar ApplicationContext desde ubicaciones de recursos XML. GenericXmlWebContextLoader : a cargas WebApplicationContext de lugares de recursos XML. GenericPropertiesContextLoader : norma cargas ApplicationContext de Java Los archivos de propiedades.

En las secciones siguientes se explica cmo configurar el TestContext marco a travs anotaciones y ofrecer ejemplos prcticos de cmo escribir pruebas de unidad e integracin en el marco.
Contexto de la gestin

Cada TestContext contexto proporciona una gestin y soporte de almacenamiento en cach para la instancia de prueba que es responsable. Casos de prueba no reciben automticamente el acceso a la configuracin ApplicationContext . Sin embargo, si una clase de prueba implementa la ApplicationContextAware interfaz, una referencia a la ApplicationContext se suministra a la instancia de prueba. Nota por lo tanto, proporcionar acceso a la ApplicationContext automticamente.
@ Autoconectados ApplicationContext

Como alternativa a la aplicacin de la ApplicationContextAware interfaz, puede inyectar el contexto de la aplicacin para su clase de prueba a travs del @Autowired anotacin ya sea en un campo o mtodo setter. Por ejemplo:
@ RunWith (SpringJUnit4ClassRunner.class) @ ContextConfiguration pblico MyTest clase { @ Autoconectados applicationContext ApplicationContext privado; / / Clase cuerpo ... }

Del mismo modo, si la prueba est configurado para cargar una WebApplicationContext , se puede inyectar el contexto de la aplicacin web en la

prueba de la siguiente manera:


@ RunWith (SpringJUnit4ClassRunner.class) @ WebAppConfiguration @ ContextConfiguration pblico MyWebAppTest clase { @ Autoconectados wac WebApplicationContext privado; / / Clase cuerpo ... }

La inyeccin de dependencia a travs de @Autowired es proporcionado por el DependencyInjectionTestExecutionListener que est configurado por defecto (ver la seccin llamada "inyeccin de dependencias de accesorios de prueba" ). Las clases de prueba que utilizan el marco TestContext no es necesario extender cualquier clase o implementar una interfaz especfica para configurar su contexto de aplicacin. En su lugar, la configuracin se realiza con slo declarar la @ContextConfiguration anotacin en el nivel de clase. Si la clase de prueba no se declare explcitamente el contexto de recursos de aplicacin locations o anotados classes , el configurado ContextLoader determina cmo cargar un contexto desde una ubicacin predeterminada o clases de configuracin por defecto. Adems de los recursos contexto locations y anotados classes , un contexto de aplicacin tambin se puede configurar a travs del contexto de aplicacin initializers . En las secciones siguientes se explica cmo configurar un ApplicationContext a travs de archivos de configuracin XML, clases anotadas (tpicamente @Configuration clases), o inicializadores contexto usando Spring @ContextConfiguration anotacin. Como alternativa, puede implementar y configurar su propia costumbre SmartContextLoader para casos de uso avanzados.
Contexto de configuracin XML con los recursos

Para cargar un ApplicationContext para sus pruebas utilizando archivos de configuracin XML, anotar su clase de prueba con @ContextConfiguration y configurar las locations atribuir con una matriz que contiene las ubicaciones de recursos de los metadatos de configuracin XML. Un camino llano o relativa - por ejemplo "context.xml" - se trata como un recurso ruta de clases que es relativa al paquete en el que se define la clase de prueba. Una ruta que comienza con una barra inclinada se trata como una ubicacin absoluta classpath, por ejemplo "/org/example/config.xml" . Un camino que representa una direccin URL de los recursos (es decir, un camino prefijado con classpath: , file: , http: , etc) se utilizan como es.
@ RunWith (SpringJUnit4ClassRunner.class) / / ApplicationContext se cargar desde "/ app-config.xml" y / / "/ Test-config.xml" en la raz de la ruta de clases @ ContextConfiguration (ubicaciones = {"/ app-config.xml", "/ testconfig.xml"}) pblico MyTest clase { / / Clase cuerpo ...

} @ContextConfiguration soporta un alias para las locations atribuir a travs del estndar Java value de atributo. Por lo tanto, si usted no tiene que declarar atributos adicionales en @ContextConfiguration , se puede omitir la declaracin de la locations y el nombre del atributo declarar los lugares de recursos utilizando el

formato abreviado se muestra en el siguiente ejemplo.


@ RunWith (SpringJUnit4ClassRunner.class) @ ContextConfiguration ({"/ app-config.xml", "/ test-config.xml"}) pblico MyTest clase { / / Clase cuerpo ... }

Si se omite tanto las locations y value de atributos de la @ContextConfiguration anotacin, el marco TestContext intentar detectar una ubicacin predeterminada XML recurso. En concreto, GenericXmlContextLoader detecta una ubicacin predeterminada basada en el nombre de la clase de prueba. Si la clase se llama com.example.MyTest , GenericXmlContextLoader carga el contexto de la aplicacin de "classpath:/com/example/MyTest-context.xml" .
paquete com.example; @ RunWith (SpringJUnit4ClassRunner.class) / / ApplicationContext se cargar desde / / "Com classpath :/ / ejemplo / MyTest-context.xml" @ ContextConfiguration pblico MyTest clase { / / Clase cuerpo ... } Contexto de configuracin con clases anotadas

Para cargar un ApplicationContext para sus pruebas con clases anotadas (vase la Seccin 5.12, "Configuracin basada en Java contenedor" ), anotar su clase de prueba con @ContextConfiguration y configurar las classes atributo con una matriz que contiene referencias a las clases anotadas.
@ RunWith (SpringJUnit4ClassRunner.class) / / ApplicationContext se cargar desde AppConfig y TestConfig @ ContextConfiguration (clases = {AppConfig.class, TestConfig.class}) pblico MyTest clase { / / Clase cuerpo ... }

Si se omiten las classes atributo de la @ContextConfiguration anotacin, el marco TestContext intentar detectar la presencia de clases de configuracin predeterminados. En concreto, AnnotationConfigContextLoader detectar todas las clases estticas internas de la clase de prueba que cumplen con los requisitos para las implementaciones de la clase de configuracin como se especifica en el Javadoc de @Configuration . En el siguiente ejemplo, el OrderServiceTest clase declara una clase esttica configuracin interna llamada Config que se utiliza para cargar automticamente el ApplicationContext para la clase de prueba. Tenga en cuenta que el nombre de la

clase de configuracin es arbitraria. Adems, una clase de prueba puede contener ms de una clase esttica configuracin interior si se desea.
@ RunWith (SpringJUnit4ClassRunner.class) / / ApplicationContext sern cargados desde la / / Clase interna esttica Config @ ContextConfiguration pblico OrderServiceTest clase { @ Configuracin Config clase static { / / Este frijol se inyecta en la clase OrderServiceTest @ Frijol OrderService pblico OrderService () { OrderService OrderService = new OrderServiceImpl (); / / Propiedades de conjunto, etc volver OrderService; } } @ Autoconectados OrderService OrderService privado; @ Test public void testOrderService () { / / Comprobar la OrderService } } Mezclar los recursos XML y clases anotadas

A veces puede ser deseable mezclar los recursos XML y clases anotados (es decir, tpicamente @Configuration clases) para configurar un ApplicationContext para las pruebas. Por ejemplo, si utiliza la configuracin de XML en la produccin, usted puede decidir que desea utilizar @Configuration clases para configurar especficos gestionados por Spring-componentes para sus pruebas, o viceversa. Como se menciona en la seccin "Anotaciones pruebas de primavera" del marco TestContext no le permiten declarar tanto a travs de @ContextConfiguration , pero esto no significa que usted no puede utilizar los dos. Si desea utilizar XML y @Configuration clases para configurar las pruebas, tendr que elegir uno como el punto de entrada, y que se tendr que incluir o importar el otro. Por ejemplo, en XML puede incluir @Configuration clases a travs de anlisis de componentes o definirlos como granos de primavera normales en XML y que, en una @Configuration clase puede utilizar @ImportResource para importar archivos de configuracin XML. Tenga en cuenta que este comportamiento es semnticamente equivalente a cmo configurar la aplicacin en la produccin: en la configuracin de produccin se definen un conjunto de ubicaciones de recursos XML o un conjunto de @Configuration clases que su produccin ApplicationContext se cargarn, pero usted todava tiene la libertad de incluir o importar el tipo de configuracin.
Contexto de configuracin con inicializadores de contexto

Para configurar un ApplicationContext para sus pruebas utilizando inicializadores contexto, anotar su clase de prueba con @ContextConfiguration y configurar los initializers atribuir con una matriz que contiene referencias a las clases que implementan ApplicationContextInitializer . Los inicializadores contexto declarados luego se utilizar para inicializar el ConfigurableApplicationContext que se carga para sus pruebas. Tenga en cuenta que el hormign ConfigurableApplicationContext tipo soportado por cada inicializador declarado debe ser compatible con el tipo de ApplicationContext creado por la SmartContextLoader en uso (es decir, tpicamente un GenericApplicationContext ). Por otra parte, el orden en que los inicializadores son llamadas depende de si la aplicacin de Spring Ordered interfaz o se anotan con Spring @Order anotacin.
@ RunWith (SpringJUnit4ClassRunner.class) / / ApplicationContext se cargar desde TestConfig / / Inicializado por TestAppCtxInitializer @ ContextConfiguration ( clases = TestConfig.class, inicializadores = TestAppCtxInitializer.class) pblico MyTest clase { / / Clase cuerpo ... }

Tambin es posible omitir la declaracin de archivos de configuracin o clases anotadas en @ContextConfiguration completamente y en lugar de declarar slo ApplicationContextInitializer clases que son entonces responsable del registro de granos en el contexto - por ejemplo, mediante programacin Cargar definiciones de frijol de archivos XML o clases de configuracin .
@ RunWith (SpringJUnit4ClassRunner.class) / / ApplicationContext se iniciar por EntireAppInitializer / / Que presumiblemente registra frijoles en el contexto @ ContextConfiguration (inicializadores = EntireAppInitializer.class) pblico MyTest clase { / / Clase cuerpo ... } Contexto herencia configuracin @ContextConfiguration apoya booleanos inheritLocations y inheritInitializers atributos que denotan si las ubicaciones de

recursos o clases anotadas e inicializadores contexto declarados por superclases deben ser heredada. El valor por defecto para ambas banderas es true . Esto significa que una clase de prueba hereda las ubicaciones de recursos o clases anotadas, as como los inicializadores contexto declarados por cualquier superclases. En concreto, las ubicaciones de recursos o clases anotadas para una clase de prueba se aaden a la lista de ubicaciones de recursos o clases anotadas declarados por superclases. De manera similar, los inicializadores para una clase de prueba dado se aaden al conjunto de iniciadores definidos por superclases de prueba. Por lo tanto, las subclases tienen la opcin de ampliar los lugares de recursos, clases anotadas, o inicializadores contexto. Si @ContextConfiguration 's inheritLocations o inheritInitializers atributo se establece en false , la localizacin de recursos o clases anotadas y los inicializadores

de contexto, respectivamente, para la sombra clase de prueba y efectivamente reemplazar la configuracin definida por superclases. En el ejemplo siguiente que utiliza XML ubicaciones de recursos, el ApplicationContext para ExtendedTest se cargar de "base-config.xml" y "extended-config.xml", en ese orden. Beans define en "extended-config.xml" por lo tanto puede anular (es decir, sustituir) las definidas en el "base-config.xml".
@ RunWith (SpringJUnit4ClassRunner.class) / / ApplicationContext se cargar desde "/ base-config.xml" / / En la raz del classpath @ ContextConfiguration ("/ base-config.xml") pblico BaseTest clase { / / Clase cuerpo ... } / / ApplicationContext se cargar desde "/ base-config.xml" y / / "/ Extended-config.xml" en la raz de la ruta de clases @ ContextConfiguration ("/ extended-config.xml") pblico ExtendedTest clase extiende BaseTest { / / Clase cuerpo ... }

Del mismo modo, en el ejemplo siguiente que utiliza clases anotadas, el ApplicationContext para ExtendedTest sern cargados desde los BaseConfig y ExtendedConfig clases, en ese orden. Beans define en ExtendedConfig por lo tanto puede anular (es decir, sustituir) las definidas en BaseConfig .
@ RunWith (SpringJUnit4ClassRunner.class) / / ApplicationContext se cargar desde BaseConfig @ ContextConfiguration (clases = BaseConfig.class) pblico BaseTest clase { / / Clase cuerpo ... } / / ApplicationContext se cargar desde BaseConfig y ExtendedConfig @ ContextConfiguration (clases = ExtendedConfig.class) pblico ExtendedTest clase extiende BaseTest { / / Clase cuerpo ... }

En el ejemplo siguiente que utiliza inicializadores contexto, el ApplicationContext para ExtendedTest se inicializa utilizando BaseInitializer y ExtendedInitializer . Tenga en cuenta, sin embargo, que el orden en que los inicializadores son llamadas depende de si la aplicacin de Spring Ordered interfaz o se anotan con Spring @Order anotacin.
@ RunWith (SpringJUnit4ClassRunner.class) / / ApplicationContext se iniciar por BaseInitializer @ ContextConfiguration (inicializadores = BaseInitializer.class) pblico BaseTest clase { / / Clase cuerpo ... } / / ApplicationContext se iniciar por BaseInitializer / / Y ExtendedInitializer

@ ContextConfiguration (inicializadores = ExtendedInitializer.class) pblico ExtendedTest clase extiende BaseTest { / / Clase cuerpo ... } Contexto de la configuracin con perfil de entorno

Spring 3.1 introduce soporte de primera clase en el marco de la nocin de entornos y perfiles (aka, frijol perfiles definicin), y pruebas de integracin se puede configurar para activar determinados perfiles de definicin de frijol para escenarios de pruebas diferentes. Esto se consigue mediante la anotacin de un clase de prueba con el @ActiveProfiles anotacin y el suministro de una lista de perfiles que se deben activar cuando la carga del ApplicationContext para la prueba.
Nota
@ActiveProfiles puede ser utilizado con cualquier aplicacin de la nueva SmartContextLoader SPI, pero @ActiveProfiles no es compatible con las implementaciones de la mayor ContextLoader SPI.

Echemos un vistazo a algunos ejemplos de configuracin XML y @Configuration clases.


<- App-config.xml -> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: jdbc = "http://www.springframework.org/schema/jdbc" xmlns: jee = "http://www.springframework.org/schema/jee" xsi: schemaLocation = "..."> <Bean id = "transferService" class = "com.bank.service.internal.DefaultTransferService"> <constructor-arg ref = "accountRepository" /> <constructor-arg ref = "feePolicy" /> </ Bean> <Bean id = "accountRepository" class = "com.bank.repository.internal.JdbcAccountRepository"> <constructor-arg ref = "dataSource" /> </ Bean> <Bean id = "feePolicy" class = "com.bank.service.internal.ZeroFeePolicy" /> perfil <beans = "dev"> <jdbc:embedded-database id = "dataSource"> <Jdbc: script Ubicacin = "classpath: com / banco / config / sql / schema.sql" /> <Jdbc: script Ubicacin = "classpath: com / banco / config / sql / test-data.sql" /> </ Jdbc: embedded-base de datos> </ Beans> perfil <beans = "production"> <Jee: JNDI lookup id = "origen de datos"

JNDI name = "java: comp / env / jdbc / fuente de datos" /> </ Beans> </ Beans> paquete com.bank.service; @ RunWith (SpringJUnit4ClassRunner.class) / / ApplicationContext se carga de "classpath :/ app-config.xml" @ ContextConfiguration ("/ app-config.xml") @ ActiveProfiles ("dev") pblico TransferServiceTest clase { @ Autoconectados TransferService transferService privado; @ Test public void testTransferService () { / / Comprobar la transferService } }

Cuando TransferServiceTest se ejecuta, su ApplicationContext se cargar desde la app-config.xml archivo de configuracin en la raz de la ruta de clases. Si observas app-config.xml te dars cuenta de que el accountRepository frijol tiene una dependencia en un dataSource frijol, sin embargo, dataSource no se define como un grano de nivel superior. En cambio, dataSource est definido dos veces: una vez en el perfil de produccin y una vez en el perfil prog. Al anotar TransferServiceTest con @ActiveProfiles("dev") instruimos a la primavera TestContext Marco para cargar el ApplicationContext con los perfiles establecidos para activos {"dev"} . Como resultado, una base de datos integrada, se crear, y la accountRepository frijol se conectar con una referencia al desarrollo DataSource . Y eso es probablemente lo que queremos en una prueba de integracin. Los listados de cdigo siguientes se muestra la forma de aplicar la misma configuracin y pruebas de integracin, pero utilizando @Configuration clases en lugar de XML.
@ Configuracin @ Perfil ("dev") StandaloneDataConfig clase pblica { @ Frijol pblica DataSource dataSource () { volver EmbeddedDatabaseBuilder nuevo () . Settype (EmbeddedDatabaseType.HSQL) . Addscript ("classpath: com / banco / config / sql / schema.sql") . Addscript ("classpath: com / banco / config / sql / test data.sql-") . Build (); } } @ Configuracin @ Perfil ("produccin") JndiDataConfig clase pblica {

@ Frijol pblica DataSource dataSource () throws Exception { Context ctx = new InitialContext (); volver (DataSource) ctx.lookup ("java: comp / env / jdbc / fuente de datos"); } } @ Configuracin TransferServiceConfig clase pblica { @ Autoconectados DataSource dataSource; @ Frijol transferService pblico TransferService () { return new DefaultTransferService accountRepository ((), feePolicy ()); } @ Frijol accountRepository AccountRepository pblico () { volver JdbcAccountRepository nuevo (dataSource); } @ Frijol feePolicy FeePolicy pblico () { volver ZeroFeePolicy nuevo (); } } paquete com.bank.service; @ RunWith (SpringJUnit4ClassRunner.class) @ ContextConfiguration ( = {clases TransferServiceConfig.class, StandaloneDataConfig.class, JndiDataConfig.class}) @ ActiveProfiles ("dev") pblico TransferServiceTest clase { @ Autoconectados TransferService transferService privado; @ Test public void testTransferService () { / / Comprobar la transferService } }

En esta variacin, hemos dividido la configuracin XML en tres independientes @Configuration clases:
TransferServiceConfig : adquiere un dataSource travs de la inyeccin dependencia con @Autowired StandaloneDataConfig : define un dataSource para una base de datos

de

integrada adecuado para pruebas de desarrolladores JndiDataConfig : define un dataSource que se recupera de JNDI en un entorno de produccin

Al igual que con el ejemplo de configuracin basado en XML, todava anotar TransferServiceTest con @ActiveProfiles("dev") , pero esta vez especificamos las tres clases de configuracin a travs de la @ContextConfiguration anotacin. El cuerpo de la clase de prueba en s permanece sin cambio.
Carga de un WebApplicationContext

Spring 3.2 introduce soporte para cargar un WebApplicationContext en las pruebas de integracin. Encomendar al marco TestContext cargar un WebApplicationContext en lugar de un estndar ApplicationContext , slo tiene que anotar la clase de prueba respectivo con @WebAppConfiguration . La presencia de @WebAppConfiguration en tu clase de prueba indica al marco TestContext (TCF) que un WebApplicationContext (WAC) debe ser cargado para las pruebas de integracin. En el fondo el TCF se asegura de que un MockServletContext se crea y suministra a WAC su prueba. Por defecto, la ruta de la base de recursos para su MockServletContext se establecer en "src / main / webapp". Esto se interpreta como una ruta relativa a la raz de la JVM (es decir, normalmente la ruta de acceso al proyecto). Si est familiarizado con la estructura de directorios de una aplicacin web en un proyecto Maven, usted sabr que "src / main / webapp" es la ubicacin predeterminada para la raz de su guerra. Si necesita reemplazar este valor predeterminado, simplemente proporcionar una ruta alternativa a la @WebAppConfiguration anotacin (por ejemplo, @WebAppConfiguration("src/test/webapp") ). Si desea hacer referencia a una ruta de la base de recursos de la ruta de clase en lugar del sistema de archivos, slo tiene que utilizar classpath de Spring: prefijo. Tenga en cuenta que el apoyo de Spring pruebas para WebApplicationContexts est a la par con su soporte para el estndar de ApplicationContexts . Al probar con un WebApplicationContext usted es libre de declarar cualquiera de los archivos de configuracin XML o @Configuration a travs de clases @ContextConfiguration . Usted, por supuesto, tambin es libre de usar cualquier anotacin de prueba tales como @TestExecutionListeners , @TransactionConfiguration , @ActiveProfiles , etc Los siguientes ejemplos muestran algunas de las diferentes opciones de configuracin para cargar un WebApplicationContext . Ejemplo 11,1. Convenios
@ RunWith (SpringJUnit4ClassRunner.class) / / Por defecto es "file: src / main / webapp" @ WebAppConfiguration / / Detecta "WacTests-context.xml" en el mismo paquete / / O clase anidada esttica Configuracin @ @ ContextConfiguration WacTests public class { / / ... }

El ejemplo anterior demuestra el apoyo del marco TestContext para la convencin sobre configuracin. Si usted anotar una clase de prueba con @WebAppConfiguration sin especificar una ruta de la base de recursos, la ruta del recurso efectivamente pondr por defecto en "file: src / main / webapp". Del mismo modo, si usted declara @ContextConfiguration sin especificar recursos locations , anotados classes , o el contexto initializers , Spring intentar detectar la presencia de su configuracin mediante convenios (es decir, "WacTests-context.xml" en el mismo paquete que el WacTests clase o estticas anidadas @Configuration las clases). Ejemplo 11,2. La semntica de recursos predeterminados
@ RunWith (SpringJUnit4ClassRunner.class) / / Archivo de recursos del sistema @ WebAppConfiguration ("aplicacin web") / / Recurso classpath @ ContextConfiguration ("/ muelle / test-servlet-config.xml") WacTests public class { / / ... }

En este ejemplo se muestra cmo declarar explcitamente una ruta de la base de recursos con @WebAppConfiguration y una ubicacin recurso XML con @ContextConfiguration . Lo importante a destacar aqu es la semntica diferentes caminos con estos dos anotaciones. Por defecto, @WebAppConfiguration caminos de recursos son la base del sistema de archivos, y que, @ContextConfiguration ubicaciones de recursos son la base classpath. Ejemplo 11.3. Semntica explcita de recursos
@ RunWith (SpringJUnit4ClassRunner.class) / / Recurso classpath @ WebAppConfiguration ("classpath: test-web-recursos") / / Archivo de recursos del sistema @ ContextConfiguration ("file: src / main / webapp / WEB-INF / servlet-config.xml") WacTests public class { / / ... }

En este tercer ejemplo, vemos que podemos invalidar la semntica de recursos impago correspondientes a las anotaciones especificando un prefijo de recursos primavera. Contrastar los comentarios en este ejemplo con el ejemplo anterior.
Trabajar con burla Web

Para proporcionar un completo soporte de pruebas web, Spring 3.2 introduce un nuevo ServletTestExecutionListener que est habilitada de forma predeterminada. Cuando se prueba contra un WebApplicationContext este TestExecutionListener establece por defecto local de subprocesos estado a travs de Spring Web RequestContextHolder antes de cada mtodo de prueba y crea un MockHttpServletRequest , MockHttpServletResponse y ServletWebRequest basado en la ruta del recurso base configurada por @WebAppConfiguration . ServletTestExecutionListener tambin asegura que el MockHttpServletResponse y ServletWebRequest se puede inyectar en la instancia de prueba, y una vez finalizada la prueba se limpia local de subprocesos estado. Una vez que tenga un WebApplicationContext cargado para su prueba usted podra encontrar que usted necesita para interactuar con las imitaciones web - por ejemplo, para configurar el dispositivo de prueba o para realizar afirmaciones despus de invocar el componente web. El siguiente ejemplo muestra que se burla puede autoconectados en la instancia de prueba. Tenga en cuenta que el WebApplicationContext y MockServletContext estn en cach todo el conjunto de pruebas y que, se burla de los otros son administrados por el mtodo de prueba por ServletTestExecutionListener . Ejemplo 11.4. Se burla inyectables
@ WebAppConfiguration @ ContextConfiguration WacTests public class { @ Autoconectados WebApplicationContext wac / / cach @ Autoconectados MockServletContext ServletContext / / cach @ Sesin MockHttpSession autoconectados; @ Autoconectados solicitud MockHttpServletRequest; @ Autoconectados respuesta MockHttpServletResponse; @ Autoconectados ServletWebRequest webRequest; / / ... }

Contexto cach

Una vez que el marco TestContext carga un ApplicationContext (o WebApplicationContext ) para una prueba, ese contexto se almacenan en cach y volver a utilizar para todas las pruebas posteriores que declaran la misma configuracin contexto nico en el conjunto de pruebas misma. Para entender cmo funciona el almacenamiento en cach, es importante comprender lo que se entiende por habitacin nica y prueba. Un ApplicationContext puede ser identificado nicamente por la combinacin de parmetros de configuracin que se utilizan para cargarlo. Por consiguiente, la

combinacin nica de parmetros de configuracin se utiliza para generar una clave bajo la que el contexto se almacena en cach. El marco TestContext utiliza los siguientes parmetros de configuracin para crear la clave de cach contexto:
locations de ContextConfiguration (@) classes de ContextConfiguration (@) contextInitializerClasses (desde ContextConfiguration contextLoader (de ContextConfiguration @) activeProfiles (de @ ActiveProfiles) resourceBasePath (de WebAppConfiguration @)

@)

Por ejemplo, si TestClassA especifica {"app-config.xml", "test-config.xml"} de los locations (o value ) de atributos de @ContextConfiguration , el marco TestContext cargar el correspondiente ApplicationContext y gurdelo en un static contexto cach en una tecla que se basa nicamente en esas ubicaciones. As que si TestClassB tambin define {"app-config.xml", "test-config.xml"} por sus lugares (ya sea explcita o implcitamente a travs de la herencia) pero no define @WebAppConfiguration , un diferente ContextLoader , los diferentes perfiles activos, o diferentes inicializadores de contexto, lo mismo ApplicationContext ser compartida por ambas clases de prueba. Esto significa que el coste de instalacin para la carga de un contexto de aplicacin se incurre solamente una vez (por prueba suite), y ejecucin de la prueba subsiguiente es mucho ms rpido.
Bancos de pruebas y procesos bifurcados

La primavera TestContext marco contextos de aplicacin almacena en una memoria cach esttica. Esto significa que el contexto est literalmente almacenado en un static variable. En otras palabras, si las pruebas se ejecutan en procesos separados de la memoria cach esttica se borra entre cada ejecucin de la prueba, y esta eficacia se desactivar el mecanismo de cach. Para beneficiarse del mecanismo de almacenamiento en cach, todas las pruebas deben ejecutarse en el mismo proceso o serie de pruebas. Esto puede lograrse mediante la ejecucin de todas las pruebas como un grupo dentro de un IDE. De manera similar, cuando la ejecucin de pruebas con un marco de compilacin como Ant, Maven, o Gradle es importante para asegurarse de que el marco de generacin no tenedor entre las pruebas. Por ejemplo, si el forkMode para el Maven Surefire plug-in se establece always o pertest , el marco TestContext no ser capaz de almacenar en cach los contextos de aplicacin entre las clases de prueba y el proceso de construccin se ejecutarn significativamente ms lento como consecuencia de ello. En el improbable caso de que una prueba corrompe el contexto de aplicacin y requiere volver a cargar - por ejemplo, mediante la modificacin de la definicin de frijol o el estado de un objeto de aplicacin - se puede anotar su clase de prueba o mtodo de ensayo con @DirtiesContext (vase el anlisis de @DirtiesContext en la seccin "Anotaciones pruebas de primavera" ). Esto indica a la primavera para eliminar el contexto de la cach y reconstruir el contexto de la aplicacin antes de ejecutar la siguiente prueba. Tenga en cuenta que el apoyo al @DirtiesContext anotacin es

proporcionado por el DirtiesContextTestExecutionListener que est habilitada de forma predeterminada.


Inyeccin de dependencia de accesorios de prueba

Cuando se utiliza el DependencyInjectionTestExecutionListener - que est configurado por defecto - las dependencias de los casos de la prueba se inyectan de frijol en el contexto de la aplicacin que ha configurado con @ContextConfiguration . Usted puede utilizar la inyeccin de setter, inyeccin de campo, o ambos, dependiendo de las anotaciones que usted elige y si los has puesto en mtodos setter o campos. Para mantener la coherencia con el apoyo anotacin introducida en la primavera de 2,5 y 3,0, se puede usar Spring @Autowired anotacin o el @Inject anotacin de JSR 300.
Punta

El marco TestContext no instrumento de la manera en que se instancia una instancia de prueba. As, el uso de @Autowired o @Inject para los constructores no tiene efecto para las clases de prueba. Debido a @Autowired se utiliza para realizar autowiring por tipo , si usted tiene mltiples definiciones de frijol del mismo tipo, no se puede confiar en este mtodo para los frijoles particulares. En ese caso, puede utilizar @Autowired junto con @Qualifier . A partir de Spring 3.0 tambin puede optar por utilizar @Inject junto con @Named . Alternativamente, si su clase de prueba tiene acceso a su ApplicationContext , puede realizar una bsqueda explcita utilizando (por ejemplo) una llamada a applicationContext.getBean("titleRepository") . Si no desea que la inyeccin de dependencia se aplica a los casos de la prueba, simplemente no anotar los campos o mtodos setter con @Autowired o @Inject . Como alternativa, puede desactivar por completo mediante la inyeccin de dependencia explcitamente la configuracin de su clase con @TestExecutionListeners y omitiendo DependencyInjectionTestExecutionListener.class de la lista de oyentes. En cuenta la situacin de probar un HibernateTitleRepository clase, como se indica en la Metas seccin. Los siguientes dos listados de cdigo muestra el uso de @Autowired en campos y mtodos setter. La configuracin de contexto de aplicacin se presenta despus de que todos los listados de cdigo de ejemplo.
Nota

El comportamiento de la inyeccin de dependencia en los listados de cdigo a continuacin no es especfico de JUnit. Las mismas tcnicas de DI se puede utilizar en conjuncin con cualquier marco de pruebas. Los siguientes ejemplos realizar llamadas a mtodos estticos, como afirmacin assertNotNull() pero sin anteponiendo la llamada con Assert . En tales casos, se supone que el mtodo se ha importado correctamente a travs de una import static declaracin de que no se muestra en el ejemplo.

El anuncio del primer cdigo muestra una implementacin basada en JUnit de la clase de prueba que utiliza @Autowired para inyeccin campo.
@ RunWith (SpringJUnit4ClassRunner.class) / / Especifica la configuracin de Spring para cargar para este dispositivo de prueba @ ContextConfiguration ("repositorio-config.xml") HibernateTitleRepositoryTests public class { / / Este ejemplo va a ser inyectado por tipo de dependencia @ Autoconectados titleRepository HibernateTitleRepository privado; @ Test findById public void () { Ttulo title = titleRepository.findById (nuevo Larga (10)); assertNotNull (ttulo); } }

Como alternativa, puede configurar la clase que se utiliza @Autowired para inyeccin de setter como se ve a continuacin.
@ RunWith (SpringJUnit4ClassRunner.class) / / Especifica la configuracin de Spring para cargar para este dispositivo de prueba @ ContextConfiguration ("repositorio-config.xml") HibernateTitleRepositoryTests public class { / / Este ejemplo va a ser inyectado por tipo de dependencia titleRepository HibernateTitleRepository privado; @ Autoconectados setTitleRepository public void (titleRepository HibernateTitleRepository) { este titleRepository = titleRepository.; } @ Test findById public void () { Ttulo title = titleRepository.findById (nuevo Larga (10)); assertNotNull (ttulo); } }

Los listados de cdigo anteriores utilizan el mismo archivo XML contexto al que hace referencia el @ContextConfiguration anotacin (es decir, repository-config.xml ), que se ve as:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/springbeans.xsd ">

<- Este grano se inyecta en la clase HibernateTitleRepositoryTests -> <bean id = "titleRepository" class=" com.foo.repository.hibernate.HibernateTitleRepository "> <propiedad nombre = "sessionFactory" ref = "sessionFactory" /> </ Bean> <Bean id = "sessionFactory" class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <- Configuracin elide por brevedad -> </ Bean> </ Beans>

Nota

Si se extiende desde una primavera clase proporcionada por la base de pruebas que le sucede a utilizar @Autowired en uno de sus mtodos setter, puede tener mltiples beans del tipo afectado definido en el contexto de aplicacin: por ejemplo, mltiples DataSource frijoles. En tal caso, se puede reemplazar el mtodo setter y utilizar el @Qualifier anotacin para indicar un frijol blanco especfico de la siguiente manera, pero asegrese de delegar en el mtodo reemplazado en la superclase tambin.
/ / ... @ Autoconectados @ Override public void SetDataSource (@ Qualifier ("myDataSource") DataSource dataSource) { sper SetDataSource (DataSource).; } / / ...

El calificador especificado indica el especfico DataSource frijol para inyectar, estrechando el conjunto de partidos de tipo a un grano especfico. Su valor se compara con <qualifier> declaraciones dentro de los correspondientes <bean> definiciones. El nombre del bean se utiliza como calificador de retorno, por lo que puede efectivamente apuntan tambin a un grano especfico por su nombre all (como se muestra arriba, en el supuesto de que "myDataSource" es el identificador de frijol).
Pruebas de solicitud y sesin de frijoles con mbito

Frijoles demanda y la reunin de mbito han sido apoyados por la primavera desde hace varios aos, pero que siempre ha sido un poco trivial para probarlos. Desde la primavera 3.2 es ahora muy fcil de probar sus frijoles con mbito de peticiones y un mbito de sesin, siga estos pasos.

Asegrese de que un WebApplicationContext se carga para su prueba anotando su clase de prueba con @WebAppConfiguration .

Inyectar la solicitud simulacro o una sesin en la instancia de prueba y preparar su aparato de prueba segn el caso. Invoca el componente Web que recupera de la configuracin WebApplicationContext (es decir, a travs de la inyeccin de dependencia). Realizar afirmaciones contra las imitaciones.

El fragmento de cdigo siguiente se muestra la configuracin de XML para un caso de uso login. Tenga en cuenta que el userService frijol tiene una dependencia en una solicitud de mbito loginAction frijol. Asimismo, el LoginAction se crea una instancia utilizando expresiones Spel que recuperan el nombre de usuario y contrasea de la actual solicitud HTTP. En nuestra prueba, tendr que configurar los parmetros de la peticin a travs del simulacro administrado por el marco TestContext. Ejemplo 11.5. Solicitud de mbito de configuracin de frijol
<beans> <Bean id = "UserService" class = "com.example.SimpleUserService" c: loginAction-ref = "loginAction" /> <Bean id = "loginAction" class = "com.example.LoginAction" c: username = "# {request.getParameter ('user')}" c: password = "# {request.getParameter ('pswd')}" scope = "request"> <aop:scoped-proxy /> </ Bean> </ Beans>

En RequestScopedBeanTests inyectamos tanto el UserService (es decir, el sujeto sometido a prueba) y el MockHttpServletRequest en nuestro caso de prueba. Dentro de nuestra requestScope() mtodo de ensayo armaremos nuestro dispositivo de prueba mediante el establecimiento de parmetros de peticin previsto en el MockHttpServletRequest . Cuando el loginUser() mtodo se invoca en nuestro userService se nos asegura que la atencin al usuario tiene acceso a la solicitud de mbito loginAction para el actual MockHttpServletRequest (es decir, el que acabamos de establecer los parmetros in). A continuacin, podemos realizar afirmaciones en contra de los resultados en funcin de los insumos conocidos para el nombre de usuario y contrasea. Ejemplo 11.6. Solicitud de mbito de frijol prueba
@ RunWith (SpringJUnit4ClassRunner.class) @ ContextConfiguration @ WebAppConfiguration RequestScopedBeanTests public class { @ Autoconectados UserService UserService; @ Autoconectados solicitud MockHttpServletRequest; @ Test requestScope public void () {

request.setParameter ("usuario", "enigma"); request.setParameter ("clav", "$ pr ng"); Resultados LoginResults = userService.loginUser (); / / Afirmar resultados } }

El fragmento de cdigo siguiente es similar a la que vimos anteriormente para un bean de mbito de peticin, sin embargo, esta vez la userService frijol tiene una dependencia en un mbito de sesin userPreferences frijol. Tenga en cuenta que el UserPreferences bean se crea con una expresin Spel que recupera el tema del actual perodo de sesiones HTTP. En nuestra prueba, tendr que configurar un tema en la sesin de simulacro administrado por el marco TestContext. Ejemplo 11.7. mbito de sesin configuracin de frijol
<beans> <Bean id = "UserService" class = "com.example.SimpleUserService" c: PreferenciasDelUsuario-ref = "PreferenciasDelUsuario" /> <Bean id = "PreferenciasDelUsuario" class = "com.example.UserPreferences" c: theme = "# {session.getAttribute ('tema')}" scope = "session"> <aop:scoped-proxy /> </ Bean> </ Beans>

En SessionScopedBeanTests inyectamos el UserService y la MockHttpSession en nuestro caso de prueba. Dentro de nuestra sessionScope() mtodo de ensayo armaremos nuestro dispositivo de prueba mediante el establecimiento de la esperada "tema" en el atributo siempre MockHttpSession . Cuando los processUserPreferences() mtodo se invoca en nuestro userService se nos asegura que la atencin al usuario tiene acceso a las de mbito de sesin userPreferences para el actual MockHttpSession , y podemos realizar afirmaciones en contra de los resultados basados en el tema configurado. Ejemplo 11.8. mbito de sesin bean prueba
@ RunWith (SpringJUnit4ClassRunner.class) @ ContextConfiguration @ WebAppConfiguration SessionScopedBeanTests public class { @ Autoconectados UserService UserService; @ Sesin MockHttpSession autoconectados;

@ Test sessionScope public void () throws Exception { session.setAttribute ("theme", "azul"); Resultados Los resultados de userService.processUserPreferences = (); / / Afirmar resultados } }

Gestin de transacciones

En el marco TestContext, las transacciones son manejadas por el TransactionalTestExecutionListener . Tenga en cuenta que TransactionalTestExecutionListener est configurado por defecto, incluso si usted no declara explcitamente @TestExecutionListeners en tu clase de prueba. Para activar el soporte para transacciones, sin embargo, usted debe proporcionar una PlatformTransactionManager frijol en el contexto de la aplicacin cargada por @ContextConfiguration semntica. Adems, debe declarar @Transactional ya sea a nivel de clase o mtodo para sus pruebas. Para la configuracin de transaccin de nivel de clase (es decir, el establecimiento de un nombre explcito de frijol para el administrador de transacciones y la marca predeterminada rollback), consulte la @TransactionConfiguration entrada en el soporte de anotaciones seccin. Si las transacciones no han sido habilitadas para la clase de prueba completa, puede anotar los mtodos explcitamente con @Transactional . Para controlar si una transaccin debe comprometerse por un mtodo de prueba en particular, puede utilizar la @Rollback anotacin para anular el valor predeterminado de nivel de clase reversin.
AbstractTransactionalJUnit4SpringContextTests AbstractTransactionalTestNGSpringContextTests

y vienen preconfiguradas con

soporte transaccional a nivel de clase. En ocasiones es necesario ejecutar cierto cdigo antes o despus de un mtodo de prueba transaccional, pero fuera del contexto transaccional, por ejemplo, para verificar el estado de la base de datos inicial antes de la ejecucin de la prueba o para verificar el comportamiento esperado de transacciones de confirmacin despus de la ejecucin de prueba (si la prueba fue configurado para no deshacer la transaccin). TransactionalTestExecutionListener apoya la @BeforeTransaction y @AfterTransaction anotaciones exactamente para tales escenarios. Simplemente anotar cualquier public void mtodo en su clase de prueba con una de estas anotaciones, y el TransactionalTestExecutionListener asegura que su mtodo de transaccin antes o despus de mtodo de transaccin se ejecuta en el momento adecuado.
Punta

Todo antes de los mtodos (tales como los mtodos anotados con JUnit @Before ) y cualquier mtodo despus (como los mtodos anotados con JUnit @After ) se ejecutan dentro de una transaccin. Adems, los mtodos anotados con @BeforeTransaction o @AfterTransaction no estn naturalmente ejecutado para las pruebas anotado con @NotTransactional . Sin embargo, @NotTransactional est en desuso en la primavera de 3,0. A continuacin JUnit basada ejemplo muestra un escenario de pruebas de integracin ficticia destacando varios relacionados con la transaccin anotaciones. Consulte la compatibilidad con las anotaciones seccin para obtener ms informacin y ejemplos de configuracin.
@ RunWith (SpringJUnit4ClassRunner.class) @ ContextConfiguration @ TransactionConfiguration (TransactionManager = "txMgr", defaultRollback = false) @ Transactional pblico FictitiousTransactionalTest clase { @ BeforeTransaction verifyInitialDatabaseState public void () { / / Lgica para verificar el estado inicial antes de que se inicia una transaccin } Antes @ setUpTestDataWithinTransaction public void () { / / Configurar los datos de prueba de la transaccin } @ Test / / Anula el ajuste de nivel de clase defaultRollback @ Rollback (true) modifyDatabaseWithinTransaction public void () { / / La lgica que utiliza los datos de prueba y modifica el estado de base de datos } @ Despus tearDownWithinTransaction public void () { / / Ejecutar "derribar" lgica dentro de la transaccin } @ AfterTransaction verifyFinalDatabaseState public void () { / / La lgica para comprobar el estado final despus de la transaccin se ha revertido } }

Evite los falsos positivos en el ensayo cdigo ORM

Al probar el cdigo de aplicacin que manipula el estado de la sesin de Hibernate, asegrese de enjuagar la sesin subyacente dentro de los mtodos de prueba que ejecutan ese cdigo. El no poder vaciar la sesin subyacente puede producir falsos positivos: la prueba puede pasar, pero el mismo cdigo produce una excepcin en

un entorno de produccin en vivo,. En la siguiente Hibernate basada en caso de prueba de ejemplo, un mtodo demuestra un falso positivo, y el otro mtodo correctamente expone los resultados de la sesin de lavado. Tenga en cuenta que esto se aplica a JPA y los marcos ORM otros que mantienen una unidad de memoria de trabajo.
/ / ... @ Autoconectados privado sessionFactory SessionFactory; @ Test / / no hay excepcin esperada! falsePositive public void () { updateEntityInHibernateSession (); / / Falso positivo: una excepcin ser lanzada una vez que la sesin es / / Finalmente se sonroj (es decir, en el cdigo de produccin) } @ Test (expected = GenericJDBCException.class) updateWithSessionFlush public void () { updateEntityInHibernateSession (); / / Lavado manual es necesaria para evitar falsos positivos en la prueba de . SessionFactory.getCurrentSession () flush (); } / / ...

TestContext Marco de las clases de apoyo


JUnit clases de apoyo

El org.springframework.test.context.junit4 paquete proporciona clases de apoyo para JUnit 4.5 + casos de prueba basados.
AbstractJUnit4SpringContextTests

: Clase abstracta test bsico que integra el Spring Framework con TestContext explcito ApplicationContext soporte de pruebas en un entorno JUnit 4.5 +. Al ampliar AbstractJUnit4SpringContextTests , puede acceder a las siguientes protected variable de instancia: : Esta variable se utiliza para realizar bsquedas explcitas de frijol o para probar el estado del contexto en su totalidad. AbstractTransactionalJUnit4SpringContextTests : Resumen extensin transaccional de AbstractJUnit4SpringContextTests que tambin aade algunas funciones de conveniencia para el acceso JDBC. Espera una javax.sql.DataSource frijol y un PlatformTransactionManager frijol que se definirn en el ApplicationContext . Al ampliar AbstractTransactionalJUnit4SpringContextTests puede acceder a los siguientes protected variables de instancia:
o applicationContext

applicationContext : hereda de los AbstractJUnit4SpringContextTests

superclase. Esta variable se utiliza para realizar bsquedas explcitas de frijol o para probar el estado del contexto en su totalidad. jdbcTemplate : Esta variable se utiliza para ejecutar sentencias SQL para consultar la base de datos. Dichas consultas se pueden utilizar para confirmar el estado de base de datos, tanto antes como despus de la ejecucin de la base de datos relacionada con el cdigo de la aplicacin, y resorte garantiza que dichas consultas realizada en el mbito de la misma transaccin que el cdigo de aplicacin. Cuando se utiliza junto con una herramienta ORM, asegrese de evitar falsos positivos .

Punta

Estas clases son una conveniencia para la extensin. Si usted no desea que sus clases de prueba para estar atado a una jerarqua de clases Primavera-especfico por ejemplo, si desea extender directamente la clase que se est probando - usted puede configurar sus propias clases de pruebas personalizadas mediante @RunWith(SpringJUnit4ClassRunner.class) , @ContextConfiguration , @TestExecutionListeners , y as sucesivamente.
Primavera JUnit Runner

La primavera TestContext marco ofrece una completa integracin con JUnit 4.5 + a travs de un corredor de costumbre (probado en JUnit 4.5 a 4.10). Al anotar las clases de prueba con @RunWith(SpringJUnit4ClassRunner.class) , los desarrolladores pueden implementar estndar basado en JUnit pruebas unitarias y de integracin y al mismo tiempo aprovechar los beneficios del marco TestContext como el soporte para la carga de contextos de aplicacin, la inyeccin de dependencia de instancias de prueba, mtodo de prueba transaccional ejecucin, y as sucesivamente. La lista de cdigo siguiente se muestran los requisitos mnimos para la configuracin de una clase de prueba para funcionar con el Corredor Primavera personalizado. @TestExecutionListeners se configura con una lista vaca para desactivar los oyentes predeterminados, que de otro modo requeriran un ApplicationContext se configura a travs de @ContextConfiguration .
@ RunWith (SpringJUnit4ClassRunner.class) @ TestExecutionListeners ({}) pblico SimpleTest clase { @ Test testMethod public void () { / / Ejecutar lgica de la prueba ... } } TestNG clases de apoyo

El org.springframework.test.context.testng paquete proporciona clases de apoyo para TestNG casos basados en pruebas.

AbstractTestNGSpringContextTests

: Clase abstracta test bsico que integra el Marco del resorte con TestContext explcito ApplicationContext soporte de pruebas en un entorno TestNG. Al ampliar AbstractTestNGSpringContextTests , puede acceder a las siguientes protected variable de instancia: : Esta variable se utiliza para realizar bsquedas explcitas de frijol o para probar el estado del contexto en su totalidad. AbstractTransactionalTestNGSpringContextTests : Resumen extensin transaccional de AbstractTestNGSpringContextTests que aade algunas funciones de conveniencia para el acceso JDBC. Espera una javax.sql.DataSource frijol y un PlatformTransactionManager frijol que se definirn en el ApplicationContext . Al ampliar AbstractTransactionalTestNGSpringContextTests , puede acceder a las siguientes protected variables de instancia: o applicationContext : hereda de los AbstractTestNGSpringContextTests superclase. Esta variable se utiliza para realizar bsquedas explcitas de frijol o para probar el estado del contexto en su totalidad. o jdbcTemplate : Esta variable se utiliza para ejecutar sentencias SQL para consultar la base de datos. Dichas consultas se pueden utilizar para confirmar el estado de base de datos, tanto antes como despus de la ejecucin de la base de datos relacionada con el cdigo de la aplicacin, y resorte garantiza que dichas consultas realizada en el mbito de la misma transaccin que el cdigo de aplicacin. Cuando se utiliza junto con una herramienta ORM, asegrese de evitar falsos positivos .
o applicationContext

Punta

Estas clases son una conveniencia para la extensin. Si usted no desea que sus clases de prueba para estar atado a una jerarqua de clases Primavera-especfico por ejemplo, si desea extender directamente la clase que se est probando - usted puede configurar sus propias clases de pruebas personalizadas mediante @ContextConfiguration , @TestExecutionListeners , y as sucesivamente, y por manualmente instrumentar la clase de prueba con un TestContextManager . Ver el cdigo fuente de AbstractTestNGSpringContextTests para un ejemplo de cmo instrumentar su clase de prueba.
11.3.6 Prueba de Spring MVC Framework

Proyecto independiente Antes de la inclusin en Spring Framework 3.2, la prueba de Spring MVC marco ya exista como un proyecto separado en GitHub donde creci y se desarroll a travs del uso real, la retroalimentacin y la contribucin de muchos. El independiente primavera-test-mvc proyecto est todava disponible en GitHub y puede ser utilizado en conjuncin con Spring Framework 3.1.X. Actualizacin de

aplicaciones y 3,2 debe sustituir a la spring-test-mvc dependencia con una dependencia en spring-test . El spring-test mdulo utiliza un paquete diferente org.springframework.test.web pero por lo dems es casi idntico, con dos excepciones. Uno de ellos es el apoyo a las nuevas caractersticas de 3,2 (por ejemplo, las peticiones web asncronos). El otro se refiere a las opciones para crear un MockMvc ejemplo. En Spring Framework 3.2, esto slo se puede hacer a travs del marco TestContext, que proporciona beneficios de cach para la configuracin cargada. El framework Spring MVC prueba proporciona soporte de primera clase JUnit para probar cliente y el cdigo de servidor Spring MVC a travs de una API fluida. Por lo general se carga la configuracin de Spring real a travs del marco TestContext y siempre utiliza la DispatcherServlet para procesar las solicitudes por lo tanto se aproximan a las pruebas de integracin sin necesidad de un contenedor de Servlet corriendo. Del lado del cliente pruebas son RestTemplate y basado en pruebas para permitir que el cdigo que se basa en la RestTemplate sin necesidad de un servidor que ejecuta para responder a las solicitudes.
Pruebas del lado del servidor

Antes de Spring Framework 3.2, la forma ms probable para probar un controlador de Spring MVC fue escribir una prueba unitaria que crea una instancia del controlador, lo inyecta con dependencias simulacros o ramal, a continuacin, llama a sus mtodos directamente, utilizando un MockHttpServletRequest y MockHttpServletResponse cuando sea necesario. Aunque esto es bastante fcil de hacer, los controladores tienen muchas anotaciones, y queda mucho por probar. Solicitar asignaciones de enlace de datos de conversin, el tipo y la validacin son slo unos pocos ejemplos de lo que no est probado. Adems, existen otros tipos de mtodos anotados como @InitBinder , @ModelAttribute y @ExceptionHandler que se invoca como parte del proceso de solicitud. La idea detrs de pruebas de la primavera MVC es ser capaz de volver a escribir las pruebas de controlador realizando peticiones reales y la generacin de respuestas, como lo seran en tiempo de ejecucin, en el camino a travs de la invocacin de controladores Spring MVC DispatcherServlet . Controladores todava puede ser inyectado con dependencias simuladas, lo que las pruebas pueden permanecer enfocados en la capa de banda. Spring MVC prueba se basa en las conocidas "simulados" implementaciones de la API Servlet disponible en la spring-test del mdulo. Esto permite realizar peticiones y respuestas generan sin la necesidad de ejecutar en un contenedor de Servlet. Para la mayor parte, todo debera funcionar como lo hace en tiempo de ejecucin, con la excepcin de la representacin de JSP, que no est disponible fuera de un contenedor de Servlets. Por otra parte, si usted est familiarizado con la forma en la MockHttpServletResponse funciona, sabrs que reenva y redirecciones no estn realmente ejecutados. En su lugar "remitido" y "redirigir" las direcciones URL se

guardan y se puede afirmar en pruebas. Esto significa que si usted est utilizando JSP, puede verificar la pgina JSP a la que se envi la solicitud. Todos los otros medios de representacin incluyendo @ResponseBody mtodos y View , adems de los tipos (JSP) como Freemarker, Velocity, Thymeleaf, y otros para la representacin HTML, JSON, XML, y as sucesivamente debera funcionar como se esperaba, y la respuesta contendr el contenido generado por el . A continuacin se muestra un ejemplo de una cuenta de prueba solicitando informacin en formato JSON:
importar org.springframework.test.web.servlet.request.MockMvcRequestBuilders estticas *.; importar org.springframework.test.web.servlet.result.MockMvcResultMatchers estticas *.; @ RunWith (SpringJUnit4ClassRunner.class) @ WebAppConfiguration @ ContextConfiguration ("test-servlet-context.xml") ExampleTests public class { @ Autoconectados wac WebApplicationContext privado; mockMvc MockMvc privado; Antes @ public void setup () { .. este mockMvc MockMvcBuilders.webAppContextSetup = (. este wac) build (); } @ Test getAccount public void () throws Exception { este mockMvc.perform (get ("/ accounts / 1") aceptan ("application / json; charset = UTF-8".)). . AndExpect (status (). Isok ()) . AndExpect (contenido (). ContentType ("application / json")) . AndExpect (jsonPath ("$ nombre.") Valor ("Lee").; } }

La prueba se basa en la WebApplicationContext apoyo del marco TestContext. Se carga la configuracin de Spring desde un archivo de configuracin XML ubicado en el mismo paquete que la clase de prueba (tambin admite JavaConfig) e inyecta el creado WebApplicationContext en la prueba por lo que un MockMvc ejemplo se puede crear con ella. El MockMvc se utiliza para realizar una peticin de "/accounts/1" y verificar el estado de la respuesta resultante es de 200, el tipo de contenido de la respuesta es "application/json" , y el contenido de la respuesta JSON tiene una propiedad llamada "nombre" con el valor "Lee". Contenido JSON es inspeccionado con ayuda de

Jayway del proyecto JsonPath . Hay muchas otras opciones para verificar el resultado de la solicitud realizada y aquellos se discutir ms adelante.
Las importaciones estticas

La API de fluido en el ejemplo anterior requiere de una pocas importaciones estticos como MockMvcRequestBuilders.* , MockMvcResultMatchers.* y MockMvcBuilders.* . Una manera fcil de encontrar estas clases es la bsqueda de tipos que coinciden con "* MockMvc". Si se utiliza Eclipse, asegrese de aadir como favoritos "miembros estticos" en las preferencias de Eclipse en Java -> Editor -> Contenido Assist -> Favoritos. Esto permitir el uso de contenidos asistir despus de escribir el primer carcter del nombre del mtodo esttico. Otros IDE (por ejemplo, IntelliJ) pueden no requerir ninguna configuracin adicional. Slo tienes que comprobar el apoyo para completar el cdigo a los miembros estticos.
Opciones de configuracin del

El objetivo de la configuracin de prueba del lado del servidor es crear una instancia de MockMvc que se puede utilizar para realizar peticiones. Hay dos opciones principales. La primera opcin es apuntar a Spring MVC configuracin a travs del marco TestContext, que carga la configuracin de Spring e inyecta una WebApplicationContext en la prueba a utilizar para crear un MockMvc :
@ RunWith (SpringJUnit4ClassRunner.class) @ WebAppConfiguration @ ContextConfiguration ("mi-servlet-context.xml") MyWebTests public class { @ Autoconectados wac WebApplicationContext privado; mockMvc MockMvc privado; Antes @ public void setup () { .. este mockMvc MockMvcBuilders.webAppContextSetup = (. este wac) build (); } / / ... }

La segunda opcin es registrar simplemente una instancia de controlador sin cargar cualquier configuracin de Spring. En cambio bsico Spring MVC configuracin adecuada para probar los controladores anotados se crea automticamente. La configuracin creada es comparable a la de la JavaConfig MVC (y el espacio de nombres MVC) y se pueden personalizar para un grado a travs de mtodos de estilo constructor:
MyWebTests public class { mockMvc MockMvc privado;

Antes @ public void setup () { .. este mockMvc = MockMvcBuilders.standaloneSetup (nuevo AccountController ()) build (); } / / ... }

Qu opcin se debe utilizar? El "webAppContextSetup" carga la configuracin de Spring MVC real que resulta en una prueba de integracin ms completa. Dado que el marco TestContext almacena en cach la configuracin de resorte, que ayuda a mantener la ejecucin de pruebas rpido, incluso a medida que ms pruebas se agregan. Adems, se puede inyectar servicios simulacros en los controladores a travs de la configuracin de Primavera, con el fin de permanecer enfocados en probar la capa web. He aqu un ejemplo de declaracin de un servicio simulado con Mockito:
<bean id = "accountService" class = "org.mockito.Mockito" factorymethod "mock" => <constructor-arg value = "org.example.AccountService" /> </ Bean>

A continuacin, puede inyectar el servicio simulado en el ensayo con el fin de configurar y verificar las expectativas:
@ RunWith (SpringJUnit4ClassRunner.class) @ WebAppConfiguration @ ContextConfiguration ("test-servlet-context.xml") AccountTests public class { @ Autoconectados wac WebApplicationContext privado; mockMvc MockMvc privado; @ Autoconectados AccountService AccountService privado; / / ... }

El "standaloneSetup" por otra parte es un poco ms a una prueba unitaria. Se comprueba un controlador a la vez, el controlador puede ser inyectado con dependencias simulacros de forma manual, y que no implica cargar la configuracin del resorte. Estas pruebas se centran ms en el estilo y hacer que sea ms fcil ver qu controlador se est probando, si alguna configuracin especfica Spring MVC tiene la obligacin de trabajar, y as sucesivamente. El "standaloneSetup" es tambin una manera muy conveniente de escribir ad-hoc pruebas para verificar algn comportamiento o para depurar un problema.

Al igual que con las pruebas unitarias de integracin vs, no hay una respuesta correcta o incorrecta. Uso de la "standaloneSetup" implica la necesidad de algunos "webAppContextSetup" pruebas para verificar la configuracin de Spring MVC. Alternativamente, usted puede decidir escribir todas las pruebas con "webAppContextSetup" y siempre se prueba contra Spring MVC configuracin actual.
Realizar solicitudes

Para realizar pedidos, utilice el mtodo apropiado HTTP y estilo adicionales constructor mtodos correspondientes a las propiedades de MockHttpServletRequest . Por ejemplo:
mockMvc.perform (post ("/ hoteles / {id}" 42), aceptar (MediaType.APPLICATION_JSON).);

Adems de todos los mtodos HTTP, tambin puede realizar peticiones de subida de archivos, que internamente crea una instancia de MockMultipartHttpServletRequest :
mockMvc.perform (FileUpload ("/ doc") de archivo ("a1", "ABC" getBytes ("UTF-8")).).;

Parmetros de cadena de consulta se pueden especificar en la plantilla URI:


mockMvc.perform (get ("/ hoteles foo = {foo}?", "bar"));

O simplemente aadiendo los parmetros Servlet solicitud:


mockMvc.perform (get ("/ hoteles") param ("foo", "bar").);

Si el cdigo de aplicacin se basa en parmetros de la peticin del servlet, y no comprueba la cadena de consulta, como suele ser el caso, entonces no importa qu parmetros se agregan. Tenga en cuenta sin embargo que los parmetros proporcionados en la plantilla URI se decodifica mientras que los parmetros proporcionados a travs del param(...) mtodo se espera a decodificar. En la mayora de los casos es preferible dejar el camino y la ruta de contexto de servlet de la URI de la solicitud. Si usted tiene que probar con el URI de la solicitud completa, asegrese de ajustar el contextPath y servletPath en consecuencia para que las asignaciones de solicitud funcionar:
mockMvc.perform (get ("/ app / main / hoteles / {id}"). contextPath ("/ app"). servletPath ("/ main"))

Mirando el ejemplo anterior, sera engorroso para fijar el contextPath y servletPath con cada peticin realizada. Es por eso que se puede definir propiedades por defecto de solicitud en la construccin de la MockMvc :
MyWebTests public class { mockMvc MockMvc privado;

Antes @ public void setup () { mockMvc = standaloneSetup (nuevo AccountController ()) . DefaultRequest (get ("/") . ContextPath ("/ app"). ServletPath ("/ main") .. Aceptar (MediaType.APPLICATION_JSON) build (); } }

Las propiedades anteriores se aplicarn a cada solicitud realizada a travs del MockMvc . Si la misma propiedad se especifica tambin en una solicitud determinada, prevalecer el valor predeterminado. Por eso, el mtodo HTTP y URI no importan, al establecer las propiedades por defecto de peticin, ya que deben ser especificados en cada solicitud.
Definicin de las expectativas

Expectativas se puede definir aadiendo uno o ms .andExpect(..) despus de llamar para realizar la solicitud:
mockMvc.perform (get ("/ accounts / 1")) andExpect (status () Isok ().).; MockMvcResultMatchers.*

define un nmero de miembros estticos, algunos de los cuales devuelven tipos con mtodos adicionales, para afirmar el resultado de la solicitud realizada. Las afirmaciones caen en dos categoras generales. La primera categora de verificar las afirmaciones de propiedades de la respuesta, es decir, el estado de la respuesta, los encabezados y contenido. Esas son las cosas ms importantes para probar. La segunda categora de afirmaciones van ms all de la respuesta, y permitir la inspeccin de Spring MVC construcciones especficas, tales como el mtodo controlador procesa la solicitud, si la excepcin se plante y se maneja, cul es el contenido del modelo es, que Vista fue seleccionado, lo que Flash atributos se han aadido, y as sucesivamente. Tambin es posible verificar Servlet constructos especficos, tales como peticin y atributos de la sesin. El siguiente ensayo afirma que la unin / validacin ha fallado:
mockMvc.perform (post ("/ personas")) . AndExpect (status (). Isok ()) . AndExpect (modelo () attributeHasErrors ("persona").);

Muchas veces, al escribir pruebas, es til para volcar el resultado de la solicitud realizada. Esto se puede hacer de la siguiente manera, donde print() es una importacin esttica de MockMvcResultHandlers :
mockMvc.perform (post ("/ personas")) . AndDo (print ()) . AndExpect (status (). Isok ()) . AndExpect (modelo () attributeHasErrors ("persona").);

Mientras que el procesamiento de solicitudes se produce una excepcin no controlada, el print() mtodo se imprimirn todos los datos de resultados disponibles a System.out . En algunos casos, es posible que desee obtener acceso directo a los resultados y verificar algo que no se puede comprobar lo contrario. Esto se puede hacer aadiendo .andReturn() al final despus de todas las expectativas:
MvcResult mvcResult = (post ("/") personas) mockMvc.perform andExpect (status () Isok ().) AndReturn ()..; / / ...

Cuando todas las pruebas de repetir las mismas expectativas, puede definir las expectativas comunes de una vez en la construccin de la MockMvc :
standaloneSetup (nuevo SimpleController ()) . AlwaysExpect (status (). Isok ()) . AlwaysExpect (contenido () contentType ("application / json; charset = UTF-8".)) . Build ()

Tenga en cuenta que la expectativa se aplica siempre y no puede ser anulado sin necesidad de crear un separado MockMvc ejemplo. Cuando el contenido de la respuesta JSON contiene enlaces hipermedia creados con HATEOAS primavera , los enlaces resultantes pueden ser verificados:
mockMvc.perform (get ("/ pueblo"). aceptar (MediaType.APPLICATION_JSON)) . AndExpect (jsonPath ("$ vnculos href. [(@ Rel == 'auto')?.]".) Valor ("http://localhost:8080/people").);

Cuando el contenido de la respuesta XML contiene enlaces hipermedia creados con HATEOAS primavera , los enlaces resultantes pueden ser verificados:
Mapa <String, String> ns = Collections.singletonMap ("ns", "http://www.w3.org/2005/Atom"); mockMvc.perform (get ("/ handle"). aceptar (MediaType.APPLICATION_XML)) . AndExpect (xpath ("/ persona / ns: link [@ rel = 'self'] / @ href"., Ns) string ("http://localhost:8080/people")); Inscripciones Filtro

Al configurar una MockMvc , puede registrar uno o varios Filter casos:


. mockMvc = standaloneSetup (nuevo PersonController ()) addFilters (nuevo CharacterEncodingFilter ()) build ().;

Filtros registrados podrn ser invocadas por MockFilterChain de spring-test y el ltimo filtro se delega en el DispatcherServlet .
Otros ejemplos del lado del servidor de prueba

El marco propias pruebas incluyen una variedad de pruebas de muestras destinadas a demostrar cmo utilizar pruebas de la primavera de MVC. Examine estos ejemplos para otras ideas. Tambin la primavera-mvc-escaparate tiene cobertura de la prueba plena sobre la base de pruebas de la primavera de MVC.
Pruebas de cliente REST

Del lado del cliente son las pruebas para el cdigo usando el RestTemplate . El objetivo es definir las solicitudes esperadas y proporcionar "stub" respuestas:
RestTemplate restTemplate = new RestTemplate (); MockRestServiceServer mockServer = MockRestServiceServer.createServer (restTemplate); . mockServer.expect (requestTo ("/ saludo")) andRespond (withSuccess ("Hola mundo", "text / plain")); / / Usar RestTemplate ... mockServer.verify ();

En el ejemplo anterior, MockRestServiceServer - la clase central para las pruebas de REST lado del cliente - configura el RestTemplate con una costumbre ClientHttpRequestFactory afirma que las peticiones reales con las esperadas y devuelve "stub" respuestas. En este caso se espera una sola peticin a "/ saludo" y desea devolver una respuesta 200 con "text / plain" contenido. Podramos definir tantas otras solicitudes y respuestas de cdigo auxiliar que sea necesario. Una vez que las solicitudes y las respuestas esperadas stub se han definido, la RestTemplate se puede utilizar en el cdigo del lado del cliente como de costumbre. Al final de las pruebas mockServer.verify() se puede usar para verificar que todas las solicitudes esperadas se realizaron.
Las importaciones estticas

Al igual que con las pruebas del lado del servidor, la API de fluido para las pruebas del lado del cliente requiere un par importaciones estticas. Los que son fciles de encontrar mediante la bsqueda "* MockRest". Usuarios de Eclipse debe agregar "MockRestRequestMatchers.*" y "MockRestResponseCreators.*" como "miembros estticos favoritos" en las preferencias de Eclipse en Java -> Editor -> Contenido Assist -> Favoritos. Esto permite el uso de ayuda de contenido despus de escribir el primer carcter del nombre del mtodo esttico. Otros IDE (por ejemplo, IntelliJ) pueden no requerir ninguna configuracin adicional. Slo tienes que comprobar el apoyo para completar el cdigo a los miembros estticos.
Ejemplos de ensayos REST lado del cliente

Propias pruebas Spring MVC pruebas incluyen pruebas de ejemplo de las pruebas de REST lado del cliente.

11.3.7 Ejemplo PetClinic

La aplicacin PetClinic, disponible en el repositorio de muestras , ilustra varias caractersticas de la infraestructura Spring TestContext en un entorno JUnit 4,5 +. La mayora de la funcionalidad de prueba se incluye en los AbstractClinicTests , para los que una lista parcial se muestra a continuacin:
importar org.junit.Assert.assertEquals estticas; / / Import ... @ ContextConfiguration pblicas AbstractClinicTests clase abstracta se extiende AbstractTransactionalJUnit4SpringContextTests { @ Autoconectados Clnica protegido clnica; @ Test getVets public void () { Coleccin veterinarios <Vet> = Este clinic.getVets ().; assertEquals ("query JDBC debe mostrar el mismo nmero de veterinarios", super.countRowsInTable (VETS ""), vets.size ()); Vet v1 = EntityUtils.getById (veterinarios, veterinario de clase, 2.); assertEquals ("Leary", v1.getLastName ()); assertEquals (1, v1.getNrOfSpecialties ()); assertEquals ("radiologa", (v1.getSpecialties () Obtiene (0)) getName ()..); / / ... } / / ... }

Notas:

Este caso de prueba se extiende la


AbstractTransactionalJUnit4SpringContextTests

clase, de la que hereda de configuracin para la inyeccin de dependencia (a travs de la DependencyInjectionTestExecutionListener ) y el comportamiento transaccional (a travs de la TransactionalTestExecutionListener ). La clinic variable de instancia - el objeto de la aplicacin se est probando - es fijado por la inyeccin de dependencia a travs de @Autowired semntica. Los testGetVets() mtodo muestra cmo puede utilizar el heredado countRowsInTable() mtodo para comprobar fcilmente el nmero de filas en una tabla determinada, verificando as el correcto comportamiento del cdigo de la aplicacin se est probando. Esto permite pruebas ms fuertes y la dependencia disminuye en los datos de las pruebas exactas. Por ejemplo, puede agregar filas adicionales en la base de datos sin interrumpir las pruebas. Al igual que muchas pruebas de integracin que utilizan una base de datos, la mayora de las pruebas en AbstractClinicTests depender de una cantidad mnima de datos ya en la base de datos antes de ejecutar los casos de prueba. Alternativamente, usted puede optar por rellenar la base de datos en el

dispositivo de prueba de conjunto de casos de prueba - otra vez, dentro de la misma transaccin que de las pruebas. La aplicacin PetClinic admite tres tecnologas de acceso a datos: JDBC, Hibernate, JPA y. Al declarar @ContextConfiguration sin ningn tipo de ubicaciones especficas de recursos, el AbstractClinicTests clase tendr su contexto de aplicacin cargados desde la ubicacin por defecto, AbstractClinicTests-context.xml , que declara un comn DataSource . Las subclases especificar ubicaciones adicionales de contexto que deben declarar un PlatformTransactionManager y una implementacin concreta de Clinic . Por ejemplo, una implementacin de las pruebas PetClinic contiene la siguiente implementacin. Para este ejemplo, HibernateClinicTests no contiene una sola lnea de cdigo: slo tenemos que declarar @ContextConfiguration , y las pruebas se heredan de AbstractClinicTests . Porque @ContextConfiguration se declara sin ninguna ubicacin de recursos especficos, la primavera TestContext Marco carga un contexto de aplicacin de todos los beans definidos en AbstractClinicTestscontext.xml (es decir, los lugares heredados) y HibernateClinicTestscontext.xml , con HibernateClinicTests-context.xml posiblemente invalidando beans definidos en AbstractClinicTests-context.xml .
@ ContextConfiguration HibernateClinicTests clase pblica se extiende AbstractClinicTests {}

En una aplicacin a gran escala, la configuracin de la primavera a menudo se divide en varios archivos. Por lo tanto, las ubicaciones de configuracin se especifica tpicamente en una clase base comn para todas las pruebas de integracin de aplicaciones especficas. Una clase base tambin puede aadir variables tiles instancia - poblada por inyeccin de dependencias, naturalmente - como una SessionFactory en el caso de una aplicacin usando Hibernate. En lo posible, debe tener exactamente los mismos archivos de configuracin de primavera en sus pruebas de integracin como en el entorno de despliegue. Un punto probable de la diferencia preocupaciones agrupacin de conexiones de base de datos y la infraestructura de transaccin. Si va a desplegar en un servidor de aplicaciones a gran escala, es probable que utilice su pool de conexiones (disponible a travs de JNDI) y la implementacin JTA. As, en la produccin que va a utilizar un JndiObjectFactoryBean o <jee:jndi-lookup> para el DataSource y JtaTransactionManager . JNDI JTA y no estar disponible en las pruebas de integracin fuera de los contenedores, por lo que debe utilizar una combinacin como el DBCP Commons BasicDataSource y DataSourceTransactionManager o HibernateTransactionManager para ellos. Usted puede factorizar este comportamiento variante en un solo archivo XML, que tiene la posibilidad de elegir entre un servidor de aplicaciones y "local" configuracin separada de las dems configuraciones, que no variar entre la prueba y entornos de produccin. Adems, es aconsejable utilizar archivos de propiedades para la configuracin de la conexin. Vea la aplicacin PetClinic para un ejemplo.

11.4 Recursos adicionales

Consulte los siguientes recursos para obtener ms informacin acerca de las pruebas:

JUnit : "Un programador orientado al marco de pruebas para Java". Utilizado por el Spring Framework en su serie de pruebas. TestNG : Un framework de pruebas JUnit inspirado con soporte para Java 5 anotaciones, grupos de prueba, pruebas controladas por datos, pruebas, etc distribuida MockObjects.com : Pgina web dedicada a los objetos de imitacin, una tcnica para mejorar el diseo de cdigo en desarrollo basado en pruebas. "Objetos" Simulacro : El artculo en Wikipedia. EasyMock : Java library "que ofrece objetos de burla para las interfaces (y objetos a travs de la extensin de clase) mediante la generacin de ellos sobre la marcha usando el mecanismo de representacin de Java." Lo utiliza el Spring Framework en su serie de pruebas. JMock : Biblioteca que apoya desarrollo basado en pruebas de cdigo Java con objetos de imitacin. Mockito : Java biblioteca de simulacro basado en el espa de prueba patrn. DBUnit : extensin de JUnit (tambin utilizable con Ant y Maven) dirigidos a bases de datos para proyectos que, entre otras cosas, pone a su base de datos en un estado conocido entre ejecuciones de pruebas. El Molino : Carga Java framework de pruebas.

Parte IV. Acceso a datos


Esta parte de la documentacin de referencia est relacionada con el acceso a datos y la interaccin entre la capa de acceso de datos y de negocios o la capa de servicio. Integral de apoyo del resorte de gestin de la transaccin est cubierta con algn detalle, seguido de una cobertura completa de los marcos de acceso diferentes de datos y tecnologas de que el marco se integra con Spring.

Captulo 12, Gestin de Operaciones Captulo 13, soporte DAO Captulo 14, el acceso a datos con JDBC Captulo 15, Object Relational Mapping (ORM) de acceso a datos Captulo 16, Marshalling XML usando O / X mappers

12. Administracin de transacciones 12.1 Introduccin a la gestin de Spring Framework transaccin


Soporte de transacciones Integral es una de las razones ms convincentes para utilizar el marco de la Primavera. El Spring Framework proporciona una abstraccin coherente para la gestin de transacciones que ofrece los siguientes beneficios:

Modelo de programacin consistente a travs de las API de transaccin diferente, como Java Transaction API (JTA), JDBC, Hibernate, Java Persistence API (JPA) y Java Data Objects (JDO). El apoyo a la gestin de transacciones declarativa . Simplificacin de la API para la programacin de las API de gestin de transacciones transaccin compleja, como JTA. Excelente integracin con abstracciones primavera de acceso a datos.

En las secciones siguientes se describen los valores agregados Spring Framework de operacin y tecnologas. (El captulo tambin incluye la discusin de las mejores prcticas, la integracin del servidor de aplicaciones y soluciones a problemas comunes.)

Ventajas del modelo Spring Framework de transacciones de apoyo se describe por qu usara abstraccin Spring Framework de transaccin en lugar de EJB transacciones gestionadas por contenedor (CMT) o la eleccin para conducir operaciones locales a travs de un API propietario como Hibernate. Comprender el Spring Framework abstraccin transaccin describe las clases principales y describe cmo configurar y obtener DataSource instancias de una variedad de fuentes. Sincronizacin de los recursos con transacciones describe cmo el cdigo de la aplicacin garantiza que los recursos se crean, reutilizar, y haban limpiado correctamente. Gestin de transacciones declarativa describe la compatibilidad para la gestin de transacciones declarativa. Gestin de transacciones programtica abarca el apoyo para la gestin programtica de transacciones (es decir, explcitamente codificado).

12.2 Ventajas del modelo Spring Framework de transacciones de apoyo


Tradicionalmente, los desarrolladores de Java EE han tenido dos opciones para la gestin de transacciones: transacciones globales o locales, los cuales tienen profundas limitaciones. Gestin de transacciones globales y locales se revisa en las dos secciones siguientes, seguido por una discusin de cmo el apoyo al Marco de gestin de transacciones de Spring aborda las limitaciones de los modelos de transacciones globales y locales.
12.2.1 Las transacciones globales

Las transacciones globales le permiten trabajar con mltiples recursos transaccionales, bases de datos relacionales normalmente y colas de mensajes. El servidor de aplicaciones administra las transacciones globales a travs de la JTA, que es una API complicado de usar (en parte debido a su modelo de excepcin). Adems, JTA UserTransaction normalmente tiene que proceder de JNDI, lo que significa que tambin es necesario para utilizar JNDI a fin de utilizar JTA. Obviamente, el uso de transacciones globales limitara cualquier potencial reutilizacin de cdigo de la aplicacin, como JTA normalmente slo est disponible en un entorno de servidor de aplicaciones.

Anteriormente, la mejor forma de utilizar las transacciones globales fue a travs de EJB CMT (Container Managed Transaction): CMT es una forma de gestin de transacciones declarativa (a diferencia de la gestin de transacciones programtica). EJB CMT elimina la necesidad de transaccin relacionados con bsquedas JNDI, aunque, por supuesto, el uso de EJB s requiere el uso de JNDI. Se elimina la mayora pero no todos de la necesidad de escribir cdigo Java para las transacciones de control. La desventaja significativa es que la CMT est ligado a JTA y un entorno de servidor de aplicaciones. Adems, slo est disponible si se opta por implementar la lgica de negocio en los EJB, o por lo menos detrs de una fachada transaccional EJB. Los negativos de EJB en general son tan grandes que no se trata de una propuesta atractiva, especialmente en la cara de alternativas convincentes para la gestin de transacciones declarativa.
12.2.2 Las transacciones locales

Las transacciones locales son recursos especficos, tales como una transaccin asociado a una conexin JDBC. Las transacciones locales pueden ser ms fciles de usar, pero tiene desventajas importantes: no pueden trabajar a travs de mltiples recursos transaccionales. Por ejemplo, el cdigo que maneja las transacciones mediante una conexin JDBC no puede ejecutarse dentro de una transaccin JTA global de. Debido a que el servidor de aplicaciones no est implicado en la gestin de la transaccin, no puede ayudar a garantizar la correccin a travs de mltiples recursos. (Cabe sealar que la mayora de las aplicaciones utilizan un recurso sola transaccin.) Otra desventaja es que las transacciones locales son invasivos para el modelo de programacin.
12.2.3 Spring Framework El modelo de programacin coherente

Primavera resuelve los inconvenientes de las transacciones globales y locales. Permite a los desarrolladores de aplicaciones para utilizar un modelo de programacin consistente en cualquier entorno. El cdigo se escribe una vez, y se pueden beneficiar de las diferentes estrategias de gestin de transacciones en diferentes entornos. El Spring Framework proporciona la gestin de transacciones declarativa y programtica. La mayora de los usuarios prefieren la gestin de transacciones declarativa, que se recomienda en la mayora de los casos. Con la gestin de transacciones programtica, los desarrolladores trabajar con la abstraccin Spring Framework transaccin, que puede funcionar sobre cualquier infraestructura transaccin subyacente. Con el modelo declarativo preferida, normalmente los desarrolladores escribir cdigo poca o ninguna relacin con la gestin de transacciones, y por lo tanto, no dependen de la API de transaccin Spring Framework, o cualquier otra transaccin API. Necesita un servidor de aplicaciones para la gestin de transacciones? El apoyo de la Spring Framework de gestin de transacciones cambia las reglas tradicionales en cuanto a cuando una aplicacin empresarial Java requiere un servidor de aplicaciones. En particular, no es necesario un servidor de aplicaciones slo para las transacciones declarativas mediante EJBs. De hecho, incluso si su servidor de aplicaciones tiene

potentes capacidades de JTA, usted puede decidir que las transacciones declarativas Spring Framework ofrecen ms potencia y un modelo de programacin ms productiva que EJB CMT. Normalmente, usted necesita la capacidad de un servidor de aplicaciones de JTA slo si su aplicacin necesita manejar las transacciones a travs de mltiples recursos, que no es un requisito para muchas aplicaciones. Muchas aplicaciones de gama alta utiliza una base de datos nica, altamente escalable (como Oracle RAC) en su lugar. Directores independientes de transacciones tales como operaciones Atomikos y JOTM otras opciones. Por supuesto, usted puede necesitar otras funciones de servidor de aplicaciones como Java Message Service (JMS) y J2EE Connector Architecture (JCA). El Spring Framework le da la opcin de cundo escalar su aplicacin a un servidor de aplicaciones completamente cargado. Atrs han quedado los das en que la nica alternativa al uso de EJB CMT JTA o iba a escribir cdigo con transacciones locales como las de conexiones JDBC, y se enfrentan a una reanudacin fuerte si es necesario que el cdigo se ejecute dentro globales, transacciones gestionadas por contenedor. Con el Spring Framework, slo algunas de las definiciones de frijol en el archivo de configuracin, en lugar de su cdigo, necesita cambiar.

12.3 Entender la Spring Framework abstraccin transaccin


La clave de la abstraccin transaccin primavera es la nocin de una estrategia de operacin. Una estrategia de transaccin se define por la org.springframework.transaction.PlatformTransactionManager interfaz:
PlatformTransactionManager interfaz pblica { TransactionStatus GetTransaction (TransactionDefinition definicin) lanza TransactionException; void commit (TransactionStatus estado) throws TransactionException; rollback vaco (estado TransactionStatus) throws TransactionException; }

Esto es principalmente una interfaz de proveedor de servicios (SPI), aunque se puede utilizar mediante programacin desde el cdigo de aplicacin. Debido PlatformTransactionManager es una interfaz, que puede ser fcilmente burlado o apag como sea necesario. No est vinculado a una estrategia de bsqueda, tales como JNDI. PlatformTransactionManager implementaciones se definen como cualquier otro objeto (o frijol) en el contenedor de Spring Framework COI. Este beneficio solo hace que las transacciones Spring Framework una abstraccin que vale la pena, incluso cuando se trabaja con JTA. Cdigo transaccional se pueden probar mucho ms fcilmente que si se utiliza JTA directamente. De nuevo de acuerdo con la filosofa de la primavera, la TransactionException que puede ser lanzado por cualquiera de los PlatformTransactionManager mtodos de interfaz es sin marcar (es decir, se extiende la java.lang.RuntimeException clase).

Fallas de transaccin de infraestructura son casi invariablemente fatal. En los casos excepcionales en que el cdigo de aplicacin en realidad se puede recuperar de un error de la transaccin, el desarrollador de la aplicacin an puede optar por capturar y manejar TransactionException . El punto saliente es que los desarrolladores no estn obligados a hacerlo. El getTransaction(..) mtodo devuelve un TransactionStatus objeto, en funcin de un TransactionDefinition parmetro. El regres TransactionStatus podra representar una nueva transaccin, o puede representar una transaccin existente si una transaccin coincida en la pila de llamadas actual. La implicacin en este ltimo caso es que, como con los contextos de transacciones de Java EE, una TransactionStatus est asociada con un hilo de ejecucin. El TransactionDefinition interfaz especifica:

Aislamiento: El grado en que se asla esta transaccin a partir del trabajo de otras transacciones. Por ejemplo, puede ver esta transaccin no confirmada escribe desde otras transacciones? Propagacin: Por lo general, todo el cdigo ejecutado dentro de un mbito de transaccin se ejecutar en esa transaccin. Sin embargo, usted tiene la opcin de especificar el comportamiento en el caso de que un mtodo transaccional se ejecuta cuando un contexto de transaccin ya existe. Por ejemplo, el cdigo puede continuar funcionando en la transaccin actual (el caso ms comn), o la transaccin existente puede ser suspendida y cre una nueva transaccin ofertas de primavera todas las opciones de transaccin de propagacin familiares de EJB CMT.. Para leer acerca de la semntica de propagacin de transacciones en Spring, consulte la Seccin 12.5.7, "propagacin de transacciones" . Tiempo de espera: Cunto tiempo esta transaccin se ejecuta antes de que se agote el tiempo y se deshace automticamente por la infraestructura transaccin subyacente. De slo lectura SITUACIN: Una transaccin de slo lectura puede utilizarse cuando el cdigo se lee, pero no modifica los datos. Transacciones de slo lectura puede ser una optimizacin til en algunos casos, como cuando se utiliza Hibernate.

Estos valores reflejan conceptos estndares transaccionales. Si es necesario, consulte los recursos que discuten los niveles de aislamiento de transacciones y otros conceptos bsicos de transaccin. La comprensin de estos conceptos es indispensable usando Spring Framework o cualquier otra solucin de gestin de transacciones. El TransactionStatus interfaz proporciona una forma sencilla para el cdigo de transaccin para controlar la ejecucin de transacciones y situacin de la operacin de consulta. Los conceptos deben estar familiarizados, ya que son comunes a todas las API de transaccin:
public interface extends TransactionStatus SavepointManager { isNewTransaction boolean (); booleano hasSavepoint ();

setRollbackOnly vaco (); booleano isRollbackOnly (); anular flush (); isCompleted booleano (); }

Independientemente de si se opta por la gestin de transacciones declarativa o programtica en la primavera, que define el correcto PlatformTransactionManager aplicacin es absolutamente esencial. Por lo general, definen esta aplicacin a travs de la inyeccin de dependencia.
PlatformTransactionManager

implementaciones normalmente requieren el conocimiento del entorno en el que trabajan: JDBC, JTA, Hibernate, y as sucesivamente. Los siguientes ejemplos muestran cmo se puede definir un local PlatformTransactionManager implementacin. (Este ejemplo funciona con el llano JDBC). Se define un JDBC DataSource
<bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method "close" => <propiedad nombre = valor = "driverClassName" "${jdbc.driverClassName}" /> <propiedad nombre = valor = "url" "${jdbc.url}" /> <propiedad nombre = valor = "username" "${jdbc.username}" /> <propiedad nombre = valor = "password" "${jdbc.password}" /> </ Bean>

El relacionada PlatformTransactionManager definicin de bean tendr entonces una referencia al DataSource definicin. Se parece a esto:
<bean id = "txManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager"> <propiedad nombre = "dataSource" ref = "dataSource" /> </ Bean>

Si utiliza JTA en un contenedor Java EE a continuacin, utiliza un recipiente de DataSource , obtenidos a travs de JNDI, junto con Spring JtaTransactionManager . Esto es lo que la versin de bsqueda JNDI JTA y se vera as:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: jee = "http://www.springframework.org/schema/jee" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd "> id = <jee:jndi-lookup "dataSource" jndi-name = "jdbc/jpetstore" />

<bean id = "txManager" class = "org.springframework.transaction.jta.JtaTransactionManager" /> <- Otras definiciones <bean/> aqu -> </ Beans>

El JtaTransactionManager no necesita saber sobre el DataSource , o cualquier otros recursos especficos, ya que utiliza el contenedor de la infraestructura global de gestin de transacciones.
Nota

La definicin anterior de la dataSource bean utiliza el <jndi-lookup/> etiqueta de la jee espacio de nombres. Para obtener ms informacin sobre el esquema basado en configuracin, consulte el Apndice E, esquema XML de configuracin basada en , y para ms informacin sobre los <jee/> etiquetas consulte la seccin titulada Seccin E.2.3, "El jee esquema " . Tambin puede utilizar Hibernate transacciones locales fcilmente, como se muestra en los siguientes ejemplos. En este caso, es necesario definir una Hibernate LocalSessionFactoryBean , que el cdigo de aplicacin que utilizar para obtener Hibernate Session casos. El DataSource definicin de bean ser similar a la local de ejemplo JDBC demostrado previamente y por lo tanto no se muestra en el siguiente ejemplo.
Nota

Si el DataSource , utilizado por cualquier gestor de transacciones no JTA, se busca a travs de JNDI y gestionado por un contenedor Java EE, entonces debera ser no transaccional porque el Spring Framework, en lugar del contenedor Java EE, se encargar de las operaciones. El txManager bean en este caso es de la HibernateTransactionManager tipo. De la misma manera como la DataSourceTransactionManager necesita una referencia a la DataSource , el HibernateTransactionManager necesita una referencia a la SessionFactory .
<bean id = "sessionFactory" class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <propiedad nombre = "dataSource" ref = "dataSource" /> <propiedad nombre = "mappingResources"> <list> <valor> org / springframework / samples / petclinic / hibernate / petclinic.hbm.xml </ value> </ List> </ Propiedad> <propiedad nombre = "hibernateProperties"> <valor> hibernate.dialect = $ {} hibernate.dialect </ Value> </ Propiedad>

</ Bean> <bean id = "txManager" class = "org.springframework.orm.hibernate3.HibernateTransactionManager"> <propiedad nombre = "sessionFactory" ref = "sessionFactory" /> </ Bean>

Si usted est usando Hibernate y Java EE gestionada por contenedor transacciones JTA, entonces usted simplemente debe utilizar el mismo JtaTransactionManager como en el ejemplo anterior JTA para JDBC.
<bean id = "txManager" class = "org.springframework.transaction.jta.JtaTransactionManager" />

Nota

Si utiliza JTA, entonces su definicin del gestor de transacciones tendrn el mismo aspecto, independientemente de lo que la tecnologa de acceso a datos que utilice, ya sea JDBC, Hibernate JPA o cualquier otra tecnologa compatible. Esto es debido al hecho de que las transacciones JTA son transacciones globales, lo que puede dar de alta cualquier recurso transaccional. En todos estos casos, el cdigo de aplicacin no tiene que cambiar. Puede cambiar el nmero de transacciones son manejadas solamente por el cambio de configuracin, incluso si ese cambio significa pasar de lo local a las transacciones globales o viceversa.

12.4 Sincronizacin de recursos con transacciones


Ahora debera quedar claro cmo crear diferentes gestores de transacciones y la forma en que estn vinculados a los recursos relacionados que deben ser sincronizados con las transacciones (por ejemplo DataSourceTransactionManager a un JDBC DataSource , HibernateTransactionManager a Hibernate SessionFactory , y as sucesivamente). En esta seccin se describe cmo el cdigo de la aplicacin, directa o indirectamente, mediante una API de persistencia, como JDBC, Hibernate, JDO o, asegura que estos recursos se crean, reutilizar, y haban limpiado correctamente. La seccin tambin explica cmo se activa la sincronizacin de transaccin (opcionalmente) a travs de la correspondiente PlatformTransactionManager .
12.4.1 alto nivel de sincronizacin enfoque

El mtodo preferido es usar ms de Spring plantilla de nivel de base persistencia API de integracin o utilizar las API nativas ORM con frijoles fbrica conscientes de transacciones o proxies para gestionar las fbricas de recursos nativos. Estas soluciones conscientes de transacciones internamente manejar la creacin y reutilizacin de los recursos, la limpieza, la sincronizacin de transaccin opcional de los recursos y la asignacin de excepcin. As usuario cdigo de acceso de datos no tiene que abordar estas tareas, pero puede ser enfocado puramente en la lgica de persistencia no repetitivo. Por lo general, se utiliza la API nativa ORM o adoptar un enfoque modelo para el acceso JDBC utilizando el JdbcTemplate . Estas soluciones se detallan en los siguientes captulos de esta documentacin de referencia.

12.4.2 Bajo nivel de sincronizacin enfoque

Las clases como DataSourceUtils (para JDBC), EntityManagerFactoryUtils (por JPA), SessionFactoryUtils (por Hibernate), PersistenceManagerFactoryUtils (por JDO), y as sucesivamente existen en un nivel inferior. Si desea que el cdigo de aplicacin para tratar directamente con los tipos de recursos de la API de persistencia nativa, utiliza estas clases para asegurar que la primavera adecuado marco gestionados casos se obtienen, las transacciones son (opcionalmente) sincronizados, y son excepciones que se producen en el proceso de asignado correctamente a una API consistente. Por ejemplo, en el caso de JDBC, en lugar del tradicional enfoque JDBC de llamar a la getConnection() mtodo en el DataSource , en su lugar usar Spring org.springframework.jdbc.datasource.DataSourceUtils clase de la siguiente manera:
Conexin conn = DataSourceUtils.getConnection (DataSource);

Si una transaccin existente ya tiene una conexin sincronizada (vinculado) a la misma, dicha instancia se devuelve. De lo contrario, la llamada al mtodo desencadena la creacin de una nueva conexin, la cual es (opcionalmente) sincronizado con cualquier transaccin existente, y puesto a disposicin para su reutilizacin posterior en la misma transaccin. Como se ha mencionado, cualquier SQLException se envuelve en un Spring Framework CannotGetJdbcConnectionException , uno de jerarqua de la infraestructura Spring de DataAccessExceptions sin marcar. Este enfoque le da ms informacin que la que se puede obtener fcilmente de la SQLException , y asegura la portabilidad a travs de bases de datos, incluso a travs de tecnologas de persistencia diferentes. Este mtodo tambin funciona sin una gestin Spring transaccin (transaccin sincronizacin es opcional), as que usted puede utilizar si usted est usando la primavera de gestin de transacciones. Por supuesto, una vez que haya utilizado el apoyo de Spring JDBC, soporte JPA o Hibernate apoyo, por lo general se prefiere no utilizar DataSourceUtils o de las otras clases de ayuda, porque usted va a trabajar mucho ms feliz a travs de la abstraccin Primavera de hacerlo directamente con las API correspondiente. Por ejemplo, si utiliza la primavera JdbcTemplate o jdbc.object paquete para simplificar el uso de JDBC, recuperacin correcta conexin ocurre detrs de las escenas y no necesita escribir ningn cdigo especial.
12.4.3 TransactionAwareDataSourceProxy

En el nivel ms bajo que existe la TransactionAwareDataSourceProxy clase. Se trata de un proxy para un objetivo DataSource , que envuelve el objetivo DataSource para aadir el conocimiento de las operaciones gestionadas por resorte. A este respecto, es similar a una transaccional JNDI DataSource como proporcionada por un servidor Java EE.

Nunca se debe casi ser necesario o deseable utilizar esta clase, excepto cuando el cdigo existente debe ser llamado y aprob un estndar JDBC DataSource implementacin de la interfaz. En ese caso, es posible que este cdigo se puede utilizar, pero que participan en gestionados Spring transacciones. Es preferible escribir el nuevo cdigo mediante el uso de las abstracciones de nivel superior mencionados arriba.

12,5 gestin de transacciones declarativa


Nota

La mayora de los usuarios de Spring Framework elegir la gestin de transacciones declarativa. Esta opcin tiene el menor impacto en el cdigo de aplicacin, y por lo tanto es ms coherente con los ideales de un contenedor ligero no invasiva. La gerencia de la Spring Framework de transacciones declarativa se hace posible con la primavera programacin orientada a aspectos (AOP), aunque, como el cdigo de los aspectos transaccionales viene con la distribucin Spring Framework y puede ser utilizado de forma repetitivo, los conceptos de AOP por lo general no tienen que ser entendidos para hacer un uso efectivo de este cdigo. La gerencia de la Spring Framework de transacciones declarativa es similar a EJB CMT en que se puede especificar el comportamiento de transacciones (o falta de ella) hasta el nivel de mtodo individual. Es posible hacer un setRollbackOnly() llamada dentro de un contexto de transaccin si es necesario. Las diferencias entre los dos tipos de gestin de la transaccin son:

A diferencia de EJB CMT, que est vinculado a JTA, la gestin de la infraestructura Spring de transacciones declarativa funciona en cualquier entorno. Puede trabajar con transacciones JTA o transacciones locales mediante JDBC, JPA, Hibernate o JDO simplemente ajustando los archivos de configuracin. Puede aplicar el Marco de gestin de transacciones declarativa primavera a ninguna clase, y no slo las clases especiales, tales como EJB. El Spring Framework ofrece declarativos reglas de rollback, una caracterstica que no tiene equivalente EJB. Tanto el apoyo programtico y declarativo para las reglas de rollback se proporciona. El Spring Framework permite personalizar el comportamiento transaccional, mediante el uso de AOP. Por ejemplo, puede insertar comportamiento personalizado en el caso de reversin de transacciones. Tambin puede aadir consejo arbitrario, junto con el asesoramiento transaccional. Con EJB CMT, no se puede influir en el manejo del contenedor transaccin excepto con setRollbackOnly() . El Spring Framework no admite la propagacin de contexto de transaccin a travs de llamadas remotas, al igual que los de gama alta servidores de aplicaciones. Si usted necesita esta caracterstica, se recomienda que utilice EJB. Sin embargo, considere cuidadosamente antes de utilizar esta caracterstica, ya que normalmente, uno no quiere que las operaciones para abarcar las llamadas remotas.

Dnde est TransactionProxyFactoryBean ? Configuracin transaccin declarativa en las versiones de Spring 2.0 y arriba difiere considerablemente de las versiones anteriores de primavera. La principal diferencia es que ya no hay ninguna necesidad de configurar TransactionProxyFactoryBean frijoles. El estilo pre-Spring 2.0 configuracin sigue siendo 100% configuracin vlida, pensar en el nuevo <tx:tags/> como una simple definicin TransactionProxyFactoryBean frijoles en su nombre. El concepto de reglas de rollback es importante: le permiten especificar qu excepciones (y throwables) debe hacer rollback automtico. Esto se especifica mediante declaracin, en la configuracin, no en cdigo Java. Por lo tanto, aunque todava se puede llamar setRollbackOnly() en el TransactionStatus objeto de revertir la transaccin en curso de nuevo, con mayor frecuencia se puede especificar una regla que MyApplicationException siempre debe dar lugar a reversin. La importante ventaja de esta opcin es que los objetos de negocio no dependen de la infraestructura de transacciones. Por ejemplo, normalmente no es necesario importar APIs Spring transaccin o APIs Spring otro. Aunque contenedor EJB comportamiento predeterminado revierte automticamente la transaccin en una excepcin del sistema (generalmente una excepcin de tiempo de ejecucin), EJB CMT no deshace la transaccin de forma automtica en una excepcin de aplicacin (es decir, una excepcin comprobada que no sea java.rmi.RemoteException ). Aunque el comportamiento predeterminado de primavera para la gestin de transacciones declarativa siguiente convencin EJB (rollo de espalda es automtico slo en excepciones sin marcar), a menudo es til para modificar este comportamiento.
12.5.1 Comprender la implementacin del Marco de Spring transaccin declarativa

No basta con decirle simplemente a anotar sus clases con el @Transactional anotacin, aadir @EnableTransactionManagement a su configuracin, y luego espero que lo entiendas cmo funciona todo. En esta seccin se explica el funcionamiento interno de la infraestructura Spring Framework de transacciones declarativa en el caso de las transacciones relacionadas con los temas. Los conceptos ms importantes para agarrar lo que se refiere al apoyo al Marco de Spring transaccin declarativa es que este apoyo se habilita a travs de servidores proxy AOP , y que el asesoramiento transaccional es impulsada por metadatos (actualmente en XML o anotaciones-based). La combinacin de AOP con metadatos transaccional produce un proxy AOP que utiliza un TransactionInterceptor en conjuncin con un apropiado PlatformTransactionManager aplicacin para conducir transacciones alrededor de invocaciones de mtodos.
Nota

Spring AOP se trata en el captulo 9, Programacin Orientada a Aspectos con

Spring . Conceptualmente, llamar a un mtodo en un proxy transaccional se parece a esto ...

12.5.2 Ejemplo de implementacin de transacciones declarativa

Considere la siguiente interfaz, y su aplicacin operadora. En este ejemplo se utiliza Foo y Bar clases como marcadores de posicin para que pueda concentrarse en el uso de la transaccin, sin centrarse en un modelo de dominio particular. Para los fines de este ejemplo, el hecho de que la DefaultFooService clase lanza UnsupportedOperationException casos en los que el cuerpo de cada mtodo implementado es bueno, sino que le permite ver las operaciones de creacin y vuelve a desplazarse en respuesta a la UnsupportedOperationException ejemplo.
/ / El interfaz de servicio que queremos hacer transaccional paquete xyservice; FooService interfaz pblica { Foo getFoo (String fooName); Foo getFoo (String fooName, String barName); vaco insertFoo (Foo foo); vaco updateFoo (Foo foo); } / / Una implementacin de la interfaz anterior paquete xyservice;

DefaultFooService clase pblica implementa FooService { pblico Foo getFoo (String fooName) { tirar UnsupportedOperationException nuevo (); } pblico Foo getFoo (String fooName, String barName) { tirar UnsupportedOperationException nuevo (); } public void insertFoo (Foo foo) { tirar UnsupportedOperationException nuevo (); } public void updateFoo (Foo foo) { tirar UnsupportedOperationException nuevo (); } }

Supongamos que los dos primeros mtodos de la FooService interfaz , getFoo(String) y getFoo(String, String), debe ejecutar en el contexto de una transaccin con slo lectura semntica, y que los otros mtodos ,insertFoo(Foo) y updateFoo(Foo), se debe ejecutar en el contexto de una operacin de lectura-escritura semntica. La configuracin siguiente se explica en detalle en los siguientes prrafos.
<- Desde el archivo 'context.xml' -> <? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <- Este es el objeto de servicio que queremos hacer transaccional > <bean id = "fooService" class = "xyservice.DefaultFooService" /> <- El asesoramiento transaccional (lo que sucede ", vase el grano <aop:advisor/> abajo) -> <tx:advice id = transaction-manager "txAdvice" "txManager" => <- La semntica transaccional ... -> <tx:attributes> <- Todos los mtodos que comienzan con 'get' es de slo lectura > <tx:method name = "get*" read-only = "true" /> <- Mtodos utilizarn los ajustes predeterminados de transaccin (ver ms abajo) -> nombre = <tx:method "*" /> </ Tx: attributes> </ Tx: advice> <- Garantizar que el asesoramiento de transacciones por encima de todo tiene una duracin de ejecucin

de una operacin definida por la interfaz FooService -> <aop:config> <aop:pointcut id = "fooServiceOperation" expresin = "execution(* xyservice.FooService.*(..))" /> <aop:advisor advice-ref = "txAdvice" pointcut-ref = "fooServiceOperation" /> </ Aop: config> <- No se olvide de la fuente de datos -> <bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method "close" => <propiedad nombre = valor = "driverClassName" "oracle.jdbc.driver.OracleDriver" /> <propiedad nombre = valor = "url" "jdbc:oracle:thin:@rjt42:1521:elvis" /> <propiedad nombre = valor = "username" "scott" /> <propiedad nombre = valor = "password" "tiger" /> </ Bean> <- Del mismo modo, no se olvide de la PlatformTransactionManager -> <bean id = "txManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager"> <propiedad nombre = "dataSource" ref = "dataSource" /> </ Bean> <- Otras definiciones <bean/> aqu -> </ Beans>

Examine la configuracin anterior. Quieres hacer un objeto de servicio, el fooService frijol, transaccional. La semntica de transaccin aplicables se encapsula en el <tx:advice/> definicin. El <tx:advice/> definicin dice "... todos los mtodos sobre cmo comenzar con 'get' van a ejecutar en el contexto de una transaccin de slo lectura, y todos los otros mtodos han de ejecutar con la semntica de transaccin por defecto ". La transaction-manager atributo de la <tx:advice/> etiqueta se establece en el nombre de la PlatformTransactionManager bean que va a conducir las operaciones, en este caso, el txManager frijol.
Punta

Puede omitir la transaction-manager de atributos en el asesoramiento transaccional ( <tx:advice/> ) si el nombre del bean PlatformTransactionManager que desea conectar en cuenta el nombre transactionManager . Si el PlatformTransactionManager bean que desea conectar en cuenta cualquier otro nombre, entonces usted debe utilizar la transaction-manager atributo explcitamente, como en el ejemplo anterior. El <aop:config/> definicin asegura que el asesoramiento transaccional definido por el txAdvice frijol ejecuta en los puntos apropiados en el programa. En primer lugar se define un punto de corte que corresponda a la ejecucin de cualquier operacin definida en el FooService interfaz ( fooServiceOperation ). A continuacin, se asocia el punto de corte con el txAdvice con un asesor. El resultado indica que en la ejecucin de un fooServiceOperation , el asesoramiento definido por txAdvice se ejecutar.

La expresin definida dentro del <aop:pointcut/> elemento es una expresin AspectJ pointcut, vase el Captulo 9, Programacin Orientada a Aspectos con Spring para obtener ms detalles sobre las expresiones pointcut en Spring 2.0. Un requisito comn es hacer una capa de servicio completo de transacciones. La mejor forma de hacer esto es simplemente para cambiar la expresin punto de corte para que coincida con cualquier operacin en la capa de servicio. Por ejemplo:
<aop:config> <aop:pointcut id = "fooServiceMethods" expresin = "execution(* xyservice.*.*(..))" /> <aop:advisor advice-ref = "txAdvice" pointcut-ref = "fooServiceMethods" /> </ Aop: config>

Nota

En este ejemplo, se supone que todas las interfaces de servicio se definen en el xyservice paquete, vase el Captulo 9, Programacin Orientada a Aspectos con Spring para ms detalles. Ahora que hemos analizado la configuracin, es posible que se est preguntando, "De acuerdo ... pero qu significa todo esto configuracin realmente? ". La configuracin anterior se puede utilizar para crear un proxy transaccional alrededor del objeto que se crea a partir de la fooService definicin de bean. El proxy se puede configurar con el asesoramiento transaccional, de modo que cuando un mtodo apropiado se invoca en el proxy, se inicia una transaccin, suspendido, marcado como de slo lectura, y as sucesivamente, dependiendo de la configuracin de transaccin asociado con ese mtodo. Considere el siguiente programa de prueba que conduce la configuracin anterior:
Boot public final class { public static void main (String [] args definitivo) throws Exception { ApplicationContext ctx = new ClassPathXmlApplicationContext ("context.xml", Bota de clase.); FooService fooService = (FooService) ctx.getBean ("fooService"); fooService.insertFoo (new Foo ()); } }

La salida de la ejecucin del programa anterior ser similar al siguiente. (La salida Log4J y el seguimiento de la pila de la UnsupportedOperationException lanzada por el insertFoo (..) mtodo de la clase DefaultFooService han sido truncada para mayor claridad.)
<- El contenedor Spring est poniendo en marcha ... -> [AspectJInvocationContextExposingAdvisorAutoProxyCreator] - Creacin de representacin implcita de 'fooService' frijol comn con 0 y 1 interceptores especfico interceptores <- Es en realidad el DefaultFooService proxy ->

[JdkDynamicAopProxy] - Creacin de proxy dinmico para JDK [xyservice.DefaultFooService] <-! ... proxy -> el insertFoo (..) el mtodo est siendo invocado en el

[TransactionInterceptor] - Obtencin de transacciones para xyservice.FooService.insertFoo <- El asesoramiento transaccional aqu entra en accin ... -> [DataSourceTransactionManager] - Crear nueva transaccin con nombre [xyservice.FooService.insertFoo] [DataSourceTransactionManager] - Conexin Adquirida [Org.apache.commons.dbcp.PoolableConnection @ a53de4] para JDBC transaccin <- El insertFoo (..) el mtodo de DefaultFooService produce una excepcin ... -> [RuleBasedTransactionAttribute] - Aplicacin de las normas para determinar si la transaccin debe rollback en java.lang.UnsupportedOperationException [TransactionInterceptor] - Invocando por rollback de transacciones en xyservice.FooService.insertFoo debido a arrojar al agua [java.lang.UnsupportedOperationException] <- Y la transaccin se cancela (por defecto, rollback RuntimeException causa de los casos) -> [DataSourceTransactionManager] - back balanceo JDBC de transaccin en la conexin [Org.apache.commons.dbcp.PoolableConnection @ a53de4] [DataSourceTransactionManager] - La liberacin de conexiones JDBC despus de la transaccin [DataSourceUtils] - Volviendo a la conexin JDBC DataSource Exception in thread "main" java.lang.UnsupportedOperationException en xyservice.DefaultFooService.insertFoo (DefaultFooService.java: 14) <- AOP infraestructura de elementos traza de pila retiradas para mayor claridad -> en $ Proxy0.insertFoo (origen desconocido) en Boot.main (Boot.java: 11)

12.5.3 Anulacin de una transaccin declarativa

La seccin anterior describe los conceptos bsicos de cmo especificar la configuracin para las clases de transacciones, por lo general las clases de la capa de servicios, mediante declaracin en su aplicacin. En esta seccin se describe cmo se puede controlar la reversin de las transacciones de forma declarativa simple. La forma recomendada para indicar a la infraestructura de la transaccin Spring Framework es que el trabajo de una transaccin se deshace es lanzar una Exception de cdigo que se est ejecutando actualmente en el contexto de una transaccin. El cdigo de la Spring Framework de transacciones infraestructura coger cualquier controlada Exception , ya que se propaga hacia arriba la pila de llamadas, y hacer una determinacin de si con motivo de la transaccin para el desmantelamiento. En su configuracin por defecto, el cdigo de la Spring Framework de transacciones de infraestructura slo marca una operacin de deshacer en el caso de las excepciones en

tiempo de ejecucin, sin control, es decir, cuando la excepcin se produce es una instancia o una subclase de RuntimeException . ( Error s tambin - por defecto como resultado un rollback). Las excepciones comprobadas que se lanzan desde un mtodo transaccional no dan lugar a reversin en la configuracin por defecto. Puede configurar exactamente qu Exception tipos marcar una transaccin de reversin, incluidas las excepciones comprobadas. El siguiente fragmento de cdigo XML muestra cmo configurar un rollback marcada, especfica de la aplicacin Exception de tipo.
<tx:advice id = transaction-manager "txAdvice" "txManager" => <tx:attributes> <tx:method name = "get*" read-only = "true" rollbackfor="NoProductInStockException" /> nombre = <tx:method "*" /> </ Tx: attributes> </ Tx: advice>

Tambin puede especificar "sin reglas" rollback, si usted no quiere una transaccin revierte cuando se produce una excepcin. En el ejemplo siguiente se indica la infraestructura Spring Framework de transaccin para confirmar la transaccin asistente, incluso en la cara de un no controlada InstrumentNotFoundException .
<tx:advice id = "txAdvice"> <tx:attributes> nombre = <tx:method "updateStock" no-rollbackfor="InstrumentNotFoundException" /> nombre = <tx:method "*" /> </ Tx: attributes> </ Tx: advice>

Cuando la infraestructura Spring Framework de transacciones detecta una excepcin y se consulta a las reglas configuradas rollback para determinar si se debe marcar la transaccin para la reversin, el ms fuerte gana a juego de reglas. As, en el caso de la configuracin siguiente, cualquier excepcin que no sea una InstrumentNotFoundException da lugar a una reversin de la transaccin operadora.
<tx:advice id = "txAdvice"> <tx:attributes> nombre = <tx:method rollback-for "*" = no-rollback-for "Throwable" = "InstrumentNotFoundException" /> </ Tx: attributes> </ Tx: advice>

Tambin puede indicar una reversin requerida mediante programacin. Aunque es muy simple, este proceso es muy invasivo y parejas estrechamente su cdigo a la infraestructura transaccin Spring Framework es:
resolvePosition public void () { try { / / Algo de lgica de negocios ... Catch} (NoProductInStockException ex) { / / Rollback trigger mediante programacin . TransactionAspectSupport.currentTransactionStatus () setRollbackOnly ();

} }

Se le recomienda utilizar el enfoque declarativo de revertir si es posible. Rollback programtico es disponible si lo necesita absolutamente, pero su uso va en contra de lograr una limpia POJO basado en la arquitectura.
12.5.4 Configuracin de una semntica distinta transaccionales para las semillas de diferentes

Tenga en cuenta la situacin en la que usted tiene un nmero de objetos de la capa de servicios y desea aplicar una configuracin transaccional totalmente diferente a cada uno de ellos. Esto se hace mediante la definicin de distintos <aop:advisor/> elementos con diferentes pointcut y advice-ref valores de los atributos. Como punto de comparacin, en primer lugar asumir que todas las clases de servicio de la capa se definen en una raz xyservice paquete. Para que todos los granos que son instancias de clases definidas en el paquete (o en subpaquetes) y que tienen nombres que terminan en Service tienen la configuracin por defecto transaccional, podra escribir lo siguiente:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <aop:config> <Aop: pointcut id = "serviceOperation" = expresin "ejecucin (* xyservice .. Servicio *. * (..))" /> <aop:advisor pointcut-ref = "serviceOperation" advice-ref = "txAdvice" /> </ Aop: config> <- Estos dos granos ser transaccional ... -> <bean id = "fooService" class = "xyservice.DefaultFooService" /> <bean id = "barService" class = "xyservice.extras.SimpleBarService" /> <-! ... y estos dos granos no -> <bean id = "anotherService" class = "org.xyz.SomeService" /> <- (no en el paquete de la derecha) -> <bean id = "barManager" class = "xyservice.SimpleBarManager" /> <(no se agota en el 'Servicio') -> <tx:advice id = "txAdvice">

<tx:attributes> <tx:method name = "get*" read-only = "true" /> nombre = <tx:method "*" /> </ Tx: attributes> </ Tx: advice> <- Otros granos de infraestructura de transacciones tales como un PlatformTransactionManager omitido ... -> </ Beans>

El siguiente ejemplo muestra cmo configurar dos granos diferentes, con valores de transaccin totalmente diferentes.
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <aop:config> <Aop: pointcut id = "defaultServiceOperation" = expresin "ejecucin (* xyservice. Service *. * (..))" /> <Aop: pointcut id = "noTxServiceOperation" = expresin "ejecucin (* xyservice.ddl.DefaultDdlManager. * (..))" /> <aop:advisor pointcut-ref = "defaultServiceOperation" advice-ref = "defaultTxAdvice" /> <aop:advisor pointcut-ref = "noTxServiceOperation" advice-ref = "noTxAdvice" /> </ Aop: config> <- Este grano ser transaccional (ver el "defaultServiceOperation 'punto de corte) -> <bean id = "fooService" class = "xyservice.DefaultFooService" /> <- Este grano tambin ser transaccional, pero con los ajustes de transacciones totalmente diferentes -> <bean id = "anotherFooService" class = "xyservice.ddl.DefaultDdlManager" /> <tx:advice id = "defaultTxAdvice"> <tx:attributes> <tx:method name = "get*" read-only = "true" /> nombre = <tx:method "*" /> </ Tx: attributes> </ Tx: advice>

<tx:advice id = "noTxAdvice"> <tx:attributes> nombre = <tx:method "*" propagacin = "NEVER" /> </ Tx: attributes> </ Tx: advice> <- Otros granos de infraestructura de transacciones tales como un PlatformTransactionManager omitido ... -> </ Beans>

12.5.5 <tx:advice/> ajustes

Esta seccin resume las diversas configuraciones de transacciones que se pueden especificar utilizando la <tx:advice/> etiqueta. La configuracin predeterminada <tx:advice/> ajustes son:

Ajuste de propagacin es REQUIRED. El nivel de aislamiento es DEFAULT. La transaccin es de lectura / escritura. Incumplimientos de transaccin de tiempo de espera para el tiempo de espera predeterminado del sistema de operacin subyacente, o ninguno si los tiempos de espera no son compatibles. Cualquier RuntimeException desencadena rollback, y cualquier comprobado Exception no.

Puede cambiar esta configuracin predeterminada, los diversos atributos de las <tx:method/> etiquetas que estn anidados dentro <tx:advice/> y <tx:attributes/> etiquetas se resumen a continuacin: Tabla 12.1. <tx:method/> ajustes
Atributo Necesario Defecto ? Descripcin

name

Nombre de mtodo (s) con el que los atributos de la transaccin se asocia. El carcter comodn (*) carcter puede ser usado para asociar los valores de transaccin mismos atributos con varios mtodos, por ejemplo, get* , handle* , on*Event , y as sucesivamente.
REQUERID Transaccin comportamiento de propagacin. O DEFAULT -1 falso Nivel de aislamiento de transaccin. Valor de transaccin de tiempo de espera (en segundos). Es esta transaccin de slo lectura?
Exception(s)

propagatio No n isolation No timeout

No

read-only No rollback- No

que se disparan rollback; delimitado por comas. Por ejemplo,

Atributo
for

Necesario Defecto ?

Descripcin
com.foo.MyBusinessException,ServletExcepti on. Exception(s)

norollback- No for

que no activan rollback, delimitado por comas. Por ejemplo,


com.foo.MyBusinessException,ServletExcepti on.

12.5.6 Uso de @Transactional

Adems del enfoque declarativo basado en XML para la configuracin transaccin, puede utilizar un enfoque basado en anotacin. La declaracin de la semntica de transaccin directamente en el cdigo fuente de Java pone las declaraciones mucho ms cerca del cdigo afectado. No hay mucho peligro de acoplamiento indebida, porque el cdigo que est destinado a ser utilizado de forma transaccional es casi siempre desplegada que forma de todos modos. La facilidad de uso que ofrece el uso de la @Transactional anotacin se ilustra mejor con un ejemplo, que se explica en el texto que sigue. Considere la siguiente definicin de clase:
/ / La clase de servicio que queremos hacer transaccional @ Transactional DefaultFooService clase pblica implementa FooService { Foo getFoo (String fooName); Foo getFoo (String fooName, String barName); vaco insertFoo (Foo foo); vaco updateFoo (Foo foo); }

Cuando el POJO anteriormente se define como un grano en un contenedor Spring IoC, la instancia de frijol se puede hacer transaccional aadiendo simplemente una lnea de configuracin XML:
<- Desde el archivo 'context.xml' -> <? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd ">

<- Este es el objeto de servicio que queremos hacer transaccional > <bean id = "fooService" class = "xyservice.DefaultFooService" /> <- Habilitar la configuracin de comportamiento transaccional basada en anotaciones -> <tx:annotation-driven transaction-manager="txManager"/> <- Un PlatformTransactionManager an se requiere -> <bean id = "txManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager"> <- (Esta dependencia se define en otro lugar) -> <propiedad nombre = "dataSource" ref = "dataSource" /> </ Bean> <- Otras definiciones <bean/> aqu -> </ Beans>

Punta

Puede omitir la transaction-manager de atributos en el <tx:annotationdriven/> etiqueta si el nombre del bean de la PlatformTransactionManager que desea conectar en cuenta el nombre transactionManager . Si el PlatformTransactionManager bean que desea dependencia se inyecte tiene otro nombre, entonces usted tiene que utilizar la transaction-manager atributo explcitamente, como en el ejemplo anterior.
Nota

El @EnableTransactionManagement anotacin proporciona apoyo equivalente si se utiliza la configuracin basada en Java. Slo tienes que aadir la anotacin a una @Configuration clase. Ver Javadoc para ms detalles. Mtodo visibilidad y @Transactional Al utilizar servidores proxy, se debe aplicar el @Transactional anotacin slo a los mtodos con visibilidad pblica. Si lo hace anotar protegida, mtodos privados o visibles-con el paquete @Transactional anotacin, no hay ningn error, pero el mtodo anotado no presenta las opciones configuradas transaccionales. Considere el uso de AspectJ (ver ms abajo), si usted necesita para anotar mtodos no pblicos. Puede colocar el @Transactional anotacin antes de una definicin de interfaz, un mtodo en una interfaz, una definicin de clase, o un mtodo pblico de la clase. Sin embargo, la mera presencia de la @Transactional anotacin no es suficiente para activar el comportamiento transaccional. El @Transactional anotacin es simplemente metadatos que pueden ser consumidos por alguna infraestructura de tiempo de ejecucin que es @Transactional -conscientes y que pueden utilizar los metadatos para configurar los frijoles apropiadas con el comportamiento transaccional. En el ejemplo anterior, la <tx:annotation-driven/> elemento cambia en el comportamiento transaccional.

Punta

Spring recomienda que slo anotar clases concretas (y los mtodos de las clases concretas) con el @Transactional anotacin, en lugar de anotar interfaces. Por supuesto que puede colocar el @Transactional anotacin en una interfaz (o un mtodo de interfaz), pero esto slo funciona como es de esperar que si usted est utilizando la interfaz de base de proxies. El hecho de que las anotaciones de Java no se heredan de las interfaces significa que si usted est utilizando proxies basados en clases ( proxy-target-class="true" ) o el aspecto de tejer-based ( mode="aspectj" ), entonces los valores de transaccin son no reconocido por el proxy infraestructura y el tejido, y el objeto no se ver envuelto en un proxy transaccional, que sera decididamente mala.
Nota

En el modo de proxy (que es el predeterminado), slo el mtodo externo las llamadas entrantes a travs del proxy son interceptados. Esto significa que la autoinvocacin, en efecto, un mtodo en el objeto de destino llamando a otro mtodo del objeto de destino, no dar lugar a una transaccin real en tiempo de ejecucin incluso si el mtodo invocado est marcado con @Transactional . Considere el uso de AspectJ modo (vase atributo mode en la tabla a continuacin) si espera auto-invocaciones a envolver con las transacciones tambin. En este caso, no habr un proxy en primer lugar, en su lugar, la clase de destino se teje (es decir, su cdigo de bytes ser modificada) con el fin de girar @Transactional en el comportamiento de tiempo de ejecucin en cualquier tipo de mtodo. Tabla 12.2. Anotaciones impulsadas por valores de transaccin
Atributo XML Atributo anotacin Defecto Descripcin

transacti N / A (Ver onTransactionManagementConf TransactionManager manager igurer Javadoc)

Nombre del administrador de transacciones de usar. Slo es necesario si el nombre del administrador de transacciones no es
transactionMan ager , como en el

mode

mode

apoderado

ejemplo anterior. El modo predeterminado "sustitutivos" frijoles procesos anotados para ser proxy usando

Atributo XML

Atributo anotacin

Defecto

Descripcin

proxytargetclass

proxyTargetClass

falso

Spring AOP marco (siguiendo la semntica de proxy, como se discuti anteriormente, aplicando el mtodo de las llamadas entrantes a travs del proxy solamente). La alternativa mode "AspectJ" en lugar teje las clases afectadas con aspecto de Spring transaccin AspectJ, modificando la clase de destino cdigo byte para aplicar a cualquier tipo de llamada al mtodo. Tejer AspectJ requiere primaveraaspects.jar en la ruta de clases, as como en tiempo de carga de tejer (o en tiempo de compilacin tejido) habilitado. (Consulte la seccin "Configuracin de primavera" para obtener detalles sobre cmo configurar el tiempo de carga de tejido.) Se aplica a modo de proxy solamente. Controla qu tipo

Atributo XML

Atributo anotacin

Defecto

Descripcin

de poderes transaccionales se crean para las clases anotadas con la


@Transactional

anotacin. Si el
proxy-targetclass atributo se establece en true

, entonces las clases basadas en proxies se crean. Si proxytarget-class es false o si el atributo se omite, entonces JDK estndar de interfaz basadas en proxies se crean. (Ver Seccin 9.6, "mecanismos" Uso de proxy para un examen detallado de los diferentes tipos de proxy). Define el orden de los consejos transaccin que se aplica a los frijoles anotado con
@Transactional order order

Ordered.LOWEST_PRECE ms informacin DENCE acerca de las

. (Para obtener

reglas relacionadas con la ordenacin de asesoramiento AOP, consulte la seccin "Consejos de ordenamiento" .) No hay medios

Atributo XML

Atributo anotacin

Defecto

Descripcin

especficos pedido que el subsistema de AOP determina el orden del consejo.

Nota

El proxy-target-class atributo controla qu tipo de poderes transaccionales se crean para las clases anotadas con la @Transactional anotacin. Si proxytarget-class se establece en true , basadas en la clase proxy se crean. Si proxytarget-class es false o si se omite el atributo, JDK estndar de interfaz basados en servidores proxy se crean. (Ver Seccin 9.6, "mecanismos" Uso de proxy para un anlisis de los diferentes tipos de proxy).
Nota
@EnableTransactionManagement y <tx:annotation-driven/> slo busca @Transactional en frijol en el contexto de la aplicacin misma se definen pulg

Esto significa que, si se pone de configuracin basada en anotacin en un WebApplicationContext un DispatcherServlet , slo comprueba @Transactional frijoles en sus controladores, y no sus servicios. Consulte Seccin 17.2, "El DispatcherServlet " para ms informacin. La ubicacin ms derivada tiene prioridad en la evaluacin de los valores de transaccin de un mtodo. En el caso del ejemplo siguiente, el DefaultFooService clase se anota en el nivel de clase con la configuracin de una transaccin de slo lectura, pero el @Transactional anotacin en el updateFoo(Foo) mtodo en la misma clase tiene prioridad sobre los ajustes de transacciones definidas en el nivel de clase.
@ Transactional (ReadOnly = true) DefaultFooService clase pblica implementa FooService { pblico Foo getFoo (String fooName) { / / Hacer algo } / / Estos valores tienen prioridad para este mtodo @ Transactional (readonly = false, propagacin = Propagation.REQUIRES_NEW) public void updateFoo (Foo foo) { / / Hacer algo } }

@Transactional ajustes

El @Transactional anotacin son los metadatos que especifica que una interfaz, clase o mtodo debe tener la semntica transaccional, por ejemplo, "iniciar una nueva transaccin de slo lectura cuando se invoca este mtodo, suspender cualquier transaccin existente". Los predeterminados @Transactional ajustes son los siguientes:

Ajuste de propagacin es PROPAGATION_REQUIRED. El nivel de aislamiento es ISOLATION_DEFAULT. La transaccin es de lectura / escritura. Incumplimientos de transaccin de tiempo de espera para el tiempo de espera predeterminado del sistema de operacin subyacente, ni a ninguno si los tiempos de espera no son compatibles. Cualquier RuntimeException desencadena rollback, y cualquier comprobado Exception no.

Estos valores predeterminados se pueden cambiar; las diversas propiedades de la @Transactional anotacin se resumen en la siguiente tabla: Tabla 12.3. @Transactional propiedades
Propiedad Tipo Descripcin Calificador opcional que especifica el gestor de transacciones para ser utilizado. Ajuste de propagacin Facultativo. Nivel de aislamiento opcional. Leer / escribir vs slo lectura transaccin

value

Cadena

propagation isolation readOnly timeout

enumeracin: Propagation enumeracin: Isolation booleano

int (granularidad en segundos) Transaccin tiempo de espera. Array opcional de clases de Matriz de Class objetos, que excepcin que debe causar debe derivarse de Throwable. reversin. Array de nombres de clase. Las Array opcional de nombres de clases deben ser derivados de clases de excepcin que debe Throwable. causar reversin. Matriz de Class objetos, que Array opcional de clases de debe derivarse de Throwable. excepcin que no debe causar

rollbackFor

rollbackForClassname

noRollbackFor

Propiedad

Tipo reversin.

Descripcin

Matriz de String nombres de Array opcional de nombres de noRollbackForClassname las clases, que debe derivarse clases de excepcin que no de Throwable. debe causar reversin.

Actualmente no se puede tener un control explcito sobre el nombre de una transaccin, donde "nombre": el nombre de la transaccin que se muestra en un monitor de transacciones, en su caso (por ejemplo, WebLogic monitor de operacin), y en el registro de salida. Para las transacciones declarativas, el nombre de la transaccin siempre es el nombre de clase completo + "." + Nombre de la clase transaccional aconsejable. Por ejemplo, si el handlePayment(..) mtodo de la BusinessService clase iniciado una transaccin, el nombre de la transaccin sera: com.foo.BusinessService.handlePayment .
Los administradores mltiples transacciones con @Transactional

La mayora de las aplicaciones de primavera slo necesita un gestor de transacciones individuales, pero puede haber situaciones en las que desee mltiples administradores de transacciones independientes en una sola aplicacin. El valor del atributo de la @Transactional anotacin se puede utilizar para especificar opcionalmente la identidad del PlatformTransactionManager para ser utilizado. Esto puede ser el nombre del bean o el valor calificador del grano de gestor de transacciones. Por ejemplo, usando la notacin calificador, el siguiente cdigo Java
TransactionalService clase pblica { @ Transactional ("orden") setSomething public void (String nombre) {... @ Transactional ("cuenta") doSomething public void () {... } } }

se podra combinar con las declaraciones de transaccin siguientes frijol Manager en el contexto de aplicacin.
<tx:annotation-driven/> <bean id = "transactionManager1" class = "org.springframework.jdbc.DataSourceTransactionManager"> ... <qualifier value = "order" /> </ Bean> <bean id = "transactionManager2" class = "org.springframework.jdbc.DataSourceTransactionManager"> ...

<qualifier value = "account" /> </ Bean>

En este caso, los dos mtodos en TransactionalService se ejecutar con los administradores de transacciones separadas, diferenciadas por el "orden" y calificadores "cuenta". El valor predeterminado <tx:annotation-driven> objetivo frijol nombre transactionManager todava se utilizar si no haba PlatformTransactionManager especficamente calificado se encuentra.
Anotaciones personalizadas de acceso directo

Si usted encuentra que usted est usando repetidamente los mismos atributos con @Transactional de muchos mtodos diferentes, meta-anotacin de Spring apoyo le permite definir las anotaciones personalizadas de acceso directo para los casos de uso especficos. Por ejemplo, la definicin de las siguientes anotaciones
@ Target ({ElementType.METHOD, ElementType.TYPE}) @ Retention (RetentionPolicy.RUNTIME) @ Transactional ("orden") public @ interface OrderTx { } @ Target ({ElementType.METHOD, ElementType.TYPE}) @ Retention (RetentionPolicy.RUNTIME) @ Transactional ("cuenta") public @ interface AccountTx { }

nos permite escribir el ejemplo de la seccin anterior,


TransactionalService clase pblica { @ OrderTx setSomething public void (String nombre) {... @ AccountTx doSomething public void () {... } } }

Aqu hemos utilizado la sintaxis para definir la clasificacin del gestor de transacciones, pero tambin podra haber incluido el comportamiento de propagacin, las reglas de rollback, tiempos de espera, etc
12.5.7 Transaccin propagacin

En esta seccin se describen algunas semntica de propagacin de transacciones en la primavera. Tenga en cuenta que esta seccin no es una introduccin a la propagacin de transaccin correcta, sino que algunos detalles de la semntica con respecto a la propagacin de transaccin en la primavera. En la primavera de transacciones gestionadas, ser consciente de la diferencia entre las transacciones fsicas y lgicas, y cmo el ajuste de propagacin se aplica a esta diferencia.

Necesario

PROPAGATION_REQUIRED

Cuando el ajuste de propagacin es PROPAGATION_REQUIRED , un mbito de transaccin lgica se crea para cada mtodo en el que se aplica el ajuste. Cada transaccin lgica tal alcance puede determinar rollback estado de slo individualmente, con un mbito de transaccin externa es lgicamente independiente del mbito de la transaccin interna. Por supuesto, en el caso de la norma PROPAGATION_REQUIRED comportamiento, todos estos mbitos se pueden asignar a la misma transaccin fsica. As, un marcador de reversin de slo-en el mbito de la transaccin interna afecta la probabilidad de la transaccin externa para comprometerse realmente (como ustedes lo esperan). Sin embargo, en el caso en que un mbito de transaccin interna fija el marcador rollback-only, la transaccin externa no ha decidido sobre la propia operacin de deshacer, y por lo que la reversin (silencio activado por el mbito de transaccin interno) es inesperado. A correspondiente UnexpectedRollbackException se lanza en ese punto. Este es el comportamiento esperado para que la persona que llama de una transaccin no puede ser inducido a error suponer que un compromiso se llev a cabo cuando en realidad no lo era. As que si una transaccin interna (de los que el llamante externo no es consciente) silenciosamente marca una transaccin como rollback-only, el llamante externo todava llama a comprometerse. El interlocutor externo necesita recibir una UnexpectedRollbackException para indicar claramente que la reversin se llev a cabo en su lugar.

RequiresNew

PROPAGATION_REQUIRES_NEW
PROPAGATION_REQUIRES_NEW

, en contraste con PROPAGATION_REQUIRED, utiliza una transaccin completamente independiente para cada mbito de la transaccin afectada. En ese caso, las operaciones fsicas subyacentes son diferentes y por lo tanto puede confirmar o revertir de forma independiente, con una transaccin externa no se ve afectada por el estado de reversin de una transaccin interior.
Nested
PROPAGATION_NESTED

utiliza una sola transaccin fsica con mltiples puntos de retorno que se puede volver a utilizar. Dichas reversiones parciales permiten un mbito de transaccin interna para desencadenar una reversin de su alcance, con la transaccin externa de poder continuar con la transaccin fsica a pesar de algunas operaciones de haber sido revertido. Esta configuracin se suele asignar a los puntos de salvaguarda de JDBC, por lo que slo funcionar con las transacciones de recursos JDBC. Ver Spring DataSourceTransactionManager .
12.5.8 Asesoramiento operaciones transaccionales

Suponga que quiere ejecutar tanto transaccional y algunos consejos perfil bsico. Cmo afectar esto en el contexto de <tx:annotation-driven/> ? Cuando se invoca el updateFoo(Foo) mtodo, que desea ver las siguientes acciones: 1. 2. 3. 4. 5. Aspecto configurado perfiles se inicia. Asesoramiento transaccional ejecuta. Mtodo en el objeto aconsej ejecuta. Transaccin. Aspecto de perfiles informa duracin exacta de la invocacin del mtodo transaccional conjunto.

Nota

En este captulo no se ocupa de explicar AOP en gran detalle (salvo que se aplica a las transacciones). Consulte el Captulo 9, Programacin Orientada a Aspectos con Spring para la cobertura detallada de la siguiente configuracin AOP AOP y en general. Aqu est el cdigo para un aspecto sencillo perfiles discutido anteriormente. El orden de asesoramiento se controla a travs de la Ordered interfaz. Para ms detalles sobre consejos pedido, vase la seccin titulada "La ordenacin de consejo" .
paquete xy; org.aspectj.lang.ProceedingJoinPoint importacin; org.springframework.util.StopWatch importacin; importar org.springframework.core.Ordered; SimpleProfiler clase pblica implementa Pedido { Para int privado; / / Nos permite controlar el orden de asesoramiento getOrder public int () { devuelva este orden.; } setOrder public void (int fin) { . este orden = orden; } / / Este mtodo * es * el asesoramiento en torno a perfil public Object (ProceedingJoinPoint llamada) throws Throwable { ReturnValue del objeto; Reloj StopWatch StopWatch = new (. GetClass () getName ()); try { clock.start (call.toShortString ()); returnValue = call.proceed (); Finally {} clock.stop (); System.out.println (clock.prettyPrint ()); } volver returnValue; } } <? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd ">

<bean id = "fooService" class = "xyservice.DefaultFooService" /> <- Este es el aspecto -> <bean id = "profiler" class = "xySimpleProfiler"> <- Ejecutar antes de que el consejo transaccional (de ah el nmero de orden inferior) -> <propiedad nombre = "order" value="1" /> </ Bean> <tx:annotation-driven transaction-manager = "txManager" order="200" /> <aop:config> <- Este consejo se ejecutar todo el asesoramiento transaccional -> <aop:aspect id = "profilingAspect" ref = "profiler"> <Aop: pointcut id = "serviceMethodWithReturnValue" = expresin "ejecucin (! xy vaco. Service *. * (..))" /> mtodo <aop:around = "profile" pointcut-ref = "serviceMethodWithReturnValue" /> </ Aop: Aspecto> </ Aop: config> <bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method "close" => <propiedad nombre = valor = "driverClassName" "oracle.jdbc.driver.OracleDriver" /> <propiedad nombre = valor = "url" "jdbc:oracle:thin:@rjt42:1521:elvis" /> <propiedad nombre = valor = "username" "scott" /> <propiedad nombre = valor = "password" "tiger" /> </ Bean> <bean id = "txManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager"> <propiedad nombre = "dataSource" ref = "dataSource" /> </ Bean> </ Beans>

El resultado de la configuracin anterior es una fooService grano que tiene perfiles y aspectos transaccionales que se le aplica en el orden deseado. Puede configurar cualquier nmero de aspectos adicionales de manera similar. El siguiente ejemplo efecta la misma configuracin que el anterior, pero utiliza el enfoque puramente declarativo XML.
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop.xsd "> <bean id = "fooService" class = "xyservice.DefaultFooService" /> <- El consejo de perfiles -> <bean id = "profiler" class = "xySimpleProfiler"> <- Ejecutar antes de que el consejo transaccional (de ah el nmero de orden inferior) -> <propiedad name="order" value="1 "/> </ Bean> <aop:config> <aop:pointcut id = "entryPointMethod" expresin = "execution(* xy.*Service.*(..))" /> <- Se ejecutar despus de que el consejo de perfiles (vase el atributo de orden) -> <Aop: asesor consejos-ref = "txAdvice" pointcut-ref = "entryPointMethod" order = "2" /> <- valor del pedido es superior al aspecto de perfiles -> <aop:aspect id = "profilingAspect" ref = "profiler"> <Aop: pointcut id = "serviceMethodWithReturnValue" = expresin "ejecucin (! xy vaco. Service *. * (..))" /> mtodo <aop:around = "profile" pointcut-ref = "serviceMethodWithReturnValue" /> </ Aop: Aspecto> </ Aop: config> <tx:advice id = transaction-manager "txAdvice" "txManager" => <tx:attributes> <tx:method name = "get*" read-only = "true" /> nombre = <tx:method "*" /> </ Tx: attributes> </ Tx: advice> <- <bean/> Otras definiciones, como un DataSource y un PlatformTransactionManager aqu -> </ Beans>

El resultado de la configuracin anterior ser una fooService grano que tiene perfiles y aspectos transaccionales que se le aplica en ese orden. Si desea que el consejo de perfiles para ejecutar despus de que el consejo de transacciones en el camino, y antes de que el consejo transaccional a la salida, entonces simplemente cambiar el valor del grano de aspecto perfilado del order propiedad para que sea ms alta que la orden del consejo de transacciones de valor. Puede configurar otros aspectos en forma similar.

12.5.9 Uso de @Transactional con AspectJ

Tambin es posible utilizar el marco de Spring @Transactional apoyo exterior de un recipiente resorte por medio de un aspecto AspectJ. Para ello, en primer lugar anotar sus clases (y, opcionalmente, sus mtodos de clases ") con el @Transactional anotacin, y luego enlace (tejido) de su aplicacin con el
org.springframework.transaction.aspectj.AnnotationTransactionAspect definido en los spring-aspects.jar archivo. El aspecto tambin debe estar

configurado con un gestor de transacciones. Por supuesto, puede utilizar el contenedor Spring Framework de la COI para hacerse cargo de la dependencia de inyeccin de la cara. La forma ms sencilla de configurar el aspecto de gestin de transacciones es utilizar el <tx:annotation-driven/> elemento y especificar el mode atributo para aspectj como se describe en la Seccin 12.5.6, "Uso de @Transactional " . Porque nos estamos centrando aqu en aplicaciones que se ejecutan fuera de un contenedor Spring, le mostraremos cmo hacerlo mediante programacin.
Nota

Antes de continuar, es posible que desee leer la Seccin 12.5.6, "Uso de @Transactional " y el captulo 9, Programacin Orientada a Aspectos con Spring respectivamente.
/ / Construye un gestor de transacciones apropiado DataSourceTransactionManager txManager = new DataSourceTransactionManager (getDataSource ()); / / Configurar el AnnotationTransactionAspect usarlo, lo que se debe hacer antes de ejecutar cualquiera de los mtodos transaccionales . AnnotationTransactionAspect.aspectOf () setTransactionManager (txManager);

Nota

Cuando se utiliza este aspecto, se debe anotar la clase de implementacin (y / o mtodos dentro de esa clase), no la interfaz (si los hay) que la clase implementa. AspectJ sigue la regla de que las anotaciones de Java en las interfaces no se heredan. El @Transactional anotacin en una clase especifica la semntica de transaccin por defecto para la ejecucin de cualquier mtodo en la clase. El @Transactional anotacin en un mtodo dentro de la clase anula la semntica de transaccin por defecto dados por la anotacin de clase (si existe). Cualquier mtodo puede ser anotado, independientemente de la visibilidad. Para tejer sus aplicaciones con la AnnotationTransactionAspect usted debe construir su aplicacin con AspectJ (vase la Gua de AspectJ Desarrollo ) o utilizar en tiempo de carga de tejer. Consulte Seccin 9.8.4, "Tiempo de carga-que teje con AspectJ en la infraestructura Spring" para una discusin de la carga en tiempo tejiendo con AspectJ.

12,6 gestin de transacciones programtica

El Spring Framework proporciona dos medios de administracin de transacciones programtica:


Uso de la TransactionTemplate . El uso de un PlatformTransactionManager aplicacin directamente.

El equipo de Primavera generalmente recomienda el TransactionTemplate para la gestin de transacciones programtica. El segundo enfoque es similar al uso de la JTA UserTransaction API, aunque el manejo de excepciones es menos engorroso.
12.6.1 Uso de la TransactionTemplate

El TransactionTemplate adopta el mismo enfoque que las plantillas de primavera tales como la JdbcTemplate . Se utiliza un enfoque de devolucin de llamada, el cdigo de aplicacin libre de tener que hacer la compra reutilizable y liberacin de recursos transaccionales, y resulta en cdigo que se conducidos intencin, ya que el cdigo que est escrito se centra exclusivamente en lo que el desarrollador quiere hacer.
Nota

Como se puede ver en los ejemplos que siguen, utilizando los TransactionTemplate absolutamente le parejas infraestructura de transacciones de Spring y APIs. Sea o no la gestin de transacciones programtica es adecuado para sus necesidades de desarrollo es una decisin que tendr que hacer usted mismo. El cdigo de aplicacin que se deben ejecutar en un contexto transaccional, y que utilizar la TransactionTemplate explcitamente, se parece a lo siguiente. Usted, como un desarrollador de aplicaciones, escriba una TransactionCallback aplicacin (normalmente expresado como una clase interna annima) que contiene el cdigo necesario para ejecutar en el contexto de una transaccin. A continuacin, pasar una instancia de su costumbre TransactionCallback para la execute(..) mtodo expuesto en el TransactionTemplate .
SimpleService clase pblica implementa servicio { / / Solo TransactionTemplate compartido entre todos los mtodos en este caso final privado TransactionTemplate transactionTemplate; / / Usar constructor de inyeccin para suministrar la PlatformTransactionManager SimpleService pblico (TransactionManager PlatformTransactionManager) { Assert.notNull (TransactionManager, "El argumento 'TransactionManager' no debe ser nulo."); . este transactionTemplate = new TransactionTemplate (TransactionManager); } someServiceMethod public Object () { volver transactionTemplate.execute (TransactionCallback nuevo () {

/ / El cdigo de este mtodo se ejecuta en un contexto transaccional doInTransaction public Object (estado TransactionStatus) { updateOperation1 (); volver resultOfUpdateOperation2 (); } }); } }

Si no hay ningn valor de retorno, utilice la prctica TransactionCallbackWithoutResult clase con una clase annima como sigue:
transactionTemplate.execute (nuevo TransactionCallbackWithoutResult () { protected void doInTransactionWithoutResult (estado TransactionStatus) { updateOperation1 (); updateOperation2 (); } });

El cdigo de la devolucin de llamada puede deshacer la transaccin de nuevo llamando a la setRollbackOnly() mtodo en el suministrado TransactionStatus objeto:
transactionTemplate.execute (nuevo TransactionCallbackWithoutResult () { protected void doInTransactionWithoutResult (estado TransactionStatus) { try { updateOperation1 (); updateOperation2 (); Catch} (SomeBusinessExeption ex) { status.setRollbackOnly (); } } });

Especificacin de los valores de transaccin

Puede especificar valores de transaccin como el modo de propagacin, el nivel de aislamiento, el tiempo de espera, y as sucesivamente en el TransactionTemplate mediante programacin o en la configuracin. TransactionTemplate casos por defecto tienen los valores predeterminados transaccionales . El siguiente ejemplo muestra la personalizacin de programacin de los ajustes de las transacciones para un especfico
TransactionTemplate: SimpleService clase pblica implementa servicio { final privado TransactionTemplate transactionTemplate; SimpleService pblico (TransactionManager PlatformTransactionManager) { Assert.notNull (TransactionManager, "El argumento 'TransactionManager' no debe ser nulo.");

. este transactionTemplate = new TransactionTemplate (TransactionManager); / / Los valores de la transaccin se puede establecer aqu explcitamente si se desea este transactionTemplate.setIsolationLevel (TransactionDefinition.ISOLATION_READ_UNCOMMITTED).; este transactionTemplate.setTimeout (30);. / / 30 segundos / / Etc ... } }

En el ejemplo siguiente se define una TransactionTemplate con algunos ajustes transaccionales personalizados, utilizando Spring configuracin XML. El sharedTransactionTemplate entonces se puede inyectar en tantos servicios como se requiere.
<Bean id = "sharedTransactionTemplate" class = "org.springframework.transaction.support.TransactionTemplate"> <propiedad nombre = valor = "isolationLevelName" "ISOLATION_READ_UNCOMMITTED" /> <propiedad nombre = valor = "timeout" "30" /> </ Bean> "

Por ltimo, los casos de la TransactionTemplate clase son multi-hilo, que en ocasiones no mantiene ningn estado de conversacin. TransactionTemplate casos embargo, no mantener el estado de configuracin, as que mientras un nmero de clases pueden compartir una nica instancia de un TransactionTemplate , si una clase tiene que utilizar una TransactionTemplate con diferentes entornos (por ejemplo, un nivel de aislamiento diferente), entonces usted necesita para crear dos diferentes TransactionTemplate casos.
12.6.2 Uso de la PlatformTransactionManager

Tambin puede utilizar el


org.springframework.transaction.PlatformTransactionManager

directamente a

gestionar su transaccin. Basta con pasar la aplicacin de la PlatformTransactionManager que est utilizando para el bean a travs de una referencia de frijol. Luego, utilizando la TransactionDefinition y TransactionStatus objetos que se pueden iniciar transacciones, hacer retroceder, y comprometerse.
DefaultTransactionDefinition def = new DefaultTransactionDefinition (); / / Establecer explcitamente el nombre de la transaccin es algo que slo se puede hacer mediante programacin def.setName ("SomeTxName"); def.setPropagationBehavior (TransactionDefinition.PROPAGATION_REQUIRED); Estado TransactionStatus = txManager.getTransaction (def); try { / / Ejecutar la lgica de negocio aqu }

catch (MyException ex) { txManager.rollback (status); tirar ex; } txManager.commit (status);

12.7 Elegir entre la gestin de transacciones programticas y declarativas


Gestin de transacciones programtica es generalmente una buena idea si usted tiene un pequeo nmero de operaciones transaccionales. Por ejemplo, si usted tiene una aplicacin web que requieren las transacciones slo para ciertas operaciones de actualizacin, es posible que no desee configurar proxies transaccionales utilizando Spring o cualquier otra tecnologa. En este caso, utilizando la TransactionTemplate puede ser un buen enfoque. Ser capaz de definir el nombre de la transaccin explcitamente tambin es algo que slo puede hacerse utilizando el enfoque programtico para la gestin de transacciones. Por otro lado, si su aplicacin tiene numerosas operaciones transaccionales, gestin de transacciones declarativa es por lo general vale la pena. Se mantiene la gestin de transacciones de lgica de negocio, y no es difcil de configurar. Cuando se utiliza la infraestructura Spring, en lugar de EJB CMT, el costo de configuracin de gestin de transacciones declarativa se reduce considerablemente.

12.8 Aplicacin especfica del servidor de integracin


Abstraccin Spring transaccin generalmente es independiente del servidor de aplicaciones. Adems, Spring JtaTransactionManager clase, que opcionalmente puede realizar una bsqueda JNDI para la JTA UserTransaction y TransactionManager objetos, detecta automticamente la ubicacin del objeto de este ltimo, que vara segn el servidor de aplicaciones. Tener acceso a la JTA TransactionManager permite la semntica de transaccin mejoradas, en particular, suspensin transaccin portante. Ver las JtaTransactionManager Javadocs para ms detalles. Spring JtaTransactionManager es la opcin estndar para ejecutarse en servidores de aplicaciones Java EE, y se sabe que funciona en todos los servidores comunes. La funcionalidad avanzada, como la suspensin de transacciones funciona en varios servidores, as - como GlassFish, JBoss, Geronimo, y OC4J Oracle - sin ninguna configuracin especial necesaria. Sin embargo, la suspensin transaccin totalmente compatible y la integracin avanzada adems, los barcos de primavera adaptadores especiales para IBM WebSphere, BEA WebLogic Server y Oracle OC4J. Estos adaptadores se discuten en las siguientes secciones. Para los escenarios estndar, incluyendo el servidor WebLogic, WebSphere y OC4J, puede utilizar el conveniente <tx:jta-transaction-manager/> elemento de configuracin. Cuando est configurado, este elemento detecta automticamente el servidor subyacente y elige el mejor gestor de transacciones disponible para la plataforma. Esto significa que usted no tendr que configurar el servidor de clases

especficas de adaptacin (como se explica en las siguientes secciones) de forma explcita, sino que se escogen de forma automtica, con la norma JtaTransactionManager como usar por defecto.
12.8.1 IBM WebSphere

En WebSphere 6.1.0.9 y superiores, la recomendada Primavera administrador de transacciones JTA a utilizar es WebSphereUowTransactionManager . Este adaptador especial aprovecha de IBM UOWManager API, que est disponible en WebSphere Application Server 6.0.2.19 y 6.1.0.9 ms adelante y en adelante. Con este adaptador, accionado por resorte suspensin transaccin (suspender / reanudar iniciada por PROPAGATION_REQUIRES_NEW ) est oficialmente soportado por IBM!
12.8.2 BEA WebLogic Server

En WebLogic Server 9.0 o superior, lo habitual es utilizar la WebLogicJtaTransactionManager en lugar de las acciones JtaTransactionManager clase. Este especial especfico de WebLogic subclase de la normal JtaTransactionManager soporta todo el poder de las definiciones de transaccin del resorte en un WebLogic gestionados entorno de transacciones, ms all estndar semntica JTA: Las caractersticas incluyen los nombres de transaccin, por transaccin niveles de aislamiento, y adecuados reanudacin de las operaciones en todos los casos .
12.8.3 Oracle OC4J

Buques de primavera una clase adaptador especial para OC4J 10.1.3 o posterior llamado OC4JJtaTransactionManager . Esta clase es anloga a la WebLogicJtaTransactionManager clase discutido en la seccin anterior, ofreciendo valores agregados similares en OC4J: los nombres de transaccin por transaccin y los niveles de aislamiento. La funcionalidad JTA completo, incluyendo la suspensin de transacciones, funciona bien con Spring JtaTransactionManager en OC4J tambin. El especial OC4JJtaTransactionManager adaptador simplemente ofrece valores agregados ms all del estndar JTA.

12.9 Soluciones a problemas comunes


12.9.1 Uso del administrador de transacciones mal para un determinado
DataSource

Utilice la correcta PlatformTransactionManager implementacin base de su eleccin de tecnologas transaccionales y requisitos. Si se usa adecuadamente, el Spring Framework proporciona simplemente una abstraccin sencilla y porttil. Si est utilizando transacciones globales, debe utilizar el org.springframework.transaction.jta.JtaTransactionManager clase (o una aplicacin especfica del servidor subclase de ella) para todas las operaciones transaccionales. De lo contrario la infraestructura transaccin intenta realizar transacciones locales en recursos como el contenedor DataSource casos. Tales

transacciones locales no tienen sentido, y un servidor de aplicaciones bien los trata como errores.

12,10 Otros Recursos


Para obtener ms informacin sobre el soporte de transacciones de Spring Framework:

Transacciones distribuidas en la primavera, con y sin XA es una presentacin en la que David JavaWorld SpringSource Syer le gua a travs de siete patrones de transacciones distribuidas en aplicaciones de primavera, tres de ellos con XA y cuatro sin. Estrategias de diseo de transacciones Java es un libro disponible en InfoQ que proporciona una introduccin bien establecido el paso a las operaciones en Java. Tambin incluye side-by-side ejemplos de cmo configurar y utilizar las transacciones tanto con Spring Framework y EJB3.

13. DAO apoyo 13.1 Introduccin


El acceso a los datos Object (DAO) apoyo en la primavera se dirige a lo que es fcil trabajar con tecnologas de acceso a datos como JDBC, Hibernate, JPA o JDO de una manera consistente. Esto permite cambiar entre las tecnologas de persistencia antes mencionados con bastante facilidad y tambin permite que uno cdigo sin preocuparse por la captura de excepciones que son especficos para cada tecnologa.

13,2 jerarqua excepcin consistente


Spring proporciona una traduccin prctica de la tecnologa de las excepciones especficas como SQLException a su propia jerarqua de clases con la excepcin DataAccessException como la excepcin raz. Estas excepciones envuelva la excepcin original as que nunca hay ningn riesgo de que se podra perder informacin alguna acerca de lo que pudo haber salido mal. Adems de las excepciones JDBC, Spring Hibernate tambin puede envolver excepciones especficas, convirtindolos de excepciones de propiedad, controladas (en el caso de las versiones anteriores de Hibernate Hibernate a 3,0), con una serie de excepciones en tiempo de ejecucin enfocadas (lo mismo es cierto para JDO y las excepciones APP). Esto permite manejar la mayora de las excepciones persistencia, que no son recuperables, slo en las capas apropiadas, sin tener repetitivo molesto coger y tirar los bloques y las declaraciones de excepcin en la propia DAOs. (Todava se pueden atrapar y manejar excepciones en cualquier lugar que uno necesita sin embargo.) Como se mencion anteriormente, las excepciones JDBC (incluyendo bases de datos especficas dialectos) tambin se convierten en la misma jerarqua, lo que significa que uno puede realizar algunas operaciones con JDBC dentro de un modelo de programacin coherente .

Lo anterior es vlido para las diversas clases de plantilla en apoyo Muelles para marcos ORM diferentes. Si se utilizan las clases de base de interceptor, entonces la aplicacin debe cuidar sobre el manejo HibernateExceptions y JDOExceptions s misma, preferentemente a travs de la delegacin de SessionFactoryUtils ' convertHibernateAccessException(..) o convertJdoAccessException() mtodos, respectivamente. Estos mtodos de convertir las excepciones a las que son compatibles con las excepciones previstas en el org.springframework.dao jerarqua excepcin. Como JDOExceptions estn marcadas, pueden simplemente son arrojados demasiado, sacrificando genrico DAO abstraccin en trminos de excepciones, sin embargo. La jerarqua de excepcin que ofrece Spring se puede ver a continuacin. (Tenga en cuenta que la jerarqua de clases se detalla en la imagen muestra slo un subconjunto de la totalidad DataAccessException jerarqua.)

13.3 Anotaciones utilizados para la configuracin de las clases DAO o depsito


La mejor forma de garantizar que los objetos de acceso a datos (DAO) o repositorios de proporcionar la traduccin excepcin es usar el @Repository anotacin. Esta anotacin tambin permite que el componente de apoyo de exploracin para encontrar y configurar el DAOs y repositorios sin tener que proporcionar las entradas de configuracin XML para ellos.
@ Repositorio SomeMovieFinder clase pblica implementa MovieFinder {

/ / ... }

Cualquier implementacin DAO o depsito tendr que acceder a un recurso de la persistencia, en funcin de la tecnologa de persistencia utiliza, por ejemplo, un repositorio basado en JDBC tendr acceso a un JDBC DataSource , un repositorio basado en JPA tendr acceso a un EntityManager . La forma ms sencilla de lograr esto es hacer que esta dependencia de los recursos inyectados con uno de los @Autowired, , @Inject , @Resource o @PersistenceContext anotaciones. Aqu est un ejemplo de un depsito JPA:
@ Repositorio JpaMovieFinder clase pblica implementa MovieFinder { @ PersistenceContext EntityManager EntityManager privado; / / ... }

Si est utilizando la API de Hibernate clsico de lo que puede inyectar la SessionFactory:


@ Repositorio HibernateMovieFinder clase pblica implementa MovieFinder { privado sessionFactory SessionFactory; @ Autoconectados public void setSessionFactory (SessionFactory sessionFactory) { este sessionFactory = sessionFactory.; } / / ... }

ltimo ejemplo vamos a mostrar aqu es tpico para soporte de JDBC. Usted tendra el DataSource se inyecta en un mtodo de inicializacin en la que se creara un JdbcTemplate y otros datos de acceso como clases de apoyo SimpleJdbcCall etc que utilizan este DataSource .
@ Repositorio JdbcMovieFinder clase pblica implementa MovieFinder { jdbcTemplate JdbcTemplate privado; @ Autoconectados public void init (DataSource dataSource) { . este jdbcTemplate = new JdbcTemplate (DataSource); } / / ... }

Nota

Por favor, vea la cobertura especfica de cada tecnologa de persistencia para obtener detalles sobre cmo configurar el contexto de la aplicacin para tomar ventaja de estas anotaciones.

14. Acceso a los datos con JDBC 14.1 Introduccin a Spring Framework JDBC
El valor aadido proporcionados por la abstraccin Spring Framework JDBC es quizs mejor se muestra por la secuencia de las acciones indicadas en la tabla siguiente. La tabla muestra qu Spring acciones se har cargo de las acciones y que es responsabilidad de usted, el desarrollador de aplicaciones. Tabla 14.1. Spring JDBC - quin hace qu?
Accin Definir parmetros de conexin. Abrir la conexin. Especifica la sentencia de SQL. Declarar parmetros y proporcionar valores de los parmetros Elaborar y ejecutar la sentencia. Configure el bucle para iterar a travs de los resultados (si los hay). Es el trabajo de cada iteracin. Procesar cualquier excepcin. Manejar transacciones. Cerrar la conexin, el estado y de resultados. X X X X X X X X X Primavera Usted X

El Spring Framework se encarga de todos los detalles de bajo nivel que pueden hacer que JDBC tan tedioso API para desarrollar con.
14.1.1 Eleccin de un mtodo de acceso de base de datos JDBC

Usted puede elegir entre varios mtodos para formar la base para el acceso al usuario de base de datos JDBC. Adems de los tres sabores de la JdbcTemplate, un SimpleJdbcInsert nuevo enfoque y SimplejdbcCall optimiza base de datos de metadatos,

y el estilo de objeto RDBMS adopta un enfoque ms orientado a objetos similar a la de diseo JDO Query. Una vez que empiece a usar una de estas aproximaciones, todava se puede mezclar y combinar para incluir una funcin desde un enfoque diferente. Todos los mtodos requieren un JDBC 2.0 compatible con el controlador y algunas caractersticas avanzadas requieren un controlador JDBC 3.0.
Nota

Spring 3.0 actualiza todos de los siguientes enfoques con Java 5 de apoyo, como los genricos y varargs.

JdbcTemplate es el clsico enfoque Spring JDBC y el ms popular. Este "nivel ms bajo" enfoque y todos los dems utilizan una JdbcTemplate bajo las sbanas, y todos estn al da con Java 5 de apoyo, como los genricos y varargs. NamedParameterJdbcTemplate envuelve una JdbcTemplate para proporcionar parmetros con nombre en lugar de la tradicional JDBC "?" marcadores de posicin. Este enfoque proporciona una mejor documentacin y facilidad de uso cuando se tienen varios parmetros de una sentencia SQL. SimpleJdbcTemplate combina las operaciones ms utilizadas de JdbcTemplate y NamedParameterJdbcTemplate. SimpleJdbcInsert y metadatos SimpleJdbcCall optimizar la base de datos para limitar la cantidad de configuracin necesaria. Este enfoque simplifica la codificacin para que usted slo tenga que proporcionar el nombre de la tabla o procedimiento y proporcionar un mapa de parmetros que coinciden con los nombres de las columnas. Esto slo funciona si la base de datos proporciona metadatos adecuados. Si la base de datos no proporciona estos metadatos, tendr que proporcionar una configuracin explcita de los parmetros. Objetos RDBMS incluyendo MappingSqlQuery, SqlUpdate y StoredProcedure requiere la creacin de objetos reutilizables y seguras para subprocesos durante la inicializacin de la capa de acceso a datos. Este enfoque sigue el modelo de consulta JDO donde se define la cadena de consulta, declarar los parmetros, y compilar la consulta. Una vez hecho esto, ejecutar mtodos se pueden llamar varias veces con distintos valores de parmetro pasa pulg

14.1.2 Paquete jerarqua

El criterio de la infraestructura Spring JDBC de abstraccin consiste en cuatro paquetes diferentes, a saber core , datasource , object y support . El org.springframework.jdbc.core paquete contiene el JdbcTemplate clase y sus interfaces de devolucin de llamada diferentes, adems de una gran variedad de clases relacionadas. Un subpaquete llamado org.springframework.jdbc.core.simple contiene el SimpleJdbcTemplate clase y los relacionados SimpleJdbcInsert y SimpleJdbcCall clases. Otra subpaquete llamado org.springframework.jdbc.core.namedparam contiene el NamedParameterJdbcTemplate clase y de las clases de apoyo conexos. Consulte Seccin 14.2, "Uso de las clases principales de JDBC para controlar el procesamiento de JDBC bsico y manejo de errores" , Seccin 14.4, "JDBC operaciones por lotes" y Seccin 14.5, "La simplificacin de las operaciones con las clases JDBC SimpleJdbc"

El org.springframework.jdbc.datasource paquete contiene una clase de utilidad para fcil DataSource acceso, y varios simples DataSource implementaciones que se pueden utilizar para probar y ejecutar sin modificar el cdigo JDBC fuera de un contenedor Java EE. Un subpaquete llamado org.springfamework.jdbc.datasource.embedded ofrece soporte para la creacin en memoria instancias de base de datos Java utilizando motores de bases de datos como HSQL y H2. Consulte Seccin 14.3, "Control de conexiones de base de datos" y Seccin 14.8, "Embedded soporte de base de datos" El org.springframework.jdbc.object paquete contiene clases que representan consultas RDBMS, las actualizaciones y los procedimientos almacenados como objetos seguros para los subprocesos y reutilizables. Consulte Seccin 14.6, "Modelado de operaciones de JDBC como objetos Java" . Este enfoque es modelado por JDO, aunque, por supuesto, los objetos devueltos por las consultas estn "desconectados" de la base de datos. Este mayor nivel de abstraccin JDBC depende de la abstraccin de nivel inferior en la org.springframework.jdbc.core paquete. El org.springframework.jdbc.support paquete proporciona SQLException funcionalidad de traduccin y algunas clases de utilidad. Las excepciones producidas durante el procesamiento JDBC se convierten a excepciones definidas en la org.springframework.dao paquete. Esto significa que el cdigo utilizando la capa de abstraccin Spring JDBC no necesita implementar JDBC o RDBMS especfico de control de errores. Todas las excepciones son traducidos sin control, lo que le da la opcin de capturar las excepciones de que se puede recuperar al mismo tiempo a otras excepciones que se propagan a la persona que llama. Consulte Seccin 14.2.4, " SQLExceptionTranslator " .

14.2 Uso de las clases principales de JDBC para controlar el procesamiento de JDBC bsico y manejo de errores
14.2.1 JdbcTemplate

El JdbcTemplate clase es la clase central en el paquete principal de JDBC. Se ocupa de la creacin y la liberacin de los recursos, lo que ayuda a evitar errores comunes, como olvidarse de cerrar la conexin. Realiza las tareas bsicas del flujo de trabajo bsica de JDBC como la creacin declaracin y ejecucin, dejando cdigo de la aplicacin para proporcionar SQL y extraer resultados. El JdbcTemplate clase ejecuta consultas SQL, sentencias de actualizacin y llamadas a procedimientos almacenados, realiza iteracin sobre ResultSet s y extraccin de valores de los parmetros devueltos. Tambin detecta las excepciones JDBC y las traduce a la jerarqua genrica, excepcin ms informativo, se define en la org.springframework.dao paquete. Cuando se utiliza el JdbcTemplate para su cdigo, slo tiene que implementar interfaces de devolucin de llamada, dndoles un contrato claramente definido. El PreparedStatementCreator interfaz de devolucin de llamada crea un comunicado dado a Connection proporcionada por esta clase, proporcionando SQL y los parmetros necesarios. Lo mismo es cierto para la CallableStatementCreator interfaz, que crea

estados se puede llamar. El RowCallbackHandler interfaz extrae los valores de cada fila de un ResultSet . El JdbcTemplate se puede utilizar dentro de una aplicacin a travs de DAO instanciacin directa con un DataSource de referencia, o ser configuradas en un contenedor Spring IoC y dado a DAOs como referencia bean.
Nota

El DataSource siempre debe estar configurado como un grano en el contenedor de IoC primavera. En el primer caso el grano se le da al servicio directamente, en el segundo caso se le da a la plantilla preparada. Todos SQL emitido por esta clase se registra en el DEBUG nivel en la categora que corresponda al nombre de clase completo de la instancia de plantilla (normalmente JdbcTemplate , pero puede ser diferente si usted est utilizando una subclase personalizada de la JdbcTemplate clase).
Ejemplos de utilizacin de la clase JdbcTemplate

En esta seccin se presentan algunos ejemplos de JdbcTemplate uso de clases. Estos ejemplos no constituyen una lista exhaustiva de toda la funcionalidad expuesta por el JdbcTemplate , ver las Javadocs conlleva para eso.
Consulta (SELECT)

He aqu una simple consulta para obtener el nmero de filas en una relacin:
int = rowCount este jdbcTemplate.queryForInt ("select count (*) de t_actor").;

Una consulta sencilla utilizando una variable bind:


int = countOfActorsNamedJoe este jdbcTemplate.queryForInt. ( "Select count (*) de t_actor donde first_name =?", "Joe");

Consulta para una String :


LastName String = esta jdbcTemplate.queryForObject. ( "Seleccionar last_name de t_actor donde id =?" new Object [] {} 1212L, String clase).;

Consultar y rellenar un objeto nico dominio:


El actor Actor = esta jdbcTemplate.queryForObject. ( "Seleccionar first_name, last_name de t_actor donde id =?" new Object [] {} 1212L, nuevo <actor> RowMapper () { Actor mapRow pblico (ResultSet rs, int rownum) throws SQLException { El actor Actor Actor = new ();

actor.setFirstName (rs.getString ("nombre apellido")); actor.setLastName (rs.getString ("apellidos")); volver actor; } });

Consultar y rellenar una serie de objetos de dominio:


Lista de actores <actor> = esta jdbcTemplate.query. ( "Seleccionar first_name, last_name de t_actor" nuevo <actor> RowMapper () { Actor mapRow pblico (ResultSet rs, int rownum) throws SQLException { El actor Actor Actor = new (); actor.setFirstName (rs.getString ("nombre apellido")); actor.setLastName (rs.getString ("apellidos")); volver actor; } });

Si los dos ltimos fragmentos de cdigo realmente existi en la misma aplicacin, que tendra sentido para eliminar la duplicacin presente en los dos RowMapper clases annimas internas, y se extrae hacia fuera en una sola clase (normalmente una static clase interna) que puede ser referenciado por mtodos DAO segn sea necesario. Por ejemplo, puede que sea mejor escribir el ltimo fragmento de cdigo de la siguiente manera:
pblicos findAllActors Lista <actor> () { devuelva este jdbcTemplate.query ("select nombre apellido, apellidos de t_actor", nueva ActorMapper ()).; } privado ActorMapper esttica ltima clase implementa <actor> RowMapper { Actor mapRow pblico (ResultSet rs, int rownum) throws SQLException { El actor Actor Actor = new (); actor.setFirstName (rs.getString ("nombre apellido")); actor.setLastName (rs.getString ("apellidos")); volver actor; } } La actualizacin (INSERT / UPDATE / DELETE) con jdbcTemplate

Utilice la update(..) mtodo para realizar operaciones de insercin, actualizacin y eliminacin. Valores de los parmetros se proporciona generalmente como var args o alternativamente como una matriz de objetos.
este jdbcTemplate.update. ( "Insertar en t_actor (first_name, last_name) values (?,?)" "Leonor", "Watling"); este jdbcTemplate.update. ( "Update t_actor juego =? Donde id =?"

"Banjo", 5276L); este jdbcTemplate.update. ( "Borrar del actor donde id =?" Long.valueOf (actorId)); Otras operaciones jdbcTemplate

Usted puede utilizar el execute(..) para ejecutar cualquier mtodo SQL arbitrario, y como tal, el mtodo se utiliza a menudo para las sentencias DDL. Se muy sobrecargadas con variantes que tienen interfaces de devolucin de llamada, los elementos de matriz de unin, y as sucesivamente.
este jdbcTemplate.execute ("mitabla crear tabla (id entero, nombre varchar (100))").;

En el ejemplo siguiente se invoca un procedimiento almacenado simple. Ms sofisticado apoyo procedimiento almacenado se tratan ms adelante .
este jdbcTemplate.update. ( "Llamar SUPPORT.REFRESH_ACTORS_SUMMARY (?)", Long.valueOf (unionId)); JdbcTemplate mejores prcticas

Las instancias de la JdbcTemplate clase son multi-hilo, una vez configurado. Esto es importante porque significa que puede configurar una sola instancia de un JdbcTemplate y luego inyectar de forma segura esta referencia comn en mltiples DAOs (o repositorios). El JdbcTemplate tiene estado, ya que mantiene una referencia a un DataSource , pero este estado no es un estado de conversacin. Una prctica comn cuando se utiliza el JdbcTemplate clase (y el correspondiente SimpleJdbcTemplate y NamedParameterJdbcTemplate clases) es configurar un DataSource en el archivo de configuracin de Spring, a continuacin, dependencia que se inyecte compartido DataSource de frijoles en sus clases DAO, el JdbcTemplate se crea en la incubadora para el DataSource . Esto lleva a DAOs que mirar en parte como la siguiente:
pblico JdbcCorporateEventDao clase implementa CorporateEventDao { jdbcTemplate JdbcTemplate privado; public void SetDataSource (DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate (DataSource); } / / JDBC respaldados por las implementaciones de los mtodos en la CorporateEventDao seguir ... }

La configuracin correspondiente podra tener este aspecto.


<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance"

xmlns: context = "http://www.springframework.org/schema/context" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/springcontext.xsd "> <bean id = "corporateEventDao" class = "com.example.JdbcCorporateEventDao"> <propiedad nombre = "dataSource" ref = "dataSource" /> </ Bean> <bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method "close" => <propiedad nombre = valor = "driverClassName" "${jdbc.driverClassName}" /> <propiedad nombre = valor = "url" "${jdbc.url}" /> <propiedad nombre = valor = "username" "${jdbc.username}" /> <propiedad nombre = valor = "password" "${jdbc.password}" /> </ Bean> <context:property-placeholder ubicacin = "jdbc.properties" /> </ Beans>

Una alternativa a la configuracin explcita es utilizar el componente de exploracin y apoyo anotacin para inyeccin de dependencias. En este caso, anotar la clase con @Repository (lo cual lo convierte en un candidato para el componente de exploracin) y anotar el DataSource con el mtodo setter @Autowired .
@ Repositorio pblico JdbcCorporateEventDao clase implementa CorporateEventDao { jdbcTemplate JdbcTemplate privado; @ Autoconectados public void SetDataSource (DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate (DataSource); } / / JDBC respaldados por las implementaciones de los mtodos en la CorporateEventDao seguir ... }

El archivo de configuracin XML correspondiente ser similar al siguiente:


<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: context = "http://www.springframework.org/schema/context" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/springcontext.xsd ">

<- Escanea en el paquete base de la solicitud de Componentes @ configurar como frijoles -> <context:component-scan base-package = "org.springframework.docs.test" /> <bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method "close" => <propiedad nombre = valor = "driverClassName" "${jdbc.driverClassName}" /> <propiedad nombre = valor = "url" "${jdbc.url}" /> <propiedad nombre = valor = "username" "${jdbc.username}" /> <propiedad nombre = valor = "password" "${jdbc.password}" /> </ Bean> <context:property-placeholder ubicacin = "jdbc.properties" /> </ Beans>

Si est utilizando Spring JdbcDaoSupport clase, y sus diversas JDBC respaldados por las clases DAO se extienden desde l, entonces su subclase hereda un setDataSource(..) mtodo de la JdbcDaoSupport clase. Usted puede elegir si desea heredar de esta clase. El JdbcDaoSupport clase se proporciona para su conveniencia solamente. Independientemente de cul de los estilos de la plantilla por encima de inicializacin que decide utilizar (o no), rara vez es necesario crear una nueva instancia de un JdbcTemplate clase cada vez que desee ejecutar SQL. Una vez configurada, la JdbcTemplate instancia es multi-hilo. Si lo desea, mltiples JdbcTemplate casos si su aplicacin tiene acceso a mltiples bases de datos, lo que requiere de mltiples DataSources , y diferente configuracin posteriormente mltiples JdbcTemplates .
14.2.2 NamedParameterJdbcTemplate

El NamedParameterJdbcTemplate clase aade soporte para programacin sentencias JDBC que utilizan parmetros con nombre, en lugar de programacin sentencias JDBC usando solamente marcador de posicin clsica ( '?' ) argumentos. El NamedParameterJdbcTemplate clase envuelve un JdbcTemplate , y los delegados de la envuelta JdbcTemplate que hacer gran parte de su obra. Esta seccin describe solamente las zonas de la NamedParameterJdbcTemplate clase que difieren de la JdbcTemplate s mismo, es decir, la programacin de sentencias JDBC que utilizan parmetros con nombre.
/ / Una clase JDBC DAO respaldado por ... namedParameterJdbcTemplate NamedParameterJdbcTemplate privado; public void SetDataSource (DataSource dataSource) { . este namedParameterJdbcTemplate = new NamedParameterJdbcTemplate (DataSource); } countOfActorsByFirstName public int (firstName String) { String sql = "select count (*) de T_ACTOR donde first_name =: nombre apellido";

NamedParameters SqlParameterSource = new MapSqlParameterSource ("first_name", nombre); volver namedParameterJdbcTemplate.queryForInt (sql, namedParameters); }

Observe el uso de la notacin de parmetro con nombre en el valor asignado a la sql variable, y el valor correspondiente que se conecta a la namedParameters variable (de tipo MapSqlParameterSource ). Alternativamente, se puede pasar a lo largo de parmetros con nombre y sus valores correspondientes a un NamedParameterJdbcTemplate instancia mediante el Map style.The basado restantes mtodos expuestos por los NamedParameterJdbcOperations y ejecutado por el NamedParameterJdbcTemplate clase siguen un patrn similar y no estn cubiertos aqu. El siguiente ejemplo muestra el uso del Map basado en estilos.
/ / Una clase JDBC DAO respaldado por ... namedParameterJdbcTemplate NamedParameterJdbcTemplate privado; public void SetDataSource (DataSource dataSource) { . este namedParameterJdbcTemplate = new NamedParameterJdbcTemplate (DataSource); } countOfActorsByFirstName public int (firstName String) { String sql = "select count (*) de T_ACTOR donde first_name =: nombre apellido"; Mapa namedParameters = Collections.singletonMap ("first_name", nombre); devuelva este namedParameterJdbcTemplate.queryForInt (sql, namedParameters).; }

Una caracterstica interesante relacionado con el NamedParameterJdbcTemplate (y que existe en el mismo paquete Java) es el SqlParameterSource interfaz. Usted ya ha visto un ejemplo de una implementacin de esta interfaz en uno de los fragmentos de cdigo anterior (la MapSqlParameterSource clase). Un SqlParameterSource es una fuente de valores de parmetros con nombre para una NamedParameterJdbcTemplate . El MapSqlParameterSource clase es una aplicacin muy sencilla que es simplemente un adaptador en torno a un java.util.Map , donde las claves son los nombres de los parmetros y los valores son los valores de los parmetros. Otra SqlParameterSource implementacin es la BeanPropertySqlParameterSource clase. Esta clase envuelve un JavaBean arbitraria (es decir, una instancia de una clase que se adhiere a las convenciones JavaBean ), y utiliza las propiedades del JavaBean envuelto como la fuente de los valores de parmetro con nombre.
Actor clase pblica {

Identificacin del Largo privado; firstName private String; lastName private String; getFirstName public String () { devuelva este firstName.; } obtenerApellidoPaterno public String () { devuelva este lastName.; } getId public Long () { devuelva este id.; } / / Setters omitido ... } / / Una clase JDBC DAO respaldado por ... namedParameterJdbcTemplate NamedParameterJdbcTemplate privado; public void SetDataSource (DataSource dataSource) { . este namedParameterJdbcTemplate = new NamedParameterJdbcTemplate (DataSource); } pblicos countOfActors int (exampleActor Actor) { / / Observe cmo los parmetros con nombre coincida con las propiedades de la clase de los de arriba 'Actor' String sql = "Select count (*) de T_ACTOR donde first_name =: firstName y apellidos =: Apellido"; NamedParameters SqlParameterSource = new BeanPropertySqlParameterSource (exampleActor); devuelva este namedParameterJdbcTemplate.queryForInt (sql, namedParameters).; }

Recuerde que el NamedParameterJdbcTemplate clase envuelve un clsico JdbcTemplate plantilla, y si usted necesita el acceso a la envuelta JdbcTemplate ejemplo para acceder a la funcionalidad slo est presente en el JdbcTemplate clase, puede utilizar los getJdbcOperations() mtodo para acceder a la envuelta JdbcTemplate a travs de la JdbcOperations interfaz. Ver tambin la seccin llamada " JdbcTemplate mejores prcticas " para las instrucciones sobre el uso del NamedParameterJdbcTemplate clase en el contexto de una aplicacin.
14.2.3 SimpleJdbcTemplate

El SimpleJdbcTemplate clase envuelve el clsico JdbcTemplate y aprovecha las caractersticas del lenguaje Java 5 como varargs y autoboxing.

Nota

En la primavera de 3,0, el original JdbcTemplate tambin es compatible con Java 5 mejorada con sintaxis genricos y varargs. Sin embargo, el SimpleJdbcTemplate proporciona una API sencilla que funciona mejor cuando no es necesario el acceso a todos los mtodos que el JdbcTemplate ofrece. Tambin, debido a la SimpleJdbcTemplate fue diseado para Java 5, tiene ms mtodos que toman ventaja de varargs debido a otro orden de los parmetros. El valor aadido de la SimpleJdbcTemplate clase en la zona de sintctico-azcar se ilustra mejor con un-antes y despus de ejemplo. El fragmento de cdigo siguiente se muestra el cdigo de acceso a datos que utiliza el clsico JdbcTemplate , seguido de un fragmento de cdigo que hace el mismo trabajo con el SimpleJdbcTemplate .
/ / JdbcTemplate clsico de estilo ... jdbcTemplate JdbcTemplate privado; public void SetDataSource (DataSource dataSource) { . este jdbcTemplate = new JdbcTemplate (DataSource); } findActor Actor pblica (String especialidad, edad int) { String sql = "select id, first_name, last_name de T_ACTOR" + "Where = especializadas y = edad?"; RowMapper <actor> mapper = new RowMapper <actor> () { Actor mapRow pblico (ResultSet rs, int rownum) throws SQLException { El actor Actor Actor = new (); actor.setId (rs.getLong ("id")); actor.setFirstName (rs.getString ("nombre apellido")); actor.setLastName (rs.getString ("apellidos")); volver actor; } }; / / Note el envoltorio de los argumentos en un array volver (Actor) jdbcTemplate.queryForObject (sql, new Object [] {especialidad, edad}, mapper); }

Aqu es el mismo mtodo, con el SimpleJdbcTemplate .


/ / SimpleJdbcTemplate de estilo ... SimpleJdbcTemplate SimpleJdbcTemplate privado; public void SetDataSource (DataSource dataSource) { . este SimpleJdbcTemplate = new SimpleJdbcTemplate (DataSource); } findActor Actor pblica (String especialidad, edad int) { String sql = "select id, first_name, last_name de T_ACTOR" + "Where = especializadas y = edad?"; RowMapper <actor> mapper = new RowMapper <actor> () {

Actor mapRow pblico (ResultSet rs, int rownum) throws SQLException { El actor Actor Actor = new (); actor.setId (rs.getLong ("id")); actor.setFirstName (rs.getString ("nombre apellido")); actor.setLastName (rs.getString ("apellidos")); volver actor; } }; / / Note el uso de varargs ya que los valores de parmetro llegado / / Despus del parmetro RowMapper devuelva este simpleJdbcTemplate.queryForObject (sql, mapper, especialidad, edad).; }

Vea la seccin llamada " JdbcTemplate mejores prcticas " para las instrucciones sobre cmo utilizar el SimpleJdbcTemplate clase en el contexto de una aplicacin.
Nota

El SimpleJdbcTemplate clase slo ofrece un subconjunto de los mtodos expuestos en el JdbcTemplate clase. Si es necesario utilizar un mtodo de la JdbcTemplate que no est definido en la SimpleJdbcTemplate , siempre se puede acceder a la subyacente JdbcTemplate llamando a los getJdbcOperations() mtodo en el SimpleJdbcTemplate , que a su vez le permite invocar el mtodo que desee. El nico inconveniente es que los mtodos de la JdbcOperations interfaz no son de carcter genrico, por lo que vuelven a la fundicin y as sucesivamente.
14.2.4 SQLExceptionTranslator
SQLExceptionTranslator es una interfaz para ser implementadas por las clases que se pueden traducir entre SQLExceptions y propio de Spring org.springframework.dao.DataAccessException , que es agnstico con respecto a

la estrategia de acceso a datos. Las implementaciones pueden ser genrico (por ejemplo, utilizando cdigos SQLSTATE para JDBC) o de propiedad (por ejemplo, utilizando los cdigos de error de Oracle) para una mayor precisin.
SQLErrorCodeSQLExceptionTranslator es la implementacin de SQLExceptionTranslator que se utiliza por defecto. Esta aplicacin utiliza cdigos especficos del fabricante. Es ms preciso que el SQLState implementacin. Las

traducciones del cdigo de error se basan en los cdigos se mantienen en un tipo de clase JavaBean llamada SQLErrorCodes . Esta clase es creada y poblada por una SQLErrorCodesFactory que como su nombre indica es una fbrica para crear SQLErrorCodes basado en el contenido de un archivo de configuracin llamado sqlerror-codes.xml . Este archivo se llena con cdigos de proveedor y en base a la DatabaseProductName tomado de la DatabaseMetaData . Los cdigos de la base de datos actual que est utilizando se utilizan. El SQLErrorCodeSQLExceptionTranslator aplica las reglas de coincidencia en la secuencia siguiente:

Nota

El SQLErrorCodesFactory se utiliza por defecto para definir los cdigos de error y traducciones personalizadas de excepcin. Se mir en un archivo llamado sqlerror-codes.xml de la ruta de clases y la contrapartida SQLErrorCodes instancia se encuentra basado en el nombre de base de datos a partir de los metadatos de la base de datos de la base de datos en uso. 1. Cualquier traduccin costumbre implementada por una subclase. Normalmente, el hormign suministrado SQLErrorCodeSQLExceptionTranslator se utiliza por lo que esta regla no se aplica. Slo se aplica si se han previsto una implementacin subclase. 2. Cualquier implementacin personalizada del SQLExceptionTranslator interfaz que se proporciona como customSqlExceptionTranslator propiedad de la SQLErrorCodes clase. 3. La lista de instancias de la CustomSQLErrorCodesTranslation clase, se dispuso el customTranslations propiedad de la SQLErrorCodes clase, se busca una coincidencia. 4. Coincidencia de cdigo de error se aplica. 5. Utilice el traductor de reserva. SQLExceptionSubclassTranslator es el traductor usar por defecto. Si la traduccin no est disponible, entonces el traductor de reserva es el siguiente SQLStateSQLExceptionTranslator . Puede ampliar SQLErrorCodeSQLExceptionTranslator:
CustomSQLErrorCodesTranslator clase pblica se extiende SQLErrorCodeSQLExceptionTranslator { DataAccessException protegido customTranslate (tarea String, String sql, SQLException sqlex) { if (sqlex.getErrorCode () == - 12345) { return new DeadlockLoserDataAccessException (tarea, sqlex); } return null; } }

En este ejemplo, el cdigo de error especfico -12345 se traduce y otros errores se dejan para ser traducido por la aplicacin traductor por defecto. Para utilizar este traductor personalizado, es necesario pasar a la JdbcTemplate a travs del mtodo setExceptionTranslator y para utilizar este JdbcTemplate para todo el procesamiento de datos de acceso donde se necesita este traductor. Aqu est un ejemplo de cmo este traductor personalizado puede ser utilizado:
jdbcTemplate JdbcTemplate privado; public void SetDataSource (DataSource dataSource) { / / Crear un JdbcTemplate y fuente conjunto de datos . este jdbcTemplate = new JdbcTemplate (); este jdbcTemplate.setDataSource (DataSource).; / / Crear un traductor personalizado y establecer el origen de datos para la bsqueda traduccin defecto

CustomSQLErrorCodesTranslator tr = new CustomSQLErrorCodesTranslator (); tr.setDataSource (DataSource); este jdbcTemplate.setExceptionTranslator (tr).; } updateShippingCharge public void (orderId largo, largo pct) { / / Usar el preparado JdbcTemplate para esta actualizacin este jdbcTemplate.update. ( "Update rdenes" + "Establecer shipping_charge = shipping_charge *? / 100" + "Id = donde?" pct, orderId); }

El traductor personalizado se aprob una fuente de datos con el fin de buscar los cdigos de error en sql-error-codes.xml .
14.2.5 Ejecucin de sentencias

Ejecucin de una sentencia SQL requiere muy poco cdigo. Usted necesita un DataSource y un JdbcTemplate , incluyendo los mtodos de conveniencia que se proporcionan con el JdbcTemplate . El siguiente ejemplo muestra lo que hay que incluir en una clase mnima, pero completamente funcional que crea una nueva tabla:
importar javax.sql.DataSource; org.springframework.jdbc.core.JdbcTemplate importacin; ExecuteAStatement clase pblica { jdbcTemplate JdbcTemplate privado; public void SetDataSource (DataSource dataSource) { . este jdbcTemplate = new JdbcTemplate (DataSource); } doExecute public void () { este jdbcTemplate.execute ("mitabla crear tabla (id entero, nombre varchar (100))").; } }

14.2.6 Ejecucin de consultas

Algunos mtodos de consulta devuelva un solo valor. Para recuperar un nmero o un valor especfico de una fila, utilice queryForInt(..) , queryForLong(..) o queryForObject(..) . Esto ltimo convierte al regresar JDBC Type a la clase Java que se pasa como argumento. Si la conversin de tipos no es vlida, un InvalidDataAccessApiUsageException es lanzada. Aqu hay un ejemplo que contiene dos mtodos de consulta, una para un int y que las consultas para una String .
importar javax.sql.DataSource; org.springframework.jdbc.core.JdbcTemplate importacin; RunAQuery clase pblica {

jdbcTemplate JdbcTemplate privado; public void SetDataSource (DataSource dataSource) { . este jdbcTemplate = new JdbcTemplate (DataSource); } getCount public int () { devuelva este jdbcTemplate.queryForInt ("select count (*) de mitabla").; } public String getName () { . return (String) esta jdbcTemplate.queryForObject ("SELECT nombre de mitabla", la clase String.); } public void SetDataSource (DataSource dataSource) { esta fuente de datos DataSource =.; } }

Adems de los mtodos de consulta solo resultado, varios mtodos de devolver una lista con una entrada para cada fila que la consulta devuelve. El mtodo ms genrico es queryForList(..) que devuelve una List en la que cada entrada es un Map con cada entrada en el mapa que representa el valor de la columna de esa fila. Si se agrega un mtodo al ejemplo anterior para recuperar una lista de todas las filas, se vera as:
jdbcTemplate JdbcTemplate privado; public void SetDataSource (DataSource dataSource) { . este jdbcTemplate = new JdbcTemplate (DataSource); } public List <Mapa <String, Object>> GetList () { devuelva este jdbcTemplate.queryForList ("select * from mitabla").; }

La lista devuelta sera algo como esto:


[{Name = Bob, id = 1}, {nombre = Mary, id = 2}]

14.2.7 Actualizacin de la base de datos

El ejemplo siguiente muestra una columna actualizada para una clave principal determinada. En este ejemplo, la instruccin SQL tiene marcadores de posicin para los parmetros de la fila. Los valores de los parmetros se pueden pasar como varargs o, alternativamente, como un conjunto de objetos. As primitivas deben ser envueltos en las clases wrapper primitivas explcitamente o utilizando auto-boxing.
importar javax.sql.DataSource; org.springframework.jdbc.core.JdbcTemplate importacin; pblico ExecuteAnUpdate clase {

jdbcTemplate JdbcTemplate privado; public void SetDataSource (DataSource dataSource) { . este jdbcTemplate = new JdbcTemplate (DataSource); } setName public void (id int, String nombre) { este jdbcTemplate.update. ( "Actualizar nombre del conjunto de mitabla =? Donde id =?" nombre, id); } }

14.2.8 Recuperacin automtica de claves generadas

Un update() mtodo de conveniencia apoya la recuperacin de claves primarias generadas por la base de datos. Este apoyo es parte del estndar JDBC 3.0, vase el captulo 13.6 del pliego de condiciones de detalles. El mtodo toma un PreparedStatementCreator como primer argumento, y esta es la forma en que se especifica la instruccin de insercin requerida. El otro argumento es un KeyHolder , que contiene la clave generada por el exitoso regreso de la actualizacin. No hay una manera nica norma a crear el adecuado PreparedStatement (lo que explica por qu la firma del mtodo es la forma en que lo es). El siguiente ejemplo funciona en Oracle, pero no pueden trabajar en otras plataformas:
finales de cuerdas INSERT_SQL = "INSERT INTO my_test (nombre) values (?)"; nombre final String = "Rob"; LLAVERO LLAVERO GeneratedKeyHolder = new (); jdbcTemplate.update ( PreparedStatementCreator nuevo () { createPreparedStatement PreparedStatement pblico (conexin Connection) throws SQLException { PreparedStatement ps = Connection.prepareStatement (INSERT_SQL, new String [] {"id"}); ps.setString (1, nombre); volver ps; } }, LLAVERO); / / KeyHolder.getKey () ahora contiene la clave generada por

14.3 Control de conexiones de base de


14.3.1 DataSource

Spring obtiene una conexin a la base de datos a travs de un DataSource . Un DataSource es parte de la especificacin JDBC y es una fbrica de conexiones generalizada. Permite un contenedor o en un marco para ocultar la agrupacin de conexiones y las cuestiones de gestin de transacciones desde el cdigo de la aplicacin. Como desarrollador, usted no necesita saber los detalles sobre cmo conectarse a la base

de datos, que es la responsabilidad del administrador que configura el origen de datos. Lo ms probable es llenar ambos roles como a desarrollar y probar el cdigo, pero no necesariamente tiene que saber el origen de datos de produccin est configurado. Cuando se utiliza la capa de Spring JDBC, se obtiene una fuente de datos JNDI o de configurar su cuenta con una implementacin de conjunto de conexiones suministrado por un tercero. Las implementaciones ms populares son Apache Jakarta Commons DBCP y C3P0. Implementaciones en la distribucin de primavera son slo para propsitos de prueba y no proporcionan la agrupacin. Esta seccin utiliza Spring DriverManagerDataSource implementacin y varias implementaciones adicionales se tratan ms adelante.
Nota

Slo utilizar el DriverManagerDataSource clase slo debe utilizarse para propsitos de prueba, ya que no proporciona la agrupacin y se desempear mal cuando mltiples solicitudes de una conexin se hacen. Se puede obtener una conexin con DriverManagerDataSource con normalidad obtener una conexin JDBC. Especifique el nombre de clase completo del controlador JDBC para que el DriverManager puede cargar el controlador de clase. A continuacin, proporcione una URL que vara entre los controladores JDBC. (Consulte la documentacin de su controlador para el valor correcto.) Luego proporcionar un nombre de usuario y una contrasea para conectarse a la base de datos. He aqu un ejemplo de cmo configurar un DriverManagerDataSource en cdigo Java:
DriverManagerDataSource dataSource = new DriverManagerDataSource (); dataSource.setDriverClassName ("org.hsqldb.jdbcDriver"); dataSource.setUrl ("jdbc: hsqldb: hsql :/ / localhost:"); dataSource.setUsername ("sa"); dataSource.setPassword ("");

Esta es la configuracin XML correspondiente:


<bean id= "dataSource" class = "org.springframework.jdbc.datasource.DriverManagerDataSource"> <propiedad name= "driverClassName" value= "${jdbc.driverClassName}" /> <propiedad name= "url" value= "${jdbc.url}" /> <propiedad name= "username" value= "${jdbc.username}" /> <propiedad name= "password" value= "${jdbc.password}" /> </ Bean> <context:property-placeholder location= "jdbc.properties" />

Los siguientes ejemplos muestran la conectividad y configuracin bsica para el DBCP y C3P0. Para ms informacin acerca de ms opciones que ayudan a controlar las funciones de agrupacin, consulte la documentacin del producto para las implementaciones de conexin respectivos puesta en comn. Configuracin DBCP:

<Bean id = "origen de datos" class = "org.apache.commons.dbcp.BasicDataSource" destroymethod = "close"> <propiedad name= "driverClassName" value= "${jdbc.driverClassName}" /> <propiedad name= "url" value= "${jdbc.url}" /> <propiedad name= "username" value= "${jdbc.username}" /> <propiedad name= "password" value= "${jdbc.password}" /> </ Bean> <context:property-placeholder location= "jdbc.properties" />

C3P0 configuracin:
<Bean id = "origen de datos" class = "com.mchange.v2.c3p0.ComboPooledDataSource" destroymethod = "close"> <propiedad name= "driverClass" value= "${jdbc.driverClassName}" /> <propiedad name= "jdbcUrl" value= "${jdbc.url}" /> <propiedad name= "user" value= "${jdbc.username}" /> <propiedad name= "password" value= "${jdbc.password}" /> </ Bean> <context:property-placeholder location= "jdbc.properties" />

14.3.2 DataSourceUtils

El DataSourceUtils clase es una clase auxiliar cmodo y eficaz que proporciona static mtodos para obtener conexiones de JNDI y estrechas conexiones si es necesario. Es compatible con rosca enlazados a las conexiones con, por ejemplo, DataSourceTransactionManager .
14.3.3 SmartDataSource

El SmartDataSource interfaz debe ser implementada por las clases que pueden proporcionar una conexin a una base de datos relacional. Se extiende el DataSource de interfaz para permitir que las clases que lo utilizan para consultar si la conexin se debe cerrar despus de una operacin determinada. Este uso es eficiente cuando se sabe que va a volver a utilizar una conexin.
14.3.4 AbstractDataSource
AbstractDataSource es un abstract de la clase base para la primavera del DataSource que implementa las implementaciones de cdigo que es comn a todos DataSource implementaciones. Usted extender la AbstractDataSource clase si usted est escribiendo su propio DataSource implementacin.

14.3.5 SingleConnectionDataSource

El SingleConnectionDataSource clase es una implementacin de la SmartDataSource interfaz que envuelve una sola Connection que no se cierra despus de cada uso. Obviamente, esto no es multi-hilo capaz.

Si cualquier cdigo de cliente llama a cerrar en el supuesto de una conexin agrupada, como cuando se utilizan herramientas de persistencia, establezca la suppressClose propiedad true . Este ajuste devuelve un proxy que suprime el cierre de envolver la conexin fsica. Tenga en cuenta que usted no ser capaz de lanzar a un nativo de Oracle Connection o similar ms. Esto es principalmente una clase de prueba. Por ejemplo, se permite la prueba fcil de cdigo externo a un servidor de aplicaciones, junto con un sencillo entorno JNDI. En contraste con DriverManagerDataSource , se reutiliza la misma conexin en todo momento, evitando la creacin excesiva de conexiones fsicas.
14.3.6 DriverManagerDataSource

El DriverManagerDataSource clase es una implementacin del estndar DataSource interfaz que configura un claro controlador JDBC a travs de las propiedades del bean, y devuelve una nueva Connection cada vez. Esta aplicacin es til para la prueba y entornos autnomos fuera de un contenedor Java EE, ya sea como un DataSource grano en un contenedor Spring IoC, o en conjuncin con un simple entorno JNDI. Pool-suponiendo Connection.close() las llamadas simplemente se cerrar la conexin, por lo que cualquier DataSource cdigo de persistencia con conciencia debera funcionar. Sin embargo, utilizando JavaBean estilo de agrupaciones de conexiones tales como commons-dbcp es tan fcil, incluso en un entorno de prueba, que es casi siempre preferible utilizar un pool de conexiones a travs de DriverManagerDataSource .
14.3.7 TransactionAwareDataSourceProxy
TransactionAwareDataSourceProxy es un proxy para un objetivo DataSource , envuelve ese objetivo DataSource para aadir el conocimiento de las operaciones

que

gestionadas por resorte. A este respecto, es similar a una transaccional JNDI DataSource como proporcionada por un servidor Java EE.
Nota

Pocas veces es conveniente utilizar esta clase, excepto cuando el cdigo ya existente que debe ser llamado y aprob un estndar JDBC DataSource implementacin de la interfaz. En este caso, es posible tener todava el cdigo sea utilizable, y al mismo tiempo han este cdigo participar en transacciones Spring gestionados. En general, es preferible escribir su propio cdigo nuevo utilizando las abstracciones de alto nivel para la gestin de recursos, como JdbcTemplate o DataSourceUtils . (Ver las TransactionAwareDataSourceProxy Javadocs para ms detalles.)
14.3.8 DataSourceTransactionManager

El DataSourceTransactionManager clase es un PlatformTransactionManager implementacin de fuentes de datos JDBC solo. Se une una conexin JDBC del origen

de datos especificado en el subproceso actualmente en ejecucin, potencialmente permitiendo la conexin de hilos uno por cada fuente de datos. El cdigo de aplicacin es necesaria para recuperar la conexin JDBC a travs de DataSourceUtils.getConnection(DataSource) en lugar del estndar Java EE DataSource.getConnection . Arroja sin control org.springframework.dao excepciones en lugar de cuadros SQLExceptions . Todas las clases del framework como JdbcTemplate utilizar esta estrategia implcita. Si no se utiliza con este gestor de transacciones, la estrategia de bsqueda se comporta exactamente como la que comn que por lo tanto se puede utilizar en cualquier caso. El DataSourceTransactionManager clase admite niveles personalizados de aislamiento, y los tiempos de espera que se aplicarn, segn proceda tiempos de espera de consulta JDBC declaracin. Para apoyar esta ltima, cdigo de la aplicacin debe utilizar JdbcTemplate o llame a la DataSourceUtils.applyTransactionTimeout(..) mtodo para cada estado de cuenta creada. Esta aplicacin se puede utilizar en lugar de JtaTransactionManager en el caso nico recurso, ya que no requiere que el recipiente para apoyar JTA. El cambio entre ambos es slo una cuestin de configuracin, si nos atenemos a la relacin patrn de bsqueda requeridos. JTA no es compatible con niveles personalizados de aislamiento!
14.3.9 NativeJdbcExtractor

A veces es necesario para acceder a los mtodos especficos de proveedor JDBC que difieren de la norma API JDBC. Esto puede ser problemtico si se ejecuta en un servidor de aplicaciones o con un DataSource que envuelve las Connection , Statement y ResultSet objetos con sus propios objetos envolventes. Para obtener acceso a los objetos nativos que se pueden configurar su JdbcTemplate o OracleLobHandler con un NativeJdbcExtractor . El NativeJdbcExtractor viene en una variedad de sabores para adaptarse a su entorno de ejecucin:

SimpleNativeJdbcExtractor C3P0NativeJdbcExtractor CommonsDbcpNativeJdbcExtractor JBossNativeJdbcExtractor WebLogicNativeJdbcExtractor WebSphereNativeJdbcExtractor XAPoolNativeJdbcExtractor

Por lo general, la SimpleNativeJdbcExtractor es suficiente para desenvolver una Connection objeto en la mayora de los entornos. Ver las Javadocs para ms detalles.

14,4 por lotes JDBC operaciones

La mayora de los controladores JDBC proporcionan un rendimiento mejorado si por lotes varias llamadas a la declaracin preparada el mismo. Al agrupar las actualizaciones en lotes se limita el nmero de viajes de ida y vuelta a la base de datos. Esta seccin cubre el procesamiento por lotes utilizando tanto el JdbcTemplate y la SimpleJdbcTemplate .
14.4.1 operaciones por lotes bsicos con el JdbcTemplate

Usted logra JdbcTemplate procesamiento por lotes mediante la aplicacin de dos mtodos de una interfaz especial, BatchPreparedStatementSetter , y que pasa que en el segundo parmetro en su batchUpdate llamada al mtodo. Utilice el getBatchSize mtodo para proporcionar el tamao del lote actual. Utilice el setValues mtodo para establecer los valores de los parmetros de la declaracin preparada. Este mtodo se llama el nmero de veces que se haya especificado en la getBatchSize llamada. El siguiente ejemplo actualiza la tabla agente basado en las entradas de una lista. La lista completa se utiliza como el lote en este ejemplo:
pblico JdbcActorDao clase implementa ActorDao { jdbcTemplate JdbcTemplate privado; public void SetDataSource (DataSource dataSource) { . este jdbcTemplate = new JdbcTemplate (DataSource); } public int [] batchUpdate (finales actores <actor> Lista) { int [] = updateCounts jdbcTemplate.batchUpdate ( "T_actor actualizacin nombre apellido juego =?, Apellidos =? = Id donde?" BatchPreparedStatementSetter nuevo () { SetValues public void (PreparedStatement ps, int i) throws SQLException { ps.setString (1, actors.get (i) getFirstName ().); ps.setString (2, actors.get (i) obtenerApellidoPaterno ().); ps.setLong (.. 3, actors.get (i) getId () longValue ()); } getBatchSize public int () { volver actors.size (); } }); updateCounts retorno; } / / ... } mtodos adicionales

Si va a procesar una corriente de cambios o la lectura de un archivo, entonces usted podra tener un tamao de lote preferido, pero el ltimo lote que no tenga ese nmero de entradas. En este caso se puede utilizar el InterruptibleBatchPreparedStatementSetter interfaz, lo que le permite interrumpir un lote una vez que la fuente de entrada est agotado. El isBatchExhausted mtodo le permite indicar el final de la tanda.

14.4.2 Operaciones por lotes con una lista de objetos

Tanto el JdbcTemplate y la NamedParameterJdbcTemplate proporciona un modo alternativo de proporcionar la actualizacin por lotes. En lugar de implementar una interfaz lote especial, proporciona todos los valores de los parmetros en la llamada como una lista. El marco bucles sobre estos valores y utiliza un setter interna declaracin preparada. La API vara dependiendo de si se utilizan parmetros con nombre. Para los parmetros con nombre que proporciona una gran variedad de SqlParameterSource , una entrada por cada miembro del lote. Se puede utilizar el SqlParameterSource.createBatch mtodo para crear esta matriz, pasando en cualquiera de una serie de JavaBeans o una serie de mapas que contienen los valores de los parmetros. Este ejemplo muestra una actualizacin por lotes utilizando parmetros con nombre:
pblico JdbcActorDao clase implementa ActorDao { namedParameterJdbcTemplate NamedParameterTemplate privado; public void SetDataSource (DataSource dataSource) { . este namedParameterJdbcTemplate = new NamedParameterJdbcTemplate (DataSource); } public int [] batchUpdate (finales actores <actor> Lista) { SqlParameterSource [] = lote SqlParameterSourceUtils.createBatch (actors.toArray ()); int [] = updateCounts namedParameterJdbcTemplate.batchUpdate ( "T_actor actualizacin set = 'nombre: firstName, apellidos =: lastName donde id =: id", lote); updateCounts retorno; } / / ... } mtodos adicionales

Para una sentencia SQL usando el clsico "?" marcadores de posicin, se pasa en una lista que contiene una matriz de objetos con los valores de actualizacin. Esta matriz objeto debe tener una entrada para cada marcador de posicin en la sentencia SQL, y deben estar en el mismo orden en que se definen en la sentencia SQL. El mismo ejemplo usando JDBC clsico "?" marcadores de posicin:
pblico JdbcActorDao clase implementa ActorDao { jdbcTemplate JdbcTemplate privado; public void SetDataSource (DataSource dataSource) { . este jdbcTemplate = new JdbcTemplate (DataSource); } public int [] batchUpdate (finales actores <actor> Lista) { Lista <Object[]> lote = new ArrayList <Object[]> (); para (actor de reparto: actores) { Object [] valores = new Object [] { actor.getFirstName (),

actor.getLastName (), actor.getId ()}; batch.add (valores); } int [] = updateCounts jdbcTemplate.batchUpdate ( "T_actor actualizacin nombre apellido juego =?, Apellidos =? = Id donde?" lote); updateCounts retorno; } / / ... } mtodos adicionales

Todos los mtodos de actualizacin por lotes anteriores devolver una matriz int que contiene el nmero de filas afectadas por cada entrada de proceso por lotes. Este recuento es reportado por el controlador JDBC. Si la cuenta no est disponible, el controlador JDBC devuelve un valor de -2.
14.4.3 Operaciones por lotes con varios lotes

El ltimo ejemplo de una ofertas por lotes de actualizacin con los lotes que son tan grandes que desea separarlos en varios lotes ms pequeos. Por supuesto, puede hacer esto con los mtodos mencionados anteriormente al hacer varias llamadas a la batchUpdate mtodo, pero ahora hay un mtodo ms conveniente. Este mtodo tiene, adems de la instruccin SQL, una coleccin de objetos que contiene los parmetros, el nmero de cambios a realizar para cada lote y un ParameterizedPreparedStatementSetter para establecer los valores de los parmetros de la declaracin preparada. El marco de los bucles sobre los valores previstos y se rompe la actualizacin pone en lotes del tamao especificado. Este ejemplo muestra una actualizacin por lotes utilizando un tamao de lote de 100:
pblico JdbcActorDao clase implementa ActorDao { jdbcTemplate JdbcTemplate privado; public void SetDataSource (DataSource dataSource) { . este jdbcTemplate = new JdbcTemplate (DataSource); } public int [] [] batchUpdate (finales actores Collection <actor>) { int [] [] = updateCounts jdbcTemplate.batchUpdate ( "T_actor actualizacin nombre apellido juego =?, Apellidos =? = Id donde?" actores, 100, nuevo <actor> ParameterizedPreparedStatementSetter () { SetValues public void (PreparedStatement ps, argumento Actor) throws SQLException { ps.setString (1, argument.getFirstName ()); ps.setString (2, argument.getLastName ()); ps.setLong (. 3, argument.getId () longValue ()); }

}); updateCounts retorno; } / / ... } mtodos adicionales

Los mtodos de actualizacin por lotes para esta llamada devuelve un array de arrays de int que contiene una entrada de la matriz por cada lote con un arreglo en el nmero de filas afectadas por cada actualizacin. La longitud de la matriz de nivel superior indica el nmero de lotes ejecutadas y longitud de la matriz de nivel segundo indica el nmero de cambios en ese lote. El nmero de cambios en cada lote debe ser el tamao de lote de la proporcionada para todos los lotes excepto el ltimo que puede ser menos, en funcin del nmero total de objetos de actualizacin previstas. El recuento de actualizaciones para cada instruccin de actualizacin es la reportada por el controlador JDBC. Si la cuenta no est disponible, el controlador JDBC devuelve un valor de -2.

14.5 Simplificacin de JDBC operaciones con las clases SimpleJdbc


El SimpleJdbcInsert y SimpleJdbcCall clases proporcionan una configuracin simplificada mediante el aprovechamiento de los metadatos de la base de datos que se pueden recuperar a travs del controlador JDBC. Esto significa que hay menos para configurar la delantera, aunque se puede anular o desactivar el procesamiento de los metadatos para que pueda proporcionar todos los detalles en el cdigo.
14.5.1 Insertar datos utilizando SimpleJdbcInsert

Vamos a empezar por mirar el SimpleJdbcInsert clase con la mnima cantidad de opciones de configuracin. Usted debe crear una instancia del SimpleJdbcInsert mtodo de inicializacin en la capa de acceso a datos. Para este ejemplo, el mtodo de inicializacin es el setDataSource mtodo. No es necesario que la subclase SimpleJdbcInsert clase, basta con crear una nueva instancia y establezca el nombre de la tabla con el withTableName mtodo. Mtodos de configuracin para esta clase siguen el "fluido" de estilo que devuelve la instancia de la SimpleJdbcInsert , que le permite a la cadena de todos los mtodos de configuracin. En este ejemplo se utiliza un solo mtodo de configuracin, podrs ver ejemplos de los mltiples tarde.
pblico JdbcActorDao clase implementa ActorDao { SimpleJdbcTemplate SimpleJdbcTemplate privado; insertActor SimpleJdbcInsert privado; public void SetDataSource (DataSource dataSource) { . este SimpleJdbcTemplate = new SimpleJdbcTemplate (DataSource); este insertActor. = nuevo SimpleJdbcInsert (DataSource) withTableName ("t_actor").; } public void add (actor Actor) { Mapa <String, parmetros Object> = new HashMap <String, Object> (3);

parameters.put ("id", actor.getId ()); parameters.put ("first_name", actor.getFirstName ()); parameters.put ("apellidos", actor.getLastName ()); insertActor.execute (parmetros); } / / ... } mtodos adicionales

El mtodo de ejecucin utilizado aqu tiene un llano java.utils.Map como su nico parmetro. Lo importante a sealar aqu es que las claves utilizadas para el mapa deben coincidir con los nombres de las columnas de la tabla tal como se definen en la base de datos. Esto se debe a que lea los metadatos con el fin de construir la instruccin de insercin actual.
14.5.2 Recuperacin automtica de claves generadas utilizando SimpleJdbcInsert

En este ejemplo se utiliza el inserto mismo que el anterior, pero en lugar de pasar en el ello se recupera la clave generada automticamente y lo establece en el objeto nuevo actor. Cuando se crea el SimpleJdbcInsert , adems de especificar el nombre de la tabla, se especifica el nombre de la columna de claves generado con el usingGeneratedKeyColumns mtodo.
pblico JdbcActorDao clase implementa ActorDao { SimpleJdbcTemplate SimpleJdbcTemplate privado; insertActor SimpleJdbcInsert privado; public void SetDataSource (DataSource dataSource) { . este SimpleJdbcTemplate = new SimpleJdbcTemplate (DataSource); este insertActor. = nuevo SimpleJdbcInsert (DataSource) . WithTableName ("t_actor") . UsingGeneratedKeyColumns ("id"); } public void add (actor Actor) { Mapa <String, parmetros Object> = new HashMap <String, Object> (2); parameters.put ("first_name", actor.getFirstName ()); parameters.put ("apellidos", actor.getLastName ()); Nmero NEWID = insertActor.executeAndReturnKey (parmetros); actor.setId (newId.longValue ()); } / / ... } mtodos adicionales

La principal diferencia al ejecutar la insercin de este segundo enfoque es que no agrega el id al mapa y se llama a la executeReturningKey mtodo. Esto devuelve un java.lang.Number objeto con el que se puede crear una instancia del tipo numrico que se utiliza en nuestro dominio class.You no puede confiar en todas las bases de datos para devolver una determinada clase Java aqu; java.lang.Number es la base clase que usted puede confiar. Si tiene varias columnas generadas automticamente, o los valores generados son no numrico, entonces usted puede utilizar un KeyHolder que se devuelve desde el executeReturningKeyHolder mtodo.

14.5.3 Especificacin de las columnas para un SimpleJdbcInsert

Puede limitar las columnas de una insercin mediante la especificacin de una lista de nombres de columna con el usingColumns mtodo:
pblico JdbcActorDao clase implementa ActorDao { SimpleJdbcTemplate SimpleJdbcTemplate privado; insertActor SimpleJdbcInsert privado; public void SetDataSource (DataSource dataSource) { . este SimpleJdbcTemplate = new SimpleJdbcTemplate (DataSource); este insertActor. = nuevo SimpleJdbcInsert (DataSource) . WithTableName ("t_actor") . UsingColumns ("'nombre", "apellidos") . UsingGeneratedKeyColumns ("id"); } public void add (actor Actor) { Mapa <String, parmetros Object> = new HashMap <String, Object> (2); parameters.put ("first_name", actor.getFirstName ()); parameters.put ("apellidos", actor.getLastName ()); Nmero NEWID = insertActor.executeAndReturnKey (parmetros); actor.setId (newId.longValue ()); } / / ... } mtodos adicionales

La ejecucin de la pieza es el mismo que si se haba basado en los metadatos para determinar qu columnas de usar.
14.5.4 Uso de SqlParameterSource para proporcionar valores de los parmetros

El uso de un Map de proporcionar valores de parmetro funciona bien, pero no es la clase ms cmodo de usar. Spring proporciona un par de implementaciones de la SqlParameterSource interfaz que se puede utilizar una primera instead.The es BeanPropertySqlParameterSource , que es una clase muy conveniente si usted tiene una clase JavaBean compatible que contiene los valores. Se utilizar el mtodo getter correspondiente para extraer los valores de los parmetros. Aqu est un ejemplo:
pblico JdbcActorDao clase implementa ActorDao { SimpleJdbcTemplate SimpleJdbcTemplate privado; insertActor SimpleJdbcInsert privado; public void SetDataSource (DataSource dataSource) { . este SimpleJdbcTemplate = new SimpleJdbcTemplate (DataSource); este insertActor. = nuevo SimpleJdbcInsert (DataSource) . WithTableName ("t_actor") . UsingGeneratedKeyColumns ("id"); } public void add (actor Actor) {

SqlParameterSource parmetros = new BeanPropertySqlParameterSource (actor); Nmero NEWID = insertActor.executeAndReturnKey (parmetros); actor.setId (newId.longValue ()); } / / ... } mtodos adicionales

Otra opcin es la MapSqlParameterSource que se asemeja a un mapa, pero proporciona una ms conveniente addValue mtodo que puede ser encadenado.
pblico JdbcActorDao clase implementa ActorDao { SimpleJdbcTemplate SimpleJdbcTemplate privado; insertActor SimpleJdbcInsert privado; public void SetDataSource (DataSource dataSource) { . este SimpleJdbcTemplate = new SimpleJdbcTemplate (DataSource); este insertActor. = nuevo SimpleJdbcInsert (DataSource) . WithTableName ("t_actor") . UsingGeneratedKeyColumns ("id"); } public void add (actor Actor) { Parmetros SqlParameterSource = new MapSqlParameterSource () . AddValue ("first_name", actor.getFirstName ()) . AddValue ("apellidos", actor.getLastName ()); Nmero NEWID = insertActor.executeAndReturnKey (parmetros); actor.setId (newId.longValue ()); } / / ... } mtodos adicionales

Como se puede ver, la configuracin es la misma, slo el cdigo que se ejecuta tiene que cambiar para utilizar estas clases de entrada alternativos.
14.5.5 Llamar a un procedimiento almacenado con SimpleJdbcCall

El SimpleJdbcCall clase aprovecha los metadatos de la base de datos para buscar nombres de in y out los parmetros, de modo que usted no tiene que declarar explcitamente. Puede declarar los parmetros para que pueda hacer eso, o si tiene parmetros como ARRAY o STRUCT que no tiene una asignacin automtica a una clase Java. El primer ejemplo muestra un procedimiento sencillo que slo devuelve valores escalares VARCHAR y DATE formato de una base de datos MySQL. El procedimiento de ejemplo lee una entrada de agente especificado y devuelve first_name , last_name y birth_date columnas en forma de out de parmetros.
CREAR read_actor PROCEDIMIENTO ( EN INTEGER in_id, OUT out_first_name VARCHAR (100), OUT out_last_name VARCHAR (100), FECHA DE SALIDA out_birth_date) COMENZAR SELECT first_name, last_name, birth_date

EN out_first_name, out_last_name, out_birth_date DE t_actor donde id = in_id; END;

El in_id parmetro contiene el id del actor que est buscando. Las out parmetros devolver los datos ledos de la tabla. El SimpleJdbcCall se declara en una forma similar a la SimpleJdbcInsert . Usted debe crear instancias y configurar la clase en el mtodo de inicializacin de la capa de acceso a datos. En comparacin con la clase StoredProcedure, no es necesario crear una subclase y usted no tiene que declarar los parmetros que se pueden consultar en la base de datos de metadatos. El siguiente es un ejemplo de una configuracin SimpleJdbcCall utilizando el procedimiento anterior almacenada. La nica opcin de configuracin, adems de la DataSource , es el nombre del procedimiento almacenado.
pblico JdbcActorDao clase implementa ActorDao { SimpleJdbcTemplate SimpleJdbcTemplate privado; procReadActor SimpleJdbcCall privado; public void SetDataSource (DataSource dataSource) { . este SimpleJdbcTemplate = new SimpleJdbcTemplate (DataSource); este procReadActor. = nuevo SimpleJdbcCall (DataSource) . WithProcedureName ("read_actor"); } readActor Actor pblica (Long id) { SqlParameterSource en MapSqlParameterSource = new () . AddValue ("in_id", id); Mapa de salida = procReadActor.execute (in); El actor Actor Actor = new (); actor.setId (id); actor.setFirstName ((String) out.get ("out_first_name")); actor.setLastName ((String) out.get ("out_last_name")); actor.setBirthDate ((Fecha) out.get ("out_birth_date")); volver actor; } / / ... } mtodos adicionales

El cdigo que escriba para la ejecucin de la convocatoria implica la creacin de un SqlParameterSource que contiene el parmetro IN. Es importante para que coincida con el nombre proporcionado por el valor de entrada con la del nombre del parmetro declarado en el procedimiento almacenado. El caso no tiene por qu coincidir porque usa los metadatos para determinar cmo los objetos de base de datos debe ser referido a un procedimiento almacenado. Lo que se especifica en la fuente para el procedimiento almacenado no es necesariamente la forma en que se almacena en la base de datos. Algunas bases de datos transformar nombres a todo en maysculas, mientras que otros utilizan minsculas o utilizar el caso como se especifica. La execute mtodo toma los parmetros IN y devuelve un mapa que contenga cualquier out los parmetros introducidos por el nombre como se especifica en el

procedimiento almacenado. En este caso son out_first_name, out_last_name y out_birth_date . La ltima parte de la execute mtodo crea una instancia Actor utilizar para devolver los datos recuperados. De nuevo, es importante la utilizacin de los nombres de los out como los parmetros que se declaran en el procedimiento almacenado. Adems, en el caso de los nombres de los out los parmetros almacenados en los resultados del mapa coincida con el del out los nombres de parmetros en la base de datos, que puede variar entre bases de datos. Para hacer que el cdigo sea ms porttil que usted debe hacer una primavera de maysculas y minsculas de bsqueda o instruir a utilizar un CaseInsensitiveMap del proyecto Jakarta Commons. Para hacer esto ltimo, puede crear su propio JdbcTemplate y establecer el setResultsMapCaseInsensitive propiedad true . A continuacin, se pasa esta personalizado JdbcTemplate instancia en el constructor de su SimpleJdbcCall . Debe incluir el commons-collections.jar en la ruta de clases para que esto funcione. Este es un ejemplo de esta configuracin:
pblico JdbcActorDao clase implementa ActorDao { procReadActor SimpleJdbcCall privado; public void SetDataSource (DataSource dataSource) { JdbcTemplate jdbcTemplate = new JdbcTemplate (DataSource); jdbcTemplate.setResultsMapCaseInsensitive (true); este procReadActor. = nuevo SimpleJdbcCall (jdbcTemplate) . WithProcedureName ("read_actor"); } / / ... } mtodos adicionales

Al tomar esta accin, evitar conflictos en el caso usados para los nombres de los devueltos out los parmetros.
14.5.6 Parmetros declarar explcitamente a utilizar para un SimpleJdbcCall

Ustedes han visto cmo los parmetros se deducen basado en metadatos, pero se puede declarar explcitamente entonces si lo desea. Para ello, la creacin y configuracin SimpleJdbcCall con el declareParameters mtodo, que toma un nmero variable de SqlParameter objetos como entrada. Consulte la seccin siguiente para obtener informacin sobre cmo definir un SqlParameter .
Nota

Declaraciones explcitas son necesarias si la base de datos que utiliza no es una base de datos Primavera-compatible. Actualmente Spring soporta metadatos de bsqueda de llamadas a procedimientos almacenados para las siguientes bases de datos: Apache Derby, DB2, MySQL, Microsoft SQL Server, Oracle y Sybase. Tambin apoyamos bsqueda de metadatos de las funciones almacenadas para: MySQL, Microsoft SQL Server y Oracle.

Usted puede optar por declarar uno, algunos o todos los parmetros de forma explcita. Los metadatos parmetro se sigue utilizando en los que no declaran explcitamente los parmetros. Para anular todo el proceso de bsquedas de metadatos para los parmetros posibles y slo utilizar los parmetros declarados, se llama al mtodo withoutProcedureColumnMetaDataAccess como parte de la declaracin. Supongamos que usted tiene dos o ms firmas de llamada diferentes declarados para una funcin de base de datos. En este caso, se llama a los useInParameterNames para especificar la lista de nombres de los parmetros IN de incluir una firma determinada. El ejemplo siguiente muestra una llamada de procedimiento completamente declarado, utilizando la informacin del ejemplo anterior.
pblico JdbcActorDao clase implementa ActorDao { procReadActor SimpleJdbcCall privado; public void SetDataSource (DataSource dataSource) { JdbcTemplate jdbcTemplate = new JdbcTemplate (DataSource); jdbcTemplate.setResultsMapCaseInsensitive (true); este procReadActor. = nuevo SimpleJdbcCall (jdbcTemplate) . WithProcedureName ("read_actor") . WithoutProcedureColumnMetaDataAccess () . UseInParameterNames ("in_id") (DeclareParameters. SqlParameter nuevo ("in_id", Types.NUMERIC), SqlOutParameter nuevo ("out_first_name", Types.VARCHAR), SqlOutParameter nuevo ("out_last_name", Types.VARCHAR), SqlOutParameter nuevo ("out_birth_date", Types.DATE) ); } / / ... } mtodos adicionales

Los resultados de la ejecucin y al final de los dos ejemplos son el mismo; ste especifica todos los detalles explcita, en lugar de depender de metadatos.
14.5.7 Cmo definir SqlParameters

Para definir un parmetro para las clases SimpleJdbc y tambin para las clases de operaciones RDBMS, cubiertos en la Seccin 14.6, "Modelado de operaciones de JDBC como objetos Java" , se utiliza un SqlParameter o una de sus subclases. Por lo general, especificar el nombre del parmetro y el tipo SQL en el constructor. El tipo SQL se especifica utilizando las java.sql.Types constantes. Ya hemos visto las declaraciones como:
SqlParameter nuevo ("in_id", Types.NUMERIC), SqlOutParameter nuevo ("out_first_name", Types.VARCHAR),

La primera lnea de la SqlParameter declara un parmetro IN. EN parmetros se pueden utilizar tanto para llamadas a procedimientos almacenados y las consultas utilizando el SqlQuery y sus subclases trata en la seccin siguiente. La segunda lnea con la SqlOutParameter declara un out parmetro para ser utilizado en una llamada de procedimiento almacenado. Tambin hay un SqlInOutParameter para InOut parmetros, los parmetros que proporcionan una IN valor al procedimiento y que tambin devolver un valor.
Nota

Slo los parmetros declarados como SqlParameter y SqlInOutParameter se utiliza para proporcionar los valores de entrada. Esto es diferente de la StoredProcedure clase, que por razones de compatibilidad hacia atrs permite que los valores de entrada que se proporcionan para los parmetros declarados como SqlOutParameter . Para los parmetros IN, adems del nombre y el tipo SQL, puede especificar una escala para datos numricos o un nombre de tipo para los tipos de bases de datos personalizadas. Por out los parmetros, puede proporcionar una RowMapper para manejar la cartografa de filas devueltas desde un REF cursor. Otra opcin es especificar un SqlReturnType que ofrece una oportunidad para definir el manejo personalizado de los valores de retorno.
14.5.8 Llamar a una funcin almacenada utilizando SimpleJdbcCall

Usted llama a una funcin almacenada en casi la misma manera como se llama a un procedimiento almacenado, excepto que usted proporciona un nombre de funcin en lugar de un nombre de procedimiento. Se utiliza el withFunctionName mtodo como parte de la configuracin para indicar que queremos hacer una llamada a una funcin, y la cadena correspondiente para una llamada a la funcin se genera. Una especializado ejecutar llamada, executeFunction, se utiliza para ejecutar la funcin y devuelve el valor devuelto por una funcin como un objeto de un tipo especificado, lo que significa que usted no tiene que recuperar el valor devuelto por el mapa de resultados. Un mtodo de conveniencia similar llamada executeObject tambin est disponible para los procedimientos almacenados que slo tienen una out de parmetros. El siguiente ejemplo se basa en una funcin de almacenado llamado get_actor_name que devuelve el nombre completo de un actor. Aqu est el cdigo fuente de MySQL para esta funcin:
CREATE FUNCTION get_actor_name (in_id INTEGER) RETURNS VARCHAR (200) READS SQL DATA COMENZAR DECLARO out_name VARCHAR (200); SELECT concat ('nombre', ', apellidos) EN out_name DE t_actor donde id = in_id; VOLVER out_name; END;

Para llamar a esta funcin podemos crear un nuevo SimpleJdbcCall en el mtodo de inicializacin.
pblico JdbcActorDao clase implementa ActorDao { SimpleJdbcTemplate SimpleJdbcTemplate privado; funcGetActorName SimpleJdbcCall privado; public void SetDataSource (DataSource dataSource) { . este SimpleJdbcTemplate = new SimpleJdbcTemplate (DataSource); JdbcTemplate jdbcTemplate = new JdbcTemplate (DataSource); jdbcTemplate.setResultsMapCaseInsensitive (true); este funcGetActorName. = nuevo SimpleJdbcCall (jdbcTemplate) . WithFunctionName ("get_actor_name"); } getActorName public String (Long id) { SqlParameterSource en MapSqlParameterSource = new () . AddValue ("in_id", id); String nombre = funcGetActorName.executeFunction (String. clase, in); devolver el nombre; } / / ... } mtodos adicionales

El mtodo de ejecucin utilizado devuelve una String que contiene el valor devuelto de la llamada a la funcin.
14.5.9 Devolucin ResultSet / REF Cursor desde un SimpleJdbcCall

Llamar a un procedimiento almacenado o una funcin que devuelve un conjunto de resultados es un poco complicado. Algunas bases de datos devolver conjuntos de resultados durante el procesamiento de los resultados de JDBC mientras que otros requieren una explcita registrado out de parmetros de un tipo especfico. Ambos enfoques deben procesamiento adicional de iterar sobre el conjunto de resultados y procesar las filas devueltas. Con la SimpleJdbcCall utiliza el returningResultSet mtodo y declarar un RowMapper de aplicacin que se utiliza para un parmetro especfico. En el caso en que se devuelve el conjunto de resultados en el tratamiento de los resultados, no hay nombres definidos, por lo que los resultados devueltos tendrn que coincidir con el orden en que se declaran los RowMapper implementaciones. El nombre especificado todava se utiliza para almacenar la lista de los resultados procesados en el mapa de resultados que se devuelve desde la instruccin EXECUTE. El siguiente ejemplo utiliza un procedimiento almacenado que no tiene parmetros IN y devuelve todas las filas de la tabla t_actor. Aqu est el cdigo fuente de MySQL para este procedimiento:
CREAR PROCEDIMIENTO read_all_actors () COMENZAR SELECT a.id, a.first_name, a.last_name, a.birth_date DE t_actor a; END;

Para llamar a este procedimiento se declara el RowMapper . Debido a que la clase que desea asignar al JavaBean sigue las reglas, puede utilizar un ParameterizedBeanPropertyRowMapper que se crea pasando en la clase necesaria para asignar a la newInstance mtodo.
pblico JdbcActorDao clase implementa ActorDao { SimpleJdbcTemplate SimpleJdbcTemplate privado; procReadAllActors SimpleJdbcCall privadas; public void SetDataSource (DataSource dataSource) { . este SimpleJdbcTemplate = new SimpleJdbcTemplate (DataSource); JdbcTemplate jdbcTemplate = new JdbcTemplate (DataSource); jdbcTemplate.setResultsMapCaseInsensitive (true); esta procReadAllActors =. nuevo SimpleJdbcCall (jdbcTemplate) . WithProcedureName ("read_all_actors") . ReturningResultSet ("actores", ParameterizedBeanPropertyRowMapper.newInstance (Actor. clase)); } getActorsList public List () { Mapa m = procReadAllActors.execute (nuevo HashMap <String, Object> (0)); volver (List) m.get ("actores"); } / / ... } mtodos adicionales

La ejecucin de pases de llamadas en un mapa vaco porque esta llamada no tiene ningn parmetro. La lista de agentes es luego recuperado de el mapa de resultados y devuelve al llamador.

14.6 Modelado JDBC operaciones como objetos Java


El org.springframework.jdbc.object paquete contiene clases que permiten acceder a la base de datos de una manera ms orientada a objetos forma. A modo de ejemplo, puede ejecutar consultas y obtener los resultados como una lista que contiene los objetos de negocio con los datos de columna relacionales asignan a las propiedades del objeto de negocio. Tambin puede ejecutar procedimientos almacenados y ejecutar la actualizacin, eliminacin e insercin declaraciones.
Nota

Muchos desarrolladores Spring creer que las diversas clases de RDBMS operacin descrita a continuacin (con la excepcin de la StoredProcedure clase) puede a menudo ser reemplazado con rectas JdbcTemplate llamadas. A menudo es ms sencillo que escribir un mtodo DAO que simplemente llama a un mtodo en un JdbcTemplate directamente (en lugar de encapsulacin de una consulta como una clase en toda regla). Sin embargo, si usted est recibiendo un valor cuantificable del uso de las clases de

operacin de RDBMS, seguir utilizando estas clases.


14.6.1 SqlQuery
SqlQuery

es una clase reutilizable, multi-hilo que encapsula una consulta SQL. Las subclases deben implementar la newRowMapper(..) mtodo para proporcionar una RowMapper instancia que puede crear un objeto por cada fila obtenida de iterar sobre el ResultSet que se crea durante la ejecucin de la consulta. El SqlQuery clase rara vez se utiliza directamente porque la MappingSqlQuery subclase proporciona una implementacin mucho ms conveniente para el mapeo de filas a las clases Java. Otras implementaciones que se extienden SqlQuery son MappingSqlQueryWithParameters y UpdatableSqlQuery .
14.6.2 MappingSqlQuery
MappingSqlQuery

es una consulta reutilizable en subclases concretas que deben implementar el resumen mapRow(..) para convertir cada fila de la suministrada ResultSet en un objeto del tipo especificado. El ejemplo siguiente muestra una consulta personalizada que asigna los datos de la t_actor relacin con una instancia del Actor de clase.
ActorMappingQuery clase pblica se extiende MappingSqlQuery <actor> { ActorMappingQuery pblico (DataSource ds) { super (ds, "select id, first_name, last_name de t_actor donde id =?"); . sper declareParameter (nuevo SqlParameter ("id", Types.INTEGER)); compilar (); } @ Override protegida Actor mapRow (ResultSet rs, int RowNumber) throws SQLException { El actor Actor Actor = new (); actor.setId (rs.getLong ("id")); actor.setFirstName (rs.getString ("nombre apellido")); actor.setLastName (rs.getString ("apellidos")); volver actor; } }

La clase se extiende MappingSqlQuery parametrizado con el Actor tipo. El constructor para esta consulta cliente toma el DataSource como nico parmetro. En este constructor se llama al constructor de la superclase con el DataSource y el cdigo SQL que se debe ejecutar para recuperar las filas en esta bsqueda. Este SQL se utiliza para crear un PreparedStatement por lo que puede contener marcadores de posicin para los parmetros que se pasarn durante execution.You debe declarar cada parmetro con el declareParameter mtodo pasando un SqlParameter . El SqlParameter toma un nombre y el tipo JDBC como se define en java.sql.Types . Una vez definidos todos los parmetros, se llama a la compile() mtodo para que la declaracin puede ser

preparado y ejecutado ms tarde. Esta clase es thread-safe despus de haber sido compilados, as que mientras estas instancias se crean cuando se inicializa el DAO se pueden mantener como variables de instancia y volver a utilizar.
actorMappingQuery ActorMappingQuery privado; @ Autoconectados public void SetDataSource (DataSource dataSource) { . este actorMappingQuery = new ActorMappingQuery (DataSource); } GetCustomer cliente pblico (Long id) { volver actorMappingQuery.findObject (id); }

El mtodo en este ejemplo se recupera el cliente con el identificador que se pasa como parmetro nico. Ya que slo quieren un objeto devuelto simplemente llamamos al mtodo de conveniencia findObject con el identificador como parmetro. Si hubiramos tenido lugar una consulta que devuelve una lista de objetos y tom parmetros adicionales entonces podramos usar uno de los mtodos Execute que toma una matriz de valores de parmetros pasados como varargs.
pblicos searchForActors Lista <actor> edad (int, String namePattern) { Lista <actor> actores actorSearchMappingQuery.execute = (edad, namePattern); volver actores; }

14.6.3 SqlUpdate

El SqlUpdate clase encapsula una actualizacin de SQL. Como una consulta, un objeto de actualizacin es reutilizable, y como todos los RdbmsOperation clases, una actualizacin puede tener parmetros y se define en SQL. Esta clase proporciona un nmero de update(..) mtodos anlogos a la execute(..) mtodos de objetos de consulta. El SQLUpdate clase es concreta. Se puede tener subclases, por ejemplo, para aadir un mtodo de actualizacin personalizada, como en el siguiente cdigo donde se llama simplemente execute . Sin embargo, no es necesario que la subclase SqlUpdate clase, ya que fcilmente se puede parametrizar mediante el establecimiento de SQL y la declaracin de parmetros.
java.sql.Types importacin; importar javax.sql.DataSource; importar org.springframework.jdbc.core.SqlParameter; importar org.springframework.jdbc.object.SqlUpdate; UpdateCreditRating clase pblica se extiende SqlUpdate { UpdateCreditRating pblico (DataSource ds) { SetDataSource (ds); setSql ("UPDATE customer SET = credit_rating donde id =?"); declareParameter (nuevo SqlParameter ("CreditRating", Types.NUMERIC)); declareParameter (nuevo SqlParameter ("id", Types.NUMERIC));

compilar (); } / ** * @ Param id para el cliente que se actualizar * @ Param calificacin el nuevo valor para la calificacin de crdito * @ Return nmero de filas actualizadas * / public int execute (int id, int calificacin) { volver actualizacin (rating, id); } }

14.6.4 StoredProcedure

El StoredProcedure clase es una superclase de abstracciones objeto de procedimientos almacenados RDBMS. Esta clase es abstract , y sus diversas execute(..) mtodos han protected el acceso, la prevencin del uso que no sea a travs de una subclase que ofrece una mayor mecanografa. La heredado sql propiedad ser el nombre del procedimiento almacenado en el RDBMS. Para definir un parmetro para el StoredProcedure clase, se utiliza un SqlParameter o una de sus subclases. Debe especificar el nombre del parmetro y el tipo SQL en el constructor como en el siguiente fragmento de cdigo. El tipo SQL se especifica utilizando las java.sql.Types constantes.
SqlParameter nuevo ("in_id", Types.NUMERIC), SqlOutParameter nuevo ("out_first_name", Types.VARCHAR),

La primera lnea de la SqlParameter declara un parmetro IN. EN parmetros se pueden utilizar tanto para llamadas a procedimientos almacenados y las consultas utilizando el SqlQuery y sus subclases trata en la seccin siguiente. La segunda lnea con la SqlOutParameter declara un out parmetro para ser utilizado en la llamada al procedimiento almacenado. Tambin hay un SqlInOutParameter para I nOut parmetros, los parmetros que proporcionan una in valor al procedimiento y que tambin devolver un valor. Para i n parmetros, adems del nombre y el tipo SQL, puede especificar una escala para datos numricos o un nombre de tipo para los tipos de bases de datos personalizadas. Por out los parmetros que puede proporcionar un RowMapper para manejar mapeo de filas devueltas desde un cursor REF. Otra opcin es especificar un SqlReturnType que le permite definir el manejo personalizado de los valores de retorno. He aqu un ejemplo de un sencillo DAO que utiliza un StoredProcedure para llamar a una funcin, sysdate() , que viene con cualquier base de datos Oracle. Para utilizar la funcin de procedimiento almacenado se debe crear una clase que extiende StoredProcedure . En este ejemplo, el StoredProcedure clase es una clase interna,

pero si tiene que volver a utilizar el StoredProcedure se declara como una clase de nivel superior. Este ejemplo no tiene parmetros de entrada, sino un parmetro de salida se declara como un tipo de fecha utilizando la clase SqlOutParameter . El execute() mtodo se ejecuta el procedimiento y extrae la fecha de devolucin de los resultados Map . El resultados Map tiene una entrada para cada parmetro de salida declarado, en este caso, slo uno, utilizando el nombre del parmetro como la clave.
java.sql.Types importacin; importacin java.util.Date; importar java.util.HashMap; importar java.util.Map; importar javax.sql.DataSource; importar org.springframework.beans.factory.annotation.Autowired; importar org.springframework.jdbc.core.SqlOutParameter; importar org.springframework.jdbc.object.StoredProcedure; pblico StoredProcedureDao clase { getSysdate GetSysdateProcedure privado; @ Autoconectados public void init (DataSource dataSource) { . este getSysdate = new GetSysdateProcedure (DataSource); } getSysdate Fecha pblico () { volver getSysdate.execute (); } GetSysdateProcedure clase privada se extiende StoredProcedure { privado static final String sql = "SYSDATE"; pblico GetSysdateProcedure (DataSource dataSource) { SetDataSource (DataSource); setFunction (true); setSql (SQL); declareParameter (SqlOutParameter nuevo ("fecha", Types.DATE)); compilar (); } Fecha pblico execute () { / / El 'SYSDATE' sproc no tiene parmetros de entrada, por lo que un mapa vaco se suministra ... Mapa <String, resultados Object> = execute (new HashMap <String, Object> ()); SYSDATE = Date (Fecha) results.get ("fecha"); volver sysdate; } } }

El siguiente ejemplo de un StoredProcedure tiene dos parmetros de salida (en este caso, Oracle cursores REF).

oracle.jdbc.OracleTypes importacin; importar org.springframework.jdbc.core.SqlOutParameter; importar org.springframework.jdbc.object.StoredProcedure; importar javax.sql.DataSource; importar java.util.HashMap; importar java.util.Map; pblico TitlesAndGenresStoredProcedure clase extiende StoredProcedure { private String static final SPROC_NAME = "AllTitlesAndGenres"; pblico TitlesAndGenresStoredProcedure (DataSource dataSource) { super (dataSource, SPROC_NAME); declareParameter (SqlOutParameter nuevo ("ttulos", OracleTypes.CURSOR, TitleMapper nuevo ())); declareParameter (SqlOutParameter nuevo ("gneros", OracleTypes.CURSOR, nuevo GenreMapper ())); compilar (); } Mapa del pblico <String, Object> execute () { / / De nuevo, esta sproc no tiene parmetros de entrada, por lo que un mapa vaco se suministra volver sper ejecutar (new HashMap <String, Object> ()).; } }

Ntese cmo las variantes sobrecargados de la declareParameter(..) mtodo que se han utilizado en la TitlesAndGenresStoredProcedure constructor se pasan RowMapper casos de aplicacin, lo que es una forma muy conveniente y potente para reutilizar la funcionalidad existente. El cdigo para los dos RowMapper implementaciones se proporciona a continuacin. El TitleMapper clase asigna un ResultSet a un Title objeto de dominio para cada fila de la suministrada ResultSet :
importar org.springframework.jdbc.core.RowMapper; java.sql.ResultSet importacin; java.sql.SQLException importacin; importar com.foo.domain.Title; TitleMapper public final class implementa RowMapper <Title> { pblico mapRow Ttulo (ResultSet rs, int rownum) throws SQLException { Ttulo Ttulo Ttulo = new (); title.setId (rs.getLong ("id")); title.setName (rs.getString ("nombre")); volver ttulo; } }

El GenreMapper clase asigna un ResultSet a un Genre objeto de dominio para cada fila de la suministrada ResultSet .

importar org.springframework.jdbc.core.RowMapper; java.sql.ResultSet importacin; java.sql.SQLException importacin; importar com.foo.domain.Genre; GenreMapper public final class implementa RowMapper <Genre> { Gnero pblico mapRow (ResultSet rs, int rownum) throws SQLException { volver Gnero nueva (rs.getString ("nombre")); } }

Para pasar parmetros a un procedimiento almacenado que tiene uno o ms parmetros de entrada en su definicin en el RDBMS, puede codificar un establecimiento inflexible de tipos execute(..) mtodo que se delegue en la superclase sin tipo ' execute(Map parameters) mtodo (que tiene protected de acceso), por ejemplo:
oracle.jdbc.OracleTypes importacin; importar org.springframework.jdbc.core.SqlOutParameter; importar org.springframework.jdbc.core.SqlParameter; importar org.springframework.jdbc.object.StoredProcedure; importar javax.sql.DataSource; java.sql.Types importacin; importacin java.util.Date; importar java.util.HashMap; importar java.util.Map; pblico TitlesAfterDateStoredProcedure clase extiende StoredProcedure { private String static final SPROC_NAME = "TitlesAfterDate"; privado CUTOFF_DATE_PARAM static final String = "cutoffDate"; pblico TitlesAfterDateStoredProcedure (DataSource dataSource) { super (dataSource, SPROC_NAME); declareParameter (nuevo SqlParameter (CUTOFF_DATE_PARAM, Types.DATE); declareParameter (SqlOutParameter nuevo ("ttulos", OracleTypes.CURSOR, TitleMapper nuevo ())); compilar (); } Mapa del pblico <String, Object> ejecutar (cutoffDate Fecha) { Mapa <String, Object> entradas = new HashMap <String, Object> (); inputs.put (CUTOFF_DATE_PARAM, cutoffDate); volver sper ejecutar (entradas).; } }

14.7 Problemas comunes con el parmetro de valor y manejo de datos

Problemas comunes con los parmetros y valores de datos existen en los diferentes enfoques proporcionados por el JDBC Spring Framework.
14.7.1 Proporcionar informacin de tipo SQL para los parmetros

Por lo general, Spring determina el tipo SQL de los parmetros en funcin del tipo de parmetro que se pasa pulg Es posible proporcionar explcitamente el tipo SQL que se utilizar al establecer los valores de los parmetros. Esto a veces es necesario establecer correctamente valores NULL. Puede proporcionar informacin de tipo SQL de varias maneras:

Muchos mtodos de actualizacin y consulta de la JdbcTemplate tomar un parmetro adicional en la forma de un int array. Esta matriz se utiliza para indicar el tipo SQL del parmetro correspondiente usar valores constantes de la java.sql.Types clase. Proporcionar una entrada para cada parmetro. Usted puede utilizar el SqlParameterValue clase para envolver el valor del parmetro que necesita esta informacin adicional. Crea una nueva instancia para cada valor y pase el tipo SQL y el valor del parmetro en el constructor. Tambin puede proporcionar un parmetro opcional escala de valores numricos. Para los mtodos de trabajo con los parmetros con nombre, utilice el SqlParameterSource clases BeanPropertySqlParameterSource o MapSqlParameterSource . Ambos tienen mtodos para registrar el tipo SQL para cualquiera de los valores de los parmetros con nombre.

14.7.2 Manejo de BLOB y CLOB objetos

Puede almacenar imgenes, otros objetos binarios, y grandes trozos de texto. Estos objetos grandes se llaman BLOB para los datos binarios y CLOB para datos de caracteres. En la primavera se pueden manejar estos objetos de gran tamao utilizando la JdbcTemplate directamente y tambin cuando se usan las abstracciones superiores que proporcionan los objetos y los RDBMS SimpleJdbc clases. Todos estos enfoques se basan en una implementacin de la LobHandler interfaz para la gestin real de los datos de LOB. El LobHandler proporciona acceso a una LobCreator clase, a travs de la getLobCreator mtodo, utilizado para la creacin de nuevos objetos LOB que se inserta. El LobCreator/LobHandler proporciona el siguiente soporte para entrada y salida de LOB:

BLOB
o o

byte [] - getBlobAsBytes y setBlobAsBytes InputStream - getBlobAsBinaryStream y setBlobAsBinaryStream

CLOB
o o

String - getClobAsString y setClobAsString InputStream - getClobAsAsciiStream y setClobAsAsciiStream

Reader - getClobAsCharacterStream y setClobAsCharacterStream

El siguiente ejemplo muestra cmo crear e insertar un BLOB. Ms adelante se ver cmo leerlo de nuevo a partir de la base de datos. Este ejemplo utiliza un JdbcTemplate y una implementacin de la AbstractLobCreatingPreparedStatementCallbac k . Se implementa un mtodo, setValues . Este mtodo proporciona una LobCreator que se utiliza para establecer los valores para las columnas LOB en su instruccin de insercin de SQL. Para este ejemplo se supone que hay una variable, lobHandle r , que ya est establecida como instancia de un DefaultLobHandler . Por lo general, ajuste este valor a travs de la inyeccin de dependencia.
blobIn archivo final = new File ("spring2004.jpg"); ltimo InputStream blobIs = new FileInputStream (blobIn); clobIn archivo final = new File ("large.txt"); ltimo InputStream clobIs = new FileInputStream (clobIn); ltimo InputStreamReader clobReader = new InputStreamReader (clobIs); jdbcTemplate.execute ( "INSERT INTO lob_table (id, a_clob, a_blob) VALUES (?,?,?)" nuevo AbstractLobCreatingPreparedStatementCallback (lobHandler) { protegidas SetValues void (PreparedStatement ps, LobCreator lobCreator) throws SQLException { ps.setLong (1, 1 l); lobCreator.setClobAsCharacterStream (ps, 2, clobReader, (int) clobIn.length ()); lobCreator.setBlobAsBinaryStream (ps, 3, blobIs, (int) blobIn.length ()); } } ); blobIs.close (); clobReader.close ();

Pase en el lobHandler que en este ejemplo es una llanura DefaultLobHandler Usando el mtodo setClobAsCharacterStream , pasar en el contenido del CLOB. Usando el mtodo setBlobAsBinaryStream , pasar en el contenido del BLOB. Ahora es el tiempo para leer los datos LOB de la base de datos. Una vez ms, se utiliza un JdbcTemplate con la misma instancia variable de l obHandler y una referencia a un DefaultLobHandler .
List <Mapa <String, Object>> l = jdbcTemplate.query ("select id, a_clob, a_blob de lob_table" nuevo RowMapper <Mapa <String, Object>> () { Mapa del pblico <String, Object> mapRow (ResultSet rs, int i) throws SQLException { Mapa <String, Object> resultados = new HashMap <String, Object> (); Cadena clobText = lobHandler.getClobAsString (rs, "a_clob"); results.put ("CLOB", clobText); byte [] = blobBytes lobHandler.getBlobAsBytes (rs, "a_blob");

results.put ("BLOB", blobBytes); devuelven resultados; } });

Usando el mtodo getClobAsString, recuperar el contenido del CLOB. Utilizando el mtodo getBlobAsBytes, recuperar el contenido del BLOB.
14.7.3 Paso en las listas de valores de la clusula IN

El estndar SQL permite la seleccin de filas en funcin de una expresin que incluye una lista de variables de valores. Un ejemplo tpico sera select * from T_ACTOR where id in (1, 2, 3) . Esta lista de variables no es directamente compatible para comandos preparados por el estndar JDBC, no se puede declarar un nmero variable de marcadores de posicin. Se necesita un nmero de variaciones con el nmero deseado de marcadores de posicin de preparado, o que necesita para generar la cadena SQL de forma dinmica una vez que sabes cmo marcadores de posicin son requeridos. El apoyo proporcionado parmetro denominado en la NamedParameterJdbcTemplate y SimpleJdbcTemplate toma el ltimo enfoque. Pase los valores como java.util.List de objetos primitivos. Esta lista se utiliza para insertar los marcadores de posicin requeridos y pasar los valores durante la ejecucin de la sentencia.
Nota

Tenga cuidado al adelantar a muchos valores. El estndar JDBC no garantiza que se puede utilizar ms de 100 valores de una in lista de expresiones. Varias bases de datos supera este nmero, pero por lo general tienen un lmite para el nmero de valores estn permitidos. Lmite de Oracle es 1000. Adems de los valores primitivos en la lista de valores, puede crear un java.util.List de matrices de objetos. Esta lista apoyara mltiples expresiones definidas por el in clusula como select * from T_ACTOR where (id, last_name) in ((1, 'Johnson'), (2, 'Harrop')) . Por supuesto, esto requiere que su base de datos soporta esta sintaxis.
14.7.4 Manejo de complejos tipos de llamadas a procedimientos almacenados

Al llamar a procedimientos almacenados que a menudo soportan los tipos complejos especficos de la base de datos. Para dar cabida a este tipo, Spring ofrece una SqlReturnType para el manejo de ellos cuando se devuelven desde la llamada al procedimiento almacenado y SqlTypeValue cuando se pasa como un parmetro al procedimiento almacenado. He aqu un ejemplo de devolver el valor de un Orculo STRUCT objeto de que el usuario declara tipo ITEM_TYPE . El SqlReturnType interfaz tiene un mtodo nico llamado getTypeValue que debe implementarse. Esta interfaz se utiliza como parte de la declaracin de un SqlOutParameter .
ltimo TestItem - nuevo TestItem (123L, "Un elemento de prueba", . SimpleDateFormat nuevo ("aaaa-Md") parse ("31/12/2010") ;);

declareParameter (SqlOutParameter nuevo ("item", OracleTypes.STRUCT ", ITEM_TYPE" nuevo SqlReturnType () { pblico getTypeValue Object (CallableStatement cs, int colIndx, int sqlType, typeName Cadena) throws SQLException { STRUCT struct = (STRUCT) cs.getObject (colIndx); Object [] attr = struct.getAttributes (); TestItem artculo TestItem = new (); item.setId (((Nmero) attr [0]) longValue ().); item.setDescription ((String) attr [1]); item.setExpirationDate ((java.util.Date) attr [2]); volver el artculo; } }));

Se utiliza el SqlTypeValue a pasar en el valor de un objeto Java como TestItem en un procedimiento almacenado. El SqlTypeValue interfaz tiene un mtodo nico llamado createTypeValue que debe implementar. La conexin activa se pasa en, y se puede utilizar para crear la base de datos especficos-objetos tales como StructDescriptor s, como se muestra en el siguiente ejemplo, o ArrayDescriptor s.
ltimo TestItem - nuevo TestItem (123L, "Un elemento de prueba", . SimpleDateFormat nuevo ("aaaa-Md") parse ("31/12/2010") ;); SqlTypeValue valor = new AbstractSqlTypeValue () { Objeto protegido createTypeValue (conn conexin, int sqlType, String typeName) throws SQLException { StructDescriptor itemDescriptor = new StructDescriptor (typeName, conn); Struct = Artculo nuevo STRUCT (itemDescriptor, conn, new Object [] { testItem.getId (), testItem.getDescription (), nuevo java.sql.Date (testItem.getExpirationDate (). getTime ()) }); volver el artculo; } };

Esta SqlTypeValue ahora se puede aadir a el mapa que contiene los parmetros de entrada para la llamada de ejecutar el procedimiento almacenado. Otro uso para el SqlTypeValue est pasando en una matriz de valores a un procedimiento almacenado de Oracle. Oracle tiene su propio interior ARRAY clase que se debe usar en este caso, y se puede utilizar el SqlTypeValue para crear una instancia de Oracle ARRAY y rellenarla con los valores de la Java ARRAY .
final largo [] ids = new long [] {1L, 2L}; SqlTypeValue valor = new AbstractSqlTypeValue () { Objeto protegido createTypeValue (conn conexin, int sqlType, String typeName) throws SQLException { ArrayDescriptor arrayDescriptor = new ArrayDescriptor (typeName, conn); ARRAY idArray = new Array (arrayDescriptor, conn, ids);

volver idArray; } };

14.8 Base de datos interna de apoyo


El org.springframework.jdbc.datasource.embedded paquete proporciona soporte para los motores de base de datos integrada de Java. Apoyo a HSQL , H2 , y Derby se proporciona de forma nativa. Tambin puede utilizar una API extensible para conectar nuevos tipos de bases de datos integradas y DataSource implementaciones.
14.8.1 Por qu utilizar una base de datos integrada?

Una base de datos integrada es til durante la fase de desarrollo de un proyecto debido a su naturaleza ligera. Los beneficios incluyen la facilidad de configuracin, el tiempo de arranque rpido, la capacidad de prueba, y la capacidad de evolucionar rpidamente durante el desarrollo de SQL.
14.8.2 Creacin de una instancia de base de datos incrustado utilizando Spring XML

Si desea exponer una instancia de base de datos incrustada como un frijol en un ApplicationContext Spring, utilice la etiqueta integrada base de datos en el espacio de nombres de primavera-jdbc:
<jdbc:embedded-database id = "dataSource"> <jdbc:script ubicacin = "classpath:schema.sql" /> <jdbc:script ubicacin = "classpath:test-data.sql" /> </ Jdbc: embedded-base de datos>

La configuracin anterior crea una base de datos HSQL poblado de SQL embebido de schema.sql testdata.sql y recursos en el classpath. La instancia de base de datos se pondr a disposicin del contenedor Spring como un bean del tipo javax.sql.DataSource . Este bean continuacin, se puede inyectar en los objetos de datos de acceso segn sea necesario.
14.8.3 Creacin de una instancia de base de datos incrustado mediante programacin

El EmbeddedDatabaseBuilder clase proporciona una API de fluido para la construccin de una base de datos integrada mediante programacin. Utilice esta opcin cuando es necesario crear una instancia de base de datos integrada en un entorno autnomo, como una prueba de acceso a datos de la unidad objeto:
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder (); . EmbeddedDatabase db = builder.setType (H2) addscript ("mischema.sql") addscript ("mi-test-data.sql") build ()..; / / Hacer cosas en contra de la db (EmbeddedDatabase extiende javax.sql.DataSource) db.shutdown ()

14.8.4 Ampliacin del soporte base de datos integrada

Spring JDBC soporte de base de datos integrado se puede extender de dos formas: 1. Implementar EmbeddedDatabaseConfigurer para apoyar un nuevo tipo de base de datos integrada, como Apache Derby. 2. Implementar DataSourceFactory para apoyar una nueva implementacin de DataSource, como una agrupacin de conexiones, conexiones integradas para gestionar bases de datos. Usted est invitado a aportar de nuevo las extensiones a la comunidad de Primavera en jira.springframework.org .
14.8.5 Uso de HSQL

Spring soporta HSQL 1.8.0 y superiores. HSQL es la base de datos integrada predeterminada si no se especifica el tipo de forma explcita. Para especificar explcitamente HSQL, establezca el type atributo de la embedded-database etiqueta a HSQL . Si utiliza la API de constructor, llame a la setType(EmbeddedDatabaseType) mtodo con EmbeddedDatabaseType.HSQL .
14.8.6 Uso de H2

Spring apoya la base de datos H2 tambin. Para habilitar H2, establezca el type atributo de la embedded-database etiqueta a H2 . Si utiliza la API de constructor, llame a la setType(EmbeddedDatabaseType) mtodo con EmbeddedDatabaseType.H2 .
14.8.7 Uso de Derby

Spring tambin soporta Apache Derby 10.5 y superior. Para habilitar Derby, establezca el type atributo de la embedded-database etiqueta a Derby . Si se utiliza la API de constructor, llame a la setType(EmbeddedDatabaseType) mtodo con EmbeddedDatabaseType.Derby .
14.8.8 Pruebas de lgica de acceso a datos con una base de datos integrada

Bases de datos integrados proporcionan una forma sencilla de probar el cdigo de acceso a datos. La siguiente es una unidad de acceso a datos plantilla de prueba que utiliza una base de datos integrada:
public class {DataAccessUnitTestTemplate db EmbeddedDatabase privado; Antes @ setUp public void () { / / Crea un HSQL en la memoria base de datos de poblacin a partir de scripts por defecto / / Classpath: schema.sql y classpath: data.sql db = new EmbeddedDatabaseBuilder () addDefaultScripts () build ()..; }

@ Test testDataAccess public void () { JdbcTemplate plantilla = new JdbcTemplate (db); template.query (...); } @ Despus tearDown public void () { db.shutdown (); } }

14.9 Inicializacin de un origen de datos


El org.springframework.jdbc.datasource.init paquete proporciona soporte para la inicializacin de una ya existente DataSource . El soporte de base de datos integrada ofrece una opcin para crear e inicializar un DataSource para una aplicacin, pero a veces es necesario para inicializar una instancia que se ejecuta en un servidor en algn lugar.
14.9.1 Inicializacin de una instancia de base de datos utilizando XML Spring

Si desea inicializar una base de datos y puede proporcionar una referencia a un bean DataSource, utilice la initialize-database de etiqueta en el spring-jdbc espacio de nombres:
<jdbc:initialize-database data-source="dataSource"> <jdbc:script location="classpath:com/foo/sql/db-schema.sql"/> <jdbc:script location="classpath:com/foo/sql/db-test-data.sql"/> </ Jdbc: initialize-base de datos>

El ejemplo anterior se ejecuta dos programas indicados en la base de datos: el primero es un script de creacin de esquemas, y el segundo es un prospecto del conjunto de datos. Las ubicaciones de scripts tambin pueden ser patrones con comodines en el estilo hormiga habitual utilizado por los recursos en primavera (por ejemplo classpath*:/com/foo/**/sql/*-data.sql ). Si un patrn se utiliza los scripts se ejecutan en orden lxico de su URL o nombre de archivo. El comportamiento por defecto de la base de datos inicializador es ejecutar incondicionalmente los scripts proporcionados. Esto no siempre es lo que quieres, por ejemplo, si se ejecuta contra una base de datos existente que ya tiene los datos de prueba en el mismo. La probabilidad de que el borrado accidental de datos se reduce por el patrn ms comn (como se muestra ms arriba) que crean las tablas primero y luego inserta los datos - el primer paso fallar si las tablas ya existen. Sin embargo, para obtener un mayor control sobre la creacin y supresin de los datos existentes, el espacio de nombres XML proporciona un par de opciones. La primera es la bandera para cambiar la inicializacin encendido y apagado. Esto se puede ajustar de acuerdo con el medio ambiente (por ejemplo, para tirar de un valor booleano de propiedades del sistema o un grano medio ambiente), por ejemplo,

<Jdbc: initialize base de datos de origen de datos = "origen de datos" enabled = "# {systemProperties.INITIALIZE_DATABASE}"> <jdbc:script location="..."/> </ Jdbc: initialize-base de datos>

La segunda opcin para controlar lo que ocurre con los datos existentes es ser ms tolerante de fallas. Para ello se puede controlar la capacidad del inicializador de ignorar ciertos errores en el SQL se ejecuta a partir de las secuencias de comandos, por ejemplo,
<jdbc:initialize-database data-source="dataSource" ignorefailures="DROPS"> <jdbc:script location="..."/> </ Jdbc: initialize-base de datos>

En este ejemplo estamos diciendo que esperamos que a veces las secuencias de comandos se ejecuta en una base de datos vaca y hay algunas instrucciones DROP en los guiones que por lo tanto sera un fracaso. As fallidos SQL DROP declaraciones se ignoran, pero otros fallos se producir una excepcin. Esto es til si su dialecto SQL no es compatible con DROP ... IF EXISTS DROP ... IF EXISTS (o similar), pero que desea eliminar incondicionalmente a todos los datos de prueba antes de volverlo a crear. En ese caso, la secuencia de comandos primero es por lo general un conjunto de gotas, seguido por un conjunto de CREATE estados. El ignore-failures opcin se puede ajustar a NONE (por defecto), DROPS (ignorar gotas fallidos) o ALL (ignore todos los errores). Si necesita ms control de lo que recibe del espacio de nombres XML, puede simplemente usar el DataSourceInitializer directamente, y lo definen como un componente de la aplicacin.
Inicializacin de otros componentes que dependen de la base de datos

Una gran clase de aplicaciones slo puede utilizar el inicializador base de datos sin complicaciones: las que no utilizan la base de datos hasta despus de que el contexto primavera ha comenzado. Si su solicitud no es uno de los que entonces puede que tenga que leer el resto de esta seccin. El inicializador base de datos depende de una instancia de origen de datos y ejecuta los scripts proporcionados en su devolucin de llamada de inicializacin (vase el initmethod en una definicin XML de frijoles o InitializingBean ). Si otros granos dependen de la misma fuente de datos y tambin utilizar el origen de datos en una devolucin de llamada de inicializacin es posible que haya un problema, ya que los datos no han sido inicializadas. Un ejemplo comn de esto es una cach que se inicializa con entusiasmo y carga de los datos desde la base de datos al iniciar la aplicacin. Para solucionar este problema usted dos opciones: cambiar su estrategia de inicializacin de la cach para una fase posterior, o asegurarse de que el inicializador base de datos se inicializa primero.

La primera opcin puede ser fcil si la aplicacin est bajo su control, y no lo contrario. Algunas sugerencias de cmo implementar esto son

Hacer inicializar la cach perezosamente en el primer uso, que mejora el tiempo de inicio de la aplicacin Haga que su cach o un componente separado que inicializa la memoria cach de la aplicacin Lifecycle o SmartLifecycle . Cuando el contexto de la aplicacin se inicia un SmartLifecycle puede iniciarse automticamente si su autoStartup bandera est activa, y un Lifecycle se puede iniciar manualmente llamando ConfigurableApplicationContext.start() en el contexto de inclusin. Usar un muelle ApplicationEvent o mecanismo similar observador personalizado para activar la inicializacin de la cach. ContextRefreshedEvent siempre est publicada por el contexto cuando est listo para el uso (despus de todos los granos han sido inicializado), por lo que es a menudo un gancho til (esta es la forma en la SmartLifecycle obras por defecto).

La segunda opcin tambin puede ser fcil. Algunas sugerencias sobre cmo implementar esto son Confe en el comportamiento por defecto BeanFactory primavera, y es que los frijoles se inicializa en orden de inscripcin. Usted puede ordenar que, al adoptar la prctica comn de un conjunto de elementos que <import/> pedir sus mdulos de aplicacin, y asegurar que la base de datos y base de datos de inicializacin aparecen en primer lugar Separar la fuente de datos y los componentes de negocio que lo utilizan y controlan su orden de inicio ponindolos en distintas instancias ApplicationContext (por ejemplo, los padres tiene la fuente de datos y el nio tiene los componentes de negocio). Esta estructura es comn en las aplicaciones web del resorte, sino que puede aplicarse de manera ms general. Utilice un tiempo de ejecucin modular como SpringSource servidor dm y separar la fuente de datos y los componentes que dependen de l. Por ejemplo, especificar el paquete de inicio orden como fuente de datos - inicializador> -> componentes de negocio.

15. Mapeo objeto relacional (ORM) de acceso a datos 15.1 Introduccin a ORM con Spring
El Spring Framework admite la integracin con Hibernate, Java Persistence API (JPA), Java Data Objects (JDO) y iBatis Mapas de SQL para el manejo de los recursos, de objetos de acceso a datos (DAO), aplicaciones y estrategias de transaccin. Por ejemplo, para Hibernate hay soporte de primera clase con varias funciones convenientes IoC que abordan muchos temas tpicos de integracin de Hibernate. Puede configurar todas las caractersticas soportadas por herramientas de mapeo O / R (relacional de objetos) a travs de la inyeccin de dependencias. Pueden participar en la primavera de recursos y la gestin de transacciones, y que cumplan con la transaccin genrica de Spring DAO

y las jerarquas de excepcin. El estilo de integracin recomendado es codificar DAOs contra llanura Hibernate, JPA y JDO API. El viejo estilo de la utilizacin de plantillas de Spring DAO ya no se recomienda, sin embargo, la cobertura de este estilo se pueden encontrar en la Seccin A.1, "Classic uso ORM" en los apndices. Spring aade importantes mejoras a la capa ORM de su eleccin al crear aplicaciones de acceso a datos. Puede aprovechar la mayor cantidad de apoyo a la integracin como desee, y usted debe comparar este esfuerzo de integracin con el costo y el riesgo de construir una infraestructura similar en el local. Usted puede utilizar gran parte del apoyo ORM como si fuera una biblioteca, independientemente de la tecnologa, porque todo est diseado como un conjunto de JavaBeans reutilizable. ORM en un contenedor de IoC Spring facilita la configuracin y el despliegue. As, la mayora de los ejemplos de esta seccin muestran la configuracin dentro de un contenedor de primavera. Beneficios del uso de Spring Framework para crear tu ORM DAOs incluyen:

Enfoque ms sencilla prueba. Primavera del COI hace que sea fcil cambiar las implementaciones y los lugares de configuracin de Hibernate SessionFactory casos, JDBC DataSource casos, los administradores de transacciones e implementaciones objeto asignado (si es necesario). Esto a su vez hace que sea mucho ms fcil para probar cada pieza de persistencia cdigo relacionado en aislamiento. Spring comn excepciones datos de acceso. Puede envolver excepciones de la herramienta ORM, convirtindolos de propiedad (potencialmente marcada) las excepciones a una jerarqua de tiempo de ejecucin DataAccessException comn. Esta caracterstica le permite manejar la mayora de las excepciones persistencia, que no son recuperables, slo en las capas apropiadas, sin capturas repetitivo molestos, proyecciones y declaraciones de excepcin. Usted todava puede atrapar y controlar las excepciones que sean necesarias. Recuerde que las excepciones JDBC (incluido el DB-especficos dialectos) tambin se convierten en la misma jerarqua, lo que significa que usted puede realizar algunas operaciones con JDBC dentro de un modelo de programacin coherente. Gestin de los recursos generales. Primavera contextos de aplicacin puede manejar la ubicacin y la configuracin de Hibernate SessionFactory casos, la APP EntityManagerFactory casos, JDBC DataSource de los casos, los objetos de configuracin de SQL iBatis mapas y otros recursos relacionados. Esto hace que estos valores fciles de manejar y cambiar. Spring ofrece un manejo eficiente, fcil y seguro de los recursos de persistencia. Por ejemplo, el cdigo relacionado que utiliza Hibernate generalmente tiene que usar el mismo Hibernate Session para garantizar la eficiencia y la gestin de transacciones adecuada. Primavera hace que sea fcil de crear y enlazar una Session al hilo actual de forma transparente, mediante la exposicin de una corriente Session travs del Hibernate SessionFactory . As primavera resuelve muchos de los problemas crnicos del uso tpico de Hibernate, para cualquier entorno de operacin local o JTA. Gestin de transacciones integrado. Usted puede envolver el cdigo ORM con un declarativa, programacin orientada a aspectos (AOP) interceptor estilo sea a travs del mtodo @Transactional anotacin o explcitamente por la configuracin de la transaccin consejo AOP en un archivo de configuracin XML. En ambos casos, la semntica de transaccin y manejo de excepciones

(rollback, y as sucesivamente) se manejan para usted. Como veremos ms adelante, en los recursos y la gestin de transacciones , tambin puede cambiar varios administradores de transacciones, sin afectar su ORM cdigo relacionado. Por ejemplo, usted puede cambiar entre las operaciones locales y JTA, con los mismos servicios completos (tales como las transacciones declarativas) disponibles en ambos escenarios. Adems, el cdigo relacionado con JDBC puedan integrarse plenamente transaccional con el cdigo que se utiliza para hacer ORM. Esto es til para el acceso a datos que no es adecuado para ORM, tales como el procesamiento por lotes y la transmisin de BLOB, que todava tienen que compartir transacciones comunes con las operaciones de ORM. TODO: proporcionar enlaces a muestras actuales

15.2 Consideraciones generales de integracin ORM


Esta seccin se resaltan las consideraciones que se aplican a todas las tecnologas ORM. La Seccin 15.3, "Hibernate" seccin proporciona ms detalles y tambin muestran estas caractersticas y configuraciones en un contexto concreto. El objetivo principal de la integracin ORM Spring es clara aplicacin de capas, con cualquier acceso a datos y la tecnologa de transacciones, y para el acoplamiento flexible de objetos de aplicacin. No hay dependencias de negocio ms de servicio en el acceso a los datos o la estrategia de transaccin, sin bsquedas de recursos ms rgida, no ms difciles de reemplazar nicos, hay registros ms personalizado servicio. Un mtodo sencillo y coherente para el cableado de los objetos de aplicacin, mantenindolos como reutilizable y libre de dependencias de contenedores como sea posible. Todas las caractersticas individuales de acceso a datos se pueden utilizar por su cuenta, sino integrar muy bien con el concepto de Spring contexto de aplicacin, siempre basado en XML de configuracin y referencias cruzadas de simples casos JavaBean que no necesitan ser Primavera-aware. En una aplicacin tpica de primavera, muchos objetos importantes son JavaBeans: Plantillas de acceso a datos, objetos de acceso a datos, gestores de transacciones, servicios de negocios que utilizan los objetos de acceso a datos y gestores de transacciones, resolvedores de vista Web, controladores de web que utilizan los servicios de negocio, y as sucesivamente .
15.2.1 Recursos y gestin de transacciones

Las aplicaciones tpicas de negocios estn llenas de cdigo repetitivo gestin de recursos. Muchos proyectos tratan de inventar sus propias soluciones, a veces sacrificar el manejo adecuado de los fallos de programacin para mayor comodidad. Spring aboga por soluciones simples para una manipulacin adecuada de los recursos, es decir, la COI mediante plantillas en el caso de JDBC y aplicar AOP interceptores para las tecnologas ORM. La infraestructura proporciona un manejo adecuado de los recursos y de conversin apropiado de excepciones de la API especficas a una jerarqua de infraestructura de excepcin sin control. Spring introduce una jerarqua de excepciones DAO, aplicable a cualquier estrategia de acceso a datos. Para JDBC directo, el JdbcTemplate clase mencionado en una seccin anterior proporciona un manejo adecuado de conexin y conversin de SQLException al DataAccessException jerarqua, incluida la

traduccin de determinados cdigos de error de base de datos SQL para clases de excepciones significativas. Para las tecnologas ORM, consulte la siguiente seccin para saber cmo obtener los beneficios de excepcin mismos traduccin. Cuando se trata de la gestin de transacciones, el JdbcTemplate clase ganchos en el soporte de transacciones Spring y es compatible con JTA y las transacciones JDBC, a travs de respectivos gerentes de primavera de transaccin. Para el apoyo ORM Spring tecnologas ofrece Hibernate, JPA y JDO a travs del apoyo Hibernate, JPA y JDO gerentes de transaccin, as como soporte JTA. Para ms informacin sobre el soporte de transacciones, consulte el Captulo 12, Administracin de transacciones captulo.
15.2.2 Excepciones traduccin

Cuando se utiliza Hibernate, JPA, JDO o en un DAO, debe decidir cmo manejar las clases nativas de la tecnologa de persistencia de excepcin. El DAO lanza una subclase de una HibernateException , PersistenceException o JDOException dependiendo de la tecnologa. Estas excepciones son excepciones en tiempo de ejecucin y no tienen que ser declarados o capturados. Usted tambin podra tener que lidiar con IllegalArgumentException y IllegalStateException . Esto significa que las personas que llaman slo puede tratar excepciones como generalmente fatal, a menos que quieran depender de la estructura de la tecnologa de persistencia propia excepcin. La captura de causas especficas, tales como una falla de bloqueo optimista no es posible sin atar la persona que llama a la estrategia de implementacin. Esta fuera del comercio podra ser aceptable para aplicaciones que son fuertemente ORM basado y / o que no necesitan ningn tratamiento especial excepcin. Sin embargo, Spring permite la traduccin excepcin debe aplicarse de forma transparente a travs del @Repository anotacin:
@ Repositorio pblico ProductDaoImpl clase implementa ProductDao { / / Cuerpo de la clase aqu ... } <beans> <- Traduccin Excepcin frijol postprocesador -> <bean class = "org.springframework.dao.annotation.PersistenceExceptionTranslationPos tProcessor" /> <bean id = "myProductDao" class = "product.ProductDaoImpl" /> </ Beans>

El postprocesador busca automticamente todos los traductores de excepcin (implementaciones del PersistenceExceptionTranslator interfaz) y aconseja a todos los frijoles marcados con el @Repository anotacin para que los traductores descubiertos pueden interceptar y aplicar la traduccin adecuada en las excepciones lanzadas. En resumen: se puede implementar DAOs basada en la tecnologa API de persistencia llano y anotaciones, mientras se beneficia de las transacciones gestionadas por resorte,

inyeccin de dependencia, y la conversin excepcin transparente (si se desea) a las jerarquas de excepciones personalizadas primavera.

15,3 Hibernate
Vamos a empezar con una cobertura de Hibernate 3 en un ambiente de primavera, utilizando para demostrar el enfoque que lleva hacia la integracin de Primavera de O / R mappers. Esta seccin cubre muchos temas en detalle y mostrar diferentes variaciones de las implementaciones de DAO y la demarcacin de la transaccin. La mayor parte de estos patrones puede ser directamente traducido a todas las herramientas ORM otros compatibles. Las secciones siguientes de este captulo ser cubrir las tecnologas ORM otros, mostrando ejemplos breves all.
Nota

A partir de Spring 3.0, Spring Hibernate requiere 3.2 o posterior.


15.3.1 SessionFactory de instalacin en un contenedor Spring

Para evitar la inmovilizacin de los objetos de aplicacin para bsquedas de recursos no modificables, se pueden definir los recursos, tales como JDBC DataSource o Hibernate SessionFactory como granos en el contenedor Spring. Los objetos de aplicacin que necesitan acceder a recursos reciban las referencias a dichas instancias predefinidas a travs de referencias de frijol, como se ilustra en la definicin DAO en la siguiente seccin. El siguiente extracto de una definicin de aplicacin contexto XML muestra cmo configurar un JDBC DataSource y un Hibernate SessionFactory en la parte superior de la misma:
<beans> <bean id = "myDataSource" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method "close" => <propiedad nombre = valor = "driverClassName" "org.hsqldb.jdbcDriver" /> <propiedad nombre = valor = "url" "jdbc:hsqldb:hsql://localhost:9001" /> <propiedad nombre = valor = "username" "sa" /> <propiedad nombre = valor = "password" "" /> </ Bean> <bean id = "mySessionFactory" class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <propiedad nombre = "dataSource" ref = "myDataSource" /> <propiedad nombre = "mappingResources"> <list> <valor> product.hbm.xml </ value> </ List> </ Propiedad> <propiedad nombre = "hibernateProperties"> <valor> hibernate.dialect = org.hibernate.dialect.HSQLDialect </ Value>

</ Propiedad> </ Bean> </ Beans>

El cambio de un local DBCP Jakarta Commons BasicDataSource a un JNDI situado DataSource (generalmente administrado por un servidor de aplicaciones) es slo una cuestin de configuracin:
<beans> id = <jee:jndi-lookup "myDataSource" jndi-name = "java:comp/env/jdbc/myds" /> </ Beans>

Tambin puede acceder a JNDI situado SessionFactory , usando Spring JndiObjectFactoryBean / <jee:jndi-lookup> para recuperar y exponerlo. Sin embargo, que no es tpicamente comn fuera de un contexto EJB.
15.3.2 Ejecucin DAOs basado en llano API Hibernate 3

Hibernate 3 tiene una caracterstica llamada sesiones contextuales, en el que Hibernate se maneja la actual Session por transaccin. Esto es aproximadamente equivalente a la sincronizacin de Spring Hibernate de una Session por transaccin. A correspondiente aplicacin DAO similar al siguiente ejemplo, basado en la llanura API Hibernate:
pblico ProductDaoImpl clase implementa ProductDao { privado sessionFactory SessionFactory; public void setSessionFactory (SessionFactory sessionFactory) { este sessionFactory = sessionFactory.; } pblico loadProductsByCategory Collection (String categora) { devolver esto. SessionFactory.getCurrentSession () . CreateQuery ("del producto test.Product donde product.category =?") . SetParameter (0, categora) . List (); } }

Este estilo es similar a la de la documentacin de referencia de Hibernate y ejemplos, excepto para la realizacin de la SessionFactory en una variable de instancia. Recomendamos este tipo de configuracin basada en instancia ms de la vieja escuela static HibernateUtil clase de la aplicacin de Hibernate CaveatEmptor muestra. (En general, no mantienen ningn recurso en static Las variables menos que sea absolutamente necesario.) Lo anterior DAO sigue el patrn de inyeccin de dependencias: se adapta sin problemas a un contenedor Spring IoC, del mismo modo que lo hara si codifica con Spring HibernateTemplate . Por supuesto, tal DAO tambin se puede configurar en llano Java

(por ejemplo, en las pruebas de unidad). Basta con crear una instancia y llamar setSessionFactory(..) con la referencia de fbrica deseado. Como definicin Spring bean, el DAO sera similar a lo siguiente:
<beans> <bean id = "myProductDao" class = "product.ProductDaoImpl"> <propiedad nombre = "sessionFactory" ref = "mySessionFactory" /> </ Bean> </ Beans>

La principal ventaja de este estilo DAO es que depende de Hibernate API solamente, sin importar cualquier clase Spring se requiere. Esto es por supuesto atractiva desde una perspectiva no invasividad, y, sin duda, se sienten ms naturales a Hibernate desarrolladores. Sin embargo, el DAO lanza llanura HibernateException (que no est marcada, por lo que no tiene que ser declarada o capturado), lo que significa que las personas que llaman slo puede tratar excepciones como generalmente fatal - a menos que quieran depender de jerarqua propia excepcin de Hibernate. La captura de causas especficas, tales como una falla de bloqueo optimista no es posible sin atar la persona que llama a la estrategia de implementacin. Esta fuera del comercio podra ser aceptable para aplicaciones que estn fuertemente basadas Hibernate y / o que no necesitan ningn tratamiento especial excepcin. Afortunadamente, la primavera de LocalSessionFactoryBean soporta Hibernate SessionFactory.getCurrentSession() mtodo para cualquier estrategia de transaccin Spring, devolviendo la actual Primavera-administrado transaccional Session incluso con HibernateTransactionManager . Por supuesto, el comportamiento estndar de que el mtodo sigue siendo el retorno de la corriente de Session asociado con el curso transaccin JTA, si los hay. Este comportamiento se aplica sin importar si usted est usando Spring JtaTransactionManager , EJB contenedor administrado transacciones (CMT), o JTA. En resumen: se puede implementar DAOs basado en la llanura Hibernate 3 API, sin dejar de ser capaz de participar en transacciones administradas por resorte.
15.3.3 demarcacin de transacciones declarativa

Le recomendamos que utilice el soporte de transacciones declarativa de primavera, que permite sustituir las transacciones explcitas llamadas a la API de demarcacin en el cdigo Java con un interceptor AOP transaccin. Este interceptor transaccin puede ser configurado en un contenedor de Spring usando Java anotaciones o capacidad XML.This transaccin declarativa le permite mantener los servicios empresariales gratuitos de cdigo repetitivo demarcacin de transacciones y concentrarse en aadir lgica de negocio, que es el valor real de su aplicacin.
Nota

Antes de continuar, se recomienda encarecidamente leer la Seccin 12.5, "la

gestin de transacciones declarativa" si no lo ha hecho. Adems, la semntica de transaccin como comportamiento de propagacin y nivel de aislamiento se puede cambiar en un archivo de configuracin y no afectan a las implementaciones de servicio de negocio. El siguiente ejemplo muestra cmo se puede configurar un interceptor AOP transaccin, utilizando XML, para una clase de servicio simple:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <- SessionFactory, DataSource, etc omitido -> <Bean id = "TransactionManager" class = "org.springframework.orm.hibernate3.HibernateTransactionManager"> <propiedad nombre = "sessionFactory" ref = "sessionFactory" /> </ Bean> <aop:config> <Aop: pointcut id = "productServiceMethods" = expresin "ejecucin (* product.ProductService. * (..))" /> <aop:advisor advice-ref = "txAdvice" pointcut-ref = "productServiceMethods" /> </ Aop: config> <tx:advice id = transaction-manager "txAdvice" "myTxManager" => <tx:attributes> nombre = <tx:method "increasePrice*" propagacin = "REQUIRED" /> nombre = <tx:method "someOtherBusinessMethod" propagacin = "REQUIRES_NEW" /> nombre = <tx:method propagacin "*" = "SUPPORTS" read-only = "true" /> </ Tx: attributes> </ Tx: advice> <bean id = "myProductService" class = "product.SimpleProductService"> <propiedad nombre = "productDao" ref = "myProductDao" /> </ Bean> </ Beans>

Esta es la clase de servicio que se recomienda:

pblico ProductServiceImpl clase implementa ProductService { productDao ProductDao privado; public void setProductDao (ProductDao productDao) { este productDao = productDao.; } / / Note la ausencia de demarcacin cdigo de transaccin en este mtodo / / Infraestructura de transacciones declarativa primavera ser la demarcacin / / Operaciones en su nombre public void increasePriceOfAllProductsInCategory (categora final String) { Lista productsToChange = esta productDao.loadProductsByCategory (categora).; / / ... } }

Tambin muestran una configuracin de atributo de apoyo basado en el siguiente ejemplo. Se anotar el nivel de servicio con anotaciones @ transaccionales y de instruir el contenedor Spring para encontrar estas anotaciones y proporcionar semntica transaccional para estos mtodos anotados.
pblico ProductServiceImpl clase implementa ProductService { productDao ProductDao privado; public void setProductDao (ProductDao productDao) { este productDao = productDao.; } @ Transactional public void increasePriceOfAllProductsInCategory (categora final String) { Lista productsToChange = esta productDao.loadProductsByCategory (categora).; / / ... } @ Transactional (ReadOnly = true) pblicos findAllProducts Lista <Product> () { Devuelva este productDao.findAllProducts ().; } }

Como se puede ver en el siguiente ejemplo de configuracin, la configuracin es mucho ms simplificado, en comparacin con el ejemplo de XML anterior, mientras que todava proporciona la misma funcionalidad impulsado por las anotaciones en el cdigo de la capa de servicio. Todo lo que necesitas para ofrecer es la implementacin TransactionManager y una entrada "<tx:annotation-driven/>".
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance"

xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <- SessionFactory, DataSource, etc omitido -> <Bean id = "TransactionManager" class = "org.springframework.orm.hibernate3.HibernateTransactionManager"> <propiedad nombre = "sessionFactory" ref = "sessionFactory" /> </ Bean> <tx:annotation-driven/> <bean id = "myProductService" class = "product.SimpleProductService"> <propiedad nombre = "productDao" ref = "myProductDao" /> </ Bean> </ Beans>

15.3.4 demarcacin de transacciones programtica

Puede demarcar transacciones en un nivel superior de la aplicacin, en la parte superior de dichos servicios de nivel inferior de acceso a datos que abarcan cualquier nmero de operaciones. Tampoco existen restricciones en la ejecucin del servicio de negocio circundante, sino que slo necesita una primavera PlatformTransactionManager . Una vez ms, este ltimo puede venir de cualquier parte, pero preferiblemente como una referencia frijol mediante setTransactionManager(..) mtodo, tal como la productDAO debe ser fijado por un setProductDao(..) mtodo. Los fragmentos de cdigo siguientes muestran un gestor de transacciones y una definicin de servicios a empresas en un contexto de aplicacin de primavera, y un ejemplo para una implementacin del mtodo de negocio:
<beans> <bean id = "myTxManager" class = "org.springframework.orm.hibernate3.HibernateTransactionManager"> <propiedad nombre = "sessionFactory" ref = "mySessionFactory" /> </ Bean> <bean id = "myProductService" class = "product.ProductServiceImpl"> <propiedad nombre = "transactionManager" ref = "myTxManager" /> <propiedad nombre = "productDao" ref = "myProductDao" /> </ Bean> </ Beans> pblico ProductServiceImpl clase implementa ProductService { transactionTemplate TransactionTemplate privado; productDao ProductDao privado;

setTransactionManager public void (TransactionManager PlatformTransactionManager) { . este transactionTemplate = new TransactionTemplate (TransactionManager); } public void setProductDao (ProductDao productDao) { este productDao = productDao.; } public void increasePriceOfAllProductsInCategory (categora final String) { este transactionTemplate.execute. (nuevo TransactionCallbackWithoutResult () { public void doInTransactionWithoutResult (estado TransactionStatus) { Lista productsToChange = esta productDao.loadProductsByCategory (categora).; / / Hacer el aumento de los precios ... } } ); } }

Spring TransactionInterceptor permite que cualquier excepcin de aplicacin revisadas a ser lanzado con el cdigo de devolucin de llamada, mientras que TransactionTemplate se limita a excepciones sin marcar dentro de la devolucin de llamada. TransactionTemplate desencadena un retroceso en caso de una excepcin de aplicacin seleccionada, o si la transaccin se marca rollback-slo por la aplicacin (a travs de TransactionStatus ). TransactionInterceptor se comporta del mismo modo por defecto, pero permite que las polticas configurables por mtodo rollback.
15.3.5 estrategias de gestin de transacciones

Tanto TransactionTemplate y TransactionInterceptor delegar la manipulacin real de la transaccin a un PlatformTransactionManager ejemplo, que puede ser un HibernateTransactionManager (para una sola Hibernate SessionFactory , utilizando un ThreadLocal Session bajo el cap) o un JtaTransactionManager (delegar al subsistema JTA del recipiente) para aplicaciones de Hibernate . Usted puede incluso utilizar una costumbre PlatformTransactionManager implementacin. El cambio de gestin nativo transaccin Hibernate para JTA, por ejemplo cuando se enfrentan a requisitos de transacciones distribuidas para ciertos despliegues de la aplicacin, es slo una cuestin de configuracin. Slo tiene que sustituir el gestor de transacciones de Hibernate en la aplicacin de Spring transaccin JTA. Tanto la demarcacin de la transaccin y el cdigo de acceso a datos funcionar sin cambios, ya que slo tiene que utilizar las API de gestin de transacciones genrico. Para las transacciones distribuidas a travs de mltiples fbricas de sesin de Hibernate, simplemente combinar JtaTransactionManager como una estrategia de operacin con mltiples LocalSessionFactoryBean definiciones. Cada DAO entonces consigue un determinado SessionFactory de referencia pas a su propiedad de bean correspondiente. Si todas las fuentes de datos JDBC subyacentes son los transaccionales

de contenedores, un servicio de negocio pueden demarcar transacciones a travs de cualquier nmero de DAOs y cualquier nmero de fbricas de sesin sin consideracin especial, siempre y cuando se est utilizando JtaTransactionManager como la estrategia.
<beans> id = <jee:jndi-lookup "dataSource1" jndi-name = "java:comp/env/jdbc/myds1" /> id = <jee:jndi-lookup "dataSource2" jndi-name = "java:comp/env/jdbc/myds2" /> <Bean id = "mySessionFactory1" class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <propiedad nombre = "dataSource" ref = "myDataSource1" /> <propiedad nombre = "mappingResources"> <list> <valor> product.hbm.xml </ value> </ List> </ Propiedad> <propiedad nombre = "hibernateProperties"> <valor> hibernate.dialect = org.hibernate.dialect.MySQLDialect hibernate.show_sql = true </ Value> </ Propiedad> </ Bean> <Bean id = "mySessionFactory2" class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <propiedad nombre = "dataSource" ref = "myDataSource2" /> <propiedad nombre = "mappingResources"> <list> <valor> inventory.hbm.xml </ value> </ List> </ Propiedad> <propiedad nombre = "hibernateProperties"> <valor> hibernate.dialect = org.hibernate.dialect.OracleDialect </ Value> </ Propiedad> </ Bean> <bean id = "myTxManager" class = "org.springframework.transaction.jta.JtaTransactionManager" /> <bean id = "myProductDao" class = "product.ProductDaoImpl"> <propiedad nombre = "sessionFactory" ref = "mySessionFactory1" /> </ Bean> <bean id = "myInventoryDao" class = "product.InventoryDaoImpl"> <propiedad nombre = "sessionFactory" ref = "mySessionFactory2" /> </ Bean> <bean id = "myProductService" class = "product.ProductServiceImpl"> <propiedad nombre = "productDao" ref = "myProductDao" /> <propiedad nombre = "inventoryDao" ref = "myInventoryDao" />

</ Bean> <aop:config> <Aop: pointcut id = "productServiceMethods" = expresin "ejecucin (* product.ProductService. * (..))" /> <aop:advisor advice-ref = "txAdvice" pointcut-ref = "productServiceMethods" /> </ Aop: config> <tx:advice id = transaction-manager "txAdvice" "myTxManager" => <tx:attributes> nombre = <tx:method "increasePrice*" propagacin = "REQUIRED" /> nombre = <tx:method "someOtherBusinessMethod" propagacin = "REQUIRES_NEW" /> nombre = <tx:method propagacin "*" = "SUPPORTS" read-only = "true" /> </ Tx: attributes> </ Tx: advice> </ Beans>

Tanto HibernateTransactionManager y JtaTransactionManager permiten el manejo adecuado de cach de nivel JVM con Hibernate, sin contenedor especfico de bsqueda de gestor de transacciones o un conector JCA (si no est utilizando EJB para iniciar transacciones).
HibernateTransactionManager

puede exportar el Hibernate JDBC Connection a simple cdigo de acceso JDBC, para un determinado DataSource . Esta capacidad permite la demarcacin de transacciones de alto nivel con mezcla de Hibernate y el acceso de datos JDBC completamente sin JTA, si tiene acceso a una sola base de datos. HibernateTransactionManager expone automticamente la transaccin como una transaccin de Hibernate JDBC si se ha configurado el pasado como SessionFactory con un DataSource mediante el dataSource propiedad de la LocalSessionFactoryBean clase. Alternativamente, se puede especificar explcitamente el DataSource para que las transacciones se supone que se expone a travs del dataSource propiedad de la HibernateTransactionManager clase.
15.3.6 Comparacin de contenedores administrados y definidos los recursos locales

Usted puede cambiar entre un contenedor administrado JNDI SessionFactory y un definido localmente una, sin tener que cambiar una sola lnea de cdigo de la aplicacin. Ya sea para mantener las definiciones de recursos en el envase o localmente dentro de la aplicacin es principalmente una cuestin de la estrategia de operacin que utiliza. En comparacin con un resorte local definida SessionFactory , un manual registrado JNDI SessionFactory no proporciona ningn beneficio. Implementacin de una SessionFactory de Hibernate por medio de JCA conector proporciona el valor aadido de la participacin en la gestin de la infraestructura de Java EE del servidor, pero no agrega valor real ms all de eso. Soporte de muelle de transaccin no est unido a un recipiente. Configurado con cualquier otra estrategia de JTA, soporte de transacciones tambin trabaja en un entorno autnomo o de prueba. Especialmente en el caso tpico de una sola base de datos de las

transacciones, de un solo recurso de Spring apoyo transaccin local es una alternativa ligera y potente para JTA. Al utilizar locales beans EJB de sesin sin estado para conducir transacciones, dependen tanto de un contenedor EJB y JTA, incluso si se accede slo una nica base de datos, y slo utilizar beans de sesin sin proporcionar transacciones declarativas a travs de transacciones gestionadas por contenedor. Adems, el uso directo de JTA programacin requiere un entorno Java EE tambin. JTA no implica slo las dependencias de contenedores en trminos de s mismo y de JTA JNDI DataSource casos. Para los que no la primavera, JTA impulsadas por las transacciones de Hibernate, tiene que utilizar el conector JCA Hibernate, o el cdigo de transaccin adicional Hibernate con la TransactionManagerLookup configurado para JVM adecuado nivel de almacenamiento en cach. Impulsados por resorte transacciones pueden funcionar tambin con un definido localmente Hibernate SessionFactory como lo hacen con un local de JDBC DataSource si estn accediendo a una base de datos nica. As, usted slo tiene que utilizar la estrategia de Spring JTA transaccin cuando se ha distribuido requerimientos de transaccin. Un conector JCA requiere especficos contenedor pasos de despliegue, y obviamente apoyo JCA en el primer lugar. Esta configuracin requiere ms trabajo que el despliegue de una aplicacin web sencilla con definiciones de recursos locales y las transacciones basadas en primavera. Adems, a menudo necesita la versin Enterprise Edition de su contenedor si est utilizando, por ejemplo, WebLogic Express, que no proporciona JCA. Una aplicacin de primavera con los recursos locales y las transacciones que abarcan una sola base de datos funciona en cualquier contenedor Java EE Web (sin JTA, JCA, o EJB), tales como Tomcat, Resin, o Jetty incluso sin formato. Adems, usted puede fcilmente volver a utilizar una de nivel medio en las aplicaciones de escritorio o suites de prueba. A fin de cuentas, si usted no utiliza EJB, palo con locales SessionFactory configuracin y Spring HibernateTransactionManager o JtaTransactionManager . Usted obtiene todos los beneficios, incluida la adecuada transaccional JVM y cach a nivel de transacciones distribuidas, sin las molestias del despliegue de contenedores. JNDI registro de una Hibernate SessionFactory a travs del conector JCA slo agrega valor cuando se utiliza junto con EJB.
15.3.7 espurias advertencias de servidor de aplicaciones con Hibernate

En algunos entornos JTA con muy estrictos XADataSource implementaciones actualmente slo algunos de WebLogic Server y las versiones de WebSphere Hibernate cuando se configura independientemente de la JTA PlatformTransactionManager objeto para ese entorno, es posible para la alerta falsa o excepciones a aparecer en la aplicacin servidor de registro. Estas advertencias o excepciones indicar que la conexin est accediendo ya no es vlido, o JDBC acceso ya no es vlido, posiblemente porque la transaccin ya no est activa. A modo de ejemplo, aqu hay una excepcin real de WebLogic:
java.sql.SQLException: La transaccin no est activo - estado: 'Comprometidos'. No ms el acceso JDBC est permitido dentro de esta transaccin.

Usted solucionar esta advertencia simplemente haciendo Hibernate consciente de la JTA PlatformTransactionManager instancia, a la que se sincroniza (junto con Spring). Usted tiene dos opciones para hacerlo:

Si en su contexto de aplicacin ya ests directamente la obtencin de la JTA PlatformTransactionManager objeto (presumiblemente a travs de JNDI JndiObjectFactoryBean o <jee:jndi-lookup> ) y alimentarlo, por ejemplo, para la primavera de JtaTransactionManager , entonces la manera ms fcil es especificar una referencia a el grano de la definicin de este JTA PlatformTransactionManager ejemplo como el valor de la propiedad jtaTransactionManager para LocalSessionFactoryBean. Spring luego hace que el objeto est disponible a Hibernate. Lo ms probable es que usted no tiene an el JTA PlatformTransactionManager ejemplo, debido a Spring JtaTransactionManager puede encontrar en s. Por lo tanto es necesario configurar Hibernate para buscar JTA PlatformTransactionManager directamente. Esto se hace mediante la configuracin de una aplicacin especfica del servidor TransactionManagerLookup clase en la configuracin de Hibernate, como se describe en el manual de Hibernate.

El resto de esta seccin se describe la secuencia de eventos que se producen con y sin el conocimiento de Hibernate de la JTA PlatformTransactionManager . Cuando Hibernate no est configurado con cualquier conocimiento de la JTA PlatformTransactionManager , los siguientes eventos se producen cuando una transaccin JTA compromete: 1. La transaccin JTA comete. 2. Spring JtaTransactionManager se sincroniza con la transaccin JTA, por lo que es llamado de nuevo a travs de una devolucin de llamada afterCompletion por el administrador de transacciones JTA. 3. Entre otras actividades, esta sincronizacin puede desencadenar una devolucin de llamada para la primavera de hibernacin, a travs de Hibernate afterTransactionCompletion de devolucin de llamada (se utiliza para borrar la cach de Hibernate), seguido de un explcito close() llamada en la sesin de Hibernate, lo que hace que Hibernate para tratar de close() la conexin JDBC. 4. En algunos entornos, este Connection.close() llamada activa entonces la advertencia o error, ya que el servidor de aplicaciones ya no considera la Connection utilizable en absoluto, porque la transaccin ya ha sido cometido. Cuando Hibernate est configurado con el conocimiento de la JTA PlatformTransactionManager , los siguientes eventos se producen cuando una transaccin JTA compromete: 1. la transaccin JTA est dispuesta a comprometerse. 2. Spring JtaTransactionManager se sincroniza con la transaccin JTA, por lo que la transaccin se llama de nuevo a travs de una devolucin de llamada beforeCompletion por el gestor de transacciones JTA. 3. La primavera es consciente de que Hibernate s se sincroniza con la transaccin JTA, y se comporta de manera diferente que en el escenario anterior.

Suponiendo que la hibernacin Session necesita ser cerrado en absoluto, Spring lo cerrar ahora. 4. La transaccin JTA comete. 5. Hibernate es sincronizado con la transaccin JTA, por lo que la transaccin se llama de nuevo a travs de una devolucin de llamada afterCompletion por el gestor de transacciones JTA, y adecuadamente puede borrar su cach.

15,4 JDO
Spring soporta el estndar JDO 2.0 y 2.1 APIs como estrategia de acceso a datos, siguiendo el mismo estilo que el soporte Hibernacin. Las clases de integracin correspondientes residen en el org.springframework.orm.jdo paquete.
15.4.1 PersistenceManagerFactory configuracin

Spring proporciona un LocalPersistenceManagerFactoryBean clase que le permite definir un local JDO PersistenceManagerFactory dentro de un contexto de aplicacin de primavera:
<beans> <bean id = "myPmf" class = "org.springframework.orm.jdo.LocalPersistenceManagerFactoryBean"> <propiedad nombre = valor = "configLocation" "classpath:kodo.properties" /> </ Bean> </ Beans>

Si lo prefiere, puede configurar un PersistenceManagerFactory a travs de instanciacin directa de un PersistenceManagerFactory clase de implementacin. A JDO PersistenceManagerFactory clase de implementacin sigue el modelo de JavaBeans, como un JDBC DataSource clase de implementacin, lo cual es un paso natural para una configuracin que utiliza Spring. Este estilo de configuracin generalmente soporta un Spring JDBC definido DataSource , pas a la connectionFactory propiedad. Por ejemplo, para la aplicacin de fuente abierta JDO DataNucleus (anteriormente JPOX) ( http://www.datanucleus.org/ ), esta es la configuracin XML de la PersistenceManagerFactory aplicacin:
<beans> <bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method "close" => <propiedad nombre = valor = "driverClassName" "${jdbc.driverClassName}" /> <propiedad nombre = valor = "url" "${jdbc.url}" /> <propiedad nombre = valor = "username" "${jdbc.username}" /> <propiedad nombre = valor = "password" "${jdbc.password}" /> </ Bean> <bean id = "myPmf" class = "org.datanucleus.jdo.JDOPersistenceManagerFactory" destroy-method "close" =>

<propiedad nombre = "connectionFactory" ref = "dataSource" /> <propiedad nombre = valor = "nontransactionalRead" "true" /> </ Bean> </ Beans>

Tambin puede configurar JDO PersistenceManagerFactory en el entorno JNDI de un servidor de aplicaciones Java EE, por lo general a travs del conector JCA proporcionada por la particular aplicacin JDO. Estndar Spring JndiObjectFactoryBean o <jee:jndi-lookup> se puede utilizar para recuperar y exponer tal PersistenceManagerFactory . Sin embargo, fuera de un contexto EJB, ningn beneficio real que existe en la celebracin de la PersistenceManagerFactory en JNDI: slo elegir una configuracin para una buena razn. Consulte Seccin 15.3.6, "recursos Comparando contenedores administrados y definidos a nivel local" para una discusin, los argumentos se aplican a JDO tambin.
15.4.2 Ejecucin DAOs basado en la llanura API JDO

DAOs tambin puede ser escrito directamente contra llanura API JDO, sin dependencias Spring, mediante el uso de un inyectado PersistenceManagerFactory . El siguiente es un ejemplo de una aplicacin correspondiente DAO:
pblico ProductDaoImpl clase implementa ProductDao { PersistenceManagerFactory PersistenceManagerFactory privado; public void setPersistenceManagerFactory (PersistenceManagerFactory pmf) { este PersistenceManagerFactory = pmf.; } pblico loadProductsByCategory Collection (String categora) { PersistenceManager pm = esta persistenceManagerFactory.getPersistenceManager ().; try { Query query = pm.newQuery (Product. clase ", categora pCategory ="); query.declareParameters ("String pCategory"); volver query.execute (categora); } finally { pm.close (); } } }

Debido a lo anterior DAO sigue el patrn de inyeccin de dependencia, que encaja perfectamente en un recipiente Spring, tal como sera si codifica con Spring JdoTemplate :
<beans> <bean id = "myProductDao" class = "product.ProductDaoImpl"> <propiedad nombre = "persistenceManagerFactory" ref = "myPmf" /> </ Bean>

</ Beans>

El principal problema con tal DAOs es que siempre conseguir un nuevo PersistenceManager de la fbrica. Para acceder a una transaccin Spring gestionado PersistenceManager , defina un TransactionAwarePersistenceManagerFactoryProxy (tal como se prev en la primavera) delante de su blanco PersistenceManagerFactory , pasando una referencia a ese proxy en su DAOs como en el siguiente ejemplo:
<beans> <Bean id = "myPmfProxy" class = "org.springframework.orm.jdo.TransactionAwarePersistenceManagerFactory Proxy"> <propiedad nombre = "targetPersistenceManagerFactory" ref = "myPmf" /> </ Bean> <bean id = "myProductDao" class = "product.ProductDaoImpl"> <propiedad nombre = "persistenceManagerFactory" ref = "myPmfProxy" /> </ Bean> </ Beans>

Su cdigo de acceso de datos recibir una transaccional PersistenceManager (si existe) del PersistenceManagerFactory.getPersistenceManager() mtodo que llama. La llamada al mtodo ste pasa por el proxy, que primero comprueba si hay una transaccin en curso PersistenceManager antes de conseguir uno nuevo de la fbrica. Cualquier close() pide a la PersistenceManager son ignorados en el caso de una transaccin PersistenceManager . Si el cdigo de acceso a datos siempre se ejecuta dentro de una transaccin activa (o por lo menos dentro de sincronizacin transaccin activa), se puede omitir la PersistenceManager.close() de llamada y por lo tanto todo el finally bloque, que usted puede hacer para mantener sus implementaciones DAO conciso :
pblico ProductDaoImpl clase implementa ProductDao { PersistenceManagerFactory PersistenceManagerFactory privado; public void setPersistenceManagerFactory (PersistenceManagerFactory pmf) { este PersistenceManagerFactory = pmf.; } pblico loadProductsByCategory Collection (String categora) { PersistenceManager pm = esta persistenceManagerFactory.getPersistenceManager ().; Query query = pm.newQuery (Product. clase ", categora pCategory ="); query.declareParameters ("String pCategory"); volver query.execute (categora); } }

Con DAOs que se basan en las transacciones activas, se recomienda que aplicar operaciones activas a travs de apagar TransactionAwarePersistenceManagerFactoryProxy 's allowCreate bandera:
<beans> <Bean id = "myPmfProxy" class = "org.springframework.orm.jdo.TransactionAwarePersistenceManagerFactory Proxy"> <propiedad nombre = "targetPersistenceManagerFactory" ref = "myPmf" /> <propiedad nombre = valor = "allowCreate" "false" /> </ Bean> <bean id = "myProductDao" class = "product.ProductDaoImpl"> <propiedad nombre = "persistenceManagerFactory" ref = "myPmfProxy" /> </ Bean> </ Beans>

La principal ventaja de este estilo DAO es que depende de JDO API solamente, sin importar cualquier clase Spring se requiere. Esto es, por supuesto, atractiva desde una perspectiva no-invasivo, y podra sentirse ms natural para los desarrolladores JDO. Sin embargo, el DAO lanza llanura JDOException (que no est marcada, por lo que no tiene que ser declarada o capturado), lo que significa que las personas que llaman slo puede tratar excepciones como fatal, si no quiere depender de la estructura propia excepcin del JDO. La captura de causas especficas, tales como una falla de bloqueo optimista no es posible sin atar la persona que llama a la estrategia de implementacin. Esta fuera del comercio podra ser aceptable para aplicaciones que estn fuertemente basadas JDO y / o que no necesitan ningn tratamiento especial excepcin. En resumen, se puede DAOs basado en la llanura API JDO, y todava puede participar en transacciones administradas por resorte. Esta estrategia podra apelar a usted si usted ya est familiarizado con JDO. Sin embargo, tal DAOs tirar llanura JDOException , y usted tendra que convertir explcitamente a Spring DataAccessException (si se desea).
15.4.3 Gestin de transacciones Nota

Se le recomienda que lea la Seccin 12.5, "la gestin de transacciones declarativa" si usted no lo ha hecho, para tener una cobertura ms detallada de soporte de transacciones declarativa Spring. Para ejecutar las operaciones de servicio dentro de las transacciones, puede utilizar las instalaciones comunes de primavera de transacciones declarativas. Por ejemplo:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans"

xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <bean id = "myTxManager" class = "org.springframework.orm.jdo.JdoTransactionManager"> <propiedad nombre = "persistenceManagerFactory" ref = "myPmf" /> </ Bean> <bean id = "myProductService" class = "product.ProductServiceImpl"> <propiedad nombre = "productDao" ref = "myProductDao" /> </ Bean> <tx:advice id = transaction-manager "txAdvice" "txManager" => <tx:attributes> nombre = <tx:method "increasePrice*" propagacin = "REQUIRED" /> nombre = <tx:method "someOtherBusinessMethod" propagacin = "REQUIRES_NEW" /> nombre = <tx:method propagacin "*" = "SUPPORTS" read-only = "true" /> </ Tx: attributes> </ Tx: advice> <aop:config> <Aop: pointcut id = "productServiceMethods" = expresin "ejecucin (* product.ProductService. * (..))" /> <aop:advisor advice-ref = "txAdvice" pointcut-ref = "productServiceMethods" /> </ Aop: config> </ Beans>

JDO requiere una transaccin activa para modificar un objeto persistente. El concepto ras no transaccional no existe en JDO, en contraste con Hibernate. Por esta razn, es necesario configurar la aplicacin JDO elegido para un entorno especfico. En concreto, es necesario configurarlo de forma explcita para JTA sincronizacin, para detectar un activo transaccin JTA s mismo. Esto no es necesario para las transacciones locales como la realizada en la primavera de JdoTransactionManager , pero es necesario para participar en transacciones JTA, ya sea impulsada por Spring JtaTransactionManager o EJB CMT y JTA simple.
JdoTransactionManager

es capaz de exponer una transaccin JDO cdigo de acceso a JDBC que accede a la misma JDBC DataSource , a condicin de que la registrada JdoDialect admite la recuperacin de la subyacente JDBC Connection . Este es el caso de JDBC basados en implementaciones de JDO 2.0 por defecto.

15.4.4 JdoDialect

Como una caracterstica avanzada, tanto JdoTemplate y JdoTransactionManager apoyar una costumbre JdoDialect que se puede pasar a la jdoDialect propiedad de bean. En este escenario, el DAOs no recibir un PersistenceManagerFactory referencia, sino ms bien una completa JdoTemplate instancia (por ejemplo, se aprob en el jdoTemplate caracterstica de JdoDaoSupport ). El uso de un JdoDialect implementacin, puede activar las funciones avanzadas admitidas por la primavera, por lo general de una manera especfica del proveedor:

La aplicacin de la semntica de transaccin especficos, tales como nivel de aislamiento de transaccin de tiempo de espera personalizado o Recuperacin de la transaccin JDBC Connection de exposicin al basado en JDBC DAOs La aplicacin de tiempos de espera de consulta, que se calculan automticamente a partir de los tiempos de espera de transacciones gestionadas por resorte Ansiosamente un lavado PersistenceManager, para hacer visibles a los cambios transaccionales basado en JDBC cdigo de acceso a datos Traduccin avanzada de JDOExceptions a la primavera
DataAccessExceptions

Ver el JdoDialect Javadoc para obtener ms detalles sobre sus operaciones y cmo utilizarlos en apoyo de Spring JDO.

15,5 JPA
La APP Spring, disponible bajo la org.springframework.orm.jpa paquete, ofrece un amplio soporte para la API de persistencia de Java de una manera similar a la integracin con Hibernate o JDO, si bien es consciente de la implementacin subyacente para proporcionar caractersticas adicionales.
15.5.1 Tres opciones para la configuracin de la APP en un ambiente de primavera

El soporte de Spring JPA ofrece tres maneras de configurar la APP EntityManagerFactory que sern utilizados por la aplicacin para obtener un gestor de entidades.
LocalEntityManagerFactoryBean

Nota

Slo use esta opcin en entornos de implementacin sencillas como aplicaciones independientes y pruebas de integracin. El LocalEntityManagerFactoryBean crea una EntityManagerFactory adecuado para entornos de despliegue simples donde la aplicacin utiliza slo JPA para el acceso de datos. El grano de fbrica utiliza la APP PersistenceProvider mecanismo de deteccin automtica (de acuerdo con Java SE APP bootstrapping) y, en la mayora de

los casos, requiere que se especifique nicamente el nombre de la unidad de persistencia:


<beans> <bean id = "myEmf" class = "org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> <propiedad nombre = valor = "persistenceUnitName" "myPersistenceUnit" /> </ Bean> </ Beans>

Esta forma de implementacin JPA es el ms simple y el ms limitado. Usted no puede hacer referencia a una existente JDBC DataSource bean definicin y no hay soporte para transacciones globales existe. Por otra parte, el tejido (byte-code transformacin) de las clases persistentes es especfica del proveedor, a menudo requieren un determinado agente JVM especificado en el arranque. Esta opcin slo es suficiente para aplicaciones independientes y entornos de prueba, para la que se dise la especificacin JPA.
La obtencin de una EntityManagerFactory de JNDI Nota

Utilice esta opcin cuando el despliegue en un servidor Java EE 5. Consulte la documentacin de su servidor acerca de cmo implementar una costumbre proveedor JPA en el servidor, lo que permite un proveedor diferente al predeterminado del servidor. La obtencin de una EntityManagerFactory de JNDI (por ejemplo, en un entorno Java EE 5), es simplemente una cuestin de cambiar la configuracin XML:
<beans> id = <jee:jndi-lookup "myEmf" jndi-name = "persistence/myPersistenceUnit" /> </ Beans>

Esta accin supone estndar Java EE 5 bootstrapping: el servidor Java EE detecta automticamente unidades de persistencia (en efecto, META-INF/persistence.xml archivos en tarros de aplicacin) y persistence-unit-ref entradas en el descriptor de despliegue Java EE (por ejemplo, web.xml ) y define entorno de nombrado ubicaciones para las unidades de contexto de persistencia. En tal escenario, el despliegue persistencia unidad completa, incluyendo el tejido (byte de cdigo de transformacin) de las clases persistentes, es de hasta el servidor Java EE. La JDBC DataSource se define a travs de una ubicacin JNDI en el METAINF/persistence.xml archivo; transacciones EntityManager se integran con el subsistema del servidor JTA. Spring usa realmente la obtenida EntityManagerFactory , transmitirla a los objetos de aplicacin a travs de la inyeccin de dependencia, y la

gestin de transacciones para la unidad de persistencia, tpicamente a travs de JtaTransactionManager . Si hay varias unidades de persistencia se utilizan en la misma solicitud, los nombres de frijol de tales unidades JNDI-recuperados persistencia deben coincidir con los nombres de las unidades de persistencia que la aplicacin utiliza para referirse a ellos, por ejemplo, en @PersistenceUnit y @PersistenceContext anotaciones.
LocalContainerEntityManagerFactoryBean

Nota

Utilice esta opcin para todas las capacidades de la APP en un entorno de aplicacin Spring-based. Esto incluye los contenedores web como Tomcat, as como aplicaciones independientes y pruebas de integracin de los requisitos de persistencia sofisticados. El LocalContainerEntityManagerFactoryBean da un control total sobre EntityManagerFactory configuracin y es apropiado para entornos donde se requiere de grano fino personalizacin. El LocalContainerEntityManagerFactoryBean crea un PersistenceUnitInfo ejemplo basado en el persistence.xml archivo, el suministro dataSourceLookup estrategia, y el especificado loadTimeWeaver . Por tanto, es posible trabajar con fuentes de datos personalizados fuera de JNDI y para controlar el proceso de tejido. El ejemplo siguiente muestra una definicin de bean tpico para un LocalContainerEntityManagerFactoryBean :
<beans> <bean id = "myEmf" class = "org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <propiedad nombre = "dataSource" ref = "someDataSource" /> <propiedad nombre = "loadTimeWeaver"> <bean class = "org.springframework.instrument.classloading.InstrumentationLoadTimeWe aver" /> </ Propiedad> </ Bean> </ Beans>

El siguiente ejemplo muestra un tpico persistence.xml del archivo:


<persistence xmlns = "http://java.sun.com/xml/ns/persistence" versin "1.0" => <persistence-unit name = "myUnit" transaction-type "RESOURCE_LOCAL" => <mapping-file> META-INF/orm.xml </ mapeo-file> <exclude-unlisted-classes/> </ Persistence-unit> </ Persistence>

Nota

La exclude-unlisted-classes elemento siempre indica que no barrido por las clases de entidad anotadas se supone que debe ocurrir, a fin de apoyar la <exclude-unlisted-classes/> acceso directo. Esto est en consonancia con la especificacin JPA, lo que sugiere que de acceso directo, pero por desgracia est en conflicto con el XSD APP, lo que implica false para el acceso directo. En consecuencia, <exclude-unlisted-classes> false </exclude-unlistedclasses/> no es compatible. Simplemente omite la exclude-unlisted-classes elemento si desea escanear clase de entidad que se produzca. Usando el LocalContainerEntityManagerFactoryBean es la opcin JPA configuracin ms potente, lo que permite una configuracin flexible local dentro de la aplicacin. Es compatible con enlaces a una ya existente JDBC DataSource , soporta transacciones tanto locales como globales, y as sucesivamente. Sin embargo, tambin impone requisitos sobre el entorno de ejecucin, tales como la disponibilidad de un cargador de clases de tejer con capacidad si el proveedor de persistencia exige bytecode transformacin. Esta opcin puede entrar en conflicto con las capacidades de JPA incorporados de un servidor Java EE 5. En un completo entorno de Java EE 5, considerar la obtencin de su EntityManagerFactory de JNDI. Como alternativa, especifique una costumbre persistenceXmlLocation en su LocalContainerEntityManagerFactoryBean definicin, por ejemplo, META-INF/my-persistence.xml, y slo incluir un descriptor con ese nombre en los archivos de aplicacin jar. Debido a que el servidor Java EE 5 slo busca por defecto META-INF/persistence.xml archivos, se hace caso omiso de tales unidades de persistencia personalizados y evitar as conflictos con una configuracin inicial del resorte impulsado por la APP. (Esto se aplica a la resina 3,1, por ejemplo.) Cundo es tiempo de carga necesario tejer? No todos los proveedores JPA requieren un agente JVM; Hibernate es un ejemplo de uno que no lo hace. Si su proveedor no requiere un agente o tienes otras alternativas, tales como la aplicacin de mejoras en el tiempo de construccin a travs de un compilador de costumbre o una tarea de hormiga, el tejedor en tiempo de carga no debe ser utilizado. El LoadTimeWeaver interfaz es una clase de Primavera-siempre que permita la APP ClassTransformer casos para ser conectado de una manera especfica, en funcin de si el medio ambiente es un contenedor web o servidor de aplicaciones. Conexin ClassTransformers a travs de un Java 5 agentes por lo general no es eficiente. Los agentes trabajan en contra de la mquina virtual completa e inspeccionan todas las clases que se carguen, que es generalmente indeseable en un entorno de servidor de produccin. Spring proporciona un nmero de LoadTimeWeaver implementaciones para varios ambientes, permitiendo ClassTransformer casos a ser aplicado slo por cargador de clases y no por VM.

Consulte la seccin "Configuracin de Primavera" en el captulo AOP para una visin ms clara sobre los LoadTimeWeaver implementaciones y su configuracin, ya sea genrico o personalizado para varias plataformas (como Tomcat, WebLogic, OC4J, GlassFish, resina y JBoss). Como se describe en la seccin anterior, se puede configurar un contexto amplio LoadTimeWeaver utilizando el @EnableLoadTimeWeaving anotacin de context:load-time-weaver elemento XML. Tal tejedor mundial es recogido por todo JPA LocalContainerEntityManagerFactoryBeans automticamente. Esta es la mejor forma de crear un tejedor en tiempo de carga, deteccin automtica de la entrega de la plataforma (WebLogic, OC4J, GlassFish, Tomcat, Resin, JBoss o agente VM) y la propagacin automtica de la tejedora a todos los granos de tejedor-aware:
<context:load-time-weaver/> <bean id = "emf" class = "org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> ... </ Bean>

Sin embargo, si es necesario, uno puede especificar manualmente un tejedor dedicada a travs de la loadTimeWeaver propiedad:
<bean id = "emf" class = "org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <propiedad nombre = "loadTimeWeaver"> <bean class = "org.springframework.instrument.classloading.ReflectiveLoadTimeWeaver" /> </ Propiedad> </ Bean>

No importa cmo est configurado el LTW, utilizando esta tcnica, las aplicaciones que dependen de la APP instrumentacin se puede ejecutar en la plataforma de destino (por ejemplo: Tomcat) sin necesidad de un agente. Esto es importante especialmente cuando las aplicaciones de alojamiento se basan en diferentes implementaciones de JPA porque los transformadores JPA se aplican slo a nivel del cargador de clases y por lo tanto estn aislados unos de otros.
Lidiar con mltiples unidades de persistencia

Para las aplicaciones que se basan en mltiples unidades de persistencia destinos almacenados en JARS diferentes en la ruta de clase, por ejemplo, Spring ofrece la PersistenceUnitManager para actuar como un depsito central y para evitar el proceso de persistencia unidades de descubrimiento, que puede ser costoso. La implementacin por defecto permite varias ubicaciones para especificar que se analizan y recuperados ms tarde por el nombre de la unidad de persistencia. (De manera predeterminada, la ruta de clases se busca META-INF/persistence.xml archivos.)
<bean id = "pum" class = "org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitMan ager"> <propiedad nombre = "persistenceXmlLocations"> <list>

<valor> org / springframework / orm / jpa / domain / persistence-multi.xml <valor /> <valor> classpath :/ mi / paquete / ** / custom-persistence.xml </ value> <valor> classpath *: META-INF/persistence.xml </ value> </ List> </ Propiedad> <propiedad nombre = "dataSources"> <map> clave = <entry "localDataSource" value-ref = "local-db" /> clave = <entry "remoteDataSource" value-ref = "remote-db" /> </ Map> </ Propiedad> <- Si no se especifica el origen de datos, utilice este -> <propiedad nombre = "defaultDataSource" ref = "remoteDataSource" /> </ Bean> <bean id = "emf" class = "org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <propiedad nombre = "persistenceUnitManager" ref = "pum" /> <propiedad nombre = valor = "persistenceUnitName" "myCustomUnit" /> </ Bean>

La implementacin predeterminada permite la personalizacin de los PersistenceUnitInfo casos, antes de que se alimentan al proveedor JPA, declarativa a travs de sus propiedades, que afectan a todas las unidades alojados, o mediante programacin, a travs de la PersistenceUnitPostProcessor , que permite la seleccin persistencia unidad. Si no PersistenceUnitManager se especifica, se crea y se utiliza internamente por LocalContainerEntityManagerFactoryBean .
15.5.2 Ejecucin DAOs basado en llano JPA Nota

Aunque EntityManagerFactory casos son thread-safe, EntityManager casos no lo son. La inyeccin JPA EntityManager se comporta como un EntityManager obtienen de un entorno servidor de aplicaciones JNDI, tal como se define en la especificacin JPA. Delega todas las llamadas a la transaccin actual EntityManager , en su caso, de lo contrario, se cae de nuevo a una nueva creacin EntityManager por operacin, haciendo para su uso seguro para subprocesos. Es posible escribir cdigo en la llanura JPA sin dependencias Spring, mediante el uso de una inyeccin de EntityManagerFactory o EntityManager . La primavera puede entender @PersistenceUnit y @PersistenceContext anotaciones, tanto a nivel de campo y un mtodo si PersistenceAnnotationBeanPostProcessor est habilitado. Una llanura JPA implementacin DAO usando el @PersistenceUnit anotacin podra tener este aspecto:
pblico ProductDaoImpl clase implementa ProductDao { privado fem EntityManagerFactory; @ PersistenceUnit public void setEntityManagerFactory (fem EntityManagerFactory) { esta fem = fem.; }

pblico loadProductsByCategory Collection (String categora) { EntityManager em = Este emf.createEntityManager ().; try { Query query = em.createQuery ("de productos como p donde p.category = 1?"); query.setParameter (1, categora); volver query.getResultList (); } finally { if (em! = null) { em.close (); } } } }

El DAO anteriormente no tiene dependencia de la primavera y todava encaja muy bien en un contexto de aplicacin de primavera. Por otra parte, la DAO se aprovecha de anotaciones para requerir la inyeccin del defecto EntityManagerFactory :
<beans> <- Frijol post-procesador para las anotaciones JPA -> <bean class = "org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProc essor" /> <bean id = "myProductDao" class = "product.ProductDaoImpl" /> </ Beans>

Como alternativa a la definicin de un PersistenceAnnotationBeanPostProcessor explcitamente, considere el uso de la Primavera context:annotation-config elemento XML en la configuracin de su contexto de aplicacin. Si lo hace, se registra automticamente todas muelle estndar post-procesadores para la anotacin de configuracin basada, entre ellos CommonAnnotationBeanPostProcessor y as sucesivamente.
<beans> <- Post-procesadores para todas las anotaciones de configuracin estndar -> <context:annotation-config/> <bean id = "myProductDao" class = "product.ProductDaoImpl" /> </ Beans>

El principal problema con tal DAO es que siempre se crea un nuevo EntityManager a travs de la fbrica. Esto se puede evitar mediante la solicitud de una transaccin EntityManager (tambin llamado "EntityManager compartida", porque es una responsabilidad compartida, thread-safe proxy para el EntityManager transaccional real) que se inyecta en lugar de la fbrica:
pblico ProductDaoImpl clase implementa ProductDao {

@ PersistenceContext EntityManager em privado; pblico loadProductsByCategory Collection (String categora) { Query query = em.createQuery ("de productos como p donde p.category =: categora"); query.setParameter ("categora", categora); volver query.getResultList (); } }

El @PersistenceContext anotacin tiene un atributo opcional type , que por defecto es PersistenceContextType.TRANSACTION . Este valor por defecto es lo que necesitas para recibir un proxy EntityManager compartida. La alternativa, PersistenceContextType.EXTENDED , es un asunto completamente diferente: Esto resulta en un EntityManager extendida llamada, que no es segura para los subprocesos y por lo tanto no debe ser utilizado en un componente de acceso concurrente tal como una semilla Spring gestionados singleton. EntityManagers adultos slo se supone que se utiliza en componentes con estado que, por ejemplo, residen en una sesin, con el ciclo de vida de la EntityManager no vinculada a una transaccin en curso, sino ms bien ser completamente hasta la aplicacin. Mtodo y nivel de campo inyeccin Anotaciones que indican inyecciones de dependencia (por ejemplo, @PersistenceUnit y @PersistenceContext ) se puede aplicar en el campo o mtodos dentro de una clase, por lo tanto, la inyeccin de expresiones de nivel de mtodo y la inyeccin a nivel de campo. A nivel de campo anotaciones son concisos y fciles de usar, mientras que a nivel de mtodo permite un procesamiento adicional de la dependencia inyectada. En ambos casos, la visibilidad miembro (public, protected, private) no importa. Qu pasa con las anotaciones de nivel de clase? En la plataforma Java EE 5, que se utilizan para la declaracin de dependencias y no para la inyeccin de recursos. La inyeccin EntityManager es primavera gestionados (conocimiento de la transaccin en curso). Es importante sealar que a pesar de que la nueva aplicacin DAO utiliza la inyeccin mtodo nivel de un EntityManager en lugar de un EntityManagerFactory , no se requiere un cambio en el contexto de aplicacin XML debido al uso de anotacin. La principal ventaja de este estilo de DAO es que slo depende de la Java Persistence API, sin importar cualquier clase de Primavera se requiere. Adems, como las anotaciones JPA se entienden, las inyecciones se aplican automticamente por el contenedor Spring. Esto es atractivo desde una perspectiva no-invasivo, y podra sentirse ms natural para los desarrolladores de la APP.
15.5.3 Administracin de transacciones Nota

Se le recomienda que lea la Seccin 12.5, "la gestin de transacciones declarativa"

si usted no lo ha hecho, para tener una cobertura ms detallada de soporte de transacciones declarativa Spring. Para ejecutar las operaciones de servicio dentro de las transacciones, puede utilizar las instalaciones comunes de primavera de transacciones declarativas. Por ejemplo:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <bean id = "myTxManager" class = "org.springframework.orm.jpa.JpaTransactionManager"> <propiedad nombre = "entityManagerFactory" ref = "myEmf" /> </ Bean> <bean id = "myProductService" class = "product.ProductServiceImpl"> <propiedad nombre = "productDao" ref = "myProductDao" /> </ Bean> <aop:config> <aop:pointcut id = "productServiceMethods" expresin = "execution(* product.ProductService.*(..))" /> <aop:advisor advice-ref = "txAdvice" pointcut-ref = "productServiceMethods" /> </ Aop: config> <tx:advice id = transaction-manager "txAdvice" "myTxManager" => <tx:attributes> nombre = <tx:method "increasePrice*" propagacin = "REQUIRED" /> nombre = <tx:method "someOtherBusinessMethod" propagacin = "REQUIRES_NEW" /> nombre = <tx:method propagacin "*" = "SUPPORTS" read-only = "true" /> </ Tx: attributes> </ Tx: advice> </ Beans>

Spring JPA permite un configurado JpaTransactionManager para exponer una transaccin APP a cdigo de acceso JDBC que accede a la misma JDBC DataSource , a condicin de que la registrada JpaDialect admite la recuperacin de la subyacente JDBC Connection . Fuera de la caja, Spring ofrece dialectos del Toplink, Hibernate y las implementaciones OpenJPA JPA. Consulte la siguiente seccin para ms detalles sobre el JpaDialect mecanismo.

15.5.4 JpaDialect

Como una funcin avanzada de JpaTemplate , JpaTransactionManager y subclases de AbstractEntityManagerFactoryBean apoyar una costumbre JpaDialect , que se pas a la propiedad de bean jpaDialect. En tal escenario, el DAO no recibe un EntityManagerFactory referencia sino un completo JpaTemplate instancia (por ejemplo, pasa a la propiedad jpaTemplate of JpaDaoSupport ). A JpaDialect aplicacin puede habilitar algunas caractersticas avanzadas soportadas por la primavera, por lo general de una manera especfica del proveedor:

La aplicacin de la semntica de transaccin especficos, tales como nivel de aislamiento de la costumbre o de tiempo de espera de transaccin) Recuperacin de la transaccin JDBC Connection de exposicin al basado en JDBC DAO) Traduccin avanzada de PersistenceExceptions a la primavera
DataAccessExceptions

Esto es especialmente valioso para la semntica de transaccin especiales y para la traduccin de advanced excepcin. La implementacin por defecto utilizado ( DefaultJpaDialect ) no proporciona ninguna capacidad especial y si las caractersticas anteriores son necesarios, hay que especificar el dialecto apropiado. Ver el JpaDialect Javadoc para obtener ms detalles de sus operaciones y cmo se utilizan en apoyo de Spring JPA.

15,6 iBATIS SQL Maps


El apoyo iBATIS en el Spring Framework se parece mucho al soporte de JDBC en que es compatible con la programacin misma plantilla de estilo, y como con JDBC y otras tecnologas ORM, el apoyo iBATIS trabaja con jerarqua de excepciones de Spring y le permite disfrutar de las caractersticas de Spring IoC. Gestin de transacciones pueden ser manejados a travs de las instalaciones estndar de Spring. No hay estrategias de transaccin especial es necesario para iBATIS, porque ningn recurso transaccional especial implicado sea un JDBC Connection . Por lo tanto, el nivel de Spring JDBC DataSourceTransactionManager o JtaTransactionManager son perfectamente suficiente.
Nota

Spring soporta 2.x. iBATIS Las clases de apoyo estn 1.x iBatis dejado de suministrarse.
15.6.1 Configuracin de la SqlMapClient

IBATIS SQL Maps implica la creacin de archivos de configuracin que contienen declaraciones sqlmap y mapas de resultado. Spring se encarga de cargar los que utilizan el SqlMapClientFactoryBean . Para los ejemplos vamos a utilizar la siguiente Account la clase:

Cuenta public class { private String nombre; email private String; public String getName () { volver this.name; } setName public void (String nombre) { this.name = nombre; } pblico getEmail String () { volver this.email; } public void setEmail (email String) { this.email = email; } }

Para asignar esta Account con 2.x clase iBATIS tenemos que crear el SQL siguiente mapa Account.xml :
<sqlMap espacio de nombres = "Account"> <resultMap id = "result" class = "examples.Account"> <result propiedad = columna "name" = columnIndex "NAME" = "1" /> <result propiedad = columna "email" = columnIndex "EMAIL" = "2" /> </ ResultMap> <seleccionar id = "getAccountByEmail" resultMap "result" => seleccione ACCOUNT.NAME, ACCOUNT.EMAIL de la cuenta donde ACCOUNT.EMAIL = # valor # </ Select> <insertar id = "insertAccount"> insertar en cuenta (nombre, correo electrnico) values (# nombre #, # # email) </ Insert> </ Sqlmap>

El archivo de configuracin para iBATIS 2 es el siguiente:


<sqlMapConfig> <sqlMap resource = "example/Account.xml" /> </ SqlMapConfig>

Recuerde que las cargas iBatis recursos de la ruta de clase, as que asegrese de agregar el Account.xml archivo en la ruta de clase.

Podemos utilizar el SqlMapClientFactoryBean en el contenedor Spring. Tenga en cuenta que con iBATIS SQL Maps 2.x, el JDBC DataSource normalmente se especifica en el SqlMapClientFactoryBean , que permite la carga diferida. Esta es la configuracin necesaria para estas definiciones de frijol:
<beans> <bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method "close" => <propiedad nombre = valor = "driverClassName" "${jdbc.driverClassName}" /> <propiedad nombre = valor = "url" "${jdbc.url}" /> <propiedad nombre = valor = "username" "${jdbc.username}" /> <propiedad nombre = valor = "password" "${jdbc.password}" /> </ Bean> <bean id = "sqlMapClient" class = "org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <propiedad nombre = valor = "configLocation" "WEB-INF/sqlmapconfig.xml" /> <propiedad nombre = "dataSource" ref = "dataSource" /> </ Bean> </ Beans>

15.6.2 Usando SqlMapClientTemplate y SqlMapClientDaoSupport

El SqlMapClientDaoSupport clase ofrece una clase de soporte similar al SqlMapDaoSupport . Hacemos llegar a poner en prctica nuestro DAO:
public class extends SqlMapAccountDao SqlMapClientDaoSupport implementa AccountDao { getAccount cuenta pblica (email String) throws DataAccessException { volver (Cuenta) getSqlMapClientTemplate () queryForObject ("getAccountByEmail", correo electrnico).; } insertAccount public void (cuenta Account) throws DataAccessException { . getSqlMapClientTemplate () actualizacin ("insertAccount", cuenta); } }

En el DAO, se utiliza el pre-configurado SqlMapClientTemplate para ejecutar las consultas, despus de instalar la SqlMapAccountDao en el contexto de aplicacin y cableado con nuestro SqlMapClient ejemplo:
<beans> <bean id = "accountDao" class = "example.SqlMapAccountDao"> <propiedad nombre = "sqlMapClient" ref = "sqlMapClient" /> </ Bean> </ Beans>

Un SqlMapTemplate ejemplo, tambin se pueden crear manualmente, pasando el SqlMapClient como argumento del constructor. El SqlMapClientDaoSupport clase base simplemente preinitializes un SqlMapClientTemplate ejemplo para nosotros. El SqlMapClientTemplate ofrece un genrico execute mtodo, teniendo una costumbre SqlMapClientCallback ejecucin como argumento. Esto puede, por ejemplo, ser utilizado para la dosificacin:
public class extends SqlMapAccountDao SqlMapClientDaoSupport implementa AccountDao { insertAccount public void (cuenta Account) throws DataAccessException { getSqlMapClientTemplate (). execute (SqlMapClientCallback nuevo () { public Object doInSqlMapClient (ejecutor SqlMapExecutor) throws SQLException { executor.startBatch (); executor.update ("insertAccount", cuenta); executor.update ("insertAddress", account.getAddress ()); executor.executeBatch (); } }); } }

En general, cualquier combinacin de operaciones que ofrecen el nativo SqlMapExecutor API se puede utilizar en tal una devolucin de llamada. Cualquier lanzado SQLException se convierte automticamente en genrico Spring DataAccessException jerarqua.
15.6.3 Ejecucin DAOs basada en API iBATIS llanura

DAOs tambin puede ser escrito en contra de API iBATIS liso, sin ninguna dependencia de primavera, directamente a travs de una inyeccin SqlMapClient . El ejemplo siguiente muestra una implementacin correspondiente DAO:
pblico SqlMapAccountDao clase implementa AccountDao { sqlMapClient SqlMapClient privado; public void setSqlMapClient (SqlMapClient sqlMapClient) { este sqlMapClient = sqlMapClient.; } getAccount cuenta pblica (email String) { try { volver (Cuenta) esta sqlMapClient.queryForObject ("getAccountByEmail", correo electrnico).; } catch (SQLException ex) { throw new MyDaoException (ex); } }

insertAccount public void (cuenta Account) throws DataAccessException { try { este sqlMapClient.update ("insertAccount", cuenta).; } catch (SQLException ex) { throw new MyDaoException (ex); } } }

En este escenario, usted necesita para manejar la SQLException lanzada por el API iBATIS de forma personalizada, por lo general envolvindolo en su propia aplicacin especfica de excepcin DAO. Cableado en el contexto de aplicacin todava se vera como lo hace en el ejemplo de la SqlMapClientDaoSupport , debido al hecho de que la llanura iBATIS basado DAO todava sigue el patrn de inyeccin de dependencia:
<beans> <bean id = "accountDao" class = "example.SqlMapAccountDao"> <propiedad nombre = "sqlMapClient" ref = "sqlMapClient" /> </ Bean> </ Beans>

16. Marshalling XML usando O / X mappers 16.1 Introduccin


En este captulo vamos a describir objetos Primavera / support Mapeo XML. Objeto / XML Mapping, o O / X mapeo para abreviar, es el acto de convertir un documento XML desde y hacia un objeto. Este proceso de conversin es tambin conocida como XML Marshalling, o serializacin XML. En este captulo se utilizan estos trminos indistintamente. Dentro del campo de O / X mapeo, un contador de referencias es responsable de la serializacin de un objeto (el grfico) a XML. De manera similar, un unmarshaller deserializa el XML en un grfico de objetos. Este XML puede tomar la forma de un documento DOM, un flujo de entrada o de salida, o un controlador de SAX. Algunos de los beneficios de la utilizacin de primavera para su O / X necesidades de mapeo son los siguientes: Facilidad de configuracin. Fbrica Spring bean hace que sea fcil de configurar clculos de referencia, sin necesidad de construir contexto JAXB, fbricas JiBX de unin, etc Los clculos de referencia se puede configurar como cualquier otro frijol en su contexto de aplicacin. Adems, esquema XML basado en configuracin est disponible para un nmero de clculos de referencia, por lo que la configuracin an ms sencilla. Interfaces. Consistente O Primavera / mapeo X opera a travs de dos interfaces globales: el Marshaller y Unmarshaller interfaz. Estas abstracciones permiten

cambiar de O / X marcos de mapeo con relativa facilidad, con pequeos cambios o no requeridos en las clases que hacen el clculo de referencias. Este enfoque tiene la ventaja adicional de que permite hacer marshalling XML con un enfoque de la mezcla y combinacin (por ejemplo, algunos de maniobra a cabo utilizando JAXB, s utilizando XMLBeans) de una manera no intrusiva, aprovechando la fuerza de cada tecnologa. Jerarqua de excepciones consistente. Spring proporciona una conversin de excepciones de la herramienta de mapeo subyacente O / X a su jerarqua propia excepcin con el XmlMappingException como la excepcin raz. Como era de esperar, estas excepciones de tiempo de ejecucin envuelva la excepcin original por lo que no se pierde informacin.

16,2 Marshaller y Unmarshaller


Como se ha dicho en la introduccin, un sealero serializa un objeto a XML, y una secuencia XML unmarshaller deserializa un objeto. En esta seccin, se describen las interfaces Spring dos usaron para este propsito.
16.2.1 Marshaller

Primavera abstrae todas las operaciones de maniobras detrs del org.springframework.oxm.Marshaller interfaz, los principales mtodos de que se enumeran a continuacin.
pblico Marshaller interfaz { / ** * Alguaciles el grfico de objetos con la raz entregada en el resultado previsto. * / vaco mariscal (Object grfico, resultado Resultado) lanza XmlMappingException, IOException; }

El Marshaller interfaz tiene un mtodo principal, que rene el objeto dado a un determinado javax.xml.transform.Result . El resultado es una interfaz de marcado que en el fondo representa una abstraccin de salida XML: implementaciones concretas envolver diversas representaciones XML, como se indica en la siguiente tabla.
Result aplicacin DOMResult SAXResult StreamResult org.w3c.dom.Node org.xml.sax.ContentHandler java.io.File , java.io.OutputStream o java.io.Writer

Wraps representacin XML

Nota

Aunque el marshal() mtodo acepta un objeto plano como primer parmetro, la mayora de Marshaller implementaciones no puede

Result aplicacin

Wraps representacin XML

manejar objetos arbitrarios. En su lugar, una clase de objeto se debe asignar a un archivo de asignacin, marcado con una anotacin, registrado en el contador de referencias, o tener una clase base comn. Consulte las otras secciones de este captulo para determinar cmo funcionar su O / X de la tecnologa de eleccin arregla esto.
16.2.2 Unmarshaller

Similar a la Marshaller , existe la org.springframework.oxm.Unmarshaller interfaz.


pblico Unmarshaller interfaz { / ** * Unmarshals la Fuente determinado, siempre en un grfico de objetos. * / Objeto unmarshal (fuente Fuente) lanza XmlMappingException, IOException; }

Esta interfaz tambin dispone de un mtodo, que se lee de la propuesta javax.xml.transform.Source (una abstraccin de entrada XML), y devuelve el objeto de leer. Como resultado, la Fuente es una interfaz de marcado que tiene tres implementaciones concretas. Cada envuelve una diferente representacin XML, como se indica en la siguiente tabla.
Source implementacin DOMSource SAXSource StreamSource

Wraps representacin XML


org.w3c.dom.Node org.xml.sax.InputSource , y org.xml.sax.XMLReader java.io.File , java.io.InputStream o java.io.Reader

A pesar de que hay dos interfaces separadas de clasificacin ( Marshaller y Unmarshaller ), todas las implementaciones se encuentran en primavera-WS implementar tanto en una clase. Esto significa que usted puede cablear una clase marshaller y se refieren a ella tanto como un contador de referencias y una unmarshaller en su applicationContext.xml .
16.2.3 XmlMappingException

Primavera convierte excepciones de la herramienta de mapeo subyacente O / X a su jerarqua propia excepcin con el XmlMappingException como la excepcin raz. Como era de esperar, estas excepciones de tiempo de ejecucin envuelva la excepcin original por lo que no se perder informacin.

Adems, el MarshallingFailureException y UnmarshallingFailureException proporcionar una distincin entre clasificacin y unmarshalling operaciones, aunque el valor subyacente O / X herramienta de mapeo no lo hace. La jerarqua de Mapeo O / X excepcin se muestra en la siguiente figura:

O / X Mapping jerarqua de excepciones

16.3 Uso Marshaller y Unmarshaller


OXM resorte se puede utilizar para una amplia variedad de situaciones. En el siguiente ejemplo, vamos a utilizar para ordenar los parmetros de una aplicacin Springadministrado como un archivo XML. Vamos a utilizar un JavaBean simple para representar la configuracin:
Configuracin public class { booleano privado fooEnabled; public boolean isFooEnabled () { fooEnabled retorno; } public void setFooEnabled (booleano fooEnabled) { . esto = fooEnabled fooEnabled; } }

La aplicacin utiliza esta clase de frijol para guardar sus ajustes. Adems de un mtodo principal, la clase tiene dos mtodos: saveSettings() guarda el grano de configuracin en un archivo llamado settings.xml y loadSettings() carga estas configuraciones nuevamente. Un main() mtodo construye un contexto de aplicacin de primavera, y llama a estos dos mtodos.
importar java.io.FileInputStream; importar java.io.FileOutputStream; java.io.IOException importacin; javax.xml.transform.stream.StreamResult importacin; importar javax.xml.transform.stream.StreamSource; org.springframework.context.ApplicationContext importacin;

org.springframework.context.support.ClassPathXmlApplicationContext importacin; org.springframework.oxm.Marshaller importacin; org.springframework.oxm.Unmarshaller importacin; Aplicacin public class { private String static final FILE_NAME = "settings.xml"; Ajustes Ajustes Ajustes privados = new (); marshaller Marshaller privado; unmarshaller Unmarshaller privado; public void setMarshaller (Marshaller marshaller) { este marshaller = marshaller.; } public void setUnmarshaller (Unmarshaller unmarshaller) { este unmarshaller = unmarshaller.; } public void SaveSettings () throws IOException { FileOutputStream os = null; try { os = new FileOutputStream (FILE_NAME); este marshaller.marshal (ajustes, el nuevo StreamResult (os)).; Finally {} if (os! = null) { os.close (); } } } public void LoadSettings () throws IOException { FileInputStream es = null; try { es = new FileInputStream (FILE_NAME); esta configuracin = (Ajustes) este unmarshaller.unmarshal (nuevo StreamSource (es))..; Finally {} if (est! = null) { is.close (); } } } public static void main (String [] args) throws IOException { ApplicationContext appContext = nuevo ClassPathXmlApplicationContext ("applicationContext.xml"); Aplicacin = Application (Aplicacin) appContext.getBean ("demanda"); application.saveSettings (); application.loadSettings (); } }

La Application requiere un contador de referencias y la propiedad unmarshaller a ajustar. Podemos hacerlo utilizando el siguiente applicationContext.xml :
<beans>

<bean id = "application" class = "Application"> <propiedad nombre = "marshaller" ref = "castorMarshaller" /> <propiedad nombre = "unmarshaller" ref = "castorMarshaller" /> </ Bean> <bean id = "castorMarshaller" class = "org.springframework.oxm.castor.CastorMarshaller" /> </ Beans>

Este contexto aplicacin utiliza Castor, pero podramos haber utilizado alguno de los casos que se describen Marshaller ms adelante en este captulo. Tenga en cuenta que Castor no es necesario realizar ninguna configuracin adicional de forma predeterminada, por lo que la definicin de bean es bastante simple. Tambin tenga en cuenta que la CastorMarshaller implementa Marshaller y Unmarshaller , por lo que se puede referir a la castorMarshaller frijol tanto en el contador de referencias y la propiedad unmarshaller de la aplicacin. Esta aplicacin de ejemplo produce el siguiente settings.xml del archivo:
<? Xml version = "1.0" encoding = "UTF-8"> <settings foo-enabled = "false" />

16,4 XML basado en esquemas de configuracin


Sealeros se podra configurar de forma ms concisa de usar las etiquetas del espacio de nombres OXM. Para hacer que estas etiquetas disponibles, el esquema adecuado tiene que ser referenciado primero en el prembulo del archivo de configuracin XML. Nota relacionada con el texto "OXM" a continuacin:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: OXM = "http://www.springframework.org/schema/oxm" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm.xsd ">

En la actualidad, las etiquetas estn disponibles las siguientes:


jaxb2-marshaller xmlbeans-marshaller jibx-marshaller

Cada etiqueta se explica en la seccin marshaller su respectivo. A modo de ejemplo, sin embargo, as es como la configuracin de un sealero jaxb2 podra ser:
<oxm:jaxb2-marshaller id = "marshaller" contextPath = "org.springframework.ws.samples.airline.schema" />

16,5 JAXB

El compilador JAXB vinculante traduce un esquema XML de W3C en una o ms clases de Java, un jaxb.properties archivos, y posiblemente algunos archivos de recursos. JAXB tambin ofrece una manera de generar un esquema de clases Java anotadas. Spring soporta el API JAXB 2.0 como XML estrategias de clasificacin, siguiendo las Marshaller y Unmarshaller interfaces descritas en la Seccin 16.2, "Marshaller y Unmarshaller" . Las clases de integracin correspondientes residen en el paquete org.springframework.oxm.jaxb.
16.5.1 Jaxb2Marshaller

El Jaxb2Marshaller clase implementa la primavera Marshaller y Unmarshaller interfaz. Se requiere una ruta de contexto para operar, lo cual se puede establecer mediante la propiedad contextPath. La ruta de contexto es una lista de puntos (:) separados nombres paquete Java que contienen esquema de clases derivadas. Tambin ofrece una propiedad classesToBeBound, que le permite establecer una serie de clases con el apoyo de la marshaller. Validacin del esquema se realiza mediante la especificacin de uno o ms de los recursos de esquema para el frijol, as:
<beans> <bean id = "jaxb2Marshaller" class = "org.springframework.oxm.jaxb.Jaxb2Marshaller"> <propiedad nombre = "classesToBeBound"> <list> <valor> org.springframework.oxm.jaxb.Flight </ value> <valor> org.springframework.oxm.jaxb.Flights </ value> </ List> </ Propiedad> <propiedad nombre = valor = "schema" "classpath:org/springframework/oxm/schema.xsd" /> </ Bean> ... </ Beans>

XML Schema configuracin basada en

El jaxb2-marshaller etiqueta configura un


org.springframework.oxm.jaxb.Jaxb2Marshaller

. Aqu est un ejemplo:

<oxm:jaxb2-marshaller id = "marshaller" contextPath = "org.springframework.ws.samples.airline.schema" />

Por otra parte, la lista de clases para unirse se puede proporcionar al contador de referencias a travs de la class-to-be-bound etiqueta secundaria:
<oxm:jaxb2-marshaller id = "marshaller"> nombre = <oxm:class-to-be-bound "org.springframework.ws.samples.airline.schema.Airport" /> nombre = <oxm:class-to-be-bound "org.springframework.ws.samples.airline.schema.Flight" /> ... </ OXM: jaxb2-marshaller>

Los atributos disponibles son:


Atributo
id

Descripcin

Necesario

la identificacin de la marshaller no no

contextPath la ruta de contexto JAXB

16,6 Castor
Castor mapeo XML es un marco de cdigo abierto XML vinculantes. Te permite transformar los datos contenidos en un modelo de objetos java en / de un documento XML. Por defecto, no se requiere ninguna configuracin adicional, aunque un archivo de asignacin se puede utilizar para tener ms control sobre el comportamiento de ricino. Para obtener ms informacin acerca de Castor, consulte el sitio web de ricino . Las clases de integracin Spring residen en el paquete org.springframework.oxm.castor.
16.6.1 CastorMarshaller

Como con JAXB, la CastorMarshaller implementa tanto el Marshaller y Unmarshaller interfaz. Puede ser cableado como sigue:
<beans> <bean id = "castorMarshaller" class = "org.springframework.oxm.castor.CastorMarshaller" /> ... </ Beans>

16.6.2 Mapeo

Aunque es posible confiar en el comportamiento de Castor predeterminado de maniobra, puede ser necesario tener ms control sobre l. Esto se puede lograr utilizando un archivo de asignacin de ricino. Para obtener ms informacin, consulte Asignacin de Castor XML . La asignacin se puede establecer utilizando la propiedad del recurso mappingLocation, se indican a continuacin con un recurso de ruta de clase.
<beans> <bean id = "castorMarshaller" class = "org.springframework.oxm.castor.CastorMarshaller"> <propiedad nombre = valor = "mappingLocation" "classpath:mapping.xml" /> </ Bean> </ Beans>

16,7 XMLBeans
XMLBeans es una herramienta XML vinculante que tiene soporte completo de esquema XML, y ofrece un completo conjunto de informacin XML fidelidad. Se necesita un enfoque diferente a la de la mayora de los otros frameworks de mapeo O / X, en la que todas las clases que se generan a partir de un esquema XML se derivan de XmlObject , y contienen informacin XML obligatorio en todos ellos. Para obtener ms informacin sobre XMLBeans, consulte el sitio web XMLBeans . Las clases de integracin WS Primavera-residen en el paquete org.springframework.oxm.xmlbeans.
16.7.1 XmlBeansMarshaller

El XmlBeansMarshaller implementa tanto el Marshaller y Unmarshaller interfaces. Puede ser configurado como sigue:
<beans> <bean id = "xmlBeansMarshaller" class = "org.springframework.oxm.xmlbeans.XmlBeansMarshaller" /> ... </ Beans>

Nota

Tenga en cuenta que el XmlBeansMarshaller slo puede reunir objetos de tipo XmlObject , y no todos los java.lang.Object .
XML Schema configuracin basada en

El xmlbeans-marshaller etiqueta configura un


org.springframework.oxm.xmlbeans.XmlBeansMarshaller <oxm:xmlbeans-marshaller id = "marshaller" />

. Aqu est un ejemplo:

Los atributos disponibles son:


Atributo
id

Descripcin la identificacin de la marshaller

Necesario no

el nombre del bean de los XmlOptions que se va a utilizar para este options contador de referencias. Tpicamente un XmlOptionsFactoryBean definicin

no

16,8 JiBX

El marco JiBX ofrece una solucin similar a la que JDO prev ORM: una definicin vinculante que define las reglas de cmo los objetos Java se convierte en o desde XML. Despus de preparar la unin y la compilacin de las clases, un compilador JiBX vinculante mejora los archivos de clase, y aade cdigo para manejar los casos de conversin de las clases desde o hacia XML. Para obtener ms informacin sobre JiBX, consulte el sitio web JiBX . Las clases de integracin Spring residen en el paquete org.springframework.oxm.jibx.
16.8.1 JibxMarshaller

El JibxMarshaller clase implementa la Marshaller y Unmarshaller interfaz. Para que funcione, se requiere el nombre de la clase para reunir en que se puede establecer mediante la propiedad targetClass. Opcionalmente, se puede establecer el nombre del enlace con la propiedad bindingName. En el ejemplo siguiente, nos obligar a la Flights clase:
<beans> <bean id = "jibxFlightsMarshaller" class = "org.springframework.oxm.jibx.JibxMarshaller"> <propiedad nombre => "targetClass" org.springframework.oxm.jibx.Flights </ propiedad> </ Bean> ...

Un JibxMarshaller est configurado para una sola clase. Si desea reunir varias clases, usted tiene que configurar varias JibxMarshaller s con diferentes valores targetClass propiedad.
XML Schema configuracin basada en

El jibx-marshaller etiqueta configura un


org.springframework.oxm.jibx.JibxMarshaller

. Aqu est un ejemplo:

Los atributos disponibles son:


Atributo
id

Descripcin la identificacin de la marshaller

Necesario no s

target-class la clase de objetivo para este marshaller

bindingName el nombre del enlace que utiliza esta marshaller no

16,9 XStream

XStream es una biblioteca simple para serializar objetos a XML y viceversa. No requiere ninguna asignacin, y genera limpio XML. Para obtener ms informacin sobre XStream, consulte el sitio web XStream . Las clases de integracin Spring residen en el paquete org.springframework.oxm.xstream.
16.9.1 XStreamMarshaller

El XStreamMarshaller no requiere ninguna configuracin, y puede configurarse en un contexto de aplicacin directa. Para personalizar an ms el XML, se puede establecer un mapa de alias, que consta de los alias de cadena asignados a clases:
<beans> <bean id = "xstreamMarshaller" class = "org.springframework.oxm.xstream.XStreamMarshaller"> <propiedad nombre = "aliases"> <props> <prop clave = "Flight"> org.springframework.oxm.xstream.Flight </ prop> </ Accesorios> </ Propiedad> </ Bean> ... </ Beans>

Advertencia

De forma predeterminada, permite XStream clases arbitrarias que se unmarshalled, lo que puede dar lugar a problemas de seguridad. Por lo tanto, se recomienda establecer la propiedad supportedClasses en el XStreamMarshaller , de este modo:
<bean id = "xstreamMarshaller" class = "org.springframework.oxm.xstream.XStreamMarshaller"> <propiedad nombre = valor = "supportedClasses" "org.springframework.oxm.xstream.Flight" /> ... </ Bean>

Esto se asegurar de que slo las clases registradas son elegibles para unmarshalling. Adems, puede registrar convertidores personalizados para asegurarse de que slo las clases de apoyo se puede unmarshalled.
Nota

Tenga en cuenta que XStream es una biblioteca de serializacin XML, no una biblioteca de enlace de datos. Por lo tanto, tiene un apoyo limitado espacio de nombres. Como tal, es bastante inadecuado para uso dentro de los servicios Web.

Parte V. La Web

Esta parte de la documentacin de referencia abarca el apoyo Spring Framework para el nivel de presentacin (y especficamente basados en la web capas de presentacin). El criterio de la Spring Framework web propio, Spring Web MVC , se cubre en el primer par de captulos. Varios de los captulos restantes de esta parte de la documentacin de referencia se refieren a la integracin de la infraestructura de Spring con otras tecnologas web, como Struts y JSF (por nombrar slo dos). Esta seccin concluye con una cobertura de Spring MVC portlet marco .

Captulo 17, Web MVC marco Captulo 18, las tecnologas View Captulo 19, Integracin con otros frameworks web Captulo 20, Portlet MVC Framework

17. Web MVC marco 17.1 Introduccin a Spring Web MVC marco
La Red Spring modelo-vista-controlador (MVC) est diseado en torno a un DispatcherServlet que despacha las peticiones a los manipuladores, con asignaciones de controlador configurable, ver la resolucin, la configuracin regional y la resolucin de tema, as como soporte para la carga de archivos. El manejador por defecto se basa en el @Controller y @RequestMapping anotaciones, ofreciendo una amplia gama de mtodos de manipulacin flexibles. Con la introduccin de la Primavera 3.0, el @Controller mecanismo tambin permite crear sitios Web RESTful y aplicaciones, a travs del @PathVariable anotacin y otras caractersticas. "Abierto por extensin ..." Uno de los principios clave de diseo en Spring Web MVC y en la primavera, en general, es el "Open de extensin, cerrada por modificacin" principio. Algunos mtodos de las clases bsicas de Spring Web MVC estn marcados final . Como desarrollador no puede reemplazar estos mtodos para abastecer su propio comportamiento. Esto no se ha hecho arbitrariamente, pero especficamente con este principio en mente. Para una explicacin de este principio, vase Expert Spring Web MVC y Web Flow por Seth Ladd y otros, en concreto vea la seccin "Una mirada a Design", en la pgina 117 de la primera edicin. Alternativamente, vase 1. Bob Martin, El principio abierto-cerrado (PDF) No se puede agregar asesoramiento a los mtodos definitivos cuando se utiliza Spring MVC. Por ejemplo, no puede agregar asesoramiento al AbstractController.setSynchronizeOnSession() mtodo. Consulte la Seccin 9.6.1, "Descripcin de proxies AOP" para ms informacin sobre servidores proxy AOP y por qu no se puede aadir a los mtodos de asesoramiento finales.

En Spring Web MVC se puede utilizar cualquier objeto como un objeto de comando o forma de respaldo-, usted no necesita implementar un marco especfico de interfaz o clase base. Vinculante primavera de datos es muy flexible, por ejemplo, trata los tipos no coincidentes como los errores de validacin que pueden ser evaluados por la aplicacin, no como errores del sistema. Por lo tanto no es necesario duplicar las propiedades de los objetos de negocios como cadenas simples, sin tipo de objetos de formulario simple para manejar las comunicaciones no vlidos, o para convertir las cadenas correctamente. En su lugar, a menudo es preferible para unirse directamente a los objetos de su negocio. Resolucin de Spring vista es extremadamente flexible. Un Controller es normalmente responsable de la preparacin de un modelo de Map con los datos y la seleccin de un nombre de vista, pero tambin puede escribir directamente en la secuencia de respuesta y completar la solicitud. Ver resolucin nombre es altamente configurable a travs de la extensin de archivo o contenido de la cabecera Accept negociacin tipo, a travs de nombres de frijol, un archivo de propiedades, o incluso una costumbre ViewResolver implementacin. El modelo (la M en MVC) es un Map de la interfaz, la cual permite la abstraccin completa de la tecnologa de vista. Usted puede integrar directamente con las tecnologas de la plantilla de representacin basados tales como JSP, Velocity y Freemarker, o directamente generar XML, JSON, Atom, y muchos otros tipos de contenido. El modelo de Map simplemente se transforma en un formato apropiado, tal como atributos de la peticin JSP, un modelo de plantilla Velocity.
17.1.1 Caractersticas de Spring Web MVC

Spring Web Flow Spring Web Flow (SWF) aspira a ser la mejor solucin para la gestin del flujo de la pgina web de la aplicacin. SWF se integra con los marcos existentes como Spring MVC, Struts y JSF, tanto en entornos de servlets y portlets. Si usted tiene un proceso de negocio (o procesos) que se beneficiaran de un modelo conversacional en lugar de un modelo puramente peticin, entonces SWF puede ser la solucin. SWF le permite capturar los flujos de pginas lgicas como mdulos autnomos que son reutilizables en diferentes situaciones, y por lo tanto es ideal para la construccin de mdulos de aplicaciones web que guan al usuario a travs de navegaciones controladas que los procesos de unidad de negocio. Para obtener ms informacin acerca de SWF, consulte el sitio web de Spring Web Flow . Mdulo de Spring Web incluye muchas caractersticas nicas de soporte Web:

Una clara separacin de roles. Cada funcin - controlador, validador, objeto de comando, objeto de formulario, objeto modelo, DispatcherServlet , asignacin de controlador, resolucin de vista, y as sucesivamente - se puede cumplir por un objeto especializado.

Configuracin de gran alcance y directa de ambas clases de aplicacin y marco como JavaBeans. Esta capacidad de configuracin incluye referencias fciles a travs de contextos, como el de los controladores web a los objetos de negocio y validadores. Adaptabilidad, no intrusivo, y la flexibilidad. Defina cualquier firma de mtodo controlador que necesita, posiblemente usando una de las anotaciones de parmetros (como @ RequestParam, RequestHeader @, @ PathVariable, y ms) para un escenario dado. Cdigo reutilizable empresa, sin necesidad de duplicacin. Utilice los objetos de negocio existentes como objetos de comando o formulario en lugar de reflejar a extender una clase marco bsico particular. Encuadernacin personalizable y validacin. Tipos no coincidentes como los errores de validacin de nivel de aplicacin que mantienen el valor ofender, fecha localizada y vinculante nmero, y as sucesivamente en vez de objetos String de slo formulario con el anlisis manual y conversin a los objetos de negocio. Asignacin de controlador personalizable y la resolucin de vista. Asignacin de controlador y las estrategias de resolucin de vista van desde la simple direccin URL de configuracin basada, a las estrategias sofisticadas, resolucin de propsito especfico. La primavera es ms flexible que la web frameworks MVC que exigen una tcnica particular. Modelo flexible de transferencia. Modelo con la transferencia de un nombre / valor Map soporta una fcil integracin con cualquier tecnologa de visin. Locale adaptable y resolucin tema, el soporte para JSP con o sin biblioteca de etiquetas de primavera, el apoyo a JSTL, el apoyo para la velocidad sin la necesidad de puentes adicionales, y as sucesivamente. Un simple pero potente biblioteca de etiquetas JSP conocida como la biblioteca de etiquetas de primavera que ofrece soporte para funciones tales como la unin de datos y temas. Las etiquetas personalizadas permiten una gran flexibilidad en trminos de cdigo marcado. Para obtener informacin sobre el descriptor de biblioteca de etiquetas, consulte el apndice titulado Apndice G, spring.tld Una biblioteca de etiquetas JSP forma, introducido en la primavera de 2,0, que hace que escribir las formas en las pginas JSP mucho ms fcil. Para obtener informacin sobre el descriptor de biblioteca de etiquetas, consulte el apndice titulado Apndice H, primavera-form.tld Beans cuyo ciclo de vida est en el mbito de la actual solicitud HTTP o HTTP Session . Esto no es una caracterstica especfica de Spring MVC en s, sino ms bien de la WebApplicationContext recipiente (s) que utiliza Spring MVC. Estos mbitos de frijol se describen en la Seccin 5.5.4, "Solicitud, sesin y mbitos global de sesin"

17.1.2 enchufabilidad de otras implementaciones de MVC

Non-Spring MVC implementaciones son preferibles para algunos proyectos. Muchos equipos esperan aprovechar su inversin existente en las habilidades y herramientas. Una gran cantidad de conocimientos y experiencias existen para el marco de trabajo Struts. Si usted puede cumplir los defectos arquitectnicos de Struts, puede ser una opcin viable para la capa web, y lo mismo se aplica a WebWork y otros frameworks web MVC.

Si no desea utilizar web de Spring MVC, pero la intencin de aprovechar otras soluciones que Spring ofrece, usted puede integrar el marco MVC web de su eleccin con Spring fcilmente. Simplemente inicie una raz Spring contexto de la aplicacin a travs de su ContextLoaderListener , y acceder a ella a travs de su ServletContext atributo (o mtodo auxiliar respectivo Spring) desde dentro de Struts o acciones WebWork. No "plug-ins" estn involucrados, por lo que no es necesaria la integracin especfica. Desde el punto de la capa web de vista, slo tiene que usar Spring como una biblioteca, con la instancia de solicitud raz de contexto como punto de entrada. Los frijoles y servicios inscritos Spring puede ser a su alcance, incluso sin Web Spring MVC. Primavera no compite con Struts o WebWork en este escenario. Simplemente se ocupa de las muchas reas que los puros web frameworks MVC no lo hacen, desde la configuracin de frijol para el acceso de datos y gestin de transacciones. As que usted puede enriquecer su aplicacin con un nivel medio de Primavera y / o nivel de acceso a datos, incluso si slo desea utilizar, por ejemplo, la abstraccin de transacciones con JDBC o Hibernate.

17.2 El DispatcherServlet
Web de Spring MVC es, al igual que muchas otras web frameworks MVC, de solicitudimpulsado, diseado alrededor de un Servlet central que distribuye las solicitudes a los controladores y ofrece otras funcionalidades que facilitan el desarrollo de aplicaciones web. Spring DispatcherServlet sin embargo, hace mucho ms que eso. Est completamente integrado con el contenedor Spring IoC y, como tal, le permite usar todas las otras caractersticas que la primavera tiene. El flujo de trabajo de procesamiento de la solicitud de la Spring Web MVC DispatcherServlet se ilustra en el siguiente diagrama. El lector modelo-comprensin reconocern que la DispatcherServlet es una expresin del patrn de diseo "Front Controller" (este es un patrn que se Spring Web MVC comparte con muchos otros frameworks web ms importantes).

El flujo de trabajo de procesamiento de solicitudes en Spring Web MVC (nivel alto) El DispatcherServlet es un verdadero Servlet (se hereda de la HttpServlet clase base), y como tal se declara en el web.xml de la aplicacin web. Debe corresponder las peticiones que desea que el DispatcherServlet de manejar, con una asignacin de direccin URL en el mismo web.xml archivo. Este es el estndar Java EE configuracin de servlet, el siguiente ejemplo muestra una DispatcherServlet declaracin y asignacin:
<web-app> <servlet> <servlet-name> ejemplo </ servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </ servlet-clase> <load-on-startup> 1 </ load-on-startup> </ Servlet> <servlet-mapping> <servlet-name> ejemplo </ servlet-name> <url-pattern> / ejemplo / * </ url-pattern> </ Servlet-mapping> </ Web-app>

En el ejemplo anterior, todas las peticiones que empiezan por /example ser manejada por el DispatcherServlet instancia con nombre example . En un entorno de Servlet 3.0 +, usted tambin tiene la opcin de configurar el contenedor de Servlets programacin. A continuacin se muestra el cdigo equivalente basado en lo anterior web.xml ejemplo:
MyWebApplicationInitializer clase pblica implementa WebApplicationInitializer { @ Override public void OnStartup (ServletContext contenedor) { ServletRegistration.Dynamic registro = container.addServlet ("dispatcher", nueva DispatcherServlet ()); registration.setLoadOnStartup (1); registration.addMapping ("/ ejemplo / *"); } } WebApplicationInitializer

es una interfaz proporcionada por Spring MVC que asegura que su cdigo de configuracin basada en que se detecta y utiliza automticamente para inicializar cualquier Servlet 3 recipiente. Una implementacin de la clase base abstracta de este interace llamado AbstractDispatcherServletInitializer hace que sea an ms fcil de registrar el DispatcherServlet simplemente especificando su asignacin servlet. Ver cdigo basado en la inicializacin del contenedor de Servlets para ms detalles. Lo anterior es slo el primer paso en la creacin de Spring Web MVC. Ahora debe configurar los granos diversos utilizados por el Spring Web MVC (ms all de la DispatcherServlet s mismo). Como se detalla en la Seccin 5.14, "Capacidades adicionales de la ApplicationContext " , ApplicationContext instancias en primavera puede ser cubierto. En el marco Web MVC, cada DispatcherServlet tiene su propio WebApplicationContext , que hereda todos los granos ya definidos en la raz WebApplicationContext . Estos granos hereditarias pueden suprimirse en el mbito especfico de servlet, y se puede definir nuevos especficas alcance en grano local para una instancia de servlet determinado.

Contexto jerarqua en Spring Web MVC

En la inicializacin de una DispatcherServlet , Spring MVC busca un archivo llamado [servlet-name]-servlet.xml en la WEB-INF directorio de la aplicacin web y crea los beans definidos all, ignorando las definiciones de cualquier beans definidos con el mismo nombre en el mbito global. Considere lo siguiente DispatcherServlet configuracin de servlet (en el web.xml archivo):
<web-app> <servlet> <servlet-name> golf </ servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </ servlet-clase> <load-on-startup> 1 </ load-on-startup> </ Servlet> <servlet-mapping> <servlet-name> golf </ servlet-name> <url-pattern> / golf / * </ url-pattern> </ Servlet-mapping> </ Web-app>

Con la configuracin de servlet anterior en su lugar, usted tendr que tener un archivo llamado /WEB-INF/ golf -servlet.xml en su aplicacin, este archivo contendr todos tus Spring Web MVC componentes especficos (frijoles). Puede cambiar la ubicacin

exacta de este archivo de configuracin a travs de un parmetro de inicializacin de servlet (ver ms abajo para ms detalles). El WebApplicationContext es una extensin de la llanura ApplicationContext que tiene algunas caractersticas adicionales necesarias para las aplicaciones web. Se diferencia de una normal ApplicationContext en que es capaz de resolver los temas (vase la Seccin 17,9, "Uso de temas" ), y que se sabe que Servlet que est asociado con (por tener un enlace a la ServletContext ). El WebApplicationContext est ligada en el ServletContext , y usando mtodos estticos en el RequestContextUtils clase siempre se puede buscar el WebApplicationContext si usted necesita el acceso a la misma.
17.2.1 Tipos de alubias especiales En el WebApplicationContext

La primavera DispatcherServlet utiliza beans especiales para procesar las solicitudes y hacer las visitas correspondientes. Estos frijoles son parte de Spring MVC. Se puede elegir que los granos especiales para poder usar simplemente la configuracin de uno o ms de ellos en el WebApplicationContext . Sin embargo, usted no necesita hacer eso desde un principio Spring MVC mantiene una lista de beans predeterminada para utilizar si no se configura ninguna. Ms sobre esto en la siguiente seccin. Primero consulte la tabla siguiente enumera los tipos de frijol especiales del DispatcherServlet basa. Tabla 17.1. Los tipos especiales de frijol en el WebApplicationContext
Frijol tipo Explicacin Mapas de solicitudes de entrada a los controladores y una lista de pre-y post-procesadores (manejador de interceptores) en base a unos criterios cuyos detalles varan segn HandlerMapping implementacin. La aplicacin ms popular compatible con los controladores anotados pero otras implementaciones existe tambin. Ayuda al DispatcherServlet para invocar un manejador asignado a una solicitud, independientemente del manejador se invoca realmente. Por ejemplo, la invocacin de un controlador anotado requiere resolver varias anotaciones. As, el propsito principal de un HandlerAdapter es proteger el DispatcherServlet de tales detalles. Mapas de excepciones a las vistas tambin permite cdigo de manejo de excepciones ms compleja. Resuelve lgicas basadas en cadenas nombres de las vistas a verdaderos View tipos. Resuelve el locale un cliente est utilizando, con el fin de ser capaz

HandlerMapping

HandlerAdapter

HandlerExceptionResolver

ViewResolver LocaleResolver

Frijol tipo

Explicacin de ofrecer puntos de vista internacionalizados

ThemeResolver

Resuelve temas de su aplicacin web puede utilizar, por ejemplo, para ofrecer diseos personalizados Analiza varias partes solicitudes de ejemplo para apoyar la carga de procesamiento de archivos de formularios HTML. Almacena y recupera el "input" y "output" FlashMap que se puede utilizar para transferir los atributos de una solicitud a otra, generalmente a travs de un redireccionamiento.

MultipartResolver

FlashMapManager

17.2.2 Configuracin predeterminada DispatcherServlet

Como se mencion en la seccin anterior para cada bean especial la DispatcherServlet mantiene una lista de las implementaciones de utilizar por defecto. Esta informacin se guarda en el archivo DispatcherServlet.properties en el paquete org.springframework.web.servlet . Todos los frijoles especiales tienen algunos valores razonables de los suyos. Tarde o temprano, aunque tendr que modificar una o ms de las propiedades de estos granos proporcionan. Por ejemplo, es bastante comn para configurar un InternalResourceViewResolver configuracin de su prefix propiedad a la ubicacin de los archivos de vista padre. Independientemente de los detalles, el concepto importante de entender aqu es que una vez que se configura un grano especial, como un InternalResourceViewResolver en su WebApplicationContext , que efectivamente reemplazar la lista de implementaciones predeterminadas que se habran utilizado de otra manera para ese tipo de frijol especial. Por ejemplo, si se configura un InternalResourceViewResolver , la lista predeterminada de ViewResolver implementaciones se ignora. En la Seccin 17.15, "Configuracin de Spring MVC" usted aprender acerca de otras opciones de configuracin de Spring MVC MVC incluyendo Java y configuracin del espacio de nombres XML MVC ambos proporcionan un punto de partida sencillo y asumir poco conocimiento de cmo funciona Spring MVC. Independientemente de cmo decida configurar la aplicacin, los conceptos explicados en esta seccin son fundamentales deberan ser de ayuda para usted.
17.2.3 Secuencia de procesamiento DispatcherServlet

Despus de configurar un DispatcherServlet , y llega una solicitud para ese usuario especfico DispatcherServlet , el DispatcherServlet empieza a procesar la solicitud de la siguiente manera:

1. El WebApplicationContext se busca y atado en la solicitud como un atributo que el controlador y otros elementos en el proceso puede utilizar. Est obligado por defecto en la clave DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE . 2. La resolucin de localizacin est unido a la solicitud de que los elementos en el proceso de resolver la localizacin para su empleo en el tratamiento de la solicitud (haciendo que el punto de vista, la preparacin de datos, y as sucesivamente). Si usted no necesita configuracin regional de resolucin, que no lo necesita. 3. El sistema de resolucin tema est unido a la peticin para que elementos tales como vistas determinar qu tema usar. Si usted no utiliza temas, puede ignorarlo. 4. Si se especifica una resolucin de archivo de varias partes, la solicitud se inspecciona para Multiparts, si Multiparts se encuentran, la solicitud se envuelve en una MultipartHttpServletRequest para su transformacin por otros elementos en el proceso. Consulte Seccin 17.10, "multipart Spring (carga de archivos) de apoyo" para obtener ms informacin sobre el manejo de varias partes. 5. Un controlador apropiado est buscado. Si un controlador se encuentra, la cadena de ejecucin asociado con el controlador (preprocesadores, postprocesadores y controladores) se ejecuta con el fin de preparar un modelo o representacin. 6. Si un modelo se devuelve la vista es renderizada. Si no se devuelve modelo, (puede ser debido a un preprocesador o postprocesador interceptar la peticin, tal vez por razones de seguridad), no hay vista es renderizada, porque la solicitud ya podra haber sido cumplida. Resolucin de manejador de excepciones que se declaran en el WebApplicationContext recoger excepciones que se producen durante el procesamiento de la solicitud. El uso de estos solucionadores de excepcin permite definir comportamientos personalizados para abordar las excepciones. El Spring DispatcherServlet tambin apoya el regreso de la ltima modificacin con la fecha, tal como se especifica por el Servlet API. El proceso de determinar la fecha de la ltima modificacin de una solicitud especfica es sencillo: el DispatcherServlet busca una asignacin de controlador apropiado y comprueba si el controlador que se encuentra implementa la LastModified interfaz. Si es as, el valor de la long getLastModified(request) mtodo de la LastModified interfaz se devuelve al cliente. Puede personalizar cada DispatcherServlet casos aadiendo los parmetros de inicializacin del servlet ( init-param elementos) a la declaracin de Servlet en el web.xml archivo. Consulte la tabla siguiente para obtener una lista de parmetros compatibles. Tabla 17.2. DispatcherServlet parmetros de inicializacin
Parmetro Explicacin

Parmetro

Explicacin Clase que implementa WebApplicationContext , lo que crea una instancia del contexto utilizado por este Servlet. Por defecto, el XmlWebApplicationContext se utiliza.

contextClass

Cadena que se pasa a la instancia de contexto (especificado por contextClass ) para indicar donde el contexto (s) se puede encontrar. La cadena se compone de varias cadenas contextConfigLocation potencialmente (utilizando una coma como delimitador) para apoyar mltiples contextos. En el caso de los lugares de contexto mltiples con frijoles que se definen en dos ocasiones, la ltima ubicacin tiene prioridad.
namespace

Espacio de nombres de la WebApplicationContext . El valor predeterminado es [servlet-name]-servlet .

17,3 Controladores de ejecucin


Controladores de proporcionar acceso a la comportamiento de la aplicacin que normalmente se definen a travs de una interfaz de servicio. Controladores de interpretar la entrada del usuario y transformarla en un modelo que se representa al usuario por la vista. Spring implementa un controlador de una manera muy abstracta, que le permite crear una amplia variedad de controladores. Spring 2,5 introdujo un modelo de programacin basado en anotacin para los controladores de MVC que utiliza anotaciones tales como @RequestMapping , @RequestParam , @ModelAttribute , y as sucesivamente. Este apoyo anotacin est disponible tanto para Servlet MVC MVC Portlet y. Los controladores implementados en este estilo no tiene que extender las clases especficas de base o implementar interfaces especficas. Adems, por lo general no tienen dependencias directas en Servlet o las API de portlets, aunque usted puede configurar fcilmente el acceso a las instalaciones de servlet o portlet.
Punta

Disponible en el repositorio de muestras , una serie de aplicaciones web de aprovechar el soporte de anotaciones describe en esta seccin incluyendo MvcShowcase, MvcAjax, MvcBasic, PetClinic, PetCare, y otros.
@ Controller pblico HelloWorldController clase { @ RequestMapping ("/ helloWorld") pblico helloWorld String (modelo Modelo) { model.addAttribute ("mensaje", "Hello World!"); return "Hola Mundo"; } }

Como se puede ver, el @Controller y @RequestMapping anotaciones permiten nombres de mtodos flexibles y firmas. En este ejemplo particular, el mtodo acepta un Model y devuelve un nombre de vista como una String , pero varios otros parmetros de mtodo y valores de retorno se puede utilizar como se explica ms adelante en esta seccin. @Controller y @RequestMapping y un nmero de otras anotaciones de base para la aplicacin Spring MVC. Esta seccin documenta estas anotaciones y cmo son los ms utilizados en un entorno Servlet.
17.3.1 Definicin de un controlador con @Controller

El @Controller anotacin indica que una clase particular sirve la funcin de un controlador. Primavera no es necesario para otorgar ninguna clase base del controlador o hacer referencia a la API Servlet. Sin embargo, usted todava puede hacer referencia a Servlet caractersticas especficas si es necesario. El @Controller anotacin acta como un estereotipo de la clase anotada, indicando su funcin. El operador escanea tales clases anotadas para los mtodos de mapeado y detecta @RequestMapping anotaciones (vase la seccin siguiente). Puede definir frijoles anotados controlador explcitamente, utilizando una definicin estndar de frijol de primavera en el contexto del despachador. Sin embargo, el @Controller estereotipo tambin permite la deteccin automtica, alineado con el soporte de Spring general para detectar clases de componentes en las definiciones de frijol classpath y auto-registrarse para ellos. Para habilitar la deteccin automtica de dichos controladores anotadas, se agrega barrido componente a su configuracin. Utilice el esquema de contexto de resorte como se muestra en el fragmento de cdigo XML siguiente:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: p = "http://www.springframework.org/schema/p" xmlns: context = "http://www.springframework.org/schema/context" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/springcontext.xsd "> <context:component-scan base-package = "org.springframework.samples.petclinic.web" /> <-! ... </ Beans> ->

17.3.2 Las solicitudes de asignacin con @RequestMapping

Se utiliza el @RequestMapping anotacin a las URL del mapa tales como /appointments a toda una clase o un mtodo de control particular. Normalmente la clase de nivel de anotacin de mapas de una ruta de solicitud especfico (o patrn de

ruta) en un controlador de formulario, con adicionales de nivel de mtodo anotaciones estrechando la asignacin primaria para un mtodo de peticin HTTP mtodo especfico ("GET", "POST", etc) o una peticin HTTP condicin parmetro. El siguiente ejemplo de la muestra Petcare muestra un controlador en una aplicacin Spring MVC que utiliza esta anotacin:
@ Controller @ RequestMapping ("/" citas) pblico AppointmentsController clase { appointmentBook privado AppointmentBook final; @ Autoconectados pblico AppointmentsController (AppointmentBook appointmentBook) { este appointmentBook = appointmentBook.; } @ RequestMapping (method = RequestMethod.GET) Mapa <String, pblico Appointment> get () { volver appointmentBook.getAppointmentsForToday (); } @ RequestMapping (value = "/ {da}", method = RequestMethod.GET) Mapa del pblico <String, Appointment> getForDay (@ @ PathVariable DateTimeFormat (iso = ISO.DATE) da Fecha, modelo Modelo) { volver appointmentBook.getAppointmentsForDay (da); } @ RequestMapping (value = "/ nuevo", method = RequestMethod.GET) pblico AppointmentForm getNewForm () { volver AppointmentForm nuevo (); } @ RequestMapping (method = RequestMethod.POST) public String add (cita @ AppointmentForm vlido, resultado BindingResult) { si (result.hasErrors ()) { return "citas / nuevos"; } appointmentBook.addAppointment (cita); volver "reorientar citas :/"; } }

En el ejemplo, la @RequestMapping se utiliza en un nmero de lugares. El primer uso es del tipo (clase) de nivel, que indica que todos los mtodos de manipulacin de este controlador son relativos a la /appointments camino. El get() mtodo tiene una mayor @RequestMapping refinamiento: slo acepta peticiones GET, lo que significa que un HTTP GET para /appointments invoca a este mtodo. El post() tiene un refinamiento similar, y el getNewForm() combina la definicin de mtodo HTTP y ruta de acceso en una sola, de modo que las solicitudes GET de appointments/new estn a cargo de ese mtodo.

El getForDay() mtodo muestra otro uso de @RequestMapping : plantillas URI. (Consulte la seccin siguiente ). Un @RequestMapping en el nivel de clase no es necesario. Sin l, todos los caminos son simplemente absoluta y relativa no. El siguiente ejemplo de la aplicacin de ejemplo PetClinic muestra un controlador multi-accin utilizando @RequestMapping :
@ Controller pblico ClinicController clase { clnica privada Clnica final; @ Autoconectados pblico ClinicController (Clnica clnica) { esta clnica clnica =.; } @ RequestMapping ("/") welcomeHandler public void () { } @ RequestMapping ("/" veteranos) pblico vetsHandler ModelMap () { return new ModelMap (esto clinic.getVets ().); } }

Usando @RequestMapping En los Mtodos de interfaz

Un error comn cuando se trabaja con clases de controlador comentadas sucede cuando se aplica la funcionalidad que requiere la creacin de un proxy para el objeto controlador (por ejemplo, @Transactional mtodos). Por lo general, introducir una interfaz para el controlador con el fin de utilizar proxies dinmicos JDK. Para que esto funcione debe mover los @RequestMapping anotaciones, as como cualquier otro tipo y nivel de mtodo anotaciones (por ejemplo, @ModelAttribute , @InitBinder ) a la interfaz, as como el mecanismo de asignacin slo puede "ver" la interfaz expuesta por el proxy. Como alternativa, puede activar el proxy-target-class="true" en la configuracin de la funcionalidad aplicada al controlador (en nuestro escenario de transaccin en <tx:annotation-driven /> ). Si lo hace, indica que CGLIB proxies basados en la subclase debe ser utilizado en lugar de la interfaz basada en proxies JDK. Para obtener ms informacin sobre los diversos mecanismos de proxies ver Seccin 9.6, "mecanismos de proxies nativa" . Tenga en cuenta sin embargo que las anotaciones mtodo argumento, por ejemplo, @RequestParam , deben estar presentes en las firmas de los mtodos de la clase del controlador.
Nuevas clases de apoyo para @RequestMapping mtodos en Spring MVC 3.1

Spring 3.1 introdujo una nueva serie de clases de apoyo para @RequestMapping mtodos llamados RequestMappingHandlerMapping y RequestMappingHandlerAdapter respectivamente. Se recomienda su uso e incluso

obligados a tomar ventaja de las nuevas caractersticas de Spring MVC 3.1 y en el futuro. Las nuevas clases de apoyo estn habilitados de forma predeterminada por el espacio de nombres y el MVC MVC config Java, pero se debe configurar explcitamente si se utiliza ninguno. Esta seccin describe algunas diferencias importantes entre las antiguas y las nuevas clases de apoyo. Antes de la primavera de 3,1, el tipo y nivel de mtodo asignaciones solicitud se examinaron en dos etapas separadas - un controlador fue seleccionado por primera vez por el DefaultAnnotationHandlerMapping y el mtodo actual para invocar fue reducido luego por los AnnotationMethodHandlerAdapter . Con las nuevas clases de apoyo en Spring 3.1, el RequestMappingHandlerMapping es el nico lugar donde se toma una decisin sobre el mtodo a procesar la solicitud. Piense de mtodos de controlador como una coleccin de puntos finales nicos, con asignaciones para cada mtodo derivado del tipo y nivel de mtodo @RequestMapping informacin. Esto permite nuevas posibilidades. Por una vez un HandlerInterceptor o un HandlerExceptionResolver ahora puede esperar que el controlador basado en objetos a ser un HandlerMethod , lo que les permite examinar el mtodo exacto, sus parmetros y anotaciones asociadas. El procesamiento de una URL ya no necesita ser dividido en diferentes controladores. Tambin hay varias cosas que ya no es posible:

Seleccionar un controlador primero con un SimpleUrlHandlerMapping o BeanNameUrlHandlerMapping y luego reducir el mtodo basado en @RequestMapping anotaciones. Confe en los nombres de mtodo como un mecanismo de retroceso para eliminar la ambigedad entre dos @RequestMapping mtodos que no tienen una asignacin explcita ruta ruta URL pero por lo dems coincide igualmente, por ejemplo, por el mtodo HTTP. En las clases de apoyo a los nuevos @RequestMapping mtodos tienen que ser asignada de forma exclusiva. Tener un mtodo nico defecto (sin una asignacin de ruta explcita) con la que se procesan las solicitudes si no coincide con otro mtodo de control ms concreta. En las clases de apoyo a nuevas si un mtodo de emparejamiento no se encuentra un error 404 se eleva.

Las caractersticas anteriores son an compatibles con las clases de apoyo existentes. Sin embargo, para aprovechar las nuevas caractersticas de Spring MVC 3.1 que tendr que utilizar las nuevas clases de apoyo.
Los patrones de URI de plantilla

Plantillas URI puede ser utilizado para facilitar el acceso a determinadas partes de una URL en un @RequestMapping mtodo. Una plantilla URI es una cadena URI-like, que contiene uno o ms nombres de variables. Al sustituir los valores de estas variables, la plantilla se convierte en un URI. El RFC propuesto para las plantillas URI define cmo un URI tiene parmetros. Por

ejemplo, la plantilla URI http://www.example.com/users/{userId} contiene el userId variable. Asignacin de la fred valor a los rendimientos variables http://www.example.com/users/fred . En la primavera de MVC puede utilizar el @PathVariable anotacin en un argumento de mtodo para enlazar con el valor de una variable de plantilla URI:
@ RequestMapping (valor = "/ propietarios / {ID_PROPIETARIO}", method = RequestMethod.GET) findOwner public String (Cadena @ PathVariable ID_PROPIETARIO, modelo Modelo) { Propietario Propietario = ownerService.findOwner (ID_PROPIETARIO); model.addAttribute ("propietario", el dueo); return "displayOwner"; }

La plantilla URI " /owners/{ownerId} "especifica el nombre de la variable ownerId . Cuando el controlador maneja esta peticin, el valor de ownerId se establece en el valor que se encuentra en la parte apropiada de la URI. Por ejemplo, cuando llega una solicitud para /owners/fred , el valor de ownerId es fred .
Punta

Para procesar la anotacin @ PathVariable, Spring MVC tiene que encontrar la variable de plantilla URI coincidente por su nombre. Puede especificar esta opcin en la anotacin:
@ RequestMapping (valor = "/ propietarios / {ID_PROPIETARIO}", method = RequestMethod.GET) findOwner public String (@ PathVariable ("ID_PROPIETARIO") theOwner String, modelo Modelo) { / / Implementacin omitido }

O si la plantilla URI nombre de la variable coincide con el nombre del argumento mtodo se puede omitir ese detalle. Mientras que el cdigo no se compila sin informacin de depuracin, Spring MVC coincidir con el nombre del argumento mtodo para el nombre de plantilla URI variable:
@ RequestMapping (valor = "/ propietarios / {ID_PROPIETARIO}", method = RequestMethod.GET) findOwner public String (Cadena @ PathVariable ID_PROPIETARIO, modelo Modelo) { / / Implementacin omitido }

Un mtodo puede tener cualquier nmero de @PathVariable anotaciones:


@ RequestMapping (valor = "/ propietarios / {} ID_PROPIETARIO / mascotas / {petId}", method = RequestMethod.GET) public String findPet (@ Cadena PathVariable ID_PROPIETARIO, @ PathVariable Cadena petId, modelo Modelo) { Propietario Propietario = ownerService.findOwner (ID_PROPIETARIO); = Owner.getPet para mascotas (petId);

model.addAttribute ("PET", pet); return "displayPet"; }

Cuando un @PathVariable anotacin se utiliza en un Map<String, String> argumento, el mapa se completa con todas las variables de la plantilla URI. Una plantilla URI puede ser montado desde el nivel del tipo y la ruta anotaciones @ RequestMapping. Como resultado, el findPet() mtodo puede ser invocado con una URL como /owners/42/pets/21 .
@ Controller @ RequestMapping ("/ propietarios / {ID_PROPIETARIO}") pblico RelativePathUriTemplateController clase { @ RequestMapping ("/ mascotas / {petId}") public void findPet (@ Cadena PathVariable ID_PROPIETARIO, @ PathVariable Cadena petId, modelo Modelo) { / / Implementacin omitido } }

A @PathVariable argumento puede ser de cualquier tipo simple como int, Fecha larga,, Spring etc convierte automticamente al tipo adecuado o lanza una TypeMismatchException si no lo hace. Tambin puede registrar compatibilidad para analizar los tipos de datos adicionales. Vea la seccin titulada "Parmetros de mtodo y de conversin de tipo" y la seccin "Personalizacin WebDataBinder inicializacin " .
Los patrones de URI plantilla con expresiones regulares

A veces se necesita una mayor precisin en la definicin de las variables de la plantilla URI. Considere la URL "/spring-web/spring-web-3.0.5.jar" . Cmo se dividen en varias partes? El @RequestMapping anotacin apoya el uso de expresiones regulares en las variables de la plantilla URI. La sintaxis es {varName:regex} donde la primera parte se define el nombre de la variable y el segundo - el ejemplo expression.For regular:
@ RequestMapping ("/ muelle-web / {SymbolicName: [az-] +} -. {.. Versin: \ d \ \ d \ \ d {}. Extensin: \ [az]}") mango public void (@ version Cadena PathVariable, extensin @ PathVariable cadena) { / / ... } }

Patrones de trayectoria

Adems de las plantillas URI, el @RequestMapping anotacin tambin es compatible con los patrones de estilo hormiga ruta (por ejemplo, /myPath/*.do ). Una combinacin de plantillas URI y globs estilo Ant-tambin es compatible (por ejemplo, /owners/*/pets/{petId} ).

Los patrones con comodines

Patrones en @RequestMapping anotaciones apoyar $ {...} marcadores de posicin en contra de las propiedades locales y / o las propiedades del sistema y variables de entorno. Esto puede ser til en los casos en que la trayectoria est asignado a un controlador puede necesitar ser personalizado mediante la configuracin. Para obtener ms informacin sobre los marcadores de posicin para ver el Javadoc PropertyPlaceholderConfigurer .
Variables de matriz

El URI especificacin RFC 3986 define la posibilidad de incluir pares nombre-valor dentro de los segmentos de trazado. No existe un trmino especfico utilizado en la especificacin. Los parmetros generales "ruta URI" podra aplicarse aunque el ms nico "URI Matrix" , procedente de una entrada antigua por Tim Berners-Lee, es tambin de uso frecuente y conocido bastante bien. Dentro Spring MVC estos se conocen como variables de matriz. Las variables matriciales pueden aparecer en cualquier segmento de la ruta, cada variable de matriz separados por un ";" (punto y coma). Por ejemplo: "/cars;color=red;year=2012" . Varios valores pueden ser "," (coma) separados "color=red,green,blue" o el nombre de la variable se puede repetir "color=red;color=green;color=blue" . Si una URL que debe contener las variables de la matriz, el patrn de asignacin de solicitud debe representar con una plantilla URI. Esto asegura que la solicitud se puede emparejar correctamente, independientemente de si las variables de matriz est presente o no y en qu orden se proporcionan. A continuacin se muestra un ejemplo de la extraccin de la matriz variable "q":
/ / GET / pets/42, q = 11, r = 22 @ RequestMapping (valor = "/ mascotas / {petId}", method = RequestMethod.GET) public void findPet (@ PathVariable Cadena petId, @ MatrixVariable int q) { / / PetId == 42 / / Q == 11 }

Dado que todos los segmentos de trazado puede contener variables de la matriz, en algunos casos, es necesario ser ms especfico para identificar donde la variable se espera que sean:
/ / GET / owners/42, q = 11/pets/21, q = 22 @ RequestMapping (valor = "/ propietarios / {} ID_PROPIETARIO / mascotas / {petId}", method = RequestMethod.GET) findPet public void (

@ MatrixVariable (value = "q", pathVar = "ID_PROPIETARIO") q1 int, @ MatrixVariable (value = "q", pathVar = "petId") int q2) { / / Q1 == 11 / / Q2 == 22 }

Una variable de matriz puede ser definido como opcional y un valor predeterminado especificado:
/ / GET / pets/42 @ RequestMapping (valor = "/ mascotas / {petId}", method = RequestMethod.GET) public void findPet (@ MatrixVariable (required = true, defaultValue = "1") int q) { / / Q == 1 }

Todas las variables de la matriz pueden ser obtenidos en un mapa:


/ / GET / owners/42, q = 11, r = 12/pets/21, q = 22, s = 23 @ RequestMapping (valor = "/ propietarios / {} ID_PROPIETARIO / mascotas / {petId}", method = RequestMethod.GET) findPet public void ( @ Mapa MatrixVariable <String, matrixVars String>, @ MatrixVariable (pathVar = "" "petId) Mapa <String, petMatrixVars String>) { / / MatrixVars: ["q": [11,22], "r": 12, "s": 23] / / PetMatrixVars: ["q": 11, "s": 23] }

Tenga en cuenta que para habilitar el uso de variables de matriz, debe establecer el removeSemicolonContent propiedad de RequestMappingHandlerMapping a false . Por defecto est configurado a true , con la excepcin del espacio de nombres y el MVC MVC Java config tanto de lo que automticamente permite el uso de variables de matriz.
Tipos de soportes consumibles

Puede restringir la asignacin primaria mediante la especificacin de una lista de tipos de medios de consumo. La solicitud deber ir acompaada slo si el encabezado Content-Type peticin coincide con el tipo de papel especificado. Por ejemplo:
@ Controller @ RequestMapping (valor = "/ mascotas", method = RequestMethod.POST, consume = "application / json") public void addPet (@ RequestBody para mascotas, modelo Modelo) { / / Implementacin omitido }

Consumibles expresiones de tipos de medios tambin pueden ser negados como en! Text / plain hacer coincidir a todas las solicitudes que no tengan tipo de contenido de text / plain.
Punta

El consume condicin se admite en el tipo y en el nivel de mtodo. A diferencia de la mayora de otras condiciones, cuando se utilizan en el nivel de tipo, nivel de tipos de mtodos de consumo anular en lugar de ampliar tipo tipos de nivel de consumo.
Tipos de medios producible

Puede restringir la asignacin primaria mediante la especificacin de una lista de tipos de medios producibles. La solicitud deber ir acompaada slo si el encabezado de la solicitud Accept coincide con uno de estos valores. Adems, el uso de la condicin produce garantiza el tipo de contenido real utilizado para generar la respuesta respeta los tipos de medios especificadas en la condicin produce. Por ejemplo:
@ Controller @ RequestMapping (value = "/ mascotas / petId {}", method = RequestMethod.GET, produce = "application / json") @ ResponseBody pblico Pet getPet (@ petId PathVariable String, modelo Modelo) { / / Implementacin omitido }

Al igual que con consume, producibles expresiones de tipos de medios pueden ser negados como en! Text / plain para igualar a todas las solicitudes que no tengan un valor de la cabecera Accept de text / plain.
Punta

La condicin produce se admite en el tipo y en el nivel de mtodo. A diferencia de la mayora de otras condiciones, cuando se utilizan en el nivel de tipo, nivel de mtodo tipos producibles anular en lugar de ampliar tipo tipos de nivel producibles.
Parmetros de la peticin y los valores de la cabecera

Puedes filtrar solicitud correspondiente a travs de las condiciones de parmetros de la peticin como "myParam" , "!myParam" , o "myParam=myValue" . Las dos primeras pruebas de la presencia de una orden de parmetro / ausencia y el tercero por un valor de parmetro especfico. He aqu un ejemplo con una condicin de peticin valor de parmetro:
@ Controller @ RequestMapping ("/ propietarios / {ID_PROPIETARIO}") pblico RelativePathUriTemplateController clase { @ RequestMapping (value = "/ mascotas / petId {}", method = RequestMethod.GET, params = "myParam = myValue")

public void findPet (@ Cadena PathVariable ID_PROPIETARIO, @ PathVariable Cadena petId, modelo Modelo) { / / Implementacin omitido } }

Lo mismo se puede hacer para determinar la presencia solicitud encabezado / ausencia o para que coincida con base en un valor de encabezado de la peticin especfica:
@ Controller @ RequestMapping ("/ propietarios / {ID_PROPIETARIO}") pblico RelativePathUriTemplateController clase { @ RequestMapping (valor = "/ mascotas", method = RequestMethod.GET, headers = "myHeader = myValue") public void findPet (@ Cadena PathVariable ID_PROPIETARIO, @ PathVariable Cadena petId, modelo Modelo) { / / Implementacin omitido } }

Punta

Aunque se pueden combinar para Content-Type y aceptar los valores del encabezado utilizando tarjetas de memoria de tipo salvaje (por ejemplo, "contenttype = text / *" coincidir con "text / plain" y "text / html"), se recomienda el uso de la consume y produce condiciones respectivamente en su lugar. Ellos estn destinados especficamente para ese fin.
17.3.3 Definir @RequestMapping mtodos de controlador

Un @RequestMapping mtodo de control puede tener una firma muy flexibles. Los argumentos de los mtodos admitidos y valores de retorno se describen en la siguiente seccin. La mayora de los argumentos pueden usarse en un orden arbitrario con la nica excepcin de BindingResult argumentos. Esto se describe en la siguiente seccin.
Nota

Spring 3.1 introdujo una nueva serie de clases de apoyo para @RequestMapping mtodos llamados RequestMappingHandlerMapping y RequestMappingHandlerAdapter respectivamente. Se recomienda su uso e incluso obligados a tomar ventaja de las nuevas caractersticas de Spring MVC 3.1 y en el futuro. Las nuevas clases de apoyo estn habilitadas por defecto del espacio de nombres MVC y con el uso de la configuracin MVC Java, pero se debe configurar explcitamente si se utiliza ninguno.
Los tipos de los argumentos de mtodo

Los siguientes son los argumentos de los mtodos admitidos:

Solicitud o una respuesta objetos (Servlet API). Elija cualquier peticin especfica o tipo de respuesta, por ejemplo ServletRequest o HttpServletRequest . Sesin de objeto (Servlet API): de tipo HttpSession . Un argumento de este tipo refuerza la presencia de una sesin correspondiente. Como consecuencia de ello, este argumento nunca es null .
Nota

Sesin de acceso puede no ser seguro para subprocesos, en particular en un entorno de Servlet. Considere las RequestMappingHandlerAdapter 's "synchronizeOnSession" bandera "true" si mltiples peticiones pueden acceder a una sesin al mismo tiempo.

Permite un acceso genrico parmetro de la peticin, as como la peticin / sesin de acceso de atributo, sin vnculos con el nativo de Servlet / Portlet API. java.util.Locale para la configuracin regional solicitud actual, determinada por la resolucin de localizacin ms especfica disponible, en efecto, el configurada LocaleResolver en un entorno de Servlet. java.io.InputStream / java.io.Reader para acceder al contenido de la solicitud. Este valor es el InputStream crudo / Lector segn lo expuesto por el API Servlet. java.io.OutputStream / java.io.Writer para la generacin de contenido de la respuesta. Este valor es el escritor de crudo OutputStream / as expuestos por el API Servlet. java.security.Principal que contiene el usuario actualmente autenticado. @PathVariable parmetros anotados para el acceso a las variables de la plantilla URI. Vea la seccin llamada "Patrones de plantilla URI" . @MatrixVariable parmetros anotados para el acceso a los pares de nombre y valor ubicadas en segmentos de ruta URI. Consulte la seccin "Variables Matrix" . @RequestParam parmetros anotados para el acceso a determinados parmetros Servlet solicitud. Los valores de parmetros se convierten al tipo de mtodo argumento declarado. Vea la seccin titulada "Parmetros de solicitud de enlace a los parmetros del mtodo con @RequestParam " . @RequestHeader parmetros anotados para el acceso a determinados Servlet solicitud de cabeceras HTTP. Los valores de parmetros se convierten al tipo de mtodo argumento declarado. @RequestBody parmetros anotados para el acceso al cuerpo de la peticin HTTP. Los valores de parmetros se convierten al tipo de mtodo argumento declaran usando HttpMessageConverter s. Consulte la seccin "Asignacin de cuerpo de la solicitud con la anotacin @ RequestBody" . @RequestPart anotados parmetros para el acceso al contenido de una parte de la solicitud "multipart / form-data". Consulte Seccin 17.10.5, "Cmo manejar un archivo de solicitud de carga de los clientes programticas" y la Seccin 17.10, "(carga de archivos) de varias partes de primavera de apoyo" . HttpEntity<?> parmetros de acceso a las cabeceras HTTP Servlet solicitud y contenidos. La secuencia de la solicitud se puede convertir en el cuerpo de la

entidad utilizando HttpMessageConverter s. Vea la seccin titulada "Uso HttpEntity<?> " . java.util.Map / org.springframework.ui.Model / org.springframework.ui.ModelMap para enriquecer el modelo implcito que est expuesta a la vista web.
org.springframework.web.servlet.mvc.support.RedirectAttributes

para especificar el conjunto exacto de atributos para usar en caso de una redireccin y tambin para agregar atributos de flash (atributos almacenados temporalmente en el lado del servidor para que estn disponibles para la solicitud despus de la redireccin). RedirectAttributes se utiliza en lugar del modelo implcito si el mtodo devuelve un "redireccionamiento:" nombre con prefijo vista o RedirectView . Los objetos de comando o la forma de obligar a los parmetros de solicitud a travs de las propiedades de frijol (setters) o directamente a los campos, con la conversin de tipos personalizable, dependiendo @InitBinder mtodos y / o la configuracin de HandlerAdapter. Ver el webBindingInitializer propiedad en RequestMappingHandlerAdapter . Tales objetos de comando junto con sus resultados de validacin se exponen como atributos del modelo por defecto, utilizando el nombre de clase de clase de comando - por ejemplo atributo model "orderAddress" para un objeto de comando del tipo "some.package.OrderAddress". El ModelAttribute anotacin se puede utilizar en un argumento del mtodo para personalizar el nombre de atributo modelo utilizado. org.springframework.validation.Errors / org.springframework.validation.BindingResult resultados de la validacin de un comando anterior o la forma del objeto (el argumento del mtodo anterior). org.springframework.web.bind.support.SessionStatus mango estado marcado por el procesamiento del formulario lo ms completo, lo que desencadena la limpieza de los atributos de la sesin que han sido sealados por las @SessionAttributes anotacin en el nivel de tipo de controlador. org.springframework.web.util.UriComponentsBuilder un constructor para la preparacin de una direccin URL relativa al host de la solicitud actual, el puerto, plan, ruta de contexto, y la parte literal de la correlacin de servlet.

Los Errors o BindingResult parmetros tienen que seguir el modelo de objeto que se est enlazando inmediatamente como la firma del mtodo puede tener ms que un objeto de modelo y la primavera creara una BindingResult instancia para cada uno de ellos para que el ejemplo siguiente no funcionar: Ejemplo 17,1. Invalid orden de ModelAttribute BindingResult y @
@ RequestMapping (method = RequestMethod.POST) pblico processSubmit String (ModelAttribute @ ("PET") para mascotas, Modelo modelo, resultado BindingResult) {...}

Tenga en cuenta que hay un Model parmetro entre Pet y BindingResult . Para que esto funcione tienes que cambiar el orden de los parmetros de la siguiente manera:
@ RequestMapping (method = RequestMethod.POST) pblico processSubmit String (ModelAttribute @ ("PET") para mascotas,

Resultado BindingResult, modelo Modelo) {...}

Los tipos de mtodos de devolucin

Los siguientes son los tipos de devolucin compatibles:

A ModelAndView objeto, con el modelo implcitamente enriquecido con objetos de comando y los resultados de @ModelAttribute mtodos anotados de datos de referencia de acceso. Un Model objeto, con el nombre de la vista determina implcitamente a travs de un RequestToViewNameTranslator y el modelo implcitamente enriquecido con objetos de comando y los resultados de @ModelAttribute mtodos anotados de datos de referencia de acceso. Un Map de objetos para la exposicin de un modelo, con el nombre de la vista determina implcitamente a travs de un RequestToViewNameTranslator y el modelo implcitamente enriquecido con objetos de comando y los resultados de @ModelAttribute mtodos anotados de datos de referencia de acceso. A View objeto, con el modelo implcitamente determinado a travs de objetos de comando y @ModelAttribute datos anotados de referencia los mtodos de acceso. El mtodo de control de programacin tambin puede enriquecer el modelo de la declaracin de un Model argumento (vase ms arriba). Una String valor que se interpreta como el nombre de la vista lgico, con el modelo implcitamente determinado a travs de objetos de comando y @ModelAttribute datos anotados de referencia los mtodos de acceso. El mtodo de control de programacin tambin puede enriquecer el modelo de la declaracin de un Model argumento (vase ms arriba). void si el mtodo se encarga de la respuesta en s misma (por escrito el contenido de la respuesta directa, declarando un argumento de tipo ServletResponse / HttpServletResponse para tal fin) o si el nombre de la vista que se supone que de forma implcita a travs de un determinado RequestToViewNameTranslator (no declarar un argumento de respuesta en el firma controlador de mtodos). Si el mtodo est anotado con @ResponseBody , el tipo de retorno se escribe en el cuerpo de la respuesta HTTP. El valor de retorno se convierte al tipo de mtodo argumento declaran usando HttpMessageConverter s. Consulte la seccin "Asignacin de cuerpo de la respuesta con el @ResponseBody anotacin ". Un HttpEntity<?> o ResponseEntity<?> objeto de proporcionar acceso a las cabeceras HTTP de respuesta Servlet y contenidos. El cuerpo de la entidad ser convertida a la secuencia de respuesta utilizando HttpMessageConverter s. Vea la seccin titulada "Uso HttpEntity<?> " . A Callable<?> se puede devolver cuando la aplicacin necesita para producir el valor de retorno de forma asincrnica en un subproceso administrado por Spring MVC. A DeferredResult<?> se puede devolver cuando la aplicacin necesita para producir el valor de retorno de un hilo de su propia eleccin. Cualquier otro tipo de retorno es considerada como un atributo de un modelo nico de estar expuestos a la vista, utilizando el nombre del atributo especificado por @ModelAttribute en el nivel de mtodo (o el nombre del atributo

predeterminado basado en el nombre y vuelta en clase de tipos). El modelo est implcitamente enriquecido con objetos de comando y los resultados de @ModelAttribute mtodos anotados de referencia de datos de acceso.
Los parmetros de unin de solicitud a los parmetros del mtodo con
@RequestParam

Utilice el @RequestParam anotacin para enlazar parmetros de la peticin a un parmetro de mtodo en el controlador. El fragmento de cdigo siguiente se muestra el uso de:
@ Controller @ RequestMapping ("/ mascotas") @ SessionAttributes ("PET") pblico EditPetForm clase { / / ... @ RequestMapping (method = RequestMethod.GET) pblico setupForm String (@ RequestParam ("petId") int petId, modelo ModelMap) { Para mascotas = esta clinic.loadPet (petId).; model.addAttribute ("PET", pet); return "petForm"; } / / ...

Los parmetros que utilizan esta anotacin estn obligadas por defecto, pero se puede especificar que un parmetro es opcional estableciendo @RequestParam 's required atributo a false (por ejemplo, @RequestParam(value="id", required=false) ). Conversin de tipos se aplica automticamente si el mtodo de destino tipo de parmetro no es String . Consulte la seccin "Parmetros de mtodos y reconversin" .
Cartografa del cuerpo de la solicitud con la anotacin @ RequestBody

El @RequestBody mtodo de anotacin parmetro indica que un parmetro de mtodo debe ser vinculado al valor del cuerpo de la peticin HTTP. Por ejemplo:
@ RequestMapping (value = "/ algo", method = RequestMethod.PUT) mango public void (@ body Cadena RequestBody, escritor Escritor) throws IOException { writer.write (cuerpo); }

Convertir el cuerpo de la solicitud para el argumento del mtodo mediante el uso de un HttpMessageConverter . HttpMessageConverter es responsable de convertir el mensaje de peticin de HTTP a un objeto y la conversin de un objeto en el cuerpo de la respuesta HTTP. Los RequestMappingHandlerAdapter apoya la @RequestBody anotacin con los predeterminados siguientes HttpMessageConverters :

ByteArrayHttpMessageConverter convierte matrices de bytes. StringHttpMessageConverter convierte las cadenas. FormHttpMessageConverter convierte los datos del formulario a /

desde un

String> <String, MultiValueMap. SourceHttpMessageConverter convierte a / desde un javax.xml.transform.Source.

Para obtener ms informacin acerca de estos convertidores, vea Convertidores de mensajes . Tambin tenga en cuenta que si se utiliza el espacio de nombres MVC MVC o la configuracin de Java, una amplia gama de convertidores de mensajes estn registrados por defecto. Consulte Activacin de la MVC Java Config o el espacio de nombres XML MVC para ms informacin. Si tiene la intencin de leer y escribir XML, tendr que configurar el MarshallingHttpMessageConverter con un especfico Marshaller y un Unmarshaller aplicacin de la org.springframework.oxm paquete. El siguiente ejemplo muestra cmo hacerlo directamente en su configuracin, pero si la aplicacin est configurada a travs del espacio de nombres o el MVC MVC Java config ver Habilitacin del MVC Java Config o el espacio de nombres XML MVC en su lugar.
<bean class = "org.springframework.web.servlet.mvc.method.annotation.RequestMappingH andlerAdapter"> <propiedad nombre = "messageConverters"> <util:list id = "beanList"> <ref frijol = "stringHttpMessageConverter" /> <ref frijol = "marshallingHttpMessageConverter" /> </ Util: Lista> </ Propiedad </ Bean> <Bean id = "stringHttpMessageConverter" class = "org.springframework.http.converter.StringHttpMessageConverter" /> <Bean id = "marshallingHttpMessageConverter" class = "org.springframework.http.converter.xml.MarshallingHttpMessageConverte r"> <propiedad nombre = "marshaller" ref = "castorMarshaller" /> <propiedad nombre = "unmarshaller" ref = "castorMarshaller" /> </ Bean> <bean id = "castorMarshaller" class = "org.springframework.oxm.castor.CastorMarshaller" />

Un @RequestBody parmetro de mtodo puede ser anotado con @Valid , en cuyo caso ser validada mediante el configurada Validator ejemplo. Cuando se utiliza el espacio de nombres MVC MVC o la configuracin de Java, un validador de JSR-303 se configura automticamente suponiendo una implementacin JSR-303 est disponible en el classpath. Al igual que con @ModelAttribute parmetros, una Errors argumento puede ser utilizado para examinar los errores. Si este argumento no se declara, una

MethodArgumentNotValidException DefaultHandlerExceptionResolver

ser levantado. La excepcin se maneja en la , que enva un 400 error de vuelta al cliente.

Nota

Tambin vea Habilitacin de la MVC Java Config o el espacio de nombres XML MVC para obtener informacin sobre la configuracin de los convertidores y validadores un mensaje a travs del espacio de nombres MVC MVC o la configuracin de Java.
Cartografa del cuerpo de la respuesta con el @ResponseBody anotacin

El @ResponseBody anotacin es similar a @RequestBody . Esta anotacin se puede poner en un mtodo e indica que el tipo de retorno debe ser escrito directamente al cuerpo de la respuesta HTTP (y no se coloca en un modelo, o interpretado como un nombre de vista). Por ejemplo:
@ RequestMapping (value = "/ algo", method = RequestMethod.PUT) @ ResponseBody pblico helloWorld String () { return "Hola Mundo"; }

En el ejemplo anterior, se incurrir en el texto Hello World se escriben en la secuencia de respuesta HTTP. Al igual que con @RequestBody , Spring convierte el objeto devuelto a un cuerpo de la respuesta mediante el uso de un HttpMessageConverter . Para obtener ms informacin acerca de estos convertidores, vea la seccin anterior y convertidores de mensajes .
Uso de HttpEntity<?>

El HttpEntity es similar a @RequestBody y @ResponseBody . Adems de tener acceso a la solicitud y cuerpo de la respuesta, HttpEntity (y la respuesta subclase especfica de ResponseEntity ) tambin permite el acceso a la solicitud y las cabeceras de respuesta, as:
@ RequestMapping ("/ algo") ResponseEntity pblico mango <String> (HttpEntity <byte []> requestEntity) throws UnsupportedEncodingException { . Cadena RequestHeader requestEntity.getHeaders = () GetFirst ("MyRequestHeader")); byte [] = requestBody requestEntity.getBody (); / / Hacer algo con el encabezado de la solicitud y el cuerpo ResponseHeaders HttpHeaders = new HttpHeaders (); responseHeaders.set ("MyResponseHeader", "MyValue"); volver <String> ResponseEntity nuevo ("Hello World", responseHeaders, HttpStatus.CREATED); }

El ejemplo anterior se obtiene el valor de la MyRequestHeader encabezado de la solicitud, y lee el cuerpo como una matriz de bytes. Aade la MyResponseHeader a la respuesta, escribe Hello World la secuencia de respuesta, y se establece el cdigo de estado de respuesta al 201 (de creacin). Al igual que con @RequestBody y @ResponseBody , Spring utiliza HttpMessageConverter para convertir desde y para la solicitud y arroyos de respuesta. Para obtener ms informacin acerca de estos convertidores, vea la seccin anterior y convertidores de mensajes .
Usando @ModelAttribute en un mtodo

El @ModelAttribute anotacin se puede utilizar en los mtodos o en los argumentos de mtodo. En esta seccin se explica su uso en mtodos mientras que la seccin siguiente se explica su uso en los argumentos de mtodo. Un @ModelAttribute en un mtodo indica el propsito de que el mtodo es aadir uno o ms atributos del modelo. Tales mtodos de apoyo a los tipos de los argumentos mismos @RequestMapping mtodos, pero no se pueden asignar directamente a las solicitudes. En su lugar @ModelAttribute mtodos en un controlador se invoca antes de @RequestMapping mtodos, dentro del mismo controlador. Un par de ejemplos:
/ / Aadir un atributo / / El valor de retorno del mtodo se aade al modelo bajo el nombre de "cuenta" / / Se puede personalizar el nombre de va ModelAttribute @ ("miCuenta") @ ModelAttribute Cuenta pblico addAccount (@ nmero Cadena RequestParam) { volver accountManager.findAccount (nmero); } / / Aadir mltiples atributos @ ModelAttribute populateModel public void (@ Cadena RequestParam nmero, modelo Modelo) { model.addAttribute (accountManager.findAccount (numero)); / / Aadir ms ... } @ModelAttribute

mtodos se utilizan para rellenar el modelo con atributos comunes necesarios, por ejemplo para llenar una lista desplegable con los Estados o con otros tipos de mascotas, o para recuperar un objeto de comando como cuenta con el fin de utilizarlo para representar los datos en un formulario HTML. El ltimo caso se trata ms detalladamente en la siguiente seccin. Tenga en cuenta los dos estilos de @ModelAttribute mtodos. En el primero, el mtodo aade un atributo implcitamente mediante su retorno. En la segunda, el mtodo acepta un Model y aade cualquier nmero de atributos del modelo a la misma. Puede elegir entre los dos estilos en funcin de sus necesidades.

Un controlador puede tener cualquier nmero de @ModelAttribute mtodos. Todos estos mtodos son invocados antes de @RequestMapping mtodos del mismo controlador.
@ModelAttribute

mtodos tambin se pueden definir en un @ControllerAdvice anotado clase y tales mtodos se aplican a todos los controladores. El @ControllerAdvice anotacin es un componente que permite la anotacin clases de implementacin para detectarse automticamente a travs del escaneo classpath.
Punta

Qu sucede cuando un nombre de atributo modelo no se especifica explcitamente? En tales casos, un nombre predeterminado se asigna al atributo de modelo en base a su tipo. Por ejemplo, si el mtodo devuelve un objeto del tipo Account , el nombre por defecto es "cuenta". Usted puede cambiar esto a travs del valor de la @ModelAttribute anotacin. Si la adicin de atributos directamente al Model , usar apropiadamente sobrecargado addAttribute(..) mtodo - es decir, con o sin un nombre de atributo. El @ModelAttribute anotacin se puede utilizar en @RequestMapping mtodos tambin. En ese caso, el valor de retorno de la @RequestMapping mtodo se interpreta como un atributo de modelo en lugar de como un nombre de vista. El nombre de la vista se deriva de las convenciones de nombre de vista en lugar muy parecido a los mtodos que regresan vaco - ver Seccin 17.12.3, "The View RequestToViewNameTranslator " .
Usando @ModelAttribute en un argumento de mtodo

Como se explica en la seccin anterior @ModelAttribute se puede utilizar en los mtodos o en los argumentos del mtodo. En esta seccin se explica su uso en los argumentos de mtodo. Un @ModelAttribute en un argumento de mtodo indica que el argumento debe ser recuperada a partir del modelo. Si no est presente en el modelo, el argumento debe ser instanciada primero y luego aade al modelo. Una vez presente en el modelo, los campos del argumento debe ser poblada de todos los parmetros de la peticin que tengan nombres coincidentes. Esto se conoce como el enlace de datos en Spring MVC, un mecanismo muy til que te salva de tener que analizar cada campo de forma individual.
@ RequestMapping (valor = "/ propietarios / {} ID_PROPIETARIO / mascotas / {} petId / editar", method = RequestMethod.POST) pblico processSubmit String (@ ModelAttribute para mascotas) { }

Teniendo en cuenta el ejemplo anterior donde puede el ejemplo de mascotas viene? Hay varias opciones:

Puede que ya sea en el modelo debido al uso de @SessionAttributes - vea la seccin "Uso de @SessionAttributes para almacenar atributos del modelo en la sesin HTTP entre las peticiones " . Puede que ya sea en el modelo debido a una @ModelAttribute mtodo en el controlador mismo - como se ha explicado en la seccin anterior. Puede ser recuperada basado en una variable de plantilla URI y convertidor de tipos (que se explica en ms detalle a continuacin). Puede crear una instancia con el constructor por defecto.

Un @ModelAttribute mtodo es una forma comn para recuperar un atributo de la base de datos, que puede almacenarse opcionalmente entre solicitudes a travs del uso de @SessionAttributes . En algunos casos puede ser conveniente para recuperar el atributo mediante el uso de una variable de plantilla URI y un convertidor de tipos. Aqu est un ejemplo:
@ RequestMapping (valor = "/ accounts / {} cuenta", method = RequestMethod.PUT) ahorro pblico String (ModelAttribute @ ("cuenta") cuenta Account) { }

En este ejemplo, el nombre del atributo del modelo (es decir, "cuenta") coincide con el nombre de una variable de plantilla URI. Si se registra Converter<String, Account> que puede convertir la String valor de la cuenta en una Account ejemplo, el ejemplo anterior funcionar sin la necesidad de un @ModelAttribute mtodo. El siguiente paso es el enlace de datos. Los WebDataBinder partidos de la clase de solicitud de parmetro nombres - incluyendo los parmetros de cadena de consulta y campos de formulario a los campos de atributos - modelo por su nombre. Campos de juego estn poblados despus de la conversin de tipos (de cadena en el tipo de campo de destino) se ha aplicado en caso necesario. El enlace de datos y la validacin se tratan en el captulo 7, validacin, conversin de datos Binding, y Tipo . Personalizacin del proceso de enlace de datos para un nivel de control se trata en la seccin titulada "Cmo personalizar WebDataBinder inicializacin " . Como resultado de enlace de datos puede haber errores como la falta de campos obligatorios o errores de conversin de tipos. Para comprobar si hay errores agregar un BindingResult argumento inmediatamente despus de la @ModelAttribute argumento:
@ RequestMapping (valor = "/ propietarios / {} ID_PROPIETARIO / mascotas / {} petId / editar", method = RequestMethod.POST) public String processSubmit (ModelAttribute @ ("PET") para mascotas, resultado BindingResult) { si (result.hasErrors ()) { return "petForm"; } / / ... }

Con un BindingResult se puede comprobar si se han encontrado errores en cuyo caso es comn para representar la misma forma en que los errores pueden ser mostrados con la ayuda de Spring <errors> etiqueta de formulario. Adems de enlace de datos tambin se puede invocar la validacin utilizando su propio validador personalizado que pasa lo mismo BindingResult que se utiliza para registrar los errores de enlace de datos. Esto permite el enlace de datos y los errores de validacin que se acumularon en un solo lugar y posteriormente inform al usuario:
@ RequestMapping (valor = "/ propietarios / {} ID_PROPIETARIO / mascotas / {} petId / editar", method = RequestMethod.POST) public String processSubmit (ModelAttribute @ ("PET") para mascotas, resultado BindingResult) { . PetValidator nuevo () validar (pet, resultado); si (result.hasErrors ()) { return "petForm"; } / / ... }

O usted puede tener validacin invoca automticamente aadiendo el JSR-303 @Valid anotacin:
@ RequestMapping (valor = "/ propietarios / {} ID_PROPIETARIO / mascotas / {} petId / editar", method = RequestMethod.POST) public String processSubmit (@ @ ModelAttribute Vlido ("PET") para mascotas, resultado BindingResult) { si (result.hasErrors ()) { return "petForm"; } / / ... }

Consulte Seccin 7.8, "Spring 3 Validacin" y el captulo 7, Validacin, enlace de datos y conversin de tipos para obtener detalles sobre cmo configurar y utilizar la validacin.
Usando @SessionAttributes para almacenar atributos del modelo en la sesin entre peticiones HTTP

El tipo de nivel @SessionAttributes anotacin declara atributos de sesin utilizados por un controlador especfico. Normalmente, esto mostrar una lista de los nombres de los atributos del modelo o tipo de atributos del modelo que debe ser transparente almacenados en la sesin o algn almacenamiento conversacional, sirviendo de soporte en forma de frijol, entre las solicitudes posteriores. El fragmento de cdigo siguiente muestra el uso de esta anotacin, especificando el nombre del atributo modelo:
@ Controller

@ RequestMapping ("/ editPet.do") @ SessionAttributes ("PET") pblico EditPetForm clase { / / ... }

Nota

Cuando el uso de interfaces de control (por ejemplo, para proxy AOP), asegrese de poner sistemticamente todas las anotaciones de mapeo - tales como @RequestMapping y @SessionAttributes - en la interfaz de controlador y no en la clase de implementacin.
Especificacin de atributos y redirigir Flash

Por defecto todos los atributos del modelo se consideran expuestos como variables de plantilla URI en la direccin URL de redireccionamiento. De los restantes atributos los que son tipos primitivos o colecciones / arrays de tipos primitivos se aaden automticamente como parmetros de consulta. En los controladores anotados sin embargo, el modelo puede contener atributos adicionales aadidos originalmente con fines de reproduccin (por ejemplo, desplegables valores de campo). Para tener un control preciso sobre los atributos utilizados en un escenario de redireccin, un @RequestMapping mtodo puede declarar un argumento de tipo RedirectAttributes y usarlo para agregar atributos para su uso en RedirectView . Si el mtodo de controlador es redirigir, el contenido de RedirectAttributes se utiliza. De lo contrario el contenido de la forma predeterminada Model se utiliza. Los RequestMappingHandlerAdapter proporciona un indicador llamado "ignoreDefaultModelOnRedirect" que se puede utilizar para indicar el contenido de la forma predeterminada Model nunca debe ser utilizado si un redirecciones mtodo de controlador. En cambio, el mtodo controlador debe declarar un atributo de tipo RedirectAttributes o si no lo hace ningn atributo debe ser transmitida a RedirectView . Tanto el espacio de nombres y el MVC MVC Java config mantener este indicador establecido para false con el fin de mantener la compatibilidad hacia atrs. Sin embargo, para las nuevas aplicaciones se recomienda establecerlo en true El RedirectAttributes interfaz tambin se puede utilizar para agregar atributos flash. A diferencia de otros redirigir atributos, que terminan en la meta de URL de redireccionamiento, los atributos de flash se guardan en la sesin HTTP (y por lo tanto no aparecen en la URL). El modelo del controlador de servir al objetivo redirigir URL recibe automticamente los atributos de flash despus de lo cual se retiran de la sesin. Consulte Seccin 17.6, "Uso de atributos de flash" para una visin general del apoyo general para los atributos de flash en Spring MVC.
Trabajar con "application/x-www-form-urlencoded" datos

En las secciones anteriores cubierto uso de @ModelAttribute para apoyar las peticiones de los clientes de la forma de presentacin del explorador. La misma anotacin se recomienda para su uso con las peticiones de los clientes distintas de los

navegadores tambin. Sin embargo, hay una diferencia notable cuando se trata de trabajar con las peticiones PUT HTTP. Los navegadores pueden enviar datos de formulario a travs de HTTP GET o HTTP POST. Tu navegador no los clientes tambin pueden enviar los formularios a travs de HTTP PUT. Esto presenta un desafo porque la especificacin Servlet requiere la ServletRequest.getParameter*() familia de mtodos para facilitar el acceso de campo de formulario slo para HTTP POST, no por HTTP PUT. Para apoyar PUT HTTP y pide parche, la spring-web mdulo proporciona el filtro HttpPutFormContentFilter , que se pueden configurar en web.xml :
<filter> <filter-name> httpPutFormFilter </ filter-name> <filter-class> org.springframework.web.filter.HttpPutFormContentFilter </ filterclase> </ Filter> <filter-mapping> <filter-name> httpPutFormFilter </ filter-name> <servlet-name> DispatcherServlet </ servlet-name> </ Filter-mapping> <servlet> <servlet-name> DispatcherServlet </ servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </ servlet-clase> </ Servlet>

Las intersecciones anteriores filtro HTTP PUT y peticiones parche con el tipo de contenido application/x-www-form-urlencoded , lee los datos del formulario desde el cuerpo de la solicitud, y justifica el ServletRequest con el fin de hacer que los datos del formulario disponible a travs de la ServletRequest.getParameter*() de la familia de mtodos.
Asignacin de valores de cookie con la anotacin @ CookieValue

El @CookieValue anotacin permite un parmetro de mtodo a ser vinculado al valor de una cookie HTTP. Tengamos en cuenta que la cookie siguiente ha sido recibida con una peticin http:
Jsessionid = 415A4AC178C59DACE0B2C9CA727CDD84

El ejemplo de cdigo siguiente se muestra cmo obtener el valor de la JSESSIONID cookie:


@ RequestMapping ("/ displayHeaderInfo.do") public void displayHeaderInfo (@ CookieValue ("JSESSIONID") String cookie) { / / ... }

Conversin de tipos se aplica automticamente si el mtodo de destino tipo de parmetro no es String . Consulte la seccin "Parmetros de mtodos y reconversin" . Esta anotacin es compatible con los mtodos de controlador anotado en Servlets y entornos de portlet.
Asignacin de atributos de la peticin de cabecera con la anotacin @ RequestHeader

El @RequestHeader anotacin permite un parmetro del mtodo que se enlaza a un encabezado de la solicitud. Aqu hay una cabecera de peticin de muestra:
Host localhost: 8080 Acepte text / html, application / xhtml + xml, application / xml; q = 0,9 Accept-Language fr, es-es, q = 0,7, es, q = 0,3 Accept-Encoding gzip, deflate Accept-Charset ISO-8859-1, UTF-8, q = 0,7, *, q = 0,7 Keep-Alive 300

El ejemplo de cdigo siguiente se muestra cmo obtener el valor de la AcceptEncoding y Keep-Alive cabeceras:
@ RequestMapping ("/ displayHeaderInfo.do") public void displayHeaderInfo (@ RequestHeader ("Accept-Encoding") de codificacin String, @ RequestHeader ("Keep-Alive") de largo keepAlive) { / / ... }

Conversin de tipos se aplica automticamente si el parmetro de mtodo no es String . Consulte la seccin "Parmetros de mtodos y reconversin" .
Punta

El soporte integrado est disponible para convertir una cadena separada por comas en una serie / coleccin de cadenas u otros tipos conocidos por el sistema de conversin de tipos. Por ejemplo, un parmetro de mtodo anotado con @RequestHeader("Accept") puede ser de tipo String , sino tambin String[] o List<String> . Esta anotacin es compatible con los mtodos de controlador anotado en Servlets y entornos de portlet.
Parmetros de mtodos y reconversin

Valores basados en cadenas extradas de la solicitud incluyendo parmetros de la peticin, variables de ruta de acceso, cabeceras de peticin y valores de cookies puede

ser necesario convertir al tipo de destino del parmetro de mtodo o campo (por ejemplo, la unin de un parmetro de la peticin a un campo en un @ModelAttribute parmetros) estn obligados a. Si el tipo de destino no es String , Spring convierte automticamente al tipo adecuado. Todos los tipos simples como int, Fecha larga, etc son compatibles. Adems, usted puede personalizar el proceso de conversin a travs de un WebDataBinder (vase la seccin "Personalizacin WebDataBinder inicializacin " ) o mediante el registro de Formatters con el FormattingConversionService (ver Seccin 7.6, "Spring 3 Formateado de campo" ).
Personalizacin WebDataBinder inicializacin

Para personalizar el parmetro de la peticin a travs de la unin con PropertyEditors Spring WebDataBinder , puede utilizar @InitBinder anotados mtodos dentro de su controlador, @InitBinder mtodos dentro de un @ControllerAdvice clase, o proporcionar una costumbre WebBindingInitializer .
Personalizacin de los datos obligatorios con @InitBinder

Anotacin de los mtodos de controlador con @InitBinder permite configurar datos de la web que vinculan directamente dentro de la clase del controlador. @InitBinder identifica los mtodos que inicializan el WebDataBinder que se utiliza para rellenar comando y los argumentos de formularios para objetos de mtodos de control anotadas. Tales mtodos init-aglutinante apoyar todos los argumentos que @RequestMapping apoya, a excepcin de objetos de comando / forma y los correspondientes objetos de resultado de validacin. Init-aglutinante mtodos no deben tener un valor de retorno. Por lo tanto, normalmente se declara como void . Argumentos tpicos incluyen WebDataBinder en combinacin con WebRequest o java.util.Locale , permitiendo que el cdigo de registro especficas para cada contexto editores. El siguiente ejemplo muestra el uso de @InitBinder para configurar un CustomDateEditor para todos java.util.Date propiedades de formulario.
@ Controller pblico MyFormController clase { @ InitBinder public void initBinder (WebDataBinder aglutinante) { SimpleDateFormat dateFormat = new SimpleDateFormat ("aaaa-MMdd"); dateFormat.setLenient (false); binder.registerCustomEditor (Fecha. clase, nuevo CustomDateEditor (dateFormat, false)); } / / ... } Configuracin de una costumbre WebBindingInitializer

Para exteriorizar la inicializacin del enlace de datos, puede proporcionar una implementacin personalizada de la WebBindingInitializer interfaz, que le habilite

mediante el suministro de una configuracin personalizada para un bean AnnotationMethodHandlerAdapter , reemplazando as la configuracin predeterminada. El siguiente ejemplo de la aplicacin PetClinic muestra una configuracin con una implementacin personalizada de que configura PropertyEditors requeridos por varios de los controladores PetClinic.
<bean class = "org.springframework.web.servlet.mvc.method.annotation.RequestMappingH andlerAdapter"> <propiedad nombre = valor = "cacheSeconds" "0" /> <propiedad nombre = "webBindingInitializer"> <bean class = "org.springframework.samples.petclinic.web.ClinicBindingInitializer" /> </ Propiedad> </ Bean> Personalizacin de los datos obligatorios con externalizados @InitBinder mtodos @InitBinder

mtodos tambin se pueden definir en un @ControllerAdvice -anotado clase en cuyo caso se aplican a todos los controladores. Esto proporciona una alternativa al uso de un WebBindingInitializer . El @ControllerAdvice anotacin es un componente que permite la anotacin clases de implementacin para detectarse automticamente a travs del escaneo classpath.
Apoyo a la cabecera de la respuesta del 'Last-Modified "para facilitar el almacenamiento en cach de contenido

Un @RequestMapping mtodo podra apoyar 'Last-Modified' peticiones HTTP, como se define en el contrato para el API Servlet de getLastModified mtodo, para facilitar el almacenamiento en cach de contenido. Esto implica el clculo de una lastModified long valor para una solicitud determinada, comparndola con la 'IfModified-Since' valor encabezado de la solicitud, y potencialmente devolver una respuesta con cdigo de estado 304 (no modificado). Un mtodo controlador anotado que puede alcanzar como sigue:
@ RequestMapping public String myHandleMethod (WebRequest webRequest, modelo Modelo) { largo LastModified = / / 1. clculo especfico de la aplicacin de

if (request.checkNotModified (lastModified)) { / / 2. salida de acceso directo - sin procesamiento adicional necesario return null; } / / 3. o solicitud de otra manera ms elaboracin, contenido en realidad la preparacin model.addAttribute (...); return "myViewName";

Hay dos elementos clave a tener en cuenta: llamar request.checkNotModified(lastModified) y devolver null . El primero establece el estado de la respuesta a 304 antes de que vuelva true . Este ltimo, en combinacin con el anterior, provoca Spring MVC para hacer ms procesamiento de la solicitud.
17.3.4 Procesamiento asncrono Solicitud

Spring MVC 3.2 introdujo Servlet 3 procesamiento basado solicitud asincrnica. En lugar de devolver un valor, como de costumbre, un mtodo de controlador ahora puede devolver un java.util.concurrent.Callable y producir el valor de retorno de un subproceso independiente. Mientras tanto, el hilo principal contenedor de servlets se libera y les permite procesar otras solicitudes. Spring MVC invoca al Callable en un hilo separado con la ayuda de un TaskExecutor y cuando los Callable retornos, la solicitud se enva de nuevo al contenedor de servlets para reanudar el procesamiento con el valor devuelto por la Callable . He aqu un mtodo controlador ejemplo:
@ RequestMapping (method = RequestMethod.POST) processUpload pblico <String> rescatable (final del archivo MultipartFile) { volver <String> nuevo que se puede llamar () { llamada public Object () throws Exception { / / ... return "someView"; } }; }

Una segunda opcin es para el controlador para devolver una instancia de DeferredResult . En este caso, el valor de retorno tambin se produce a partir de un hilo separado. Sin embargo, que el hilo no se conoce a Spring MVC. Por ejemplo, el resultado puede ser producido en respuesta a algn evento externo, como un mensaje JMS, una tarea programada, etc Aqu est un mtodo de controlador de ejemplo:
@ RequestMapping ("/") comillas @ ResponseBody pblicos DeferredResult comillas <String> () { <String> DeferredResult deferredResult = new DeferredResult <String> (); / / Guardar el deferredResult en cola en la memoria ... volver deferredResult; } / / En algn otro hilo ... deferredResult.setResult (datos);

Esto puede ser difcil de entender sin ningn conocimiento de la funcin de procesamiento Servlet 3 asncrona. Sin duda, ayudara a leer sobre l. Como mnimo muy en cuenta los datos bsicos siguientes:

A ServletRequest se puede poner en modo asincrnico llamando request.startAsync() . El principal efecto de ello es que el Servlet, as como

cualquier Filtros, puede salir pero la respuesta permanecer abierta permitiendo algn otro flujo para completar el procesamiento. La llamada a request.startAsync() devuelve un AsyncContext , que se puede utilizar para un mayor control sobre el procesamiento asncrono. Por ejemplo, se proporciona el mtodo dispatch , que se puede llamar desde un subproceso de la aplicacin con el fin de "enviar" la solicitud de devolucin al contenedor de Servlets. Un despacho de async es similar a un delantero, excepto que est hecho de un (aplicacin) hilo a otro hilo (contenedor de Servlets), mientras que un delantero se produce de forma sincrnica en el mismo hilo (contenedor de Servlets). ServletRequest proporciona acceso a la corriente DispatcherType , que puede ser utilizado para distinguir si un Servlet o un Filter est procesando en el subproceso de solicitud de procesamiento inicial y cuando se est procesando en un envo asncrono.

Con lo anterior en mente, la siguiente es la secuencia de eventos para el procesamiento de la solicitud asincrnica con un Callable : (1) devuelve un controlador Callable , (2) Spring MVC inicia el procesamiento asincrnico y presenta el Callable a un TaskExecutor para su procesamiento en un hilo separado , (3) la DispatcherServlet y salga todo del filtro del hilo de procesamiento de solicitudes, pero la respuesta sigue abierta, (4) el Callable un resultado y enva Spring MVC peticin de vuelta al contenedor de servlets, (5) la DispatcherServlet se invoca de nuevo y procesamiento hojas de vida, con el resultado de forma asncrona produce a partir de la Callable . La secuencia exacta de (2), (3), y (4) pueden variar dependiendo de la velocidad de ejecucin de los hilos concurrentes. La secuencia de eventos para el procesamiento de solicitudes asncronas con una DeferredResult es lo mismo, en principio, salvo que depende de la aplicacin para obtener el resultado asincrnico de un hilo: (1) controlador devuelve un DeferredResult y lo guarda en algn in-memory cola o lista donde que se puede acceder, (2) Spring MVC comienza async procesamiento, (3) la DispatcherServlet y salga de todos Filter configurado como el hilo de procesamiento de la solicitud, pero la respuesta sigue abierta, (4) la aplicacin establece el DeferredResult de un hilo y despachos Spring MVC la solicitar de nuevo al contenedor de servlets, (5) la DispatcherServlet se invoca de nuevo y se reanude la transformacin asincrnica con el resultado producido. Al explicar la motivacin para el procesamiento de solicitudes asncronas y cundo ni por qu lo utilizan estn ms all del alcance de este documento. Para ms informacin le recomendamos que lea esta serie de post del blog .
Manejo de excepciones para las solicitudes asincrnicas

Qu pasa si un Callable de regresar de un mtodo de control genera una excepcin mientras se est ejecutando? El efecto es similar a lo que ocurre cuando un mtodo controlador provoca una excepcin. Se maneja por un juego @ExceptionHandler mtodo en el mismo controlador o por uno de los configurados HandlerExceptionResolver casos.

Nota

Bajo las sbanas, cuando un Callable lanza una excepcin, Spring MVC todava enva al contenedor de servlets para reanudar el procesamiento. La nica diferencia es que el resultado de la ejecucin de la Callable es una Exception que debe ser procesada con los configurados HandlerExceptionResolver casos. Cuando se utiliza un DeferredResult , usted tiene la opcin de llamar a su setErrorResult(Object) mtodo y proporcionar una Exception o cualquier otro objeto que desea utilizar como el resultado. Si el resultado es una Exception , se procesan con un juego @ExceptionHandler mtodo en el mismo controlador o con cualquier configurado HandlerExceptionResolver ejemplo.
Interceptar peticiones asncronas

Un existente HandlerInterceptor puede implementar AsyncHandlerInterceptor , que proporciona un mtodo adicional afterConcurrentHandlingStarted . Se invoca despus del procesamiento asncrono se inicia y cuando el hilo de procesamiento de solicitudes iniciales se cierra. Consulte el Javadoc de AsyncHandlerInterceptor para obtener ms detalles al respecto. Otras opciones para el ciclo de vida de una demanda de devoluciones de llamada asincrnicas se proporcionan directamente en DeferredResult , que tiene los mtodos onTimeout(Runnable) y onCompletion(Runnable) . Los que son llamados cuando la solicitud asincrnica est a punto de agotar el tiempo o se ha completado, respectivamente. El evento de tiempo de espera puede ser manejado mediante el establecimiento de la DeferredResult a algn valor. La devolucin de llamada terminacin sin embargo, es el resultado final y no puede ser ajustado. Callbacks similares tambin estn disponibles con un Callable . Sin embargo, usted tendr que envolver la Callable en una instancia de WebAsyncTask y luego usarlo para registrar el tiempo de espera y devoluciones de llamada de finalizacin. Al igual que con DeferredResult , el evento de tiempo de espera puede ser manipulado y un valor puede ser devuelto mientras que el evento de finalizacin es definitiva. Tambin puede registrar un CallableProcessingInterceptor o un DeferredResultProcessingInterceptor globalmente a travs de la configuracin MVC Java o el espacio de nombres MVC. Los interceptores de proporcionar un conjunto completo de servicios repetidos y aplicar cada vez que Callable o DeferredResult utiliza.
Configuracin para Procesamiento de solicitudes Async
Servlet 3 Async Config

Para utilizar Servlet 3 procesamiento de la solicitud asincrnica, es necesario actualizar web.xml a la versin 3.0:
<Web-app xmlns = "http://java.sun.com/xml/ns/javaee"

xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version = "3.0"> ... <web-app>

El DispatcherServlet y cualquier Filter configuracin es necesario tener la <async-supported>true</async-supported> sub-elemento. Adems, cualquier Filter que tambin tiene que involucrarse en los despachos asincrnicos tambin debe estar configurado para admitir el tipo despachador ASYNC. Tenga en cuenta que es seguro para que el tipo despachador ASYNC para todos los filtros proporcionados con el Spring Framework, ya que no se involucrar en los despachos async a menos que sea necesario. Si se utiliza Servlet 3, configuracin basada en Java, por ejemplo, a travs de WebApplicationInitializer , usted tambin tendr que establecer el "asyncSupported" pabelln, as como el tipo despachador ASYNC al igual que con web.xml . Para simplificar toda esta configuracin, la posibilidad de ampliar AbstractDispatcherServletInitializer o AbstractAnnotationConfigDispatcherServletInitializer , que ajusta automticamente las opciones y hacen que sea muy fcil registrarse Filter casos.
Spring MVC Async Config

La configuracin MVC Java y el espacio de nombres MVC ambos proporcionan opciones para configurar el procesamiento de solicitudes asncronas. WebMvcConfigurer tiene el mtodo configureAsyncSupport mientras <mvc:annotation-driven> tiene un <async-support> sub-elemento. Los que le permiten configurar el valor de tiempo de espera predeterminado para las solicitudes asincrnicas, que si no se establece depende del contenedor de Servlets subyacente (por ejemplo, 10 segundos en Tomcat). Tambin puede configurar un AsyncTaskExecutor utilizar para ejecutar Callable casos devueltos por los mtodos de controlador. Se recomienda configurar esta propiedad ya que por defecto Spring MVC utiliza SimpleAsyncTaskExecutor . El MVC Java config y el espacio de nombres MVC tambin le permiten registrar CallableProcessingInterceptor y DeferredResultProcessingInterceptor casos. Si necesita reemplazar el valor de tiempo de espera predeterminado para un determinado DeferredResult , puede hacerlo utilizando el constructor de la clase correspondiente. Del mismo modo, para un Callable , se puede envolver en una WebAsyncTask y utilizar el constructor de la clase apropiada de personalizar el valor de tiempo de espera. El constructor de la clase de WebAsyncTask tambin permite ofrecer un AsyncTaskExecutor .

17.3.5 Controladores de Pruebas

La spring-test mdulo ofrece soporte de primera clase para probar los controladores anotadas. Consulte Seccin 11.3.6, "Spring Framework MVC Test" .

17.4 Asignaciones de controlador


En las versiones anteriores de primavera, los usuarios estn obligados a definir una o ms HandlerMapping frijol en el contexto de la aplicacin web de corresponder las peticiones web entrantes a los controladores apropiados. Con la introduccin de los controladores anotados, por lo general, no es necesario hacerlo porque la RequestMappingHandlerMapping busca automticamente @RequestMapping anotaciones en todos los @Controller frijoles. Sin embargo, tenga en cuenta que todos HandlerMapping clases que se extienden desde AbstractHandlerMapping tienen las siguientes propiedades que se pueden utilizar para personalizar su comportamiento:
interceptors

Lista de los interceptores de usar. HandlerInterceptor s se discuten en la Seccin 17.4.1, "Interceptar solicitudes con un HandlerInterceptor " .
defaultHandler

Manejador por defecto a usar cuando esta asignacin de controlador no da lugar a un controlador de juego.
order

Basndose en el valor de la propiedad de orden (vase la org.springframework.core.Ordered interfaz), todo tipo resorte de asignaciones de controlador disponible en el marco y se aplica el controlador coincidente primero.
alwaysUseFullPath

Si true , Spring utiliza la ruta completa dentro del contexto servlet actual para encontrar un controlador adecuado. Si false (el valor predeterminado), la ruta dentro de la correlacin de servlet actual se utiliza. Por ejemplo, si un servlet se asigna utilizando /testing/* y la alwaysUseFullPath propiedad se establece en true, /testing/viewPage.html se utiliza, mientras que si la propiedad se establece en false, /viewPage.html se utiliza.
urlDecode

El valor predeterminado es true , a partir de la primavera 2.5. Si prefiere comparar los caminos codificados, establezca este indicador a false . Sin embargo, el HttpServletRequest siempre expone la trayectoria Servlet en forma decodificada. Tenga en cuenta que la ruta de Servlet no coincidirn en comparacin con los caminos codificados.

El siguiente ejemplo muestra cmo configurar un interceptor:


<beans> <propiedad nombre = "interceptors"> <bean class = "example.MyInterceptor" /> </ Propiedad> </ Bean> <beans>

17.4.1 peticiones Interceptar con HandlerInterceptor

Mecanismo de Spring manejador de mapeo incluye controlador de interceptores, que son tiles cuando se quiere aplicar funcionalidades especficas para ciertas peticiones, por ejemplo, la comprobacin de un principal. Los interceptores ubicados en la asignacin de controlador debe implementar HandlerInterceptor del org.springframework.web.servlet paquete. Esta interfaz define tres mtodos: preHandle(..) es llamado antes de que el controlador actual se ejecuta; postHandle(..) se llama despus de que el manejador se ejecuta, y afterCompletion(..) es llamado despus de la solicitud completa ha terminado. Estos tres mtodos especiales deber haber flexibilidad suficiente para hacer todo tipo de preprocesamiento y postprocesamiento. El preHandle(..) mtodo devuelve un valor booleano. Puede utilizar este mtodo para romper o continuar con la tramitacin de la cadena de ejecucin. Cuando este mtodo devuelve true , la cadena de ejecucin del gestor continuar, cuando se devuelve false, el DispatcherServlet asume el propio interceptor se ha hecho cargo de las peticiones (y, por ejemplo, representa una vista apropiada) y no continuar con la ejecucin del otro interceptores y la controlador real en la cadena de ejecucin. Los interceptores se pueden configurar mediante el interceptors propiedad, que est presente en todos los HandlerMapping clases que se extienden desde AbstractHandlerMapping . Esto se muestra en el ejemplo siguiente:
<beans> <Bean id = "handlerMapping" class = "org.springframework.web.servlet.mvc.method.annotation.RequestMappingH andlerMapping"> <propiedad nombre = "interceptors"> <list> <ref frijol = "officeHoursInterceptor" /> </ List> </ Propiedad> </ Bean> <Bean id = "officeHoursInterceptor" class = "samples.TimeBasedAccessInterceptor"> <propiedad nombre = valor = "openingTime" "9" /> <propiedad nombre = valor = "closingTime" "18" /> </ Bean> <beans> Ejemplos de paquete;

TimeBasedAccessInterceptor clase pblica se extiende HandlerInterceptorAdapter { openingTime int privado; closingTime int privado; setOpeningTime public void (openingTime int) { este openingTime = openingTime.; } setClosingTime public void (closingTime int) { este closingTime = closingTime.; } preHandle pblica booleano ( HttpServletRequest solicitud, HttpServletResponse respuesta, Manejador de objetos) throws Exception { Calendar cal = Calendar.getInstance (); int hora = cal.get (HOUR_OF_DAY); if (openingTime <= hora horas && closingTime <) { return true; } Else { response.sendRedirect ("http://host.com/outsideOfficeHours.html"); return false; } } }

Cualquier solicitud manejada por este mapeo es interceptado por el TimeBasedAccessInterceptor . Si el tiempo actual est fuera de horas de oficina, el usuario es redirigido a un archivo HTML esttico que dice, por ejemplo, slo se puede acceder al sitio web durante horas de oficina.
Nota

Cuando se utiliza el RequestMappingHandlerMapping el controlador actual es una instancia de HandlerMethod que identifica el mtodo de controlador especfico que ser invocado. Como se puede ver, el adaptador de primavera de clase HandlerInterceptorAdapter hace que sea ms fcil de extender la HandlerInterceptor interfaz.
Punta

En el ejemplo anterior, el interceptor configurado se aplicar a todas las solicitudes manejan con mtodos de controlador comentados. Si desea reducir el nmero de direcciones URL a las que se aplica un interceptor, puede utilizar el espacio de nombres MVC MVC o la configuracin de Java, o declarar instancias de frijol de tipo MappedInterceptor de hacerlo. Consulte Activacin de la MVC Java Config o el espacio de nombres XML MVC .

Resolucin de 17,5 puntos de vista


Todos los marcos MVC para aplicaciones web proporcionan una forma de abordar puntos de vista. Spring proporciona resolucin de vista, que le permiten hacer modelos en un navegador sin atarte a una tecnologa de vista especfico. Fuera de la caja, la primavera le permite utilizar JSP, Velocity plantillas XSLT y puntos de vista, por ejemplo. Consulte el Captulo 18, Vistas las tecnologas para una discusin sobre la forma de integrar y usar varias tecnologas de vista dispares. Las dos interfaces que son importantes para la forma en Spring maneja vistas son ViewResolver y View . El ViewResolver proporciona una correspondencia entre los nombres de vista y las opiniones reales. La View interfaz enfoca la preparacin de la solicitud y la solicitud de manos a una de las tecnologas de vista.
17.5.1 Resolucin de puntos de vista con el ViewResolver interfaz

Como se discuti en la Seccin 17.3, "Controladores de ejecucin" , todos los mtodos de controlador de los controladores de Spring Web MVC debe resolverse en un nombre de vista lgico, ya sea de forma explcita (por ejemplo, mediante la devolucin de una String , View , o ModelAndView ) o implcitamente (es decir, sobre la base de convenciones). Visitas en Spring son abordados por un nombre de vista lgico y se resuelven mediante una resolucin de la vista. La primavera llega con bastantes pocos resolucin de vista. Esta tabla muestra la mayora de ellos, un par de ejemplos. Tabla 17.3. Ver resolvers
ViewResolver

Descripcin Resolucin de vista abstracto que almacena en cach las vistas. A menudo puntos de vista necesitan preparacin antes de que puedan ser utilizados, ampliar la resolucin de esta vista proporciona almacenamiento en cach. Implementacin de ViewResolver que acepte un archivo de configuracin escritos en XML con el mismo DTD XML de Spring como fbricas de frijol. El archivo de configuracin por defecto es /WEBINF/views.xml . Implementacin de ViewResolver que utiliza definiciones de frijol en un ResourceBundle , especificado por el nombre de la base paquete. Normalmente se define el paquete en un archivo de propiedades, que se encuentra en la ruta de clase. El nombre de archivo predeterminado es views.properties .

AbstractCachingViewResolver

XmlViewResolver

ResourceBundleViewResolver

ViewResolver

Descripcin Implementacin sencilla de la ViewResolver interfaz que afecta directamente la resolucin de nombres de vista lgicas a direcciones URL, sin una definicin de asignacin explcita. Esto es apropiado si sus nombres coinciden con los nombres lgicos de los recursos de su visin de una manera sencilla, sin necesidad de asignaciones arbitrarias. Conveniente subclase de UrlBasedViewResolver que apoya InternalResourceView (en efecto, Servlets y JSP) y subclases como JstlView y TilesView . Se puede especificar la clase de vista para todas las vistas generadas por esta resolucin mediante el uso de setViewClass(..) . Ver las Javadocs para el UrlBasedViewResolver clase para obtener ms informacin. Subclase conveniente de UrlBasedViewResolver que soporta VelocityView (en efecto, plantillas de Velocity) o FreeMarkerView , respectivamente, y las subclases personalizados de ellos.

UrlBasedViewResolver

InternalResourceViewResolver

VelocityViewResolver / FreeMarkerViewResolver

Aplicacin de la ViewResolver interfaz que resuelve un punto de vista basado en el nombre de ContentNegotiatingViewResolver archivo de la solicitud o Accept de cabecera. Consulte Seccin 17.5.4, " ContentNegotiatingViewResolver " .

A modo de ejemplo, con JSP como una tecnologa de vista, puede utilizar el UrlBasedViewResolver . Esta resolucin de vista traduce un nombre para una direccin URL y entrega la solicitud a la RequestDispatcher para representar la vista.
<Bean id = "viewResolver" class = "org.springframework.web.servlet.view.UrlBasedViewResolver"> <propiedad nombre = valor = "viewClass" "org.springframework.web.servlet.view.JstlView" /> <propiedad nombre = valor = "prefix" "/WEB-INF/jsp/" /> <propiedad nombre = valor = "suffix" ".jsp" /> </ Bean>

Al regresar test como un nombre de vista lgico, esta visin resolvedor enva la solicitud a la RequestDispatcher que enviar la solicitud a /WEB-INF/jsp/test.jsp .

Cuando se combinan diferentes tecnologas vistas en una aplicacin web, puede utilizar el ResourceBundleViewResolver :
<Bean id = "viewResolver" class = "org.springframework.web.servlet.view.ResourceBundleViewResolver"> <propiedad nombre = valor = "basename" "views" /> <propiedad nombre = valor = "defaultParentView" "parentView" /> </ Bean>

El ResourceBundleViewResolver inspecciona el ResourceBundle identificado por el nombre base y para cada vista que se supone que resolver, se utiliza el valor de la propiedad [viewname].(class) como la clase de vista y el valor de la propiedad [viewname].url como la url vista. Se pueden encontrar ejemplos en el siguiente captulo que dedica a las tecnologas de visualizacin. Como se puede ver, se puede identificar una vista padre, de la que todos los puntos de vista en el archivo de propiedades "extender". De esta manera usted puede especificar una clase de vista por defecto, por ejemplo.
Nota

Las subclases de AbstractCachingViewResolver instancias del cache que los que resuelven. El almacenamiento en cach mejora el rendimiento de las tecnologas de vista determinados. Es posible desactivar la cach mediante el establecimiento de la cache propiedad a false . Por otra parte, si tiene que actualizar una cierta visin en tiempo de ejecucin (por ejemplo, cuando una plantilla de Velocity se modifica), puede utilizar la removeFromCache(String viewName, Locale loc) mtodo.
17.5.2 ViewResolvers Encadenar

Spring soporta resolucin de mltiples vistas. As usted puede resolvers cadena y, por ejemplo, anular vistas especficas en determinadas circunstancias. Se encadenan resolucin de vista mediante la adicin de ms de una resolucin a su contexto de aplicacin y, en caso necesario, estableciendo el order propiedad para especificar el pedido. Recuerde, cuanto mayor es la propiedad de orden, la posterior resolucin de la vista se coloca en la cadena. En el ejemplo siguiente, la cadena de la resolucin de visin consta de dos reductores, un InternalResourceViewResolver , que siempre se posiciona automticamente como la resolucin final de la cadena, y un XmlViewResolver para especificar vistas de Excel. Puntos de vista de Excel no son compatibles con el InternalResourceViewResolver .
<bean id = "jspViewResolver" class = "org.springframework.web.servlet.view.InternalResourceViewResolver"> <propiedad nombre = valor = "viewClass" "org.springframework.web.servlet.view.JstlView" /> <propiedad nombre = valor = "prefix" "/WEB-INF/jsp/" /> <propiedad nombre = valor = "suffix" ".jsp" /> </ Bean> <bean id = "excelViewResolver" class = "org.springframework.web.servlet.view.XmlViewResolver">

<propiedad nombre = valor = "order" "1" /> <propiedad nombre = valor = "location" "/WEB-INF/views.xml" /> </ Bean> <- En views.xml -> <beans> nombre = <bean "report" class = "org.springframework.example.ReportExcelView" /> </ Beans>

Si un dispositivo de resolucin de vista especfico no resulta en una vista, Spring examina el contexto para reslver otra vista. Si existe resolucin de visualizacin adicionales, Spring contina a inspeccionar hasta el fin se ha resuelto. Si no hay resolucin de vista devuelve una vista, Spring lanza una ServletException . El contrato de una resolucin de vista que especifica una resolucin de vista puede devolver null para indicar el punto de vista no se pudo encontrar. No todos los resolvedores de vista hacer esto, sin embargo, porque en algunos casos, la resolucin simplemente no puede detectar si o no el punto de vista existe. Por ejemplo, la InternalResourceViewResolver utiliza el RequestDispatcher internamente, y la expedicin es la nica manera de averiguar si existe un JSP, pero esta accin slo puede ejecutar una vez. Lo mismo vale para la VelocityViewResolver y algunos otros. Compruebe el Javadoc para la resolucin de vista para ver si se informa inexistentes puntos de vista. Por lo tanto, poner InternalResourceViewResolver de la cadena en un lugar que no sea el ltimo, se demuestra que la cadena est completamente inspeccionado, porque el InternalResourceViewResolver siempre devolver una vista!
17.5.3 Redireccionamiento de puntos de vista

Como se mencion anteriormente, un controlador normalmente devuelve un nombre de vista lgico, que una resolucin de vista se resuelve en una tecnologa de vista particular. Para las tecnologas de visin tales como JSP que se procesan a travs del servlet o JSP motor, la resolucin suele ser manejado a travs de la combinacin de InternalResourceViewResolver y InternalResourceView , que emite una redireccin interna o incluir travs de la API Servlet de RequestDispatcher.forward(..) mtodo o RequestDispatcher.include() mtodo. Para ver otras tecnologas, tales como la velocidad, XSLT, y as sucesivamente, la vista en s, escribe el contenido directamente a la secuencia de respuesta. A veces es deseable para emitir una redireccin HTTP de vuelta al cliente, antes de la vista es renderizada. Esto es deseable, por ejemplo, cuando un controlador que se ha llamado con POST datos ed, y la respuesta es en realidad una delegacin a otro controlador (por ejemplo de un formulario xito). En este caso, un delantero interna normal significa que el otro controlador tambin ver los mismos POST datos, que es potencialmente problemtico si se puede confundir con otros datos esperados. Otra razn para realizar un redireccionamiento antes de visualizar el resultado es eliminar la posibilidad de que el usuario que enva los datos del formulario varias veces. En este escenario, el primer navegador enviar una primera POST , entonces recibir una respuesta para redirigir a una URL diferente, y, finalmente, el navegador lleva a cabo un posterior GET para el URL mencionado en la respuesta de redireccin. As, desde el

punto de vista del navegador, la pgina actual no refleja el resultado de una POST sino ms bien de un GET . El efecto final es que no hay forma de que el usuario accidentalmente puede volver a POST los mismos datos mediante la realizacin de una actualizacin. La actualizacin obliga a un GET de la pgina de resultados, no un reenvo de las iniciales POST de datos.
RedirectView

Una forma de forzar una redireccin como el resultado de una respuesta del controlador es para el controlador para crear y devolver una instancia de Spring RedirectView . En este caso, DispatcherServlet no utiliza el mecanismo de vistas resolucin normal. Ms bien porque se ha dado la vista (redireccin) ya la DispatcherServlet simplemente instruye a la vista para hacer su trabajo. Los RedirectView emite una HttpServletResponse.sendRedirect() llamada que devuelve al navegador del cliente como una redireccin HTTP. Por defecto todos los atributos del modelo se consideran expuestos como variables de plantilla URI en la direccin URL de redireccionamiento. De los restantes atributos los que son tipos primitivos o colecciones / arrays de tipos primitivos se aaden automticamente como parmetros de consulta. Aadiendo atributos primitivos de tipo como parmetros de consulta puede ser el resultado deseado si una instancia de modelo fue preparado especficamente para la redireccin. Sin embargo, en los controladores anotado el modelo puede contener atributos adicionales aadidos para fines de reproduccin (por ejemplo, desplegables valores de campo). Para evitar la posibilidad de tener estos atributos aparecen en la URL de un controlador anotado puede declarar un argumento de tipo RedirectAttributes y lo utilizan para especificar los atributos exactos para poner a disposicin de RedirectView . Si el mtodo de controlador decide redirigir, el contenido de RedirectAttributes se utiliza. De lo contrario el contenido del modelo utilizado. Tenga en cuenta que las variables de la plantilla URI de la presente solicitud estn disponibles automticamente cuando se expande una redireccin URL y no es necesario aadir explcitamente ni por Model ni RedirectAttributes . Por ejemplo:
@ RequestMapping (valor = "/ files / {ruta}", method = RequestMethod.POST) Cadena de carga pblica (...) { / / ... return "redirect: files / {ruta}"; }

Si utiliza RedirectView y la vista es creada por el propio controlador, se recomienda configurar el URL de redireccin para ser inyectada en el controlador de manera que no se cuece en el controlador pero no est configurado en el contexto junto con los nombres de vista. La siguiente seccin analiza este proceso.

La redirect: prefijo

Aunque el uso de RedirectView funciona bien, si el propio controlador crea la RedirectView , no hay ninguna. evitando el hecho de que el controlador es consciente de que est ocurriendo una redireccin Esto es muy deficiente y las cosas parejas con demasiada fuerza. El controlador no debe realmente se preocupan por cmo se maneja la respuesta. En general se debe operar slo en trminos de nombres de vista que se han inyectado en l. El especial de redirect: prefijo le permite lograr esto. Si el nombre de la vista que se devuelve tiene el prefijo redirect: el UrlBasedViewResolver (y todas las subclases) reconocer esto como una indicacin especial que se necesita una redireccin. El resto del nombre de la vista ser tratado como la direccin URL de redireccionamiento. El efecto neto es el mismo que si el controlador haba vuelto un RedirectView , pero ahora el propio controlador simplemente puede funcionar en trminos de nombres de vista lgico. A nombre de vista lgico, como redirect:/myapp/some/resource redireccionar en relacin con el contexto servlet actual, mientras que un nombre como redirect:http://myhost.com/some/arbitrary/path redirige a una URL absoluta.
El forward: prefijo

Tambin es posible utilizar una especial forward: prefijo para los nombres de vista que son finalmente resueltos por UrlBasedViewResolver y subclases. Esto crea un InternalResourceView (que al final hace una RequestDispatcher.forward() ) en el resto del nombre de la vista, que se considera un URL. Por lo tanto, este prefijo no es til con InternalResourceViewResolver y InternalResourceView (para JSP, por ejemplo). Pero el prefijo puede ser til cuando se est utilizando sobre todo otra tecnologa de punto de vista, pero todava quiere forzar un avance de un recurso a ser manejado por el motor de servlet / JSP. (Tenga en cuenta que tambin puede cadena resolucin de mltiples vistas, lugar.) Al igual que con la redirect: prefijo, si el nombre de la vista con el forward: prefijo se inyecta en el controlador, el controlador no detecta que algo especial est sucediendo en trminos de manejo de la respuesta.
17.5.4 ContentNegotiatingViewResolver

El ContentNegotiatingViewResolver no resuelve vistas en s, sino los delegados a resolvers otra vista, la seleccin de la vista que se asemeja a la representacin solicitada por el cliente. Dos estrategias existen para que un cliente solicite una representacin del servidor:

Utilice un URI diferente para cada recurso, por lo general mediante el uso de una extensin de archivo diferente en el URI. Por ejemplo, el URI http://www.example.com/users/fred.pdf solicita una representacin en PDF del usuario fred y http://www.example.com/users/fred.xml solicita una representacin XML.

Utilice el mismo URI para el cliente para localizar el recurso, sino establecer la Accept de encabezado de solicitud HTTP a la lista de los tipos de medios que lo entiende. Por ejemplo, una solicitud HTTP para http://www.example.com/users/fred con un Accept conjunto encabezado application/pdf solicita una representacin en PDF del usuario fred, mientras http://www.example.com/users/fred con un Accept cabezazo ajustado a text/xml solicita una representacin XML. Esta estrategia se conoce como negociacin de contenido .

Nota

Un problema con el Accept encabezado es que es imposible ponerlo en un navegador web en HTML. Por ejemplo, en Firefox, se fija a:
Accept: text / html, application / xhtml + xml, application / xml; q = 0,9, * / *, q = 0,8

Por esta razn, es comn ver el uso de un URI diferente para cada representacin en el desarrollo de aplicaciones basadas en navegador web. Para apoyar mltiples representaciones de un recurso, Spring proporciona el ContentNegotiatingViewResolver para resolver un punto de vista basado en la extensin de archivo o Accept encabezado de la solicitud HTTP. ContentNegotiatingViewResolver no realiza la resolucin de la vista en s, sino los delegados en lugar de una lista de solucionadores de vista que se especifica a travs de la propiedad de bean ViewResolvers . El ContentNegotiatingViewResolver selecciona un apropiado View para manejar la peticin al comparar el tipo de solicitud de medio (s) con el tipo de soporte (tambin conocido como Content-Type ), apoyado por la View asociada a cada uno de sus ViewResolvers . La primera View de la lista que tiene una compatible Content-Type devuelve la representacin del cliente. Si una vista genrico, no puede ser suministrada por el ViewResolver cadena, entonces la lista de puntos de vista se establecen mediante la DefaultViews propiedad ser consultado. Esta ltima opcin es adecuado para simples Views , que puede hacer una representacin adecuada de los recursos actuales, independientemente del nombre de la vista lgica. El Accept encabezado puede incluir comodines, por ejemplo text/* , en cuyo caso un View cuyo Content-Type fue text/xml es un partido compatible. Apoyar la resolucin de una vista basada en una extensin de archivo, utilice los ContentNegotiatingViewResolver frijol propiedad mediaTypes para especificar una asignacin de extensiones de archivo para tipos de medios. Para obtener ms informacin sobre el algoritmo utilizado para determinar el tipo de solicitud de medios, consulte la documentacin de la API para ContentNegotiatingViewResolver . Aqu est un ejemplo de configuracin de un ContentNegotiatingViewResolver:
<bean class = "org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <propiedad nombre = "mediaTypes">

<map> <entry clave = valor = "atom" "application/atom+xml" /> <entry clave = valor = "html" "text/html" /> <entry clave = valor = "json" "application/json" /> </ Map> </ Propiedad> <propiedad nombre = "viewResolvers"> <list> <bean class = "org.springframework.web.servlet.view.BeanNameViewResolver" /> <bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver"> <propiedad nombre = valor = "prefix" "/WEB-INF/jsp/" /> <propiedad nombre = valor = "suffix" ".jsp" /> </ Bean> </ List> </ Propiedad> <propiedad nombre = "defaultViews"> <list> <bean class = "org.springframework.web.servlet.view.json.MappingJackson2JsonView" /> </ List> </ Propiedad> </ Bean> <bean id = "content" class = "com.springsource.samples.rest.SampleContentAtomView" />

El InternalResourceViewResolver se encarga de la traduccin de los nombres de las vistas y las pginas JSP, mientras que el BeanNameViewResolver devuelve un punto de vista basado en el nombre de un frijol. (Consulte la seccin " Resolucin de vistas con la interfaz ViewResolver "para obtener ms detalles sobre cmo Spring mira hacia arriba y crea instancias de una vista.) En este ejemplo, el content de frijol es una clase que hereda de AbstractAtomFeedView , que devuelve un feed Atom RSS. Para obtener ms informacin sobre cmo crear una representacin RSS Atom, Atom ver las vistas de seccin. En la configuracin anterior, si se realiza una solicitud con un .html extensin, la resolucin de vista busca una vista que coincide con el text/html tipo de medio. El InternalResourceViewResolver proporciona la vista correspondiente para text/html . Si la solicitud se realiza con la extensin de archivo .atom , la resolucin de vista busca una vista que coincide con el application/atom+xml tipo de medio. Este punto de vista es proporcionado por el BeanNameViewResolver que se asigna al SampleContentAtomView si el nombre de la vista devuelve es content . Si la solicitud se realiza con la extensin de archivo .json , el MappingJackson2JsonView instancia de la DefaultViews lista sern seleccionados sin importar el nombre de la vista. Por otra parte, las solicitudes de cliente se puede hacer sin una extensin de archivo, pero con la Accept de cabeza al conjunto preferido de tipo de soporte, y la misma resolucin de las solicitudes de visitas se producira.
Nota

Si ContentNegotiatingViewResolver lista 's de ViewResolvers no est

configurado explcitamente, se utiliza automticamente cualquier ViewResolvers definidos en el contexto de la aplicacin. El cdigo del controlador correspondiente que devuelve un feed RSS Atom para un URI de la forma http://localhost/content.atom o http://localhost/content con un Accept cabecera de application / atom + xml se muestra a continuacin.
@ Controller pblico ContentController clase { Lista privado <SampleContent> contentList = new ArrayList <SampleContent> (); @ RequestMapping (value = "/ contenido", method = RequestMethod.GET) pblico getContent ModelAndView () { ModelAndView MAV = new ModelAndView (); mav.setViewName ("contenido"); mav.addObject ("sampleContentList", contentList); volver MAV; } }

17.6 El uso de atributos de flash


Atributos de Flash proporcionan una forma para una solicitud de atributos de la tienda destinados a ser utilizados en otro. Esto es ms comnmente necesaria cuando se redirige - por ejemplo, el Post / Redirigir / Obtener patrn. Atributos de Flash se almacenan temporalmente antes de la redireccin (por lo general en la sesin) para ponerse a disposicin de la solicitud despus de la redireccin y eliminado inmediatamente. Spring MVC tiene dos abstracciones principal en apoyo de los atributos flash. FlashMap se utiliza para mantener los atributos flash mientras FlashMapManager se utiliza para almacenar, recuperar y gestionar FlashMap casos. Soporte para Flash atributo es siempre "on" y no es necesario para habilitar de forma explcita, aunque si no se utiliza, nunca causa creacin de sesin HTTP. En cada peticin hay un "input" FlashMap con atributos pasados de una solicitud anterior (si lo hay) y una "salida" FlashMap con atributos para ahorrar para una solicitud posterior. Ambos FlashMap casos se puede acceder desde cualquier lugar a travs de Spring MVC mtodos estticos en RequestContextUtils . Controladores anotados normalmente no es necesario trabajar con FlashMap directamente. En lugar de un @RequestMapping mtodo puede aceptar un argumento de tipo RedirectAttributes y usarlo para agregar atributos de flash para un escenario de redireccin. Atributos adicionales a travs de Flash RedirectAttributes se propagan automticamente a la "salida" FlashMap. Del mismo modo despus de redirigir los atributos de la "entrada" FlashMap se agregan automticamente a la Model del controlador de servicio de la direccin URL de destino.

Peticiones que coinciden con los atributos de flash El concepto de atributos destello existe en muchos otros frameworks Web y ha demostrado ser expuesta a veces a problemas de concurrencia. Esto es porque, por definicin, los atributos de flash se almacena hasta que la siguiente solicitud. Sin embargo, la muy "siguiente" peticin puede no ser el destinatario previsto, pero otra solicitud asncrona (por ejemplo, solicitudes de sondeo o de recursos) en cuyo caso los atributos flash se extrae demasiado temprano. Para reducir la posibilidad de problemas de este tipo, RedirectView automticamente "marcas" FlashMap instancias con la trayectoria y los parmetros de consulta de la meta de URL de redireccionamiento. A su vez, el valor por defecto FlashMapManager coincide con la informacin de las solicitudes de entrada al buscar la "entrada" FlashMap . Esto no elimina la posibilidad de un problema de concurrencia por completo, pero sin embargo se reduce en gran medida con la informacin que ya est disponible en la direccin URL de redireccionamiento. Por lo tanto el uso de atributos flash se recomienda principalmente para redirigir escenarios.

17,7 Construccin URI s


Spring MVC proporciona un mecanismo para la creacin y codificacin de un URI utilizando UriComponentsBuilder y UriComponents . Por ejemplo, usted puede expandir y codificar una cadena de plantilla URI:
UriComponents uriComponents = . UriComponentsBuilder.fromUriString ("http://example.com/hotels/ {hotel} / reservas / reserva {}") build (); . URI uri = uriComponents.expand ("42", "21") encode () Touri ().;

Tenga en cuenta que UriComponents es inmutable y la expand() y encode() las operaciones regresen casos nuevos si es necesario. Tambin puede ampliar y codificar utilizando componentes individuales URI:
UriComponents uriComponents = UriComponentsBuilder.newInstance () . Plan ("http"). Host ("example.com"). Ruta ("/ hoteles / hotel de {} {/ Reservas / Reserva}"). Build () . Expand ("42", "21") . Encode ();

En un entorno de Servlet el ServletUriComponentsBuilder sub-clase proporciona mtodos estticos de fbrica para copiar la informacin disponible URL de un servlet peticiones:
HttpServletRequest request = ...

/ / Re-uso de acogida, esquema, puerto, ruta y cadena de consulta / / Reemplazar el "accountId" param consulta ServletUriComponentsBuilder ucb = ServletUriComponentsBuilder.fromRequest (bajo peticin). ReplaceQueryParam ("ID de cuenta", "{id}"). Build () . Expand ("123") . Encode ();

Alternativamente, usted puede optar por copiar un subconjunto de los datos disponibles hasta e incluyendo la ruta de contexto:
/ / Host reutilizacin, el puerto y la ruta de contexto / / Agregar "/ cuentas" a la ruta ServletUriComponentsBuilder ucb = ServletUriComponentsBuilder.fromContextPath (bajo peticin). Ruta ("/ accounts"). Build ()

O en los casos en que la DispatcherServlet est asignado por su nombre (por ejemplo /main/* ), usted tambin puede tener la parte literal de la correlacin de servlet incluido:
/ / Re-uso host, el puerto, el contexto trayectoria / / Aada la parte literal de la correlacin de servlet a la trayectoria / / Agregar "/ cuentas" a la ruta ServletUriComponentsBuilder ucb = ServletUriComponentsBuilder.fromServletMapping (bajo peticin). Ruta ("/ accounts"). Build ()

17.8 Uso de locales


La mayor parte de la internacionalizacin de Spring arquitectura de apoyo, as como el Spring Web MVC marco hace. DispatcherServlet permite resolver automticamente los mensajes con la configuracin regional del cliente. Esto se hace con LocaleResolver objetos. Cuando una peticin llega, el DispatcherServlet busca una resolucin locale, y si encuentra una que trata de usarlo para establecer la configuracin regional. Usando el RequestContext.getLocale() mtodo, siempre se puede recuperar la configuracin regional que se resolvi mediante la resolucin local. Adems de la resolucin localizacin automtica, tambin puede conectar un interceptor para la asignacin de controlador (vase la Seccin 17.4.1, "Interceptar peticiones con un HandlerInterceptor " para obtener ms informacin sobre la asignacin de controlador interceptores) para cambiar la configuracin regional en determinadas circunstancias, por ejemplo, sobre la base de un parmetro en la peticin. Configuracin regional y resolvers interceptores se definen en la org.springframework.web.servlet.i18n paquete, y se configuran en su contexto de

aplicacin de la manera normal. He aqu una seleccin de los dispositivos de resolucin de configuracin regional incluidos en primavera.
17.8.1 AcceptHeaderLocaleResolver

Esta resolucin de la configuracin regional inspecciona accept-language cabecera en la peticin que le fue enviado por el cliente (por ejemplo, un navegador web). Por lo general, este campo de encabezado contiene la configuracin regional del sistema operativo del cliente.
17.8.2 CookieLocaleResolver

Esta resolucin local inspecciona una Cookie que pueda existir en el cliente para ver si una configuracin regional especificada. Si es as, utiliza la configuracin regional especificada. Usando las propiedades de esta resolucin local, puede especificar el nombre de la cookie, as como la edad mxima. Encuentra a continuacin un ejemplo de definicin de una CookieLocaleResolver .
<bean id = "localeResolver" class = "org.springframework.web.servlet.i18n.CookieLocaleResolver"> <propiedad nombre = valor = "cookieName" "clientlanguage" /> <- En segundos. Si se establece en -1, la cookie no se conserva (suprimido cuando el navegador se cierra) -> <propiedad nombre = valor = "cookieMaxAge" "100000"> </ Bean>

Tabla 17,4. CookieLocaleResolver propiedades


Propiedad cookieName Defecto classname + LOCALE El nombre de la cookie Descripcin

El tiempo mximo de un cookie persistente se quedar en el cookieMaxAge Integer.MAX_INT cliente. Si se especifica -1, la cookie no se conservar, slo estar disponible hasta que el cliente cierra su navegador. Limita la visibilidad de la cookie a una parte determinada de su sitio. Cuando cookiePath se especifica, la cookie slo ser visible a ese camino y los senderos inferiores.

cookiePath

17.8.3 SessionLocaleResolver

El SessionLocaleResolver permite recuperar locales de la sesin que puede estar asociado con la solicitud del usuario.

17.8.4 LocaleChangeInterceptor

Se puede habilitar la modificacin de locales mediante la adicin de la LocaleChangeInterceptor a una de las asignaciones de controlador (vase la Seccin 17,4, "Asignaciones de controlador" ). Se detectar un parmetro en la peticin y cambiar la configuracin regional. Llama setLocale() en el LocaleResolver que tambin existe en el contexto. El siguiente ejemplo muestra que las llamadas a todos los *.view los recursos que contienen un parmetro llamado siteLanguage ahora va a cambiar la configuracin regional. As, por ejemplo, una solicitud de la siguiente direccin URL, http://www.sf.net/home.view?siteLanguage=nl va a cambiar el idioma del sitio al holands.
<Bean id = "localeChangeInterceptor" class = "org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> <propiedad nombre = valor = "paramName" "siteLanguage" /> </ Bean> <Bean id = "localeResolver" class = "org.springframework.web.servlet.i18n.CookieLocaleResolver" /> <Bean id = "UrlMapping" class = "org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <propiedad nombre = "interceptors"> <list> <ref frijol = "localeChangeInterceptor" /> </ List> </ Propiedad> <propiedad nombre = "mappings"> <valor> / ** / *. view = someController </ value> </ Propiedad> </ Bean>

17.9 Uso de temas


17.9.1 Resumen de los temas

Usted puede solicitar Spring Web MVC ejes temticos para establecer el total look-andfeel de la aplicacin, lo que mejora la experiencia del usuario. Un tema es un conjunto de recursos estticos, hojas de estilo e imgenes por lo general, que afectan el estilo visual de la aplicacin.
17.9.2 Definicin de temas

Para utilizar los temas de la aplicacin web, debe configurar una implementacin de la org.springframework.ui.context.ThemeSource interfaz. El WebApplicationContext interfaz extiende ThemeSource pero delega sus responsabilidades a una ejecucin especializada. Por defecto, el delegado ser un
org.springframework.ui.context.support.ResourceBundleThemeSource

aplicacin que carga los archivos de propiedades de la raz de la ruta de clases. Para utilizar una costumbre ThemeSource aplicacin o configurar el prefijo de nombre de la

base de la ResourceBundleThemeSource , puede registrar un frijol en el contexto de la aplicacin con el nombre reservado themeSource . El contexto de aplicacin Web detecta automticamente un bean con ese nombre y lo utiliza. Cuando se utiliza el ResourceBundleThemeSource , un tema se define en un archivo de propiedades simple. El archivo de propiedades se enumeran los recursos que conforman el tema. Aqu est un ejemplo:
styleSheet = / themes / fro / style.css fondo = / themes / fro / img / coolBg.jpg

Las llaves de las propiedades son los nombres que se refieren a los elementos temticos de cdigo de la vista. Para una JSP, por lo general ello, se utiliza la spring:theme etiqueta personalizada, que es muy similar a la spring:message etiqueta. El siguiente fragmento JSP utiliza el tema definido en el ejemplo anterior para personalizar la apariencia:
<% @ Taglib prefix = "primavera" uri = "http://www.springframework.org/tags"%> <html> <head> <Link rel = "stylesheet" href = "<spring:theme code='styleSheet'/>" type = "text / css" /> </ Head> <Style cuerpo = "background = <spring:theme code='background'/>"> ... </ Body> </ Html>

Por defecto, el ResourceBundleThemeSource utiliza un prefijo de base de nombre vaco. Como resultado, los archivos de propiedades se cargan desde la raz de la ruta de clase. As que le puso el cool.properties definicin de tema en un directorio en la raz de la ruta de clases, por ejemplo, en /WEB-INF/classes . El ResourceBundleThemeSource utiliza el recurso estndar Java haz mecanismo de carga, lo que permite a la internacionalizacin completa de temas. Por ejemplo, podramos tener un /WEB-INF/classes/cool_nl.properties que hace referencia a una imagen de fondo especial con el texto en lengua neerlandesa sobre el mismo.
17.9.3 resolucin de temticas

Despus de definir los temas, al igual que en la seccin anterior, usted decide qu tema usar. El DispatcherServlet buscar un bean llamado themeResolver para averiguar qu ThemeResolver aplicacin para su uso. Una resolucin de tema funciona de la misma manera que un LocaleResolver . Se detecta que el tema use para una peticin concreta y tambin puede alterar tema de la solicitud. Los resolutores tema proporciona los siguientes Primavera: Tabla 17.5. ThemeResolver implementaciones
Clase Descripcin

Clase
FixedThemeResolver

Descripcin Selecciona un tema fijo, establecido mediante el defaultThemeName propiedad.

El tema se mantiene en sesin HTTP del usuario. Slo tiene que SessionThemeResolver fijarse una vez por cada perodo de sesiones, pero no se mantiene entre sesiones.
CookieThemeResolver El tema seleccionado se almacena en una cookie en el cliente.

Spring tambin ofrece un ThemeChangeInterceptor que permite cambios temticos en cada solicitud con un parmetro de la peticin simple.

17,10 Spring multipart (carga de archivos), soporte


17.10.1 Introduccin

Soporte integrado de varias partes de Spring maneja la carga de archivos en aplicaciones web. Para habilitar este soporte con varias partes enchufables MultipartResolver objetos, que se define en el org.springframework.web.multipart paquete. Spring proporciona un MultipartResolver aplicacin para su uso con FileUpload Commons y otro para uso con Servlet 3.0 parsing solicitud de varias partes. De forma predeterminada, la primavera no hace manejo de varias partes, debido a que algunos desarrolladores quieren manejar Multiparts s mismos. Habilita el manejo de varias Spring aadiendo una resolucin de varias partes con el contexto de la aplicacin web. Cada solicitud es inspeccionado para ver si contiene una multiparte. Si no se encuentra varias partes, la solicitud contina como se espera. Si un multipart se encuentra en la solicitud, el MultipartResolver que se ha declarado en su contexto se utiliza. Despus de eso, el atributo multipart en su solicitud se trata como cualquier otro atributo.
17.10.2 Uso de una MultipartResolver con FileUpload Commons

El siguiente ejemplo muestra cmo utilizar el CommonsMultipartResolver :


<Bean id = "multipartResolver" class = "org.springframework.web.multipart.commons.CommonsMultipartResolver"> <- Una de las propiedades disponibles, el tamao mximo del archivo en bytes -> <propiedad nombre = valor = "maxUploadSize" "100000" /> </ Bean>

Por supuesto, tambin hay que poner los frascos apropiados en la ruta de clases para la resolucin de varias partes a trabajar. En el caso de la CommonsMultipartResolver , es necesario utilizar commons-fileupload.jar . Cuando la primavera DispatcherServlet detecta una solicitud de varias partes, se activa el sistema de resolucin que se ha declarado en su contexto y entrega la solicitud. La resolucin continuacin, envuelve la actual HttpServletRequest en un MultipartHttpServletRequest que soporta archivos con copias de archivos. Usando el MultipartHttpServletRequest , puede obtener informacin acerca de los contenidos Multiparts por esta peticin y de hecho obtener acceso a los archivos de varias partes ellos mismos en sus controladores.
17.10.3 Uso de una MultipartResolver con Servlet 3.0

Para utilizar Servlet 3.0 basado en el anlisis de varias partes, es necesario marcar el DispatcherServlet con un "multipart-config" en la seccin web.xml , o con un javax.servlet.MultipartConfigElement en el registro de Servlet programtica, o en el caso de una clase Servlet costumbre posiblemente con un javax.servlet.annotation.MultipartConfig anotacin en su clase Servlet. Los valores de configuracin como el tamao mximo o lugares de almacenamiento tienen que aplicarse a ese nivel de registro como Servlet Servlet 3.0 no permite los ajustes a realizar desde el MultipartResolver. Una vez que el anlisis de varias Servlet 3.0 se ha habilitado en una de las formas antes mencionadas se pueden agregar la StandardServletMultipartResolver a la configuracin de Spring:
<Bean id = "multipartResolver" class = "org.springframework.web.multipart.support.StandardServletMultipartRes olver"> </ Bean>

17.10.4 Manejo de una carga de archivos en una forma

Despus de la MultipartResolver completa su trabajo, la solicitud es procesada como cualquier otra. En primer lugar, crear un formulario con un archivo de entrada que permitir al usuario cargar un formulario. El atributo de codificacin ( enctype="multipart/form-data" ) le indica al navegador cmo codificar el formulario como solicitud de varias partes:
<html> <head> <title> Subir un archivo por favor </ title> </ Head> <body> <h1> Por favor, sube un archivo </ h1> <form method = "post" action = "/form" enctype = "multipart/form-data"> <input type = nombre "text" = "name" /> <input type = nombre "file" = "file" /> <input type = "submit" /> </ Form>

</ Body> </ Html>

El paso siguiente es el de crear un controlador que controla la carga de archivos. Este controlador es muy similar a una normal de anotada @Controller , excepto que se utiliza MultipartHttpServletRequest o MultipartFile en los parmetros del mtodo:
@ Controller pblico FileUploadController clase { @ RequestMapping (value = "/ form", method = RequestMethod.POST) handleFormUpload public String (@ RequestParam ("nombre") String nombre, @ RequestParam ("file") Archivo MultipartFile) { if (! file.isEmpty ()) { byte [] bytes = file.getBytes (); / / Almacenar los bytes en alguna parte return "redirect: uploadSuccess"; } Else { return "redirect: uploadFailure"; } } }

Observe cmo los @RequestParam parmetros del mtodo se asignan a los elementos de entrada declarada en el formulario. En este ejemplo, no se hace nada con el byte[] , pero en la prctica se puede guardar en una base de datos, lo almacena en el sistema de archivos, y as sucesivamente. Cuando se utiliza el anlisis de varias Servlet 3.0 tambin puede usar javax.servlet.http.Part para el parmetro de mtodo:
@ Controller pblico FileUploadController clase { @ RequestMapping (value = "/ form", method = RequestMethod.POST) handleFormUpload public String (@ RequestParam ("nombre") String nombre, @ RequestParam ("file") Archivo Part) { InputStream inputStream file.getInputStream = (); / / Bytes tienda de archivo subido en alguna parte return "redirect: uploadSuccess"; } }

17.10.5 Manejo de un archivo de solicitud de carga de los clientes programticas

Peticiones de varias partes tambin se pueden enviar desde distintas de los navegadores clientes en un escenario RESTful servicio. Todos los ejemplos anteriores y la configuracin se aplican tambin aqu. Sin embargo, a diferencia de los navegadores

que suelen presentar los archivos y campos simples de forma, un cliente programtica tambin puede enviar datos ms complejos de un tipo de contenido especfico - por ejemplo, una peticin de varias partes de un archivo y la segunda parte con formato JSON datos:
POST / someUrl Content-Type: multipart / mixed - Edt7Tfrdusa7r3lNQc79vXuhIIMlatb7PQg7Vp Content-Disposition: form-data; name = "meta-data" Content-Type: application / json; charset = UTF-8 Content-Transfer-Encoding: 8bit { "Name": "valor" } - Edt7Tfrdusa7r3lNQc79vXuhIIMlatb7PQg7Vp Content-Disposition: form-data; name = "datos de archivos"; filename = "file.properties" Content-Type: text / xml Content-Transfer-Encoding: 8bit ... Datos de archivo ...

Usted puede acceder a la parte llamada "meta-datos" con un @RequestParam("metadata") String metadata controlador argumento del mtodo. Sin embargo, probablemente preferira aceptar un objeto fuertemente tipado inicializada con los datos JSON formato en el cuerpo de la peticin de parte, muy similar a la forma en @RequestBody convierte el cuerpo de una solicitud no multiparte a un objeto de destino con la ayuda de un HttpMessageConverter . Usted puede utilizar el @RequestPart anotacin en lugar de la @RequestParam anotacin para este fin. Esto le permite tener el contenido de un multipart especfico pasa a travs de un HttpMessageConverter teniendo en cuenta el 'Content-Type' cabecera de la multipart:
@ RequestMapping (value = "/ someUrl", method = RequestMethod.POST) pblico onSubmit String (@ RequestPart ("metadatos") Metadatos Los metadatos, @ RequestPart ("file-data") Archivo MultipartFile) { / / ... }

Observe cmo MultipartFile argumentos de mtodo se puede acceder con @RequestParam o con @RequestPart indistintamente. Sin embargo, el @RequestPart("meta-data") MetaData argumento del mtodo en este caso se lee como contenido JSON en base a su 'Content-Type' cabecera y se convirtieron con la ayuda de la MappingJackson2HttpMessageConverter .

17.11 Manejo de excepciones

17.11.1 HandlerExceptionResolver

Primavera HandlerExceptionResolver implementaciones de tratar las excepciones inesperadas que ocurren durante la ejecucin del controlador. A HandlerExceptionResolver se parece bastante a la excepcin asignaciones se pueden definir en el descriptor de la aplicacin web web.xml . Sin embargo, proporcionan una forma ms flexible para hacerlo. Por ejemplo, se proporciona informacin acerca de qu controlador se estaba ejecutando cuando se produjo la excepcin. Por otra parte, una manera programtica de Manejo de excepciones le da ms opciones para responder adecuadamente antes de la solicitud se reenva a otra direccin URL (la misma finalidad que cuando se utiliza el mapeo de Servlets especficas de excepcin). Adems de la aplicacin de la HandlerExceptionResolver interfaz, que es slo una cuestin de aplicacin de la resolveException(Exception, Handler) y mtodo devuelve un ModelAndView , tambin puede utilizar la proporcionada SimpleMappingExceptionResolver o crear @ExceptionHandler mtodos. El SimpleMappingExceptionResolver le permite tomar el nombre de clase de cualquier excepcin que pudiera ser lanzado y asignarla a un nombre de vista. Esto es funcionalmente equivalente a la funcin de mapeo de excepcin desde el Servlet API, pero tambin es posible llevar a cabo con ms precisin las asignaciones de grano de excepciones de controladores diferentes. El @ExceptionHandler anotacin por otro lado se puede utilizar en los mtodos que deben ser invocados para controlar una excepcin. Tales mtodos pueden ser definidos localmente en un @Controller o puede aplicar globalmente a todos @RequestMapping mtodos cuando se define dentro de un @ControllerAdvice clase. En las siguientes secciones explicar esto con ms detalle.
17.11.2 @ExceptionHandler

El HandlerExceptionResolver interfaz y los SimpleMappingExceptionResolver implementaciones permiten asignar Excepciones a vistas especficas mediante declaracin junto con algunos opcionales lgica Java antes de remitir a esas opiniones. Sin embargo, en algunos casos, especialmente cuando se basa en @ResponseBody mtodos en lugar de resolver la vista, puede ser ms conveniente para establecer directamente el estado de la respuesta y, opcionalmente, escribir el contenido de error para el cuerpo de la respuesta. Usted puede hacer eso con @ExceptionHandler mtodos. Cuando se declare dentro de un controlador de esos mtodos se aplican a las excepciones planteadas por @RequestMapping mtodos de ese contoroller (o cualquiera de sus subclases). Tambin puede declarar una @ExceptionHandler mtodo dentro de un @ControllerAdvice clase en cuyo caso se maneja excepciones a @RequestMapping mtodos desde cualquier controlador. El @ControllerAdvice anotacin es una anotacin de componente, que puede ser utilizado con el escaneo classpath. Se activa automticamente cuando se utiliza el espacio de nombres MVC y la configuracin MVC Java, o de otra manera dependiendo de si el ExceptionHandlerExceptionResolver est configurado o no. A continuacin se muestra un ejemplo de un controlador local @ExceptionHandler mtodo:
@ Controller pblico SimpleController clase {

/ / @ RequestMapping mtodos omitido ... @ ExceptionHandler (IOException.class) ResponseEntity pblico handleIOException <String> (IOException ex) { / / Preparar responseEntity volver responseEntity; } }

El @ExceptionHandler valor puede ajustarse a una serie de tipos de excepcin. Si se produce una excepcin que coincide con uno de los tipos incluidos en la lista, entonces el mtodo anotado con el juego @ExceptionHandler ser invocada. Si el valor de la anotacin no se establece a continuacin los tipos de excepcin que figuran como argumentos de mtodo se utilizan. Al igual que los mtodos de controlador estndar anotado con un @RequestMapping anotacin, los argumentos de mtodo y valores devueltos de @ExceptionHandler mtodos pueden ser flexibles. Por ejemplo, el HttpServletRequest se puede acceder en entornos servlet y el PortletRequest en entornos de portlet. El tipo de retorno puede ser una String , que se interpreta como un nombre de vista, un ModelAndView objeto, una ResponseEntity , o tambin se puede agregar el @ResponseBody para tener el valor devuelto del mtodo convierte con convertidores de mensajes y se escribe en la secuencia de respuesta.
17.11.3 Manejo de excepciones estndar Spring MVC

Spring MVC puede plantear una serie de excepciones al procesar una solicitud. El SimpleMappingExceptionResolver puede asignar cualquier excepcin a una vista de error por defecto segn sea necesario. Sin embargo, cuando se trabaja con clientes que interpretan las respuestas de una forma automtica tendr que establecer el cdigo de estado especfico de la respuesta. Dependiendo de la excepcin elevado el cdigo de estado puede indicar un error de cliente (4xx) o un error en el servidor (5xx). El DefaultHandlerExceptionResolver traduce Spring MVC excepciones a determinados cdigos de error de estado. El dominio se registra por defecto con el espacio de nombres MVC, la configuracin MVC Java, y tambin por el de la DispatcherServlet (es decir, cuando no se utiliza el espacio de nombres MVC o Ajuste Java). A continuacin se enumeran algunas de las excepciones controladas por esta resolucin y los correspondientes cdigos de estado:
Excepcin
BindException ConversionNotSupportedException

Cdigo de estado HTTP 400 (Bad Request) 500 (Error interno del servidor)

Excepcin
HttpMediaTypeNotAcceptableException HttpMediaTypeNotSupportedException HttpMessageNotReadableException HttpMessageNotWritableException

Cdigo de estado HTTP 406 (no aceptable) 415 (no compatible Tipo de soporte) 400 (Bad Request) 500 (Error interno del servidor)

HttpRequestMethodNotSupportedException 405 (mtodo no permitido) MethodArgumentNotValidException

400 (Bad Request)

MissingServletRequestParameterException 400 (Bad Request) MissingServletRequestPartException NoSuchRequestHandlingMethodException TypeMismatchException

400 (Bad Request) 404 (no encontrado) 400 (Bad Request)

El DefaultHandlerExceptionResolver funciona de forma transparente mediante el establecimiento de la situacin de la respuesta. Sin embargo, no llega a escribir ningn error contenido en el cuerpo de la respuesta, mientras que su aplicacin puede necesitar agregar amistoso con el desarrollador de contenido para cada respuesta de error, por ejemplo, cuando se proporciona una API REST. Usted puede preparar una ModelAndView y representar el contenido de error mediante resolucin de la vista - es decir, mediante la configuracin de un ContentNeogitatingViewResolver , MappingJacksonJsonView , y as sucesivamente. Sin embargo, usted puede preferir utilizar @ExceptionHandler mtodos en su lugar. Si prefiere escribir el contenido de error a travs @ExceptionHandler mtodos que se pueden extender ResponseEntityExceptionHandler lugar. Este es un punto de partida ideal para @ControllerAdvice clases que proporcionan una @ExceptionHandler mtodo estndar para manejar Spring MVC excepciones y regreso ResponseEntity . Esto le permite personalizar la respuesta y escribir el contenido del mensaje de error con convertidores. Consulte el Javadoc de ResponseEntityExceptionHandler para ms detalles.
17.11.4 Las excepciones negocios anotar con @ResponseStatus

A excepcin de negocio puede ser anotado con @ResponseStatus . Cuando se produce la excepcin, la ResponseStatusExceptionResolver maneja estableciendo el estado de la respuesta en consecuencia. Por defecto, el DispatcherServlet registra el ResponseStatusExceptionResolver y est disponible para su uso.

17.11.5 Personalizacin del Servlet Container pgina de error por defecto

Cuando el estado de la respuesta se establece un cdigo de estado de error y el cuerpo de la respuesta est vaco, contenedores de Servlets comnmente emitir una pgina HTML de error con formato. Para personalizar la pgina de error por defecto del contenedor, se puede declarar una <error-page> elemento en web.xml . Hasta Servlet 3, ese elemento tuvo que ser asignado a un cdigo de estado especfico o tipo de excepcin. Comenzando con Servlet 3 una pgina de error no necesita ser mapeado, lo que significa en la ubicacin especificada personaliza el Servlet contenedor predeterminado pgina de error.
<error-page> <location> / error </ location> </ Error-page>

Tenga en cuenta que la ubicacin real de la pgina de error puede ser una pgina JSP o alguna otra direccin URL dentro del recipiente que incluye un manejados a travs de un @Controller mtodo: Cuando se escribe la informacin de error, el cdigo de estado y el conjunto de mensajes de error en el HttpServletResponse se puede acceder a travs de atributos de la peticin en un controlador:
@ Controller pblico ErrorController clase { @ RequestMapping (value = "/ error", produce = "application / json") @ ResponseBody Mapa del pblico <String, Object> mango (HttpServletRequest request) { Mapa <String, Object> map = new HashMap <String, Object> (); map.put ("status", request.getAttribute ("javax.servlet.error.status_code")); map.put ("la razn", request.getAttribute ("javax.servlet.error.message")); regresar mapa; } }

o en un JSP:
<% @ Page contentType = "application / json" pageEncoding = "UTF8"%> { estado: <% = request.getAttribute ("javax.servlet.error.status_code")%>, razn: <% = request.getAttribute ("javax.servlet.error.message")%> }

17,12 Convencin sobre la configuracin

Para una gran cantidad de proyectos, fiel a las convenciones establecidas y que tengan valores por defecto razonables es lo que ellos (los proyectos) necesita, y Spring Web MVC ahora cuenta con el apoyo explcito de convencin sobre configuracin. Lo que esto significa es que si usted establece un conjunto de convenciones de nomenclatura y cosas por el estilo, usted puede reducir sustancialmente la cantidad de configuracin que se requiere para configurar asignaciones de controlador, resolvedores de vista, ModelAndView instancias, etc Esta es una gran ayuda en lo que respecta para prototipado rpido, y tambin puede prestar un grado de (siempre es bueno tener a) la coherencia a travs de una base de cdigo si decide seguir adelante con ella en la produccin. Convencin-sobre-soporte de configuracin aborda las tres reas principales de MVC: modelos, vistas y controladores.
17.12.1 El controlador ControllerClassNameHandlerMapping

El ControllerClassNameHandlerMapping clase es un HandlerMapping aplicacin que utiliza una convencin para determinar la asignacin entre direcciones URL de solicitud y los Controller casos que se van a manejar esas solicitudes. Considere lo siguiente sencillo Controller de aplicacin. Fjese especialmente en el nombre de la clase.
ViewShoppingCartController clase pblica implementa Controller { pblico handleRequest ModelAndView (HttpServletRequest solicitud, HttpServletResponse respuesta) { / / La aplicacin no es enormemente importante para este ejemplo ... } }

Aqu hay un fragmento del archivo de configuracin de Spring Web MVC correspondiente:
<bean class = "org.springframework.web.servlet.mvc.support.ControllerClassNameHandle rMapping" /> <bean id = "viewShoppingCart" class="xyzViewShoppingCartController"> <- Inyectar dependencias como se requiere ... -> </ Bean>

El ControllerClassNameHandlerMapping encuentra todos los del controlador de varios (o Controller ) beans definidos en su contexto de aplicacin y las tiras de Controller de el nombre de definir sus asignaciones de controlador. As, ViewShoppingCartController asigna a la /viewshoppingcart* URL de la solicitud. Veamos algunos ejemplos ms para que la idea central es inmediatamente familiar. (Tenga en cuenta todas las minsculas en la URL, en contraste con camello con caja Controller nombres de clase.)

WelcomeController asigna a la /welcome* URL de la solicitud HomeController asigna a la /home* URL de solicitud IndexController asigna a la /index* URL de solicitud RegisterController asigna a la /register* URL de la solicitud

En el caso de MultiActionController clases de controlador, las asignaciones generadas son un poco ms complejas. Los Controller nombres en los ejemplos siguientes se supone que son MultiActionController implementaciones:
AdminController asigna a la /admin/* URL de la solicitud CatalogController asigna a la /catalog/* URL de la solicitud

Si usted sigue la convencin de nombrar a su Controller implementaciones como xxx Controller, el ControllerClassNameHandlerMapping le ahorra el tedio de definir y mantener un potencial looooong SimpleUrlHandlerMapping (o similar). El ControllerClassNameHandlerMapping clase extiende la AbstractHandlerMapping clase base para que pueda definir HandlerInterceptor instancias y todo lo dems igual que lo hara con muchas otras HandlerMapping implementaciones.
17.12.2 El Modelo ModelMap ( ModelAndView )

El ModelMap clase es esencialmente un glorificado Map que puede hacer que la adicin de objetos que se van a visualizar en (o sobre) una View adherirse a una convencin de nomenclatura comn. Consideremos el siguiente Controller aplicacin; aviso de que los objetos se aaden a la ModelAndView sin ningn nombre asociado especificado.
DisplayShoppingCartController clase pblica implementa Controller { pblico handleRequest ModelAndView (HttpServletRequest solicitud, HttpServletResponse respuesta) { CartItems list = / / obtener una lista de los objetos CartItem Usuario usuario = / / obtener el usuario hacer las compras ModelAndView MAV = new ModelAndView ("displayShoppingCart"); <- el nombre de la vista lgica mav.addObject (cartItems); <- Mira mam, sin nombre, slo el objeto mav.addObject (usuario); <- y otra vez ma! volver MAV; } }

El ModelAndView clase utiliza un ModelMap clase que es una costumbre Map aplicacin que genera automticamente una clave para un objeto cuando se agrega un objeto a la misma. La estrategia para determinar el nombre de un objeto es aadido, en el caso de un objeto escalar como User , para utilizar el nombre de clase corta de la clase del

objeto. Los siguientes ejemplos son nombres que se generan para objetos escalares puesta en un ModelMap ejemplo.

Un xyUser instancia aadido tendr el nombre user generado. Un xyRegistration instancia aadido tendr el nombre registration generado. Un xyFoo instancia aadido tendr el nombre foo generado. A java.util.HashMap instancia aadido tendr el nombre hashMap generado. Es posible que desee ser explcito sobre el nombre en este caso porque hashMap es menor que intuitivo. Adicin null resultar en una IllegalArgumentException siendo lanzada. Si el objeto (u objetos) que se va a agregar podra ser null , entonces tambin tendr que ser explcito sobre el nombre.

Qu, no pluralizacin automtico? Apoyo a los convenios-sobre-configuracin de Spring Web MVC no es compatible con pluralizacin automtica. Es decir, no se puede agregar una List de Person objetos a un ModelAndView y tienen el nombre generado ser people . Esta decisin se tom despus de un debate, con el "principio de mnima sorpresa" ganar en la final. La estrategia para generar un nombre despus de la adicin de un Set o una List es para echar un vistazo a la coleccin, tomar el nombre de la clase por debajo del primer objeto en la coleccin, y el uso que de List anexa al nombre. Lo mismo se aplica a las matrices con matrices aunque no es necesario para mirar en el contenido de la matriz. Algunos ejemplos har la semntica de generacin de nombres para las colecciones ms claro:

Un xyUser[] array con cero o ms xyUser elementos aadidos tendr el nombre userList generado. Un xyFoo[] array con cero o ms xyUser elementos aadidos tendr el nombre fooList generado. Un java.util.ArrayList con uno o ms xyUser elementos aadida tendr el nombre userList generado. Un java.util.HashSet con uno o ms xyFoo elementos aadida tendr el nombre fooList generado. Un vaco java.util.ArrayList no se aadir nada (de hecho, la addObject(..) llamada ser esencialmente una no-op).

17.12.3 The View - RequestToViewNameTranslator

El RequestToViewNameTranslator interfaz determina una lgica View nombre cuando no hay ningn nombre tal vista lgica se ha especificado explcitamente. Tiene slo una implementacin, el DefaultRequestToViewNameTranslator clase. Los DefaultRequestToViewNameTranslator mapas solicitar direcciones URL para nombres de vista lgico, como en este ejemplo:

RegistrationController clase pblica implementa Controller { pblico handleRequest ModelAndView (HttpServletRequest solicitud, HttpServletResponse respuesta) { / / Procesar la solicitud ... ModelAndView MAV = new ModelAndView (); / / Aadir los datos que sean necesarios para el modelo ... volver MAV; / / Cuenta de que no hay ningn nombre o Vista lgico se ha establecido } } <? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd "> <- Este bean con el nombre bien conocido genera ver los nombres para nosotros -> <Bean id = "viewNameTranslator" class = "org.springframework.web.servlet.view.DefaultRequestToViewNameTranslat or" /> <bean class = "xyRegistrationController"> <- Inyectar las dependencias que sean necesarias -> </ Bean> <- Mapas de direcciones URL para nombres de controladores solicitud -> <bean class = "org.springframework.web.servlet.mvc.support.ControllerClassNameHandle rMapping" /> <bean id = "viewResolver" class = "org.springframework.web.servlet.view.InternalResourceViewResolver"> <propiedad nombre = valor = "prefix" "/WEB-INF/jsp/" /> <propiedad nombre = valor = "suffix" ".jsp" /> </ Bean> </ Beans>

Note como en la aplicacin de la handleRequest(..) mtodo no View nombre de la vista o lgica es siempre situado en la ModelAndView que se devuelve. El DefaultRequestToViewNameTranslator tiene la tarea de generar un nombre de vista lgico desde la URL de la peticin. En el caso de la anterior RegistrationController , que se utiliza en conjuncin con la ControllerClassNameHandlerMapping , una peticin URL de http://localhost/registration.html resultados en un nombre de vista lgica de registration que se generan por la DefaultRequestToViewNameTranslator . El nombre de la vista lgica se resuelve entonces en el /WEB-INF/jsp/registration.jsp vista por el InternalResourceViewResolver frijol.
Punta

No es necesario definir un DefaultRequestToViewNameTranslator frijol explcitamente. Si te gusta la configuracin por defecto de la DefaultRequestToViewNameTranslator , usted puede confiar en el Spring Web MVC DispatcherServlet para crear una instancia de esta clase si no se configura explcitamente. Por supuesto, si usted necesita cambiar la configuracin predeterminada, entonces usted tiene que configurar su propio DefaultRequestToViewNameTranslator frijol explcitamente. Consulte el Javadoc completo para el DefaultRequestToViewNameTranslator clase para los detalles de las distintas propiedades que se pueden configurar.

17,13 ETag apoyo


Un ETag (etiqueta de entidad) es un encabezado de respuesta HTTP devuelto por un servidor compatible con HTTP/1.1 web utilizado para determinar el cambio en el contenido de una URL determinada. Puede ser considerado como el sucesor ms sofisticado para el Last-Modified cabecera. Cuando un servidor devuelve una representacin con una cabecera ETag, el cliente puede utilizar esta cabecera en GET posterior, en un If-None-Match cabecera. Si el contenido no ha cambiado, el servidor devuelve 304: Not Modified . Las ETag es proporcionada por el filtro Servlet ShallowEtagHeaderFilter . Es un filtro de servlet normal, y por lo tanto se puede utilizar en combinacin con cualquier marco de web. El ShallowEtagHeaderFilter filtro crea los llamados ETags poco profundas (en oposicin a ETags profundos, ms sobre esto ms adelante). Las cachs de filtro del contenido del rindi JSP (u otro contenido), genera un hash MD5 sobre eso, y que los rendimientos como ETag encabezado en la respuesta. La prxima vez que un cliente enva una solicitud para el mismo recurso, utiliza el hash como el If-NoneMatch valor. El filtro detecta esto, representa la vista de nuevo, y compara los dos valores. Si son iguales, un 304 se devuelve. Este filtro no va a salvar el poder de procesamiento, ya que la vista es an prestados. Lo nico que salva es el ancho de banda, como la respuesta dictada no es enviado de vuelta a travs del cable. Se configura el ShallowEtagHeaderFilter en web.xml :
<filter> <filter-name> etagFilter </ filter-name> <filter-class> org.springframework.web.filter.ShallowEtagHeaderFilter </ filterclase> </ Filter> <filter-mapping> <filter-name> etagFilter </ filter-name> <servlet-name> petclinic </ servlet-name> </ Filter-mapping>

17,14 Cdigo basado en Servlet inicializacin del contenedor

En un entorno de Servlet 3.0 +, usted tiene la opcin de configurar el contenedor de Servlets programacin como alternativa o en combinacin con un web.xml archivo. A continuacin se muestra un ejemplo de registro de un DispatcherServlet :
importar org.springframework.web.WebApplicationInitializer; MyWebApplicationInitializer clase pblica implementa WebApplicationInitializer { @ Override public void OnStartup (ServletContext contenedor) { XmlWebApplicationContext appContext = new XmlWebApplicationContext (); appContext.setConfigLocation ("/ WEB-INF/spring/dispatcherconfig.xml"); ServletRegistration.Dynamic registro = container.addServlet ("dispatcher", nueva DispatcherServlet (appContext)); registration.setLoadOnStartup (1); registration.addMapping ("/"); } } WebApplicationInitializer

es una interfaz proporcionada por Spring MVC que asegura que su aplicacin se detecta automticamente y se utiliza para inicializar cualquier Servlet 3 recipiente. Una implementacin de la clase base abstracta de WebApplicationInitializer llamado AbstractDispatcherServletInitializer hace que sea an ms fcil de registrar el DispatcherServlet simplemente reemplazar los mtodos para especificar el mapeo de servlet y la ubicacin de la DispatcherServlet configuracin:
MyWebAppInitializer clase pblica se extiende AbstractAnnotationConfigDispatcherServletInitializer { @ Override protegidos de marcas <> [] () {getRootConfigClasses return null; } @ Override protegidos de marcas <> [] () {getServletConfigClasses Rentabilidad de la Clase new [] {MyWebConfig clase.}; } @ Override Cadena protegido [] () {getServletMappings volver new String [] {"/"}; } }

El ejemplo anterior es para una aplicacin Java que utiliza la configuracin basada en primavera. Si se utiliza la configuracin basada en XML Spring, extender directamente desde AbstractDispatcherServletInitializer :

MyWebAppInitializer clase pblica se extiende AbstractDispatcherServletInitializer { @ Override protegida WebApplicationContext createRootApplicationContext () { return null; } @ Override protegida WebApplicationContext createServletApplicationContext () { XmlWebApplicationContext cxt = new XmlWebApplicationContext (); cxt.setConfigLocation ("/ WEB-INF/spring/dispatcherconfig.xml"); volver cxt; } @ Override Cadena protegido [] () {getServletMappings volver new String [] {"/"}; } } AbstractDispatcherServletInitializer tambin proporciona una manera conveniente de aadir Filter casos y hacer que se asigna automticamente a la DispatcherServlet : MyWebAppInitializer clase pblica se extiende AbstractDispatcherServletInitializer { / / ... @ Override protegido filtro [] getServletFilters () { volver nuevo filtro [] {new HiddenHttpMethodFilter (), nuevo CharacterEncodingFilter ()}; } }

Cada filtro se aade con el nombre por defecto en funcin de su tipo de hormign y asignan automticamente a la DispatcherServlet . El isAsyncSupported mtodo protegido de
AbstractDispatcherServletInitializer ofrece un lugar nico para habilitar el soporte asncrono en el DispatcherServlet y todos los filtros asignados a la misma. Por defecto, este indicador se establece en true .

17.15 Configuracin de Spring MVC


Seccin 17.2.1, "Tipos de alubias especiales En el WebApplicationContext " y Seccin 17.2.2, "Configuracin por defecto" DispatcherServlet explicado acerca de los frijoles especiales Spring MVC y las implementaciones por defecto utilizados por el DispatcherServlet . En esta seccin, usted aprender acerca de dos formas

adicionales de configuracin de Spring MVC. Es decir, la MVC Java config y el espacio de nombres XML MVC. El MVC Java config y el espacio de nombres MVC proporciona configuracin predeterminada similar que anula los DispatcherServlet valores predeterminados. El objetivo es evitar que la mayora de las aplicaciones de tener que tener que crear la misma configuracin y tambin para proporcionar un mayor nivel constructos para configurar Spring MVC que sirven como un punto de partida sencillo y requiere conocimiento previo poco o nada de la configuracin subyacente. Usted puede elegir entre el MVC config Java o el espacio de nombres MVC dependiendo de su preferencia. Adems, como se ver ms adelante, con el Java MVC config es ms fcil ver la configuracin subyacente, as como para hacer de grano fino personalizaciones creadas directamente a los beans Spring MVC. Pero empecemos desde el principio.
17.15.1 Habilitacin del MVC Java Config o el espacio de nombres XML MVC

Para habilitar Java MVC config aadir la anotacin @EnableWebMvc a uno de tus @Configuration clases:
@ Configuracin @ EnableWebMvc WebConfig clase pblica { }

Para lograr lo mismo en XML utiliza el mvc:annotation-driven elemento:


<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: mvc = "http://www.springframework.org/schema/mvc" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd "> <mvc:annotation-driven /> </ Beans>

Lo anterior se registra un RequestMappingHandlerMapping , un RequestMappingHandlerAdapter , y un ExceptionHandlerExceptionResolver (entre otros) en apoyo de procesar las solicitudes con mtodos de control comentadas con anotaciones como @RequestMapping , @ExceptionHandler , y otros. Tambin permite lo siguiente: 1. Spring 3 Estilo de conversin de tipos a travs de un ConversionService ejemplo, adems de los PropertyEditors JavaBeans utilizados para el enlace de datos.

2. Soporte para formato de campos numricos utilizando el @NumberFormat anotacin a travs del ConversionService . 3. Soporte para el formato de fecha, calendario, largo, y los campos de Joda Time utilizando el @DateTimeFormat anotacin. 4. El apoyo a la validacin de entradas del controlador con @ @Valid , si un proveedor de JSR-303 est presente en el classpath. 5. HttpMessageConverter apoyo a @RequestBody parmetros del mtodo y @ResponseBody valores de retorno a mtodos desde @RequestMapping o @ExceptionHandler mtodos. Esta es la lista completa de HttpMessageConverters establecidos por mvc: anotacin impulsada por:
ByteArrayHttpMessageConverter convierte matrices de bytes. StringHttpMessageConverter convierte las cadenas. ResourceHttpMessageConverter convierte a / desde org.springframework.core.io.Resource para todos los tipos

de

medios.
SourceHttpMessageConverter convierte a / desde un javax.xml.transform.Source . FormHttpMessageConverter convierte los datos del formulario a / desde un MultiValueMap<String, String> . Jaxb2RootElementHttpMessageConverter convierte los objetos Java a

/ desde XML - aadi jaxb2 si est presente en el classpath. MappingJackson2HttpMessageConverter (o MappingJacksonHttpMessageConverter ) convierte a / de JSON aade si Jackson 2 (o Jackson) est presente en el classpath. AtomFeedHttpMessageConverter convierte Atom feeds - aade si Roma est presente en el classpath. RssChannelHttpMessageConverter convierte feeds RSS - aade si Roma est presente en el classpath.

17.15.2 Personalizacin de la configuracin proporcionada

Para personalizar la configuracin por defecto en Java slo tiene que ejecutar el WebMvcConfigurer interfaz o ms probablemente extender la clase WebMvcConfigurerAdapter y reemplazar los mtodos que necesita. A continuacin se muestra un ejemplo de algunos de los mtodos disponibles para anular. Ver WebMvcConifgurer para obtener una lista de todos los mtodos y el Javadoc para ms detalles:
@ Configuracin @ EnableWebMvc WebConfig clase pblica se extiende WebMvcConfigurerAdapter { @ Override protegidas addFormatters void (FormatterRegistry registro) { / / Aadir formateadores y / o convertidores } @ Override

configureMessageConverters public void (lista <HttpMessageConverter <? >> convertidores) { / / Configurar la lista de HttpMessageConverters utilizar } }

Para personalizar la configuracin por defecto de <mvc:annotation-driven /> comprobar qu atributos y subelementos que soporta. Puede ver el Spring MVC esquema XML o utilizar la funcin de cdigo de su IDE para descubrir qu atributos y subelementos estn disponibles. El siguiente ejemplo muestra un subconjunto de lo que est disponible:
<mvc:annotation-driven conversion-service "conversionService" => <mvc:message-converters> <bean class = "org.example.MyHttpMessageConverter" /> <bean class = "org.example.MyOtherHttpMessageConverter" /> </ Mvc: Mensaje de convertidores> </ Mvc: anotacin impulsada> <propiedad nombre = "formatters"> <list> <bean class = "org.example.MyFormatter" /> <bean class = "org.example.MyOtherFormatter" /> </ List> </ Propiedad> </ Bean>

17.15.3 Configuracin Interceptores

Puede configurar HandlerInterceptors o WebRequestInterceptors que debe aplicarse a todas las peticiones entrantes o restringida a los patrones especficos de URL. Un ejemplo de registro de interceptores en Java:
@ Configuracin @ EnableWebMvc WebConfig clase pblica se extiende WebMvcConfigurerAdapter { @ Override public void addInterceptors (InterceptorRegistry registro) { registry.addInterceptor (nuevo LocaleInterceptor ()); registry.addInterceptor. (nuevo ThemeInterceptor ()) addPathPatterns ("/ **") excludePathPatterns ("/ admin / **").; registry.addInterceptor. (nuevo SecurityInterceptor ()) addPathPatterns ("/ secure / *"); } }

Y en XML utiliza el <mvc:interceptors> elemento:


<mvc:interceptors> <bean class = "org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />

<mvc:interceptor> <Mapping path = "/**" /> <exclude-mapping path = "/admin/**" /> <bean class = "org.springframework.web.servlet.theme.ThemeChangeInterceptor" /> </ Mvc: interceptor> <mvc:interceptor> <Mapping path = "/secure/*" /> <bean class = "org.example.SecurityInterceptor" /> </ Mvc: interceptor> </ Mvc: interceptores>

17.15.4 Configuracin Negociacin de contenido

Mirando con Spring Framework 3.2, puede configurar la forma en Spring MVC determina los tipos de medios solicitados por el cliente para la asignacin de solicitud, as como para fines de negociacin de contenido. Las opciones disponibles son el control de la extensin de archivo en la URI de la solicitud, la opcin "Aceptar" de cabecera, un parmetro de la peticin, as como a recurrir a un tipo de contenido predeterminado. Por defecto, la extensin de archivo en el URI de la solicitud se comprueba primero y la "Aceptar" de cabecera se comprueba que viene. Para las extensiones de archivo en la URI de la solicitud, la configuracin MVC Java y el espacio de nombres MVC, se registran automticamente extensiones como .json , .xml , .rss , y .atom si las dependencias correspondientes, como Jackson, jaxb2 o Roma estn presentes en el classpath. Extensiones adicionales no podrn ser necesitas estar registrado explcitamente si se puede descubrir a travs de ServletContext.getMimeType(String) o el Marco de activacin de Java (ver javax.activation.MimetypesFileTypeMap ). A continuacin se muestra un ejemplo de la personalizacin de las opciones de contenido a travs de la negociacin config MVC Java:
@ Configuracin @ EnableWebMvc WebConfig clase pblica se extiende WebMvcConfigurerAdapter { @ Override configureContentNegotiation public void (ContentNegotiationConfigurer configurer) { configurer.favorPathExtension (false) favorParameter (true).; } }

En el espacio de nombres MVC, la <mvc:annotation-driven> elemento tiene un content-negotiation-manager atributo, que espera un ContentNegotiationManager que a su vez se pueden crear con un ContentNegotiationManagerFactoryBean :
<mvc:annotation-driven content-negotiation-manager = "contentNegotiationManager" /> <propiedad nombre = valor = "favorPathExtension" "false" /> <propiedad nombre = valor = "favorParameter" "true" />

<propiedad nombre = "mediaTypes"> <valor> json = application / json xml = application / xml </ Value> </ Propiedad> </ Bean>

Si no se utiliza la configuracin MVC Java o el espacio de nombres MVC, usted tendr que crear una instancia de ContentNegotiationManager y lo utilizan para configurar RequestMappingHandlerMapping con fines cartogrficos de peticin, y RequestMappingHandlerAdapter y ExceptionHandlerExceptionResolver con fines de negociacin de contenido. Tenga en cuenta que ContentNegotiatingViewResolver ahora tambin se puede configurar con un ContentNegotiatingViewResolver , as que usted puede utilizar una instancia a travs de Spring MVC. En los casos ms avanzados, puede ser til para configurar mltiples ContentNegotiationManager casos que a su vez pueden contener personalizados ContentNegotiationStrategy implementaciones. Por ejemplo, podra configurar ExceptionHandlerExceptionResolver con un ContentNegotiationManager que siempre se resuelve el tipo de material requerido para "application/json" . O puede que quiera conectar una estrategia personalizada que tiene algo de lgica para seleccionar el contenido por defecto (por ejemplo, XML o JSON) si no hay tipos de contenido fueron solicitados.
17.15.5 Configuracin de los controladores de vista

Este es un atajo para definir un ParameterizableViewController que inmediatamente remite a una vista cuando se invoca. Se usa en casos estticos cuando no hay una lgica del controlador Java para ejecutar antes de la vista genera la respuesta. Un ejemplo de envo de una solicitud de "/" para una vista llamada "home" en Java:
@ Configuracin @ EnableWebMvc WebConfig clase pblica se extiende WebMvcConfigurerAdapter { @ Override addViewControllers public void (ViewControllerRegistry registro) { registry.addViewController ("/") setViewName ("casa").; } }

Y lo mismo en XML utiliza el <mvc:view-controller> elemento:


<mvc:view-controller path = "/" view-name = "home" />

17.15.6 Configuracin Porcin de Recursos

Esta opcin permite que las solicitudes de recursos estticos siguiendo un patrn de URL en particular a los servicios de una ResourceHttpRequestHandler de cualquiera de una lista de Resource lugares. Esto proporciona una forma conveniente para servir recursos estticos desde lugares que no sean la raz de la aplicacin web, incluyendo sitios en la ruta de clase. El cache-period propiedad puede ser utilizada para establecer los encabezados de caducidad de la medida en el futuro (1 ao es la recomendacin de herramientas de optimizacin, tales como Page Speed y YSlow) de modo que ser ms eficaz utilizado por el cliente. El controlador tambin correctamente evala el LastModified cabecera (si est presente) de modo que un 304 cdigo de estado se devuelve como sea apropiado, evitando una sobrecarga innecesaria de recursos que ya estn almacenados en cach por el cliente. Por ejemplo, para atender las solicitudes de recursos con un patrn de URL /resources/** de un public-resources en el directorio raz de la aplicacin web se debera utilizar:
@ Configuracin @ EnableWebMvc WebConfig clase pblica se extiende WebMvcConfigurerAdapter { @ Override addResourceHandlers public void (ResourceHandlerRegistry registro) { registry.addResourceHandler ("/ resources / **") addResourceLocations ("/ public-resources /").; } }

Y lo mismo en XML:
<mvc:resources anlisis grfico = ubicacin "/resources/**" = "/public-resources/" />

Para atender a estos recursos con un vencimiento futuro a 1 ao para asegurar el uso mximo de la memoria cach del navegador y una reduccin en las solicitudes HTTP realizadas por el navegador:
@ Configuracin @ EnableWebMvc WebConfig clase pblica se extiende WebMvcConfigurerAdapter { @ Override addResourceHandlers public void (ResourceHandlerRegistry registro) { } }

Y en XML:
<mvc:resources anlisis grfico = ubicacin "/resources/**" = "/public-resources/" cache-period = "31556926" />

La mapping atributo debe ser un patrn Ant que puede ser utilizado por SimpleUrlHandlerMapping , y la location atributo debe especificar una o ms ubicaciones vlidas recursos de directorio. Varias ubicaciones recursos pueden ser especificados utilizando una lista separada por comas de los valores. Las ubicaciones especificadas se comprueban en el orden especificado por la presencia del recurso para cualquier solicitud determinada. Por ejemplo, para permitir que la porcin de los recursos tanto de la raz de la aplicacin web y de una ruta conocida de /METAINF/public-web-resources/ en cualquier frasco en el uso classpath:
@ EnableWebMvc @ Configuracin WebConfig clase pblica se extiende WebMvcConfigurerAdapter { @ Override addResourceHandlers public void (ResourceHandlerRegistry registro) { registry.addResourceHandler ("/ resources / **") AddResourceLocations. ("/", "Classpath :/ META-INF/public-webresources /"); } }

Y en XML:
<mvc:resources anlisis grfico = ubicacin "/resources/**" = "/, classpath:/META-INF/public-web-resources/" />

Al momento de servir los recursos que pueden cambiar cuando una nueva versin de la aplicacin se implementa, se recomienda que incorpore una cadena de versin en el patrn de asignacin utilizado para solicitar los recursos, por lo que es posible obligar a los clientes a solicitar la versin recin desplegada de la su aplicacin recursos. Tal cadena de versin se puede parametrizar y utilizar con Spel para que pueda ser manejada fcilmente en un solo lugar cuando implementar nuevas versiones. Como ejemplo, consideremos una aplicacin que utiliza un rendimiento optimizado costumbre de construccin (como se recomienda) de la biblioteca de Dojo JavaScript en la produccin, y que la construccin es generalmente implementado dentro de la aplicacin web en un camino de /public-resources/dojo/dojo.js . Desde diferentes partes del Dojo se puede incorporar en la estructura de encargo para cada nueva versin de la aplicacin, los navegadores web cliente deben ser obligados a volver a descargar esa costumbre-construido dojo.js recurso cada vez que se despleg una nueva versin de la aplicacin . Una forma sencilla de conseguir esto sera gestionar la versin de la aplicacin en un archivo de propiedades, tales como:
Application.Version = 1.0.0

y luego hacer que los valores del archivo de propiedades de acceso a Spel como un bean mediante la util:properties tag:
<util:properties id = "applicationProps" ubicacin = "/WEBINF/spring/application.properties" />

Con la versin de la aplicacin ahora accesible a travs de Spel, se puede incorporar esto en el uso de la resources tag:

En Java, se puede utilizar la @PropertySouce anotacin y luego inyectar el Environment abstraccin para acceder a todas las propiedades definidas:
@ Configuracin @ EnableWebMvc @ PropertySource ("/" WEB-INF/spring/application.properties) WebConfig clase pblica se extiende WebMvcConfigurerAdapter { @ Inject Medio Ambiente env; @ Override addResourceHandlers public void (ResourceHandlerRegistry registro) { registry.addResourceHandler ("/ recursos-" + env.getProperty ("Application.Version") + "/ **") AddResourceLocations. ("/ Public-resources /"); } }

y, por ltimo, para solicitar el recurso con la URL correcta, podemos tomar ventaja de las etiquetas JSP Spring:
expresin <spring:eval = "@applicationProps['application.version']" var = "applicationVersion" /> <spring:url value = "/resources-{applicationVersion}" var = "resourceUrl"> <spring:param name = value = "applicationVersion" "${applicationVersion}" /> </ Primavera: url> <script src = type = "${resourceUrl}/dojo/dojo.js" "text/javascript"> </ script>

17.15.7 mvc: default-servlet-controlador

Esta etiqueta permite el mapeo de la DispatcherServlet a "/" (no teniendo en cuenta la correlacin de servlet predeterminado del contenedor), al tiempo que permite las solicitudes de recursos estticos a ser manipulados por Servlet default del contenedor. Se configura un DefaultServletHttpRequestHandler con una asignacin de direccin URL de "/ **" y la prioridad ms baja con respecto a otras asignaciones de URL. Este controlador enviar todas las solicitudes para el servlet por defecto. Por lo tanto es importante que siga siendo ltimo en el orden de todos los URL otros HandlerMappings . Ese ser el caso si se utiliza <mvc:annotation-driven> o, alternativamente, si usted est configurando su propio personalizado HandlerMapping instancia asegrese de poner su order propiedad en un valor inferior al de la DefaultServletHttpRequestHandler , que es Integer.MAX_VALUE .

Para activar la funcin mediante el uso de la configuracin predeterminada:


@ Configuracin @ EnableWebMvc WebConfig clase pblica se extiende WebMvcConfigurerAdapter { @ Override public void configureDefaultServletHandling (DefaultServletHandlerConfigurer configurer) { configurer.enable (); } }

O en XML:
<mvc:default-servlet-handler/>

La advertencia para reemplazar el "/" mapeo de servlets es que el RequestDispatcher para el servlet por defecto debe ser recuperado por su nombre y no por camino. El DefaultServletHttpRequestHandler intentar detectar automticamente el servlet por defecto para el contenedor en tiempo de inicio, utilizando una lista de nombres conocidos para la mayora de los contenedores de Servlets importantes (incluyendo Tomcat, Jetty, GlassFish, JBoss, Resin, WebLogic y WebSphere). Si el servlet predeterminado se ha configurado de forma personalizada con un nombre diferente, o si un contenedor de Servlets diferente donde se est utilizando el nombre de servlet por defecto es desconocido, entonces el nombre del servlet por defecto debe ser explcitamente como en el siguiente ejemplo:
@ Configuracin @ EnableWebMvc WebConfig clase pblica se extiende WebMvcConfigurerAdapter { @ Override public void configureDefaultServletHandling (DefaultServletHandlerConfigurer configurer) { configurer.enable ("myCustomDefaultServlet"); } }

O en XML:
<mvc:default-servlet-handler default-servlet-name = "myCustomDefaultServlet" />

17.15.8 Ms Spring Web MVC Recursos

Ver los siguientes enlaces y punteros para obtener ms recursos sobre Spring Web MVC:

Hay muchos excelentes artculos y tutoriales que muestran cmo crear aplicaciones web con Spring MVC. Lalos en la primavera de Documentacin pgina.

"Expert Spring Web MVC y Web Flow" por Seth Ladd y otros (publicado por Apress) es una excelente fuente impresa de Spring Web MVC bondad.

17.15.9 personalizaciones avanzadas con MVC Java Config

Como se puede ver en los ejemplos anteriores, configuracin MVC Java y el espacio de nombres MVC proporcionar mayores construcciones de nivel que no requieren un conocimiento profundo de los granos bsicos creados por usted. En su lugar, le ayuda a centrarse en las necesidades de su aplicacin. Sin embargo, en algn momento es posible que necesite un control ms fino de grano o puede que simplemente desean entender la configuracin subyacente. El primer paso hacia un mayor control de grano fino es ver los granos bsicos creados por usted. En MVC Java config se puede ver el Javadoc y los @Bean mtodos en WebMvcConfigurationSupport . La configuracin de esta clase se importa automticamente a travs del @EnableWebMvc anotacin. De hecho, si usted abre @EnableWebMvc usted puede ver el @Import comunicado. El siguiente paso hacia un mayor control de grano fino es personalizar una propiedad en uno de los granos creados en WebMvcConfigurationSupport o tal vez para dar su propia instancia. Esto requiere dos cosas - quitar el @EnableWebMvc anotacin con el fin de impedir la importacin y luego se extienden directamente desde WebMvcConfigurationSupport . Aqu est un ejemplo:
@ Configuracin public class extends WebConfig WebMvcConfigurationSupport { @ Override public void addInterceptors (InterceptorRegistry registro) { / / ... } @ Override @ Frijol requestMappingHandlerAdapter pblico RequestMappingHandlerAdapter () { / / Se crea o deje "super" crear el adaptador / / A continuacin, personalizar una de sus propiedades } }

Tenga en cuenta que la modificacin de frijoles de esta manera no le impide utilizar cualquiera de los de ms alto nivel construye mostrado anteriormente en esta seccin.
17.15.10 personalizaciones avanzadas con el espacio de nombres MVC

De grano fino control sobre la configuracin creada para usted es un poco ms difcil con el espacio de nombres MVC.

Si usted no necesita hacer eso, en lugar de replicar la configuracin que ofrece, podra configurar un BeanPostProcessor que detecta el grano que desea personalizar segn el tipo y luego modificar sus propiedades segn sea necesario. Por ejemplo:
@ Component MyPostProcessor clase pblica implementa BeanPostProcessor { postProcessBeforeInitialization public Object (Objeto de frijol, String name) throws BeansException { if (frijol instanceof RequestMappingHandlerAdapter) { / / Modificar propiedades del adaptador } } }

Tenga en cuenta que MyPostProcessor debe incluirse en un <component scan /> con el fin de que pueda ser detectado o si lo prefiere, puede declararlo explcitamente con una declaracin XML frijol.

18. Ver las tecnologas 18.1 Introduccin


Una de las reas en las que sobresale la primavera est en la separacin de las tecnologas de vista del resto del framework MVC. Por ejemplo, la decisin de utilizar la velocidad o XSLT en lugar de uno ya existente JSP es ante todo una cuestin de configuracin. Este captulo cubre las tecnologas de vista principales que trabajan con la primavera y toca brevemente sobre la forma de agregar nuevos. Este captulo asume que ya est familiarizado con la Seccin 17.5, "Resolucin de puntos de vista" que cubre los conceptos bsicos de cmo opiniones en general se acoplan a la estructura MVC.

JSP y JSTL 18,2


Spring proporciona un par de out-of-the-box soluciones para las vistas de JSP y JSTL. El uso de JSP o JSTL se realiza utilizando una resolucin de vista normal se define en la WebApplicationContext . Adems, por supuesto, tiene que escribir algunas pginas JSP que realmente hacen la vista.
Nota

Configurar la aplicacin para utilizar JSTL es una fuente comn de error, causado principalmente por la confusin sobre la especificacin servlet diferente., JSP y JSTL nmeros de versin, lo que significan y cmo declarar las bibliotecas de etiquetas correctamente. El artculo Cmo hacer referencia y utilizar JSTL en su aplicacin Web ofrece una gua til para los problemas comunes y cmo evitarlos. Tenga en cuenta que en la primavera de 3,0, la versin mnima compatible servlet es 2,4 (JSP JSTL 2.0 y 1.1), lo que reduce las posibilidades de confusin un poco.

18.2.1 Ver resolvers

Al igual que con cualquier tecnologa de otro punto de vista est integrando con la primavera, para JSP tendr una resolucin de vista que va a resolver sus puntos de vista. Los solucionadores de vista ms comnmente utilizado en el desarrollo de JSP son los InternalResourceViewResolver y la ResourceBundleViewResolver . Ambos se declaran en el WebApplicationContext :
<- El ResourceBundleViewResolver -> <bean id = "viewResolver" class = "org.springframework.web.servlet.view.ResourceBundleViewResolver"> <propiedad nombre = valor = "basename" "views" /> </ Bean> # Y un ejemplo de archivo de propiedades es views.properties usos (en WEB-INF/classes): bienvenidos. (clase) = org.springframework.web.servlet.view.JstlView welcome.url = / WEB-INF/jsp/welcome.jsp Lista del producto. (clase) = org.springframework.web.servlet.view.JstlView productList.url = / WEB-INF/jsp/productlist.jsp

Como se puede ver, el ResourceBundleViewResolver necesita un archivo de propiedades que define los nombres de las vistas asignadas a 1) una clase y 2) una URL. Con un ResourceBundleViewResolver puede mezclar diferentes tipos de puntos de vista con una sola resolucin.
<bean id = "viewResolver" class = "org.springframework.web.servlet.view.InternalResourceViewResolver"> <propiedad nombre = valor = "viewClass" "org.springframework.web.servlet.view.JstlView" /> <propiedad nombre = valor = "prefix" "/WEB-INF/jsp/" /> <propiedad nombre = valor = "suffix" ".jsp" /> </ Bean>

El InternalResourceBundleViewResolver puede ser configurado para utilizar JSP como se describi anteriormente. Como prctica recomendada, le recomendamos colocar los archivos JSP en un directorio bajo el 'WEB-INF' directorio, por lo que no puede haber acceso directo de los clientes.
'Plain-viejas 18.2.2 JSP JSTL frente

Cuando se utiliza la biblioteca de Java Standard Tag debe utilizar una clase de vista especial, el JstlView , como JSTL necesita un poco de preparacin antes de cosas como las caractersticas I18N funcionar.
18.2.3 etiquetas adicionales que faciliten el desarrollo

Spring proporciona un enlace de datos de parmetros de la peticin de objetos de comando como se describe en los captulos anteriores. Para facilitar el desarrollo de las pginas JSP, en combinacin con las caractersticas de enlace de datos, Spring ofrece algunas etiquetas que hacen que las cosas an ms fcil. Todas las etiquetas de

primavera han HTML escapar funciones para habilitar o deshabilitar el escape de caracteres. La etiqueta de biblioteca descriptor (TLD) est incluido en el spring-webmvc.jar . Ms informacin sobre las etiquetas individuales se pueden encontrar en el anexo titulado Apndice G, spring.tld .
18.2.4 Uso de Primavera de biblioteca de formularios de etiquetas

Desde la versin 2.0, Spring proporciona un conjunto completo de datos vinculantes que reconocen las etiquetas para el manejo de los elementos de formulario utilizando JSP y Spring Web MVC. Cada etiqueta proporciona soporte para el conjunto de atributos de su homlogo correspondiente etiqueta HTML, por lo que las etiquetas familiar e intuitivo de usar. El tag HTML generado es compatible con HTML 4.01/XHTML 1,0. A diferencia de otras bibliotecas de etiquetas de formulario / entrada, biblioteca de Spring formulario de etiqueta se integra con Spring Web MVC, dando acceso a las variables del objeto de comando y datos de referencia del controlador trata. Como se ver en los siguientes ejemplos, las etiquetas de formulario JSP hacer ms fcil desarrollar, leer y mantener. Vamos a travs de las etiquetas de formulario y ver un ejemplo de cmo se usa cada etiqueta. Hemos incluido fragmentos de cdigo HTML generado en ciertas etiquetas requieren mayores comentarios.
Configuracin

La biblioteca de etiquetas viene incluido en forma spring-webmvc.jar . El descriptor de la biblioteca se llama spring-form.tld . Para utilizar las etiquetas de esta biblioteca, aada la directiva siguiente al principio de la pgina JSP:
<% @ Taglib prefix = "form" uri = "http://www.springframework.org/tags/form"%>

... donde form es el prefijo de nombre de la etiqueta que desea utilizar para las etiquetas de esta biblioteca.
La form de etiquetas

Esta etiqueta hace que el tag 'forma' un HTML y expone una ruta de enlace con las etiquetas internas para la unin. Pone el objeto de comando en el PageContext de modo que el objeto de comando se puede acceder por etiquetas interiores. Todas las otras etiquetas de esta biblioteca se anidan las etiquetas de la form etiqueta. Supongamos que tenemos un objeto de dominio llamado User . Se trata de un JavaBean con propiedades como firstName y lastName . Vamos a utilizar como soporte en

forma de objeto de nuestro controlador de forma que devuelve form.jsp . A continuacin se muestra un ejemplo de lo form.jsp se vera as:
<form:form> <table> <tr> Nombre <td>: </ td> <td> <form:input path = "firstName" /> </ td> </ Tr> <tr> Apellidos <td>: </ td> <td> <form:input path = "lastName" /> </ td> </ Tr> <tr> <td colspan = "2"> <input type = value = "submit" "Save Changes" /> </ Td> </ Tr> </ Table> </ Form: form>

Los firstName y lastName valores se obtienen del objeto de comando situado en la PageContext por el controlador de la pgina. Sigue leyendo para ver ejemplos ms complejos de cmo las etiquetas internas se utilizan con la form de etiquetas. El HTML generado se parece a una forma estndar:
<form method = "POST"> <table> <tr> Nombre <td>: </ td> <td> nombre <input = "firstName" type = value = "text" "Harry" /> </ td> </ Tr> <tr> Apellidos <td>: </ td> <td> nombre <input = "lastName" type = value = "text" "Potter" /> </ td> </ Tr> <tr> <td colspan = "2"> <input type = value = "submit" "Save Changes" /> </ Td> </ Tr> </ Table> </ Form>

El JSP anterior supone que el nombre de la variable del objeto de soporte en forma de es 'command' . Si usted ha puesto el soporte en forma de objeto en el modelo con otro nombre (sin duda una buena prctica), entonces se puede enlazar el formulario a la variable denominada de este modo:
<form:form commandName "user" => <table> <tr> Nombre <td>: </ td> <td> <form:input path = "firstName" /> </ td>

</ Tr> <tr> Apellidos <td>: </ td> <td> <form:input path = "lastName" /> </ td> </ Tr> <tr> <td colspan = "2"> <input type = value = "submit" "Save Changes" /> </ Td> </ Tr> </ Table> </ Form: form>

La input etiqueta

Esta etiqueta hace que el tag 'input' un archivo HTML utilizando el valor enlazado y type = 'text' por defecto. Para ver un ejemplo de esta etiqueta, consulte la seccin titulada "La form tag " . Comenzando con Spring 3.1 puede utilizar otros tipos tales HTML5 tipos especficos como 'email', 'telfono', 'date', entre otros.
La checkbox etiqueta

Esta etiqueta hace que el tag 'input' un HTML con 'checkbox' tipo. Supongamos que nuestro User tiene sus preferencias, tales como suscripcin a un boletn y una lista de hobbies. A continuacin se muestra un ejemplo de la Preferences de clase:
Preferencias public class { privado receiveNewsletter booleano; private String [] intereses; private String favouriteWord; pblico isReceiveNewsletter boolean () { volver receiveNewsletter; } public void setReceiveNewsletter (booleano receiveNewsletter) { este receiveNewsletter = receiveNewsletter.; } public String [] () {getInterests volver intereses; } setInterests public void (String [] intereses) { esto le interesa = intereses.; } pblico getFavouriteWord String () { volver favouriteWord; } public void setFavouriteWord (String favouriteWord) { este favouriteWord = favouriteWord.;

} }

El form.jsp se vera as:


<form:form> <table> <tr> <td> Suscrbete al boletn: </ td> <% - Enfoque 1: La propiedad es de tipo java.lang.Boolean -%> <td> camino <form:checkbox = "preferences.receiveNewsletter" /> </ td> </ Tr> <tr> Intereses <td>: </ td> <td> <% - Enfoque 2: La propiedad es de una matriz o de tipo java.util.Collection -%> Quidditch: path = <form:checkbox "preferences.interests" value = "Quidditch" /> Herbologa: path = <form:checkbox "preferences.interests" value = "Herbology" /> Defensa Contra las Artes Oscuras: forma <: path = "checkbox" preferences.interests value = "Defensa Contra las Artes Oscuras" /> </ Td> </ Tr> <tr> Palabra <td> Favorito: </ td> <td> <% - Modalidad 3: La propiedad es de tipo java.lang.Object -%> Magic: camino <form:checkbox "preferences.favouriteWord" = value = "Magic" /> </ Td> </ Tr> </ Table> </ Form: form>

Existen 3 mtodos para la checkbox de etiquetas que debe satisfacer todas sus necesidades casilla de verificacin.

Enfoque One - Cuando el valor lmite es de tipo java.lang.Boolean , la input(checkbox) se marca como "marcado" si el valor enlazado es true . El value atributo se corresponde con el valor de resolver el setValue(Object) valor de la propiedad. Enfoque Dos - Cuando el valor lmite es de tipo array o java.util.Collection , la input(checkbox) se marca como "marcado" si la configuracin setValue(Object) valor est presente en la cota Collection . Enfoque de Tres - Para cualquier tipo de valor encuadernado, la input(checkbox) se marca como "marcado" si la configuracin setValue(Object) es igual al valor enlazado.

Tenga en cuenta que, independientemente del enfoque, la misma estructura HTML se genera. A continuacin se muestra un fragmento de cdigo HTML de algunas casillas de verificacin:
<tr> Intereses <td>: </ td> <td> Quidditch: <input name = "preferences.interests" type = value = "checkbox" "Quidditch" /> <input type = valor "hidden" = name = "1" "_preferences.interests" /> Herbologa: <input name = "preferences.interests" type = value = "checkbox" "Herbology" /> <input type = valor "hidden" = name = "1" "_preferences.interests" /> Defensa Contra las Artes Oscuras: <nombre de entrada = "preferences.interests" type = "checkbox" value = "Defensa Contra las Artes Oscuras" /> <input type = valor "hidden" = name = "1" "_preferences.interests" /> </ Td> </ Tr>

Lo que no puede esperar a ver es el campo oculto adicional despus de cada casilla. Cuando una casilla en una pgina HTML no est activada, su valor no se enva al servidor como parte de los parmetros de la peticin HTTP una vez que el formulario es enviado, por lo que necesitamos una solucin para esta peculiaridad en HTML para que los datos de primavera de forma vinculante a trabajar. La checkbox etiqueta sigue la convencin de primavera existente de incluir un parmetro oculto contiene un guin bajo ("_") en cada casilla. De esta manera, en realidad est diciendo primavera que "la casilla de verificacin era visible en la forma y quiero que mi objeto al cual los datos del formulario estarn obligados a reflejar el estado de la casilla no importa qu".
La checkboxes etiqueta

Esta etiqueta hace varias etiquetas de 'entrada' HTML del tipo "checkbox". Basndose en el ejemplo de la anterior checkbox seccin de la etiqueta. A veces prefiero no tener que enumerar todos los posibles aficiones en tu pgina JSP. Usted prefiere una lista en tiempo de ejecucin de las opciones disponibles y aconteci que en la etiqueta. Ese es el propsito de la checkboxes de etiquetas. Se pasa de una Array , una List o un Map que contiene las opciones disponibles en la seccin "Artculos" de propiedad. Tpicamente, la propiedad enlazada es una coleccin de manera que pueda almacenar varios valores seleccionados por el usuario. A continuacin se muestra un ejemplo de la JSP con esta etiqueta:
<form:form> <table> <tr> Intereses <td>: </ td> <td> <% - La propiedad es de una matriz o de tipo java.util.Collection -%> <form:checkboxes path = artculos = "preferences.interests" "${interestList}" />

</ Td> </ Tr> </ Table> </ Form: form>

Este ejemplo supone que la "interestList" es una List disponible como un atributo de modelo que contiene cadenas de los valores que se pueden seleccionar a partir de. En el caso en que se utiliza un mapa, la tecla de entrada de mapa se utilizar como el valor y el valor de la entrada de mapa se utilizar como la etiqueta que se mostrar. Tambin puede utilizar un objeto personalizado en el que pueden proporcionar los nombres de las propiedades para el valor con "ItemValue" y la etiqueta con "itemLabel".
El radiobutton etiqueta

Esta etiqueta hace que el tag 'input' un archivo HTML con el tipo "radio". Un patrn tpico de uso implicar varias instancias de etiquetas asociadas a la misma propiedad, pero con valores diferentes.
<tr> Sexo <td>: </ td> Hombre <td>: path = valor <form:radiobutton "sex" = "M" /> <br/> Mujer: path = valor <form:radiobutton "sex" = "F" /> </ td> </ Tr>

El radiobuttons etiqueta

Esta etiqueta hace varias etiquetas de 'entrada' HTML del tipo "radio". Al igual que la checkboxes etiqueta anterior, es posible que desee pasar en las opciones disponibles como una variable de tiempo de ejecucin. Para este uso se deber elegir la radiobuttons etiqueta. Se pasa de una Array , una List o un Map que contiene las opciones disponibles en la seccin "Artculos" de propiedad. En el caso en que se utiliza un mapa, la tecla de entrada de mapa se utilizar como el valor y el valor de la entrada de mapa se utilizar como la etiqueta que se mostrar. Tambin puede utilizar un objeto personalizado en el que pueden proporcionar los nombres de las propiedades para el valor con "ItemValue" y la etiqueta con "itemLabel".
<tr> Sexo <td>: </ td> <td> <form:radiobuttons path = artculos = "sex" "${sexOptions}" /> </ td> </ Tr>

La password etiqueta

Esta etiqueta hace que el tag 'input' un HTML con 'password' tipo utilizando el valor enlazado.
<tr> Contrasea <td>: </ td> <td> <form:password path = "password" />

</ Td> </ Tr>

Tenga en cuenta que, por defecto, el valor de la contrasea no se muestra. Si desea que el valor de la contrasea que se muestra, a continuacin, establezca el valor de la 'showPassword' atributo en true, como tal.
<tr> Contrasea <td>: </ td> <td> <form:password path = "password" value = "^76525bvHGq" showPassword = "true" /> </ Td> </ Tr>

La select etiqueta

Esta etiqueta hace un HTML 'select' elemento. Es compatible con el enlace de datos a la opcin seleccionada, as como el uso de anidado option y options etiquetas. Supongamos que un User tiene una lista de habilidades.
<tr> Habilidades <td>: </ td> <td> camino <form:select = Producto "skills" = "${skills}" /> </ td> </ Tr>

Si el User's habilidad se encontraban en Herbologa, el cdigo fuente HTML de la fila "Habilidades" se vera as:
<tr> Habilidades <td>: </ td> <td> nombre <seleccionar = "skills" mltiple = "true"> <option valor = "Potions"> Pociones </ option> <option valor = "Herbology" selected = "selected"> Herbologa </ option> <option valor = "Quidditch"> Quidditch </ option> </ select> </ Td> </ Tr>

La option etiqueta

Esta etiqueta hace un HTML 'opcin'. En l se establecen 'seleccionado', segn proceda en funcin del valor lmite.
<tr> <td> House: </ td> <td> <form:select path = "house"> <form:option value = "Gryffindor" /> <form:option value = "Hufflepuff" /> <form:option value = "Ravenclaw" /> <form:option value = "Slytherin" /> </ Form: select>

</ Td> </ Tr>

Si el User's se encontraba en casa de Gryffindor, el cdigo fuente HTML de la 'Casa' fila se vera as:
<tr> <td> House: </ td> <td> nombre = <seleccionar "house"> <option valor = "Gryffindor" selected = "selected"> Gryffindor </ option> <option valor = "Hufflepuff"> Hufflepuff </ option> <option valor = "Ravenclaw"> Ravenclaw </ option> <option valor = "Slytherin"> Slytherin </ option> </ Select> </ Td> </ Tr>

La options etiqueta

Esta etiqueta representa una lista de etiquetas de 'opcin' HTML. Se establece el 'seleccionado' atributo segn proceda en funcin del valor lmite.
<tr> <td> Pas: </ td> <td> <form:select path = "country"> <form:option value = "-" label = "--Please Select" /> artculos <form:options = "${countryList}" ItemValue = "code" itemLabel = "name" /> </ Form: select> </ Td> </ Tr>

Si el User vive en el Reino Unido, el cdigo fuente HTML de la fila del pas, se vera as:
<tr> <td> Pas: </ td> <td> nombre = <seleccionar "country"> <option valor = "-"> - Por favor seleccione </ option> <option valor = "AT"> Austria </ option> <option valor = "UK" selected = "selected"> Reino Unido </ option> <option valor = "US"> Estados Unidos </ option> </ Select> </ Td> </ Tr>

Como muestra el ejemplo, el uso combinado de una option con la etiqueta de options marca genera el cdigo HTML misma norma, pero le permite especificar explcitamente un valor en la JSP que es slo para visualizacin (donde corresponde), como la cadena por defecto en el ejemplo: "- por favor seleccione".

Los items atributo es normalmente llena con una coleccin o una matriz de objetos de elemento. itemValue y itemLabel simplemente se refieren a las propiedades de frijol de los objetos de elemento, si se especifica lo contrario, los objetos mismos elementos se Stringified. Como alternativa, puede especificar un Map de puntos, en cuyo caso las claves del mapa se interpretan como valores de opcin y los valores del mapa corresponden a las etiquetas de opcin. Si itemValue y / o itemLabel pasar a ser especificado as, el valor de la propiedad artculo se aplicar a la clave del mapa y la propiedad label artculo se aplicar al valor del mapa.
El textarea etiqueta

Esta etiqueta hace un HTML 'textarea'.


<tr> Notas <td>: </ td> <td> <form:textarea path = filas "notes" = "3" cols = "20" /> </ td> <td> <form:errors path = "notes" /> </ td> </ Tr>

El hidden etiqueta

Esta etiqueta hace que el tag 'input' un archivo HTML con el tipo de "oculto" utilizando el valor enlazado. Para enviar un valor sin consolidar oculta, use el cdigo HTML input con etiqueta tipo "oculto".
camino <form:hidden = "house" />

Si optamos por presentar el valor de la "casa" como una oculta, el cdigo HTML se vera as:
<input name = "house" type = value = "hidden" "Gryffindor" />

Los errors etiqueta

Esta etiqueta hace que los errores de campo de tag 'span' un HTML. Proporciona acceso a los errores creados en el controlador o en los que se crearon por cualquier validadores asociados con su controlador. Supongamos que desea mostrar todos los mensajes de error para los firstName y lastName campos una vez que enve el formulario. Tenemos un validador para las instancias del User clase llamada UserValidator .
pblico UserValidator clase implementa Validator { pblico apoyos booleano (candidato Clase) { .. usuario y vuelta en clase IsAssignableFrom (candidato); } public void validate (Object obj, Errores errores) {

ValidationUtils.rejectIfEmptyOrWhitespace (errores, "Nombre", "REQUERIDO", "campo es obligatorio."); ValidationUtils.rejectIfEmptyOrWhitespace (errores, "Apellido", "REQUERIDO", "campo es obligatorio."); } }

El form.jsp se vera as:


<form:form> <table> <tr> Nombre <td>: </ td> <td> <form:input path = "firstName" /> </ td> <% - Mostrar errores de campo firstName -%> <td> <form:errors path = "firstName" /> </ td> </ Tr> <tr> Apellidos <td>: </ td> <td> <form:input path = "lastName" /> </ td> <% - Mostrar errores de campo Apellidos -%> <td> <form:errors path = "lastName" /> </ td> </ Tr> <tr> <td colspan = "3"> <input type = value = "submit" "Save Changes" /> </ Td> </ Tr> </ Table> </ Form: form>

Si nos enva un formulario con valores vacos en los firstName y lastName campos, esto es lo que el cdigo HTML se vera as:
<form method = "POST"> <table> <tr> Nombre <td>: </ td> <td> nombre <input = "firstName" type = value = "text" "" /> </ td> <% - Los errores asociados a campo Nombre muestra -%> <td> <span name = "firstName.errors"> Campo es requerido. </ span> </ td> </ Tr> <tr> Apellidos <td>: </ td> <td> nombre <input = "lastName" type = value = "text" "" /> </ td> <% - Los errores asociados a campos lastName muestra %> <td> <span name = "lastName.errors"> Campo es requerido. </ span> </ td> </ Tr> <tr> <td colspan = "3"> <input type = value = "submit" "Save Changes" /> </ Td> </ Tr>

</ Table> </ Form>

Qu pasa si queremos mostrar la lista completa de los errores de una pgina determinada? El siguiente ejemplo muestra que el errors etiqueta tambin es compatible con algunas funciones bsicas comodines.
path="*" - muestra todos los errores path="lastName" - muestra todos los errores asociados si path se omite - Errores de objetos slo se visualizan

con la lastName campo

El ejemplo siguiente muestra una lista de errores en la parte superior de la pgina, seguido de errores especficos de campo junto a los campos:
<form:form> <form:errors path = "*" cssClass = "errorBox" /> <table> <tr> Nombre <td>: </ td> <td> <form:input path = "firstName" /> </ td> <td> <form:errors path = "firstName" /> </ td> </ Tr> <tr> Apellidos <td>: </ td> <td> <form:input path = "lastName" /> </ td> <td> <form:errors path = "lastName" /> </ td> </ Tr> <tr> <td colspan = "3"> <input type = value = "submit" "Save Changes" /> </ Td> </ Tr> </ Table> </ Form: form>

El HTML se vera as:


<form method = "POST"> <span name = "*.errors" class = "errorBox"> Campo es requerido. <br/> campo es obligatorio. </ span> <table> <tr> Nombre <td>: </ td> <td> nombre <input = "firstName" type = value = "text" "" /> </ td> <td> <span name = "firstName.errors"> Campo es requerido. </ span> </ td> </ Tr> <tr> Apellidos <td>: </ td> <td> nombre <input = "lastName" type = value = "text" "" /> </ td> <td> <span name = "lastName.errors"> Campo es requerido. </ span> </ td> </ Tr> <tr> <td colspan = "3">

<input type = value = "submit" "Save Changes" /> </ Td> </ Tr> </ Form>

HTTP Mtodo de conversin

Un principio clave de REST es el uso de la interfaz uniforme. Esto significa que todos los recursos (URL) se puede manipular con las mismas cuatro mtodos HTTP: GET, PUT, POST y DELETE. Para cada mtodo, la especificacin HTTP define la semntica exacta. Por ejemplo, un GET siempre debe ser una operacin segura, lo que significa que se carece de efectos secundarios y una PUT o DELETE debe ser idempotente, lo que significa que puede repetir estas operaciones una y otra vez, pero el resultado final debe ser el mismo. Mientras que HTTP define estos cuatro mtodos, HTML slo admite dos: GET y POST. Afortunadamente, hay dos soluciones posibles: se puede usar JavaScript para hacer su PUT o DELETE, o simplemente hacer un post con lo "real" mtodo como un parmetro adicional (modelada como un campo de entrada oculto en un formulario HTML). Este truco ltimo es lo que Spring HiddenHttpMethodFilter hace. Este filtro es un filtro de servlet simple y por lo tanto puede ser utilizado en combinacin con cualquier marco web (no slo Spring MVC). Basta con aadir este filtro para tu web.xml, y un poste con un parmetro _method oculto se convertir en el mtodo correspondiente solicitud HTTP. Para admitir la conversin HTTP mtodo de primavera etiqueta de formulario MVC se ha actualizado para apoyar la creacin del mtodo HTTP. Por ejemplo, el siguiente fragmento tomado de la muestra actualizada Petclinic
<form:form method = "delete"> <p class = "submit"> <input type = value = "submit" "Delete Pet" /> </ p> </ Form: form>

En realidad, esto llevar a cabo un HTTP POST, con el mtodo "real" DELETE escondido detrs de un parmetro de peticin, para ser recogido por el HiddenHttpMethodFilter , tal como se define en web.xml:
<filter> <filter-name> httpMethodFilter </ filter-name> <filter- clase> org.springframework.web.filter.HiddenHttpMethodFilter </ filter-clase> </ Filter> <filter-mapping> <filter-name> httpMethodFilter </ filter-name> <servlet-name> petclinic </ servlet-name> </ Filter-mapping>

El correspondiente mtodo @ Controller se muestra a continuacin:


@ RequestMapping (method = RequestMethod.DELETE) pblico deletePet String (@ PathVariable ID_PROPIETARIO int, @ PathVariable petId int) { este clinic.deletePet (petId).; retorno "redirigir los propietarios :/ /" + ID_PROPIETARIO; }

HTML5 Tags

A partir de la primavera 3, la forma del resorte biblioteca de etiquetas permite introducir atributos dinmicos, lo que significa que puede acceder a todos los atributos especficos de HTML5. En la primavera de 3,1, la etiqueta de entrada de formulario compatible con entrar en un atributo de otro tipo de "texto". Con ello se pretende permitir la prestacin de nuevos tipos de HTML5 de entrada especficos, tales como 'email', 'Fecha', 'radio de accin', y otros. Tenga en cuenta que la entrada type = 'text' no es necesaria ya que "texto" es el tipo predeterminado.

18,3 Azulejos
Es posible integrar Azulejos - al igual que cualquier otra tecnologa de otro punto de vista - en las aplicaciones web con Spring. A continuacin se describe de manera amplia cmo hacerlo. NOTA: Esta seccin se centra en el apoyo para la primavera Azulejos 2 (la versin independiente de los Azulejos, que requiere Java 5 +) en el org.springframework.web.servlet.view.tiles2 como paquete, as como azulejos de las 3 de la org.springframework.web.servlet.view.tiles3 paquete. La primavera tambin contina apoyando 1.x Azulejos (tambin conocido como "Struts Tiles", tal como se entregan con Struts 1.1 +, compatible con Java 1.4) en el original org.springframework.web.servlet.view.tiles paquete.
18.3.1 Dependencias

Para poder utilizar los azulejos que usted tiene que tener un par de dependencias adicionales incluidas en su proyecto. La siguiente es la lista de dependencias que necesita.
Tiles version 2.1.2 or higher Commons BeanUtils Commons Digester Commons Logging

18.3.2 Cmo integrar Azulejos

Para poder utilizar Azulejos, hay que configurar el uso de archivos que contienen definiciones (para obtener informacin bsica sobre las definiciones y conceptos Azulejos, por favor eche un vistazo a http://tiles.apache.org ). En la primavera de esto se hace usando la TilesConfigurer . Echa un vistazo a el siguiente fragmento de ejemplo ApplicationContext configuracin:
<bean id = "tilesConfigurer" class = "org.springframework.web.servlet.view.tiles2.TilesConfigurer"> <propiedad nombre = "definitions"> <list> <valor> / WEB-INF/defs/general.xml </ value> <valor> / WEB-INF/defs/widgets.xml </ value>

<valor> / WEB-INF/defs/administrator.xml </ value> <valor> / WEB-INF/defs/customer.xml </ value> <valor> / WEB-INF/defs/templates.xml </ value> </ List> </ Propiedad> </ Bean>

Como usted puede ver, hay cinco archivos que contienen definiciones, todas ellas situadas en el 'WEB-INF/defs' directorio. En la inicializacin de la WebApplicationContext , los archivos se cargan y la fbrica de definiciones se inicializarn. Despus de que se ha hecho, los Azulejos incluye en los archivos de definicin se pueden utilizar como puntos de vista dentro de la aplicacin web de Primavera. Para poder utilizar las vistas que tiene que tener un ViewResolver al igual que con cualquier otro punto de vista utilizado la tecnologa con la primavera. A continuacin se muestran dos posibilidades, la UrlBasedViewResolver y la ResourceBundleViewResolver .
UrlBasedViewResolver

El UrlBasedViewResolver instancia el dado viewClass para cada vista que tiene que resolver.
<bean id = "viewResolver" class = "org.springframework.web.servlet.view.UrlBasedViewResolver"> <propiedad nombre = valor = "viewClass" "org.springframework.web.servlet.view.tiles2.TilesView" /> </ Bean> ResourceBundleViewResolver

El ResourceBundleViewResolver tiene que estar provisto de un archivo de propiedades que contiene viewnames y viewclasses la resolucin puede utilizar:
<bean id = "viewResolver" class = "org.springframework.web.servlet.view.ResourceBundleViewResolver"> <propiedad nombre = valor = "basename" "views" /> </ Bean> ... welcomeView. (clase) = org.springframework.web.servlet.view.tiles2.TilesView welcomeView.url = Bienvenido (este es el nombre de una definicin Azulejos) vetsView. (clase) = org.springframework.web.servlet.view.tiles2.TilesView vetsView.url = vetsView (de nuevo, este es el nombre de una definicin Azulejos) findOwnersForm. (clase) = org.springframework.web.servlet.view.JstlView findOwnersForm.url = / WEB-INF/jsp/findOwners.jsp ...

Como se puede ver, cuando se utiliza el ResourceBundleViewResolver , usted puede fcilmente mezclar diferentes tecnologas de visualizacin.

Tenga en cuenta que el TilesView clase para Azulejos 2 soporta JSTL (Biblioteca JSP Standard Tag) fuera de la caja, mientras que existe un aparte TilesJstlView subclase en el apoyo 1.x Azulejos.
SimpleSpringPreparerFactory y SpringBeanPreparerFactory

Como una caracterstica avanzada, la primavera tambin es compatible con dos fichas especiales 2 PreparerFactory implementaciones. Echa un vistazo a la documentacin Azulejos para obtener ms informacin sobre cmo utilizar ViewPreparer referencias en los archivos de definicin de Tiles. Especifique SimpleSpringPreparerFactory a autowire casos ViewPreparer basados en clases preparador especificados, aplicando las devoluciones de llamada Primavera de contenedores, as como la aplicacin configuradas BeanPostProcessors Primavera. Si el contexto de toda la anotacin de Spring-config ha sido activada, las anotaciones en las clases ViewPreparer ser automticamente detectado y aplicado. Tenga en cuenta que esta espera preparador de clases en los archivos de definiciones de Tiles, al igual que el defecto PreparerFactory hace. Especifique SpringBeanPreparerFactory para operar en los nombres preparador especificada en lugar de clases, obteniendo el frijol de primavera correspondiente de contexto de aplicacin de la DispatcherServlet. El proceso de creacin de frijol completo estar en el control del contexto de aplicacin de primavera en este caso, lo que permite el uso de la configuracin explcita inyeccin de dependencia, con mbito frijoles, etc Tenga en cuenta que es necesario definir una definicin de bean Spring por nombre preparador (como se usa en los azulejos de definiciones).
<bean id = "tilesConfigurer" class = "org.springframework.web.servlet.view.tiles2.TilesConfigurer"> <propiedad nombre = "definitions"> <list> <valor> / WEB-INF/defs/general.xml </ value> <valor> / WEB-INF/defs/widgets.xml </ value> <valor> / WEB-INF/defs/administrator.xml </ value> <valor> / WEB-INF/defs/customer.xml </ value> <valor> / WEB-INF/defs/templates.xml </ value> </ List> </ Propiedad> <- Resolucin de nombres como preparador de nombres Spring definicin de frijol -> Nombre <property = "preparerFactoryClass" value = "org.springframework.web.servlet.view.tiles2.SpringBeanPreparerFactory " /> </ Bean>

18,4 Velocidad y FreeMarker


Velocidad y FreeMarker son dos lenguajes de plantillas que se pueden utilizar como las tecnologas de vista dentro del resorte aplicaciones MVC. Los idiomas son muy similares y servir a necesidades similares y por lo tanto se consideran en conjunto en

esta seccin. Para las diferencias semnticas y sintcticas entre los dos idiomas, consulte la FreeMarker sitio web.
18.4.1 Dependencias

La aplicacin web deber incluir velocity-1.xxjar o freemarker-2.x.jar con el fin de trabajar con la velocidad o FreeMarker respectivamente y commonscollections.jar se requiere para la velocidad. Normalmente se incluyen en el WEBINF/lib carpeta en la que estn garantizados para ser encontrado por un servidor Java EE y se aade a la ruta de clase para su aplicacin. Est, por supuesto, asume que usted ya tiene el spring-webmvc.jar en su 'WEB-INF/lib' directorio tambin! Si usted hace uso de Spring 'dateToolAttribute' o 'numberToolAttribute' en las vistas de su velocidad, tambin tendr que incluir la velocity-tools-generic-1.x.jar
18.4.2 Contexto de configuracin

Una configuracin adecuada se inicializa mediante la adicin de la definicin configurer bean relevantes para su '*-servlet.xml' como se muestra a continuacin:
<! Este bean configura el entorno de velocidad para nosotros en base a una ruta raz para plantillas. Opcionalmente, un archivo de propiedades se puede especificar para un mayor control sobre la velocidad medio ambiente, pero los valores por defecto son bastante cuerdo para carga de archivos basado en plantillas. -> <bean id = "velocityConfig" class = "org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <propiedad nombre = valor = "resourceLoaderPath" "/WEBINF/velocity/" /> </ Bean> <! Resolucin de vista tambin se puede configurar con ResourceBundles o archivos XML. Si usted necesita punto de vista diferente sobre la base de la resolucin Locale, usted tiene que utilizar el sistema de resolucin paquete de recursos. -> <bean id = "viewResolver" class = "org.springframework.web.servlet.view.velocity.VelocityViewResolver"> <propiedad nombre = valor = "cache" "true" /> <propiedad nombre = valor = "prefix" "" /> <propiedad nombre = valor = "suffix" ".vm" /> </ Bean> <- Config FreeMarker -> <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfi gurer"> <propiedad name="templateLoaderPath" value="/WEB-INF/freemarker/"/> </ Bean> <! -

Resolucin de vista tambin se puede configurar con ResourceBundles o archivos XML. Si usted necesita punto de vista diferente sobre la base de la resolucin Locale, usted tiene que utilizar el sistema de resolucin paquete de recursos. -> <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewR esolver"> <propiedad name="cache" value="true"/> <propiedad name="prefix" valor=""/> <propiedad name="suffix" value=".ftl"/> </ Bean>

Nota

Para los que no web-apps aadir un VelocityConfigurationFactoryBean o un FreeMarkerConfigurationFactoryBean a su archivo de definicin de aplicacin contexto.
18.4.3 Creacin de plantillas

Las plantillas deben ser almacenados en el directorio especificado por el *Configurer bean se muestra arriba. Este documento no cubre los detalles de la creacin de plantillas para los dos idiomas - por favor ver a sus sitios web relevantes para su informacin. Si se utilizan los resolutores vista destacadas, a continuacin, los nombres de las vistas lgicas se refieren a los nombres de archivo de plantilla de forma similar a InternalResourceViewResolver para JSP. As que si su controlador devuelve un objeto ModelAndView contiene un nombre de vista de la "bienvenida" a continuacin, los resolutores buscar el /WEB-INF/freemarker/welcome.ftl o /WEBINF/velocity/welcome.vm plantilla, segn corresponda.
18.4.4 Configuracin avanzada

Las configuraciones bsicas resaltados anteriormente ser adecuado para los requisitos de la mayora de las aplicaciones, sin embargo las opciones de configuracin adicionales estn disponibles para cuando los requisitos inusuales o avanzado dictar.
velocity.properties

Este archivo es completamente opcional, pero si se especifica, contiene los valores que se transmiten a la velocidad de ejecucin con el fin de configurar la velocidad del mismo. Slo se requiere para configuraciones avanzadas, si usted necesita este archivo, especifique su ubicacin en el VelocityConfigurer definicin de bean arriba.
<bean id = "velocityConfig" class = "org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <propiedad nombre = valor = "configLocation" "/WEBINF/velocity.properties" /> </ Bean>

Como alternativa, puede especificar propiedades de velocidad directamente en la definicin de bean del bean config velocidad mediante la sustitucin de la "configLocation" propiedad con las propiedades siguientes en lnea.

<bean id = "velocityConfig" class = "org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <propiedad nombre = "velocityProperties"> <props> <prop clave = "resource.loader"> file </ prop> <prop clave = "file.resource.loader.class"> org.apache.velocity.runtime.resource.loader.FileResourceLoader </ Prop> <prop clave = "file.resource.loader.path"> $ {} webapp.root / WEB-INF/velocity </ prop> <prop clave = "file.resource.loader.cache"> false </ prop> </ Accesorios> </ Propiedad> </ Bean>

Consulte la documentacin de la API para la configuracin de Primavera de la velocidad, o la documentacin de velocidad para los ejemplos y definiciones de los 'velocity.properties' propio archivo.
FreeMarker

'Configuracin' y 'Freemarker SharedVariables' se puede pasar directamente a la FreeMarker Configuration objeto gestionado por Spring estableciendo las propiedades adecuadas de frijol en el FreeMarkerConfigurer frijol. El freemarkerSettings propiedad requiere un java.util.Properties objeto y el freemarkerVariables propiedad requiere un java.util.Map .
<propiedad nombre = valor = "templateLoaderPath" "/WEBINF/freemarker/" /> <propiedad nombre = "freemarkerVariables"> <map> clave = <entry "xml_escape" value-ref = "fmXmlEscape" /> </ Map> </ Propiedad> </ Bean> <bean id = "fmXmlEscape" class = "freemarker.template.utility.XmlEscape" />

Consulte la documentacin FreeMarker para ms detalles sobre la configuracin y las variables que se aplican a la Configuration objeto.
18.4.5 Bind apoyo y la forma de manejo

Spring proporciona una biblioteca de etiquetas para uso en JSP que contiene (entre otras cosas) un <spring:bind/> etiqueta. Esta etiqueta permite principalmente las formas para mostrar los valores de los objetos de soporte en forma y mostrar los resultados de las validaciones fallidas de un Validator en la capa web o negocio. Desde la versin 1.1, Spring ahora tiene soporte para las mismas funciones, tanto en velocidad y FreeMarker, con macros de conveniencia adicionales para generar elementos de formulario de entrada ellos mismos.

Las macros se unen

Un conjunto estndar de las macros se mantienen dentro del spring-webmvc.jar archivo para ambos idiomas, por lo que siempre estn disponibles para una aplicacin adecuadamente configurado. Algunas de las macros definidas en las bibliotecas de primavera se consideran internos (privada), pero no existe tal alcance en las definiciones de macro haciendo todas las macros visibles a llamar plantillas de cdigo y el usuario. En las secciones siguientes se centran nicamente en las macros que se deben llamar directamente desde dentro de sus plantillas. Si desea ver el cdigo de macro directamente, los archivos se llaman spring.vm / spring.ftl y estn en el
Simple unin

En los formularios HTML (vm / dt plantillas) que actan como "FormView 'para un controlador de formulario de Primavera, que se pueden utilizar cdigo similar al siguiente para unirse a los valores de campo y mostrar mensajes de error para cada campo de entrada de forma similar a la JSP equivalente. Tenga en cuenta que el nombre del objeto de comando es "comando" de forma predeterminada, pero puede suprimirse en la configuracin MVC mediante el establecimiento de la "commandName 'propiedad de bean en el controlador de formulario. Cdigo de ejemplo se muestra a continuacin para el personFormV y personFormF vistas configuradas anteriormente;
<- Velocidad macros estn automticamente disponibles -> <html> ... <form action = "" method = "POST"> Nombre: # SpringBind ("command.name") <Input type = "text" name = "$ {} status.expression" value = "$! status.value" /> MedlinePlus # Foreach ($ error en status.errorMessages $) <b> $ error </ b> MedlinePlus # end MedlinePlus ... <input type = value = "submit" "submit" /> </ Form> ... </ Html> <- Macros Freemarker tiene que ser importado en un espacio de nombres. Le recomendamos apegarse a 'primavera' -> <# Import "/ spring.ftl" como la primavera /> <html> ... <form action = "" method = "POST"> Nombre: <@ Spring.bind "command.name" /> <Input type = "text" name = "$ {} spring.status.expression" value = "$ {spring.status.value? por defecto (" ")}" /> MedlinePlus <# Lista spring.status.errorMessages como error> <b> $ {error} </ b> MedlinePlus </ # list>

MedlinePlus ... <input type = value = "submit" "submit" /> </ Form> ... </ Html> #springBind / <@spring.bind>

requiere un "camino" argumento que consiste en el nombre del objeto de comando (ser 'comando' a menos que lo haya cambiado en las propiedades de FormController) seguido de un punto y el nombre del campo en el objeto de comando que desea enlazar. Campos anidados se puede utilizar tambin como "command.address.street". El bind macro supone que el comportamiento por defecto HTML escape especificado por el parmetro ServletContext defaultHtmlEscape en web.xml La forma opcional de la macro llamada #springBindEscaped / <@spring.bindEscaped> toma un segundo argumento y explcitamente especifica si HTML escape se debe utilizar en los mensajes de estado de error o valores. Se establece en true o false segn se requiera. Macros adicionales de manejo de forma simplificar el uso de HTML y escapar estas macros se debe utilizar siempre que sea posible. Se explican en la siguiente seccin.
Formulario de macros de entrada generacin

Macros adicionales de conveniencia para ambos idiomas simplificar tanto vinculantes como la generacin de la forma (incluyendo la visualizacin de error de validacin). Nunca es necesario el uso de estas macros para generar campos de formulario de entrada, y se pueden mezclar y emparejar con HTML simple o llama directamente a las macros de primavera se unen resaltados anteriormente. La siguiente tabla de macros disponibles muestran la VTL y definiciones FTL y la lista de parmetros que cada uno toma. Tabla 18.1. Tabla de definiciones de macros
macro VTL definicin FTL definicin

mensaje (salida de una cadena de un paquete de #springMessage($code) recursos basado en el parmetro de cdigo) MessageText (salida de una #springMessageText($code cadena de un $text) paquete de recursos basado en el parmetro de

<@spring.message code/>

<@spring.messageText code, text/>

macro cdigo, cayendo de nuevo al valor del parmetro por defecto)

VTL definicin

FTL definicin

url (prefijo de una direccin URL relativa a la raz de #springUrl($relativeUrl) contexto de la aplicacin) formInput (campo de entrada estndar para la #springFormInput($path $attributes) entrada de la recoleccin de usuario) formHiddenInput * (campo de entrada #springFormHiddenInput($path oculto para la $attributes) presentacin de no usuario de entrada)

<@spring.url relativeUrl/>

<@spring.formInput path, attributes, fieldType/>

<@spring.formHiddenInput path, attributes/>

formPasswordInpu t * (campo de entrada estndar para recopilar contraseas. Tenga #springFormPasswordInput($pat <@spring.formPasswordInpu t path, attributes/> en cuenta que no h $attributes) tiene valor siempre se rellenar los campos de este tipo) formTextarea (campo de texto grande para la recopilacin de largo, de forma libre entrada de texto) formSingleSelect

#springFormTextarea($path $attributes)

<@spring.formTextarea path, attributes/>

#springFormSingleSelect(

<@spring.formSingleSelect path, options,

macro (cuadro desplegable de opciones que permite un nico valor necesario para ser seleccionados)

VTL definicin
$path $options $attributes)

FTL definicin
attributes/>

formMultiSelect (un cuadro de lista de opciones que #springFormMultiSelect($path permiten al usuario $options $attributes) seleccionar 0 o ms valores)

<@spring.formMultiSelect path, options, attributes/>

formRadioButtons (un conjunto de botones de radio #springFormRadioButtons($path <@spring.formRadioButtons que permite una $options $separator path, options separator, nica seleccin que $attributes) attributes/> se har de las opciones disponibles) formCheckboxes (un conjunto de casillas de #springFormCheckboxes($path $options $separator verificacin que permite a 0 o ms $attributes) valores a seleccionar) formCheckbox (una #springFormCheckbox($path $attributes) sola casilla) ShowErrors (simplificar la visualizacin de los #springShowErrors($separator errores de $classOrStyle) validacin para el campo dependiente)

<@spring.formCheckboxes path, options, separator, attributes/>

<@spring.formCheckbox path, attributes/>

<@spring.showErrors separator, classOrStyle/>

* En el FTL (FreeMarker), estas dos macros no son realmente necesarios como usted puede utilizar la normal formInput macro, especificando ' hidden 'o' password 'como valor para la fieldType parmetro. Los parmetros a cualquiera de las macros anteriores tienen significados coherentes:

camino: el nombre del campo para unirse a (es decir, "command.name") opciones: un mapa de todos los valores disponibles que se pueden seleccionar a partir de en el campo de entrada. Las claves del mapa representan los valores que se devuelve desde el formulario y se enlaza al objeto de comando. Los objetos de mapa almacenados en contra de las teclas son las etiquetas mostradas en el formulario para el usuario y pueden ser diferentes de los correspondientes valores publicados de nuevo por la forma. Por lo general, dicho mapa se suministra como datos de referencia por el controlador. Cualquier implementacin de mapas puede utilizarse dependiendo de la conducta requerida. Para los mapas estrictamente segn, una SortedMap tal como un TreeMap con un comparador adecuado puede ser utilizado para mapas y arbitrarias que debe devolver valores en el orden de insercin, utilice un LinkedHashMap o un LinkedMap de Commons-colecciones. separador: donde mltiples opciones estn disponibles como elementos discretos (botones de opcin o casillas de verificacin), la secuencia de caracteres utilizada para separar cada uno en la lista (es decir, "<br>"). atributos: una cadena adicional de etiquetas arbitrarias o texto para ser incluidos dentro de la etiqueta HTML en s mismo. Esta cadena se repite literalmente por la macro. Por ejemplo, en un campo textarea puede suministrar atributos como "filas =" 5 "cols =" 60 "" y usted podra transmitir informacin de estilo tal como "style =" border: 1px solid silver ". classOrStyle: para la macro ShowErrors, el nombre de la clase CSS que la etiqueta span envolviendo cada error va a utilizar. Si no se suministra informacin (o el valor est vaco), entonces los errores se ver envuelto en <b> </ b> etiquetas.

Ejemplos de macros A continuacin se describen algunos de FTL y algunos en VTL. Cuando las diferencias existentes entre el uso de los dos idiomas, que se explican en las notas.
Campos de entrada <- El campo Nombre ejemplo desde arriba usando macros de formulario en VTL -> ... Nombre: # SpringFormInput ("command.name" "") MedlinePlus # SpringShowErrors ("<br>" "") MedlinePlus

La macro formInput toma el parmetro de ruta (command.name) y un parmetro de atributos adicional que est vaco en el ejemplo anterior. El macro, junto con todas las macros de generacin de otra forma, realiza un bind primavera implcito en el parmetro path. La unin sigue siendo vlida hasta que se produce un enlace nuevo para que la macro ShowErrors no tiene que pasar el parmetro de ruta de nuevo - simplemente funciona en cualquier campo se cre un lazo duran.

La macro ShowErrors toma un parmetro separador (los caracteres que se utilizan para separar los errores mltiples en un campo dado) y tambin acepta un segundo parmetro, esta vez un nombre de clase o atributo de estilo. Tenga en cuenta que FreeMarker es capaz de especificar los valores por defecto para el parmetro de atributos, a diferencia de la velocidad, y una llamada a otra macro anterior se puede expresar de la siguiente manera en FTL:
<@ Spring.formInput "command.name" /> <@ Spring.showErrors "<br>" />

La salida se muestra a continuacin del fragmento forma generar el campo nombre y mostrando un error de validacin despus de que el formulario se envi sin ningn valor en el campo. La validacin se produce a travs del marco de validacin de Spring. El HTML generado es el siguiente:
Nombre: <Input type = "text" name = "nombre" value = "" > MedlinePlus <b> necesaria </ b> MedlinePlus MedlinePlus

La macro formTextarea funciona de la misma manera que la macro formInput y acepta la misma lista de parmetros. Por lo general, el segundo parmetro (atributos) se utiliza para pasar informacin de estilo o filas y los atributos cols para el rea de texto.
Los campos de seleccin

Cuatro macros de seleccin de campos se puede utilizar para generar la interfaz de usuario comunes entradas de seleccin de valores en los formularios HTML.

formSingleSelect formMultiSelect formRadioButtons formCheckboxes

Cada una de las cuatro macros acepta un mapa de opciones que contienen el valor del campo de formulario y la etiqueta correspondiente a ese valor. El valor y la etiqueta puede ser el mismo. Un ejemplo de los botones de radio en FTL est abajo. El soporte en forma de objeto especifica un valor por defecto de "Londres" en este campo y por lo tanto no es necesaria la validacin. Cuando el formulario se presenta la lista completa de las ciudades para elegir se suministra como datos de referencia en el modelo bajo 'plano de la ciudad' el nombre.
... Poblacin: <@ Spring.formRadioButtons "command.address.town", plano de la ciudad, "" /> <br>

Esto hace que una lnea de botones, uno para cada valor de cityMap con el separador "". No hay atributos adicionales se suministran (el ltimo parmetro de la macro no se encuentra). El plano de la ciudad utiliza la misma cadena para cada par clave-valor en el mapa. Las teclas del mapa son lo que realmente presenta la forma como parmetros de la peticin POST, los valores del mapa son las etiquetas que el usuario ve. En el ejemplo anterior, dada una lista de tres ciudades muy conocidas y un valor predeterminado en el objeto de soporte en forma, el cdigo HTML sera
Poblacin: <Input type = "radio" name = "address.town" value = "London" > Londres <Input type = "radio" name = "address.town" value = "Paris" checked = "checked" > Pars <Input type = "radio" name = "address.town" value = "Nueva York" > Nueva York

Si la aplicacin espera manejar ciudades por cdigos internos, por ejemplo, el mapa de cdigos se crea con teclas adecuadas, como el ejemplo a continuacin.
Mapa protegida referenceData (HttpServletRequest request) throws Exception { Mapa CityMap = new LinkedHashMap (); cityMap.put ("LDN", "Londres"); cityMap.put ("ERP", "Pars"); cityMap.put ("Nueva York", "New York"); Mapa m = new HashMap (); m.put ("plano de la ciudad", plano de la ciudad); regresar m; }

Ahora, el cdigo sera producir una salida donde los valores de radio son los cdigos pertinentes, pero el usuario sigue viendo los nombres de usuario ms amigable de la ciudad.
Poblacin: <Input type = "radio" name = "address.town" value = "LDN" > Londres <Input type = "radio" name = "address.town" value = "PRS" checked = "checked" > Pars <Input type = "radio" name = "address.town" value = "NYC" > Nueva York

HTML escapar y compatibilidad con XHTML

Uso por defecto de las macros de forma anterior dar lugar a las etiquetas HTML que son HTML 4.01 compatible y que el uso del valor predeterminado de HTML escape definido en el web.xml y usadas por el apoyo bind Spring. Con el fin de hacer que el XHTML etiquetas o para anular el valor predeterminado HTML escapar, puede especificar dos variables en la plantilla (o, en su modelo en el que ser visible para sus plantillas). La ventaja de ser especificados en las plantillas es que se puede cambiar para diferentes valores ms adelante en el procesamiento de plantillas para proporcionar un comportamiento diferente para los diferentes campos del formulario. Para cambiar al cumplimiento de XHTML para sus etiquetas, especifique el valor "verdadero" de una variable de modelo / contexto nombrado xhtmlCompliant:
# # Para Velocity .. # Set ($ springXhtmlCompliant = true) <# - Para FreeMarker -> <# = Asignar xhtmlCompliant verdaderos en la primavera>

Las etiquetas generadas por las macros de primavera ser ahora compatible con XHTML despus de procesar esta directiva. De forma similar, HTML escapa puede ser especificado por el campo:
<# - Hasta este punto, HTML por defecto se utiliza escapar -> <# Asignar htmlEscape = true en la primavera> <# - Siguiente campo usar HTML escapar -> <@ Spring.formInput "command.name" /> <# Asignar htmlEscape = false en la primavera> <# - Todos los campos en el futuro estar vinculado con HTML escapar off ->

18,5 XSLT
XSLT es un lenguaje de transformacin para XML y es popular como una tecnologa de vista dentro de las aplicaciones web. XSLT puede ser una buena opcin como una tecnologa de vista, naturalmente, si su aplicacin se ocupa de XML, o si el modelo puede ser fcilmente convertido a XML. En la siguiente seccin se muestra cmo generar un documento XML como datos del modelo y lo han transformado con XSLT en aplicaciones Web Spring MVC.
18.5.1 Mis Primeras Palabras

Este ejemplo es una aplicacin de primavera trivial que crea una lista de palabras en el Controller y los agrega al mapa del modelo. El mapa se devuelve junto con el nombre de la vista de nuestro punto de vista XSLT. Consulte Seccin 17.3, "Controladores de ejecucin" para los detalles de Spring Web MVC Controller interfaz. La vista XSLT a su vez, la lista de palabras en un simple documento XML listo para la transformacin.

Frijoles definiciones

La configuracin es estndar para una aplicacin Spring simple. El servlet dispatcher archivo de configuracin contiene una referencia a un ViewResolver , las asignaciones de URL y un grano nico controlador ...
<bean id = "homeController" class = "xslt.HomeController" />

... que encapsula la lgica de nuestra generacin palabra.


Estndar MVC controlador de cdigo

La lgica del controlador se encapsula en una subclase de AbstractController , con el mtodo de control que se define como tal ...
protegida ModelAndView handleRequestInternal ( HttpServletRequest solicitud, HttpServletResponse respuesta) throws Exception { Mapa map = new HashMap (); Lista wordList = new ArrayList (); wordList.add ("hola"); wordList.add ("mundo"); map.put ("wordList", wordList); return new ModelAndView ("casa", mapa); }

Hasta ahora no hemos hecho nada que sea especfico XSLT. El modelo de datos se ha creado de la misma manera como lo hara con cualquier otra aplicacin de Spring MVC. Dependiendo de la configuracin de la aplicacin ahora, que la lista de palabras podra ser prestados por JSP / JSTL haciendo que aade como atributos de la peticin, o pueden ser manejados por Velocity aadiendo el objeto a la VelocityContext . Con el fin de tener XSLT hacerlas, que por supuesto tienen que ser convertidos en un documento XML de algn modo. Hay paquetes de software disponibles que automticamente 'domify' un grfico de objetos, pero en primavera, tiene completa flexibilidad para crear el DOM de su modelo en cualquier forma que usted elija. Esto impide la transformacin de XML jugando una parte excesiva en la estructura de los datos del modelo que es un peligro cuando se utilizan herramientas para gestionar el proceso domificacin.
Convertir los datos del modelo a XML

Con el fin de crear un documento DOM de nuestra lista de palabras o de cualquier otro modelo de datos, tenemos que la subclase (suministrado) org.springframework.web.servlet.view.xslt.AbstractXsltView clase. Al hacerlo, tambin debemos tpicamente implementar el mtodo abstracto createXsltSource(..) mtodo. El primer parmetro pasado a este mtodo es nuestro modelo de mapa. Aqu est la lista completa de la HomePage de clases en nuestra solicitud palabra trivial:

paquete xslt; / / Importa omitido por brevedad HomePage clase pblica se extiende AbstractXsltView { Fuente protegida createXsltSource (Map modelo, String nombre raz, HttpServletRequest solicitud, HttpServletResponse respuesta) throws Exception { . Documento Documento DocumentBuilderFactory.newInstance = () newDocumentBuilder () NewDocument ().; Raz de elemento = document.createElement (nombre raz); Lista de palabras = (List) model.get ("wordList"); para (Iterator it = words.iterator (); it.hasNext () ;) { Cadena nextWord = (String) it.next (); Elemento wordNode = document.createElement ("palabra"); Texto textNode = document.createTextNode (nextWord); wordNode.appendChild (textNode); root.appendChild (wordNode); } return new DOMSource (root); } }

Una serie de parmetros de nombre / valor pares opcionalmente se puede definir por su subclase que se aadir al objeto de transformacin. Los nombres de los parmetros deben coincidir con los definidos en la plantilla XSLT declarado con <xsl:param name="myParam">defaultValue</xsl:param> . Para especificar los parmetros, anular los getParameters() mtodo de la AbstractXsltView clase y devolver un Map de los pares nombre / valor. Si sus parmetros necesitan para obtener la informacin de la peticin actual, puede anular los getParameters(HttpServletRequest request) en lugar del mtodo.
Definicin de las propiedades de la vista

El archivo views.properties (o definicin xml equivalentes si usted est utilizando una resolucin basada en XML como lo hicimos en los ejemplos anteriores Velocity) tiene este aspecto para la aplicacin de una visin que es "Mis Primeras Palabras":
casa. (clase) = xslt.HomePage home.stylesheetLocation = / WEB-INF/xsl/home.xslt home.root = palabras

Aqu, se puede ver cmo la visin est ligada a la HomePage clase acaba de escribir que se ocupa de la domificacin modelo en la primera propiedad '.(class)' . Los 'stylesheetLocation' propiedad apunta al archivo XSLT que se encargar de la transformacin de XML a HTML para nosotros y la propiedad final '.root' es el nombre que se usar como la raz del documento XML. Esto se pasa a la HomePage clase anterior en el segundo parmetro a la createXsltSource(..) mtodo (s).

Documento de transformacin

Finalmente, tenemos el cdigo XSLT utiliza para transformar el documento anteriormente citado. Como se muestra en las anteriores 'views.properties' archivo, la hoja de estilo se llama 'home.xslt' y vive en el archivo de la guerra en el 'WEBINF/xsl' directorio.
<? Xml version = "1.0" encoding = "UTF-8"> <xsl:stylesheet versin = "1.0" xmlns:xsl "http://www.w3.org/1999/XSL/Transform" => <xsl:output method = "html" omit-xml-declaration = "yes" /> <xsl:template partido "/" => <html> <title> <head> Hola! </ title> </ head> <body> <h1> Mis Primeras Palabras </ h1> <xsl:apply-templates/> </ Body> </ Html> </ Xsl: template> <xsl:template partido "word" => <xsl:value-of select = "." /> <br/> </ Xsl: template> </ Xsl: stylesheet>

18.5.2 Resumen

Un resumen de los ficheros que se traten y su ubicacin en el archivo WAR se muestra en la estructura WAR simplificado a continuacin.
ProjectRoot | + - WebContent | + - WEB-INF | + - Clases | | | + - Xslt | | | | | + - HomePageController.class | | + - HomePage.class | | | + - Views.properties | + - Lib | | | + - * Primavera-jar. | + - Xsl | | | + - Home.xslt | + - FrontController-servlet.xml

Usted tambin tendr que asegurarse de que un analizador XML y un motor XSLT estn disponibles en la ruta de clase. JDK 1.4 les ofrece por defecto, y la mayora de los contenedores Java EE tambin pondr a disposicin de forma predeterminada, pero es una posible fuente de errores a tener en cuenta.

18,6 vistas del documento (PDF / Excel)


18.6.1 Introduccin

Devolucin de una pgina HTML no es siempre la mejor manera para que el usuario pueda ver los resultados del modelo, y la primavera hace que sea sencillo para generar un documento PDF o una hoja de clculo Excel de forma dinmica a partir de los datos del modelo. El documento es la vista y ser transmitido desde el servidor con el tipo de contenido correcto (con suerte) permiten el PC cliente para ejecutar su aplicacin de hoja de clculo o visor de PDF en respuesta. Con el fin de utilizar las vistas de Excel, es necesario agregar la biblioteca 'poi' a tu classpath, y para la generacin de PDF, la biblioteca iText.
18.6.2 Configuracin y puesta en

Vistas de documentos se efecten de una manera casi idntica a las opiniones de XSLT, y las secciones siguientes se basan en la anterior, demostrando cmo el mismo controlador usado en el ejemplo XSLT se invoca para hacer el mismo modelo que tanto un documento PDF y una hoja de clculo de Excel (que tambin puede verse o manipulado en Open Office).
Definiciones de documento Ver

En primer lugar, vamos a modificar el archivo views.properties (o equivalente xml) y aadir una definicin de vista simple para ambos tipos de documentos. El archivo completo se ver as con la opinin de XSLT mostrado anteriormente:
casa. (clase) = xslt.HomePage home.stylesheetLocation = / WEB-INF/xsl/home.xslt home.root = palabras xl. (clase) = excel.HomePage pdf. (clase) = pdf.HomePage

Si desea comenzar con una hoja de clculo o una plantilla de formulario electrnico PDF para aadir sus datos del modelo a, especifique la ubicacin como el 'url' propiedad en la definicin de la vista
Controlador de cdigo

El cdigo del controlador usaremos sigue siendo exactamente el mismo del ejemplo anterior XSLT que no sea para cambiar el nombre de la vista de su uso. Por supuesto, usted podra estar listo y tener este seleccionados en base a un parmetro de URL o

alguna otra lgica - la prueba de que la primavera es realmente muy bueno en la disociacin de las opiniones de los controladores!
Subclases para las vistas de Excel

Exactamente como lo hicimos en el ejemplo XSLT, vamos a subclases abstractas clases adecuadas con el fin de implementar un comportamiento personalizado en la generacin de los documentos de salida. Para Excel, se trata de escribir una subclase de org.springframework.web.servlet.view.document.AbstractExcelView (para archivos de Excel generados por POI) o org.springframework.web.servlet.view.document.AbstractJExcelView (por JExcelApi generada por Excel archivos) y la implementacin de la buildExcelDocument() mtodo. Aqu est la lista completa de nuestro PDI vista Excel que muestra la lista de palabras a partir del mapa modelo en filas consecutivas de la primera columna de una hoja de clculo nueva:
paquete de sobresalir; / / Importa omitido por brevedad public class extends HomePage AbstractExcelView { protected void buildExcelDocument ( Mapa del modelo, HSSFWorkbook wb, HttpServletRequest req, HttpServletResponse resp) throws Exception { Hoja HSSFSheet; HSSFRow sheetRow; HSSFCell celular; / / Ir a la primera hoja / / GetSheetAt: slo si wb se crea a partir de un documento existente / / Hoja = wb.getSheetAt (0); hoja = wb.createSheet ("Primavera"); sheet.setDefaultColumnWidth ((corto) 12); / / Escribir un texto en A1 cell = getCell (hoja, 0, 0); setText (clula, "Primavera-Excel test"); Lista de palabras = (List) model.get ("wordList"); for (int i = 0; i <words.size (); i + +) { cell = getCell (hoja, 2 + i, 0); setText (clula, (String) words.get (i)); } } }

Y la siguiente es una vista en generar el mismo archivo de Excel, ahora usando JExcelApi:
paquete de sobresalir; / / Importa omitido por brevedad public class extends HomePage AbstractJExcelView { protected void buildExcelDocument (Map modelo, WritableWorkbook wb, HttpServletRequest solicitud, HttpServletResponse respuesta) throws Exception { WritableSheet hoja = wb.createSheet ("Primavera", 0); sheet.addCell (new Label (0, 0, "Primavera-Excel test")); Lista de palabras = (List) model.get ("wordList"); for (int i = 0; i <words.size (); i + +) { sheet.addCell (new Label (2 + i, 0, (String) words.get (i))); } } }

Tenga en cuenta las diferencias entre las API. Hemos encontrado que la JExcelApi es algo ms intuitivo, y adems, tiene JExcelApi ligeramente mejor manejo de imgenes capacidades. Ha habido problemas de memoria con grandes archivos de Excel al utilizar JExcelApi sin embargo. Si ahora modificar el controlador de manera que vuelvan xl como el nombre de la vista ( return new ModelAndView("xl", map); ) y ejecutar la aplicacin de nuevo, usted debe encontrar que la hoja de clculo Excel que se descarga automticamente cuando se solicitar la misma pgina como antes.
Subclases de vistas de PDF

La versin en PDF de la lista de palabras es an ms simple. Esta vez, la clase extiende org.springframework.web.servlet.view.document.AbstractPdfView e implementa el buildPdfDocument() mtodo como sigue:
paquete pdf; / / Importa omitido por brevedad public class extends pdfPage AbstractPdfView { protected void buildPdfDocument ( Mapa del modelo, Documento doc, PDFWriter escritor, HttpServletRequest req, HttpServletResponse resp) throws Exception {

Lista de palabras = (List) model.get ("wordList"); for (int i = 0; i <words.size (); i + +) doc.add (nuevo prrafo ((String) words.get (i))); } }

Una vez ms, modificar el controlador a devolver el pdf vista con return new ModelAndView("pdf", map); y volver a cargar la URL en su aplicacin. Esta vez un documento PDF debe aparecer listado de cada una de las palabras en la hoja modelo.

18,7 JasperReports
JasperReports ( http://jasperreports.sourceforge.net ) es un poderoso cdigo abierto motor de informes que apoya la creacin de diseos de informes utilizando un formato fcil de entender archivo XML. JasperReports es capaz de representar los informes en cuatro diferentes formatos: CSV, Excel, HTML y PDF.
18.7.1 Dependencias

Su solicitud deber incluir la ltima versin de JasperReports, que en el momento de la escritura era 0.6.1. JasperReports su vez depende de los siguientes proyectos:

BeanShell BeanUtils Commons Colecciones Commons Digestor Commons Commons Logging iText PDI

JasperReports tambin requiere un compatible JAXP parser XML.


18.7.2 Configuracin

Para configurar las vistas JasperReports en la configuracin de su contenedor Spring es necesario definir un ViewResolver a los nombres de vista del mapa a la clase de vista adecuado en funcin del formato que desea que el informe representado pulg
Configuracin del ViewResolver

Normalmente, se utilizar el ResourceBundleViewResolver a los nombres de vista de mapa para ver clases y archivos en un archivo de propiedades.
<bean id = "viewResolver" class = "org.springframework.web.servlet.view.ResourceBundleViewResolver"> <propiedad nombre = valor = "basename" "views" /> </ Bean>

Aqu hemos configurado una instancia de la ResourceBundleViewResolver clase que buscar asignaciones de vista en el paquete de recursos con nombre de base de views . (El contenido de este archivo se describe en la siguiente seccin.)
Configuracin de la View s

El Spring Framework contiene cinco diferentes View implementaciones para JasperReports, cuatro de los cuales corresponden a uno de los cuatro formatos de salida compatibles con JasperReports, y que permite el formato que se determina en tiempo de ejecucin: Tabla 18.2. JasperReports View clases
Nombre Clase
JasperReportsCsvView JasperReportsHtmlView JasperReportsPdfView JasperReportsXlsView

Render Formato CSV HTML PDF Microsoft Excel

JasperReportsMultiFormatView La vista se decidi en tiempo de ejecucin

Asignacin de una de estas clases para un nombre de vista y un archivo de informe es una cuestin de aadir las entradas apropiadas en el paquete de recursos configurados en la seccin anterior, como se muestra aqu:
SimpleReport. (clase) = org.springframework.web.servlet.view.jasperreports.JasperReportsPdfVie w simpleReport.url = / WEB-INF/reports/DataSourceReport.jasper

Aqu se puede ver que la vista con nombre simpleReport se asigna a la JasperReportsPdfView clase, provocando la salida de este informe que se representa en formato PDF. La url caracterstica de la vista se establece en la ubicacin del archivo de informe subyacente.
Acerca de los archivos de informe

JasperReports tiene dos tipos diferentes de archivo de informe: el archivo de diseo, que cuenta con una .jrxml extensin, y el archivo de informe compilado, que tiene un .jasper extensin. Normalmente, se utiliza la tarea de Ant para compilar su JasperReports .jrxml archivo de diseo en una .jasper archivo antes de implementarlo en su aplicacin. Con el Spring Framework puede asignar cualquiera de estos archivos en el archivo de informe y el marco se encargar de compilar el .jrxml archivos sobre la marcha para ti. Debe tener en cuenta que despus de un .jrxml

archivo est compilado por el Spring Framework, el informe compilado se almacena en cach durante la vida til de la aplicacin. Por lo tanto, para realizar cambios en el archivo que tendr que reiniciar la aplicacin.
Usando JasperReportsMultiFormatView

El JasperReportsMultiFormatView permite el formato de informe que se indicar en tiempo de ejecucin. La representacin real del informe se delega a una de las clases de JasperReports Otras vistas - el JasperReportsMultiFormatView clase se limita a aadir una capa de envoltorio que permite la ejecucin exacta que se especifica en tiempo de ejecucin. El JasperReportsMultiFormatView clase introduce dos conceptos clave: el formato y la clave discriminador. El JasperReportsMultiFormatView clase utiliza la clave de asignacin para buscar la clase de vista implementacin real, y utiliza el formato clave para buscar la clave de asignacin. Desde una perspectiva de la codificacin de agregar una entrada a su modelo con el formato clave como la clave y la clave de asignacin como el valor, por ejemplo:
pblico ModelAndView handleSimpleReportMulti (HttpServletRequest request, HttpServletResponse respuesta) throws Exception { Cadena uri = request.getRequestURI (); Cadena de formato uri.substring = (uri.lastIndexOf () + 1 "."); Mapa model = getModel (); model.put ("formato", format); return new ModelAndView ("simpleReportMulti", modelo); }

En este ejemplo, la clave de asignacin se determina a partir de la extensin de la URI de la solicitud y se aade al modelo bajo la clave de formato por defecto: format . Si desea utilizar una clave de formato diferente entonces usted puede configurar esto usando el formatKey propiedad de la JasperReportsMultiFormatView clase. Por defecto, las asignaciones de mapeo siguientes claves se configuran en JasperReportsMultiFormatView : Tabla 18.3. JasperReportsMultiFormatView defecto asignaciones de clave de asignacin
Asignacin de clave csv html pdf Ver Class
JasperReportsCsvView JasperReportsHtmlView JasperReportsPdfView

Asignacin de clave xls

Ver Class
JasperReportsXlsView

As en el ejemplo anterior de una solicitud de URI / foo / myReport.pdf se asigna a la JasperReportsPdfView clase. Puede sustituir la clave de mapeo para ver las asignaciones de clase utilizando el formatMappings propiedad de JasperReportsMultiFormatView .
18.7.3 Rellenar el ModelAndView

Con el fin de hacer que su informe correctamente en el formato que ha elegido, debe proporcionar la primavera con todos los datos necesarios para rellenar el informe. Para JasperReports esto significa que debe pasar en todos los parmetros del informe junto con el informe de origen de datos. Los parmetros de informe son simple nombre / valor y se puede agregar al Map de su modelo de modo que se agregara cualquier nombre / valor par. Al aadir la fuente de datos para el modelo que usted tiene dos mtodos para elegir. El primer enfoque consiste en aadir una instancia de JRDataSource o una Collection de tipos para el modelo de Map bajo una tecla arbitraria. Spring entonces localizar este objeto en el modelo y lo tratan como el informe de origen de datos. Por ejemplo, puede rellenar el modelo de este modo:
Mapa getModel privado () { Mapa model = new HashMap (); Coleccin beanData getBeanData = (); model.put ("myBeanData", beanData); volver modelo; }

El segundo mtodo consiste en agregar la instancia de JRDataSource o Collection en una tecla especfica y luego configurar esta clave con reportDataKey propiedad de la clase de vista. En ambos casos primavera se ajustar instancias de Collection en una JRBeanCollectionDataSource ejemplo. Por ejemplo:
Mapa getModel privado () { Mapa model = new HashMap (); Coleccin beanData getBeanData = (); Coleccin someData getSomeData = (); model.put ("myBeanData", beanData); model.put ("someData", someData); volver modelo; }

Aqu se puede ver que dos Collection casos se agregan al modelo. Para asegurarse de que el correcto es usado, simplemente modificar nuestra configuracin de la vista, segn proceda:

SimpleReport. (clase) = org.springframework.web.servlet.view.jasperreports.JasperReportsPdfVie w simpleReport.url = / WEB-INF/reports/DataSourceReport.jasper simpleReport.reportDataKey = myBeanData

Tenga en cuenta que cuando se utiliza el primer mtodo, Spring usar la primera instancia de JRDataSource o Collection que se encuentra. Si es necesario colocar varias instancias de JRDataSource o Collection en el modelo es necesario utilizar el segundo enfoque.
18.7.4 Trabajar con subinformes

JasperReports ofrece soporte para incrustada subinformes dentro de sus archivos principales del informe. Hay una gran variedad de mecanismos para la inclusin de subinformes en los archivos de informe. La forma ms fcil es codificar la ruta del informe y la consulta SQL para el informe secundario en los archivos de diseo. El inconveniente de este enfoque es obvia: los valores son de codificacin fija en sus archivos de informes reduccin reutilizacin y lo que es ms difcil de modificar y actualizar los diseos de informes. Para superar esto, puede configurar subinformes mediante declaracin, y que puede incluir datos adicionales para estos informes subdirectamente de sus controladores.
Configuracin de Informe Sub-Files

Para controlar qu informes sub-archivos estn incluidos en un informe maestro usando la primavera, el archivo de informes debe estar configurado para aceptar sub-informes de una fuente externa. Para ello se declara un parmetro en el archivo de informe, as:
nombre = <parameter "ProductsSubReport" class = "net.sf.jasperreports.engine.JasperReport" />

A continuacin, se define el sub-informe para utilizar este informe sub-parmetro:


<subreport> <ReportElement isPrintRepeatedValues = "false" x = "5" y = "25" width = "325" height = "20" isRemoveLineWhenBlank = "true" BackColor = "# FFCC99" /> nombre = <subreportParameter "City"> <subreportParameterExpression> <! [CDATA [$ F {city}]]> </ subreportParameterExpression> </ SubreportParameter> <dataSourceExpression> <! [CDATA [{$ P SubReportData}]]> </ DataSourceExpression> <subreportExpression class = "net.sf.jasperreports.engine.JasperReport"> <! [CDATA [{$ P ProductsSubReport}]]> </ subreportExpression> </ Subinforme>

Esto define un archivo de informe principal que espera que el informe sub-que se pasa como una instancia de net.sf.jasperreports.engine.JasperReports bajo el parmetro ProductsSubReport . Cuando se configura la clase de vista Jasper, puede

indicar a Spring para cargar un archivo de informe y pasarlo en el motor JasperReports como un sub-informe utilizando el subReportUrls propiedad:
<propiedad nombre = "subReportUrls"> <map> <entry clave = valor = "ProductsSubReport" "/WEBINF/reports/subReportChild.jrxml" /> </ Map> </ Propiedad>

Aqu, la clave del Map se corresponde con el nombre del parmetro sub-reporte en el archivo de diseo de informes, y la entrada es la direccin URL del archivo de informe. Primavera se carga este archivo de informe, la compilacin, si es necesario, y pasar en el motor JasperReports en la clave dada.
Configuracin del Informe Sub-Orgenes de datos

Este paso es totalmente opcional cuando se utiliza Spring para configurar los subinformes. Si lo desea, puede configurar el origen de datos para sus sub-informes mediante consultas estticas. Sin embargo, si desea primavera para convertir los datos devueltos en su ModelAndView en instancias de JRDataSource entonces tienes que especificar cul de los parmetros en su ModelAndView primavera debe convertir. Para ello, configure la lista de nombres de parmetros utilizando el subReportDataKeys propiedad de la clase de vista elegido:
<propiedad nombre = valor = "subReportDataKeys" "SubReportData" />

En este caso, la tecla que debe suministrar corresponda con la clave que se utiliza en su ModelAndView y la clave utilizada en el archivo de diseo del informe.
18.7.5 Parmetros de Configuracin Exportador

Si usted tiene requisitos especiales para la configuracin del exportador - tal vez usted quiere un tamao de pgina especfica para su informe en PDF - usted puede configurar estos parmetros exportador mediante declaracin en el archivo de configuracin de Spring con el exporterParameters propiedad de la clase de vista. El exporterParameters propiedad se escribe como un Map . En la configuracin de la clave de una entrada debe ser el nombre completo de un campo esttico que contiene la definicin de parmetros exportador, y el valor de una entrada debe ser el valor que se desea asignar al parmetro. Un ejemplo de esto se muestra a continuacin:
<propiedad nombre = valor = "url" "/WEBINF/reports/simpleReport.jrxml" /> <propiedad nombre = "exporterParameters"> <map> <entry clave = "net.sf.jasperreports.engine.export.JRHtmlExporterParameter.HTML_FOOTE R"> <valor> pie de pgina para la primavera! </ Td> <td width="50%"> </ td> </ tr> </ Table> </ body> </ html> </ Value> </ Entry>

</ Map> </ Propiedad> </ Bean>

Aqu se puede ver que el JasperReportsHtmlView est configurado con un parmetro exportador para
net.sf.jasperreports.engine.export.JRHtmlExporterParameter.HTML_FOOTER

que dar salida a un pie de pgina en el HTML resultante.

18.8 Vistas de Alimentacin


Tanto AbstractAtomFeedView y AbstractRssFeedView heredan de la clase base AbstractFeedView y se utilizan para proporcionar vistas Atom y RSS respeto. Se basan en java.net 's ROMA proyecto y se encuentran en el paquete org.springframework.web.servlet.view.feed .
AbstractAtomFeedView

requiere que se apliquen las buildFeedEntries() mtodo y, opcionalmente, reemplazar el buildFeedMetadata() mtodo (la implementacin predeterminada est vaco), como se muestra a continuacin.
public class extends SampleContentAtomView AbstractAtomFeedView { @ Override protected void buildFeedMetadata (Mapa <String, Object> modelo, los piensos de alimentacin, HttpServletRequest solicitud) { / / Implementacin omitido } @ Override Lista protegido <entry> buildFeedEntries (Mapa <String, Object> modelo, HttpServletRequest solicitud, HttpServletResponse respuesta) throws Exception { / / Implementacin omitido } }

Requisitos similares se aplican para la aplicacin de AbstractRssFeedView , como se muestra a continuacin.


public class extends SampleContentAtomView AbstractRssFeedView { @ Override protected void buildFeedMetadata (Mapa <String, Object> modelo, canal de alimentacin, HttpServletRequest solicitud) { / / Implementacin omitido } @ Override Lista protegido <Elemento> buildFeedItems (Mapa <String, Object> modelo, HttpServletRequest solicitud, HttpServletResponse respuesta) throws Exception {

/ / Implementacin omitido } }

Los buildFeedItems() y buildFeedEntires() mtodos pasar en la solicitud HTTP en caso de tener que acceder a la configuracin regional. La respuesta HTTP se pasa slo por el ajuste de cookies u otras cabeceras HTTP. La alimentacin se escribir automticamente al objeto de respuesta despus de la devolucin del mtodo. Para un ejemplo de cmo crear una vista Atom consulte Alef Arendsen de SpringSource blog del equipo de entrada .

18,9 XML Marshalling View


El MarhsallingView utiliza un XML Marshaller definido en el org.springframework.oxm paquete para hacer que el contenido de la respuesta como XML. El objeto que se marshalled se puede establecer explcitamente el uso MarhsallingView 's modelKey propiedad de bean. Alternativamente, la vista iterar sobre todas las propiedades del modelo y reunir slo los tipos que son compatibles con la Marshaller . Para obtener ms informacin sobre la funcionalidad de la org.springframework.oxm paquete consulte el captulo serializacin XML mediante O / X mappers .

18,10 JSON Ver Mapping


El MappingJackson2JsonView (o MappingJacksonJsonView dependiendo de la versin de Jackson que tiene) utiliza la biblioteca de Jackson ObjectMapper para hacer que el contenido de la respuesta como JSON. Por defecto, todos los contenidos de la hoja de modelo (con la excepcin del marco clases especficas) se codifica como JSON. Para los casos en que el contenido del mapa necesita ser filtrada, los usuarios pueden especificar un conjunto especfico de atributos del modelo para codificar a travs de la RenderedAttributes propiedad. El extractValueFromSingleKeyModel propiedad tambin puede ser usado para tener el valor de una sola tecla modelos extrados y serializado directamente en lugar de como un mapa de atributos del modelo. Asignacin de JSON se puede personalizar segn sea necesario a travs de la utilizacin de anotaciones previstas Jackson. Cuando el control se necesita ms, una costumbre ObjectMapper se puede inyectar a travs de la ObjectMapper propiedad para los casos personalizados serializadores JSON / deserializadores es necesario informar a los tipos especficos.

19. Integracin con otros frameworks web 19.1 Introduccin


Esta primavera captulo detalles de la integracin con marcos web de terceros tales como JSF , Struts , WebWork y tapicera .

Spring Web Flow Spring Web Flow (SWF) aspira a ser la mejor solucin para la gestin del flujo de la pgina web de la aplicacin. SWF se integra con los marcos existentes como Spring MVC, Struts y JSF, tanto en entornos de servlets y portlets. Si usted tiene un proceso de negocio (o procesos) que se beneficiaran de un modelo conversacional en lugar de un modelo puramente peticin, entonces SWF puede ser la solucin. SWF le permite capturar los flujos de pginas lgicas como mdulos autnomos que son reutilizables en diferentes situaciones, y por lo tanto es ideal para la construccin de mdulos de aplicaciones web que guan al usuario a travs de navegaciones controladas que los procesos de unidad de negocio. Para obtener ms informacin acerca de SWF, consulte el sitio web de Spring Web Flow . Una de las propuestas de valor en el Marco de primavera es el de permitir a eleccin. En un sentido general, la primavera no obligan a usar o comprar en cualquier arquitectura particular, la tecnologa o metodologa (aunque ciertamente recomienda unos sobre otros). Esta libertad para elegir la arquitectura, la tecnologa o metodologa que sea ms relevante para un desarrollador y su equipo de desarrollo es sin duda ms evidente en el rea web, donde Spring proporciona su marco propio Web ( Spring MVC ), mientras que en el mismo tiempo que proporciona la integracin con una serie de populares marcos web de terceros. Esto permite continuar aprovechando todas y cada una de las competencias se haya adquirido un framework web en particular, como Struts, mientras que al mismo tiempo poder disfrutar de los beneficios que ofrece la primavera en otras reas como acceso a datos, transacciones declarativas la gestin y la flexibilidad de configuracin y ensamblaje de aplicaciones. Despus de haber prescindido de la jerga de ventas de lana (vase el prrafo anterior), el resto de este captulo se centrar en los detalles jugosos de la integracin de su framework web favorito con la primavera. Una cosa que a menudo es comentado por los desarrolladores que vienen a Java desde otros lenguajes es la aparente superabundancia de marcos Web disponibles en Java. De hecho, hay un gran nmero de frameworks web en el espacio de Java, de hecho hay demasiados para cubrir con cualquier apariencia de detalle en un solo captulo. En este captulo se recoge por lo tanto cuatro de los marcos web ms populares en Java, a partir de la configuracin del resorte que es comn a todos los marcos web compatibles y, a continuacin detalla las opciones de integracin especficos para cada marco web compatible.
Nota

Tenga en cuenta que este captulo no trata de explicar cmo utilizar cualquiera de los frameworks web compatibles. Por ejemplo, si desea utilizar Struts para la capa de presentacin de la aplicacin web, se supone que ya est familiarizado con Struts. Si desea obtener ms informacin acerca de cualquiera de los marcos se apoy web, por favor consulte la Seccin 19.7, "Recursos adicionales" al final de este captulo.

19.2 Configuracin comn


Antes de entrar en los detalles especficos de integracin de cada framework web compatible, primero vamos a echar un vistazo a la configuracin de Spring que no es especfico de un marco Web. (Esta seccin se aplica igualmente a framework web propia Spring, Spring MVC). Uno de los conceptos (a falta de una palabra mejor) propugnada por (Spring) Modelo de aplicacin ligera es la de una arquitectura en capas. Recuerde que en un 'clsico' arquitectura en capas, la capa web es slo una de muchas capas, sino que sirve como uno de los puntos de entrada a una aplicacin del lado del servidor y delega a los objetos de servicio (fachadas) definidos en una capa de servicios para satisfacer negocio especficos (presentacin y tecnologa agnstica) casos de uso. En la primavera, estos objetos de servicio, cualquier otro especficas del negocio objetos, los objetos de acceso a datos, etc existir en el "contexto de negocios" un claro, que no contiene objetos de presentacin web o capas (objetos de presentacin, tales como Spring MVC controladores se configuran en un 'contexto de presentacin' distinto). En esta seccin se detalla cmo una configura un contenedor de Spring (un WebApplicationContext ) que contiene todos los "granos de negocios en la propia aplicacin. En lo especfico: todo lo que uno necesita hacer es declarar un ContextLoaderListener en el estndar Java EE servlet web.xml archivo de aplicacin Web, y aadir un contextConfigLocation seccin <context-param/> (en el mismo archivo) que define qu conjunto de los archivos de configuracin XML Spring para cargar. Ponemos a tu disposicin la configuracin <listener/>:
<listener> <listener-class> org.springframework.web.context.ContextLoaderListener </ listenerclase> </ Listener>

Ponemos a tu disposicin la configuracin <context-param/>:


<context-param> <param-name> contextConfigLocation </ param-name> <param-value> / WEB-INF/applicationContext *. xml </ param-value> </ Context-param>

Si no se especifica el contextConfigLocation parmetro contexto, el ContextLoaderListener buscar un archivo llamado /WEBINF/applicationContext.xml cargar. Una vez que los archivos se cargan contexto, Spring crea un WebApplicationContext objeto basndose en las definiciones de frijol y se almacena en el ServletContext de la aplicacin web. Todos los frameworks web Java se construye en la parte superior de la API Servlet, y por lo tanto se puede utilizar el siguiente fragmento de cdigo para tener acceso a este "contexto empresarial ' ApplicationContext creado por el ContextLoaderListener .

WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext (ServletContext);

El WebApplicationContextUtils clase es por comodidad, por lo que no tiene que recordar el nombre de la ServletContext atributo. Su mtodo getWebApplicationContext () devolver null si un objeto no existe en el WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE clave. En lugar de arriesgarse a NullPointerExceptions en su aplicacin, es mejor usar el getRequiredWebApplicationContext() mtodo. Este mtodo produce una excepcin cuando el ApplicationContext falta. Una vez que tenga una referencia a la WebApplicationContext , puede recuperar frijoles por su nombre o tipo. La mayora de los desarrolladores recuperar frijoles por su nombre y luego los arroj a una de sus interfaces implementadas. Afortunadamente, la mayora de los marcos de esta seccin tienen ms simples formas de ver los frijoles. No slo es ms fcil de obtener granos de un recipiente de primavera, pero tambin le permiten utilizar la inyeccin de dependencia de sus controladores. Cada seccin framework web tiene ms detalles sobre sus estrategias especficas de integracin.

19,3 JavaServer Faces 1.1 y 1.2


JavaServer Faces (JSF) es estndar del PCJ basado en componentes, orientado a eventos de usuario web marco de interfaz. A partir de Java EE 5, es una parte oficial de la sombrilla Java EE. Para un tiempo de ejecucin muy popular JSF, as como para los populares bibliotecas de componentes JSF, visita proyecto Apache MyFaces . El proyecto MyFaces tambin ofrece extensiones JSF comunes tales como MyFaces Orchestra : una extensin basada en JSF Spring que proporciona un amplio soporte mbito de conversacin.
Nota

Spring Web Flow 2.0 proporciona soporte ricos JSF Spring a travs de su recin creada Caras mdulo, tanto para JSF centrada en uso (como se describe en esta seccin) y para el uso de Spring-cntrica (con vistas JSF dentro de un despachador Spring MVC). Echa un vistazo a la pgina web de Spring Web Flow para ms detalles! El elemento clave en la integracin de Spring JSF JSF es el 1,1 VariableResolver mecanismo. En JSF 1.2, Spring soporta el ELResolver mecanismo como una versin de prxima generacin de integracin JSF EL.
19.3.1 DelegatingVariableResolver JSF (1.1/1.2)

La forma ms fcil de integrar una de Primavera de nivel medio con una capa de JSF web es utilizar el DelegatingVariableResolver clase. Para configurar esta variable en una resolucin de la solicitud, ser necesario modificar la propia faces-context.xml

archivo. Despus de la apertura <faces-config/> elemento, aadir un <application/> elemento y un <variable-resolver/> elemento dentro de ella. El valor de la variable de resolucin debe hacer referencia a Spring DelegatingVariableResolver , por ejemplo:
<faces-config> <application> <variable-resolver> org.springframework.web.jsf.DelegatingVariableResolver </ variableresolver> <locale-config> <default-locale> en </ default-locale> <supported-locale> en </ apoyo-locale> <supported-locale> es </ apoyo-locale> </ Locale-config> <message-bundle> mensajes </ message-bundle> </ Application> </ Faces-config>

El DelegatingVariableResolver primera delegar bsquedas de valor para la resolucin predeterminada de la aplicacin subyacente JSF y luego a Spring 'contexto negocio WebApplicationContext . Esto permite inyectar fcilmente en las propias dependencias de frijoles JSF administrados. Frijoles gestionados se define en la propia faces-config.xml archivo. A continuacin encontrar un ejemplo en el #{userManager} es un grano que se recupera del 'contexto empresarial' la primavera.
<managed-bean> <managed-bean-name> lista_usuarios </ managed-bean-name> <managed-bean-class> com.whatever.jsf.UserList </ managed-beanclase> <managed-bean-scope> peticin </ managed-bean-scope> <managed-property> <property-name> UserManager </ property-name> <valor> # {UserManager} </ value> </ Managed-propiedad> </ Managed-bean>

19.3.2 SpringBeanVariableResolver JSF (1.1/1.2)


SpringBeanVariableResolver

es una variante de DelegatingVariableResolver . Delega en el de primavera "contexto negocio WebApplicationContext primero y luego a la resolucin predeterminada de la aplicacin subyacente JSF. Esto es til en particular cuando se utiliza peticin / granos de mbito de sesin con reglas especiales Spring resolucin, por ejemplo Spring FactoryBean implementaciones. Configuracin De lo contrario, simplemente definir SpringBeanVariableResolver en su rostro-context.xml del archivo:
<faces-config> <application> <variable-resolver> org.springframework.web.jsf.SpringBeanVariableResolver </ variableresolver>

... </ Application> </ Faces-config>

19.3.3 SpringBeanFacesELResolver (JSF 1.2 +)


SpringBeanFacesELResolver

es un JSF 1.2 compatible ELResolver implementacin, la integracin con la norma EL Unificado y usadas por JSF 1.2 y JSP 2.1. Al igual que SpringBeanVariableResolver , delega a la Primavera "contexto negocio WebApplicationContext primero, y luego a la resolucin predeterminada de la aplicacin subyacente JSF. Configuracin De lo contrario, simplemente definir SpringBeanFacesELResolver en su JSF 1.2 faces-context.xml del archivo:
<faces-config> <application> <el-resolver> org.springframework.web.jsf.el.SpringBeanFacesELResolver </ elresolver> ... </ Application> </ Faces-config>

19.3.4 FacesContextUtils

Una costumbre VariableResolver funciona bien cuando se asignan las propiedades de uno de los frijoles en faces-config.xml, pero a veces uno puede necesitar para tomar un grano de forma explcita. El FacesContextUtils clase lo hace fcil. Es similar a WebApplicationContextUtils , excepto que toma un FacesContext parmetro en lugar de un ServletContext parmetro.
Ctx = ApplicationContext FacesContextUtils.getWebApplicationContext (FacesContext.getCurrentInstance ());

19,4 Apache Struts 1.x y 2.x


Struts sola ser el framework web de facto para las aplicaciones Java, principalmente porque era uno de los primeros en ser liberado (junio de 2001). Ahora se ha renombrado a Struts 1 (en oposicin a Struts 2). Muchas aplicaciones todava lo utilizan. Inventado por Craig McClanahan, Struts es un proyecto de cdigo abierto patrocinado por la Fundacin de Software Apache. A la vez, se simplifica en gran medida el paradigma de programacin JSP / Servlet y se gan a muchos desarrolladores que usaban los marcos de propiedad. Se simplifica el modelo de programacin, era de cdigo abierto (y por lo tanto libre como en cerveza), y tena una gran comunidad, lo que permiti que el proyecto crezca y se vuelva popular entre los desarrolladores Web Java.
Nota

La siguiente seccin discute Struts 1 tambin conocido como "Struts Classic". Struts 2 es efectivamente un producto diferente - un sucesor de WebWork 2,2

(como se discuti en la Seccin 19.5, "WebWork 2.x" ), que lleva la marca Struts ahora. Echa un vistazo a la Struts 2 Spring API para la integracin Primavera incorporado suministra con Struts 2. En general, Struts 2 est ms cercano a 2,2 que a WebWork Struts 1 en trminos de sus implicaciones Spring integracin. Para integrar su aplicacin Struts 1.x con la primavera, tiene dos opciones:

Configurar Spring para gestionar sus acciones como frijoles, usando el ContextLoaderPlugin , y establecer sus dependencias en un archivo de contexto primavera. Primavera Subclase de ActionSupport clases y apoderarse de su gestionadas por resorte frijoles explcitamente usando un getWebApplicationContext () mtodo.

19.4.1 ContextLoaderPlugin

El ContextLoaderPlugin es un Struts 1.1 + plug-in que se carga un archivo de contexto Spring Struts para la ActionServlet . Este contexto se refiere a la raz WebApplicationContext (cargado por el ContextLoaderListener ) como su padre. El nombre predeterminado del archivo de contexto es el nombre del servlet asignada, plus-servlet.xml. Si ActionServlet se define en web.xml como <servletname>action</servlet-name> , el valor predeterminado es / WEB-INF/actionservlet.xml. Para configurar este plug-in, aada el siguiente cdigo XML para la seccin de plug-ins en la parte inferior de su struts-config.xml archivo:
plug-in> className = "org.springframework.web.struts.ContextLoaderPlugIn" />

La ubicacin de los archivos de contexto de configuracin se puede personalizar a travs del " contextConfigLocation 'propiedad.
plug-in> className = "org.springframework.web.struts.ContextLoaderPlugIn"> <Set-property property = "contextConfigLocation" value = "/ WEB-INF/action-servlet.xml, / WEBINF/applicationContext.xml" /> </ Plug-in>

Es posible utilizar este plugin para cargar todos los archivos de contexto, que puede ser til cuando se utilizan las herramientas de prueba como StrutsTestCase. StrutsTestCase de MockStrutsTestCase no se inicializar oyentes en el arranque para poner todos los archivos de contexto en el plugin es una solucin. (A bug ha sido presentada para este problema, pero se ha cerrado como "Wont Fix"). Despus de configurar este plug-in en struts-config.xml, puede configurar su Action a ser gestionados por Spring. Primavera (1.1.3 +) ofrece dos maneras de hacerlo:

Anulacin Struts 'default RequestProcessor con Spring DelegatingRequestProcessor .

Utilice el DelegatingActionProxy clase en el type atributo de su <actionmapping> .

Ambos mtodos permiten que usted maneje sus acciones y sus dependencias en el archivo de accin-servlet.xml. El puente entre la accin en struts-config.xml y accin servlet.xml-se construye con "camino" de la accin-mapping y el bean "nombre". Si usted tiene lo siguiente en el archivo struts-config.xml:
<accion path = "/users" .../>

Debe definir bean que Accin con el "/ users" en nombre de la accin servlet.xml:
nombre = <bean "/users" .../>

DelegatingRequestProcessor

Para configurar el DelegatingRequestProcessor en su struts-config.xml archivo, reemplace el "processorClass" propiedad en el elemento <controller>. Estas lneas de seguir el elemento <action-mapping>.
<controller> <Set-property property = "processorClass" value = "org.springframework.web.struts.DelegatingRequestProcessor" /> </ Controlador>

Despus de agregar este valor, accin automticamente se buscar en el archivo de contexto de Spring, no importa qu el tipo. De hecho, usted ni siquiera necesita especificar un tipo. Los dos siguientes fragmentos funcionar:
<accion path = "/user" type = "com.whatever.struts.UserAction" /> <accion path = "/user" />

Si est utilizando la funcin de Struts "mdulos, los nombres de frijol debe contener el prefijo del mdulo. Por ejemplo, una accin definida como <action path="/user"/> con mdulo prefijo "admin" requiere un nombre de frijol con <bean name="/admin/user"/> .
Nota

Si est utilizando Azulejos en su aplicacin Struts, debe configurar su <controller> con el DelegatingTilesRequestProcessor lugar.
DelegatingActionProxy

Si usted tiene una costumbre RequestProcessor y no puede utilizar los DelegatingRequestProcessor o DelegatingTilesRequestProcessor enfoques, se puede utilizar el DelegatingActionProxy como el tipo en su accin-mapping.
<Ruta action = "/ user" type = "org.springframework.web.struts.DelegatingActionProxy"

name = "UserForm" scope = "request" validar = "false" = parmetro "mtodo"> nombre = <forward "list" path = "/userList.jsp" /> nombre = <forward "edit" path = "/userForm.jsp" /> </ Accion>

La definicin de frijol en accin servlet.xml sigue siendo el mismo, ya sea que use una costumbre RequestProcessor o la DelegatingActionProxy . Si define su Action en un archivo de contexto, el conjunto completo de funciones de depsito de granos de primavera estar disponible para ella: la inyeccin de dependencia, as como la opcin de crear una instancia de una nueva Action de instancia para cada solicitud. Para activar este ltimo, aadir scope = "prototype" a su definicin de bean de Accin.
<Nombre del bean = "/ user" scope = "prototype" autowire = "apodo" class = "org.example.web.UserAction" />

19.4.2 Clases ActionSupport

Como se mencion anteriormente, se puede recuperar el WebApplicationContext del ServletContext utilizando el WebApplicationContextUtils clase. Una forma ms fcil es extender la primavera de Action para las clases de Struts. Por ejemplo, en lugar de crear subclases de Struts " Action de clase, puede resorte subclase ActionSupport clase. El ActionSupport clase proporciona mtodos adicionales de conveniencia, como getWebApplicationContext (). A continuacin se muestra un ejemplo de cmo puede utilizar esto en una accin:
public class extends useraction DispatchActionSupport { pblico ActionForward ejecutar (cartografa ActionMapping, ActionForm forma, HttpServletRequest solicitud, HttpServletResponse respuesta) throws Exception { si (log.isDebugEnabled ()) { log.debug ("entrar en el mtodo 'delete' ..."); } Ctx WebApplicationContext getWebApplicationContext = (); UserManager mgr = (UserManager) ctx.getBean ("UserManager"); / / Hable con el gerente de la lgica de negocio volver mapping.findForward ("xito"); } }

Spring incluye las subclases para todas las acciones Struts estndar - las versiones de primavera slo tiene soporte aadido al nombre:
ActionSupport , DispatchActionSupport , LookupDispatchActionSupport y MappingDispatchActionSupport .

La estrategia recomendada es utilizar el mtodo que mejor se adapte a su proyecto. Subclases hace que el cdigo sea ms legible, y usted sabe exactamente cmo sus dependencias se resuelven. En cambio, utilizando el ContextLoaderPlugin le permite aadir fcilmente nuevas dependencias en el contexto de archivo XML. De cualquier manera, Spring ofrece algunas opciones agradables para la integracin con Struts.

19,5 WebWork 2.x


Desde la pgina de inicio WebWork : "WebWork es una aplicacin Java Web marco de desarrollo de aplicaciones. Est construido especficamente con la productividad del desarrollador y la simplicidad de cdigo en mente, proporcionando un fuerte apoyo para la creacin de plantillas reutilizables de interfaz de usuario, como los controles de formulario, temas de interfaz de usuario, la internacionalizacin, la cartografa dinmica parmetro formulario para JavaBeans, cliente robusto y validacin del lado del servidor, y mucho ms. " Arquitectura Web de trabajo y los conceptos son fciles de entender, y el marco tambin tiene una extensa biblioteca de etiquetas, as como la validacin bien disociado. Una de las herramientas clave en la tecnologa de pila WebWork es un contenedor IoC para gestionar las acciones WebWork, manejar el "cableado" de los objetos de negocio, etc Antes de la versin 2.2 WebWork, WebWork utiliza su propio contenedor patentado COI (y siempre los puntos de integracin para que una podra integrar un contenedor IoC como Primavera en la mezcla). Sin embargo, desde la versin WebWork 2.2, el contenedor de IoC defecto que se utiliza dentro de WebWork es primavera. Obviamente, esto es una gran noticia si uno es un desarrollador de primavera, porque significa que uno es inmediatamente familiar con los fundamentos de la configuracin de la COI, expresiones idiomticas, y cosas por el estilo dentro de WebWork. Ahora bien, en aras de la adhesin a la SECO (No Repeat Yourself) principio, sera tonto para documentar la integracin Primavera-WebWork a la luz del hecho de que el equipo WebWork ya han escrito una valoracin crtica. Por favor consulte la pgina de integracin Primavera-WebWork en el wiki WebWork para el pleno desacuerdos. Tenga en cuenta que el cdigo de integracin Primavera-WebWork se desarroll (y sigue siendo mantenido y mejorado) por los desarrolladores WebWork mismos. As que por favor consulte primero al sitio WebWork y foros si usted est teniendo problemas con la integracin. Pero no dude en enviar sus comentarios y preguntas con respecto a la integracin Primavera-WebWork en los foros de soporte de primavera , tambin.

19,6 Tapestry 3.xy 4.x


Desde la pgina de inicio Tapestry : "Tapestry es un framework de cdigo abierto para la creacin de dinmicas y aplicaciones robustas y escalables web en Java. Tapiz complementa y desarrolla el estndar API Java Servlet, y lo que funciona en cualquier contenedor de servlets o servidor de aplicaciones. "

Mientras Spring tiene su propia capa potente , hay una serie de ventajas nicas a la construccin de una aplicacin de empresa Java usando una combinacin de tapicera para la interfaz de usuario de la web y el contenedor Spring para las capas inferiores. En esta seccin del captulo integracin web intenta detallar algunas recomendaciones para la combinacin de estos dos marcos. Una tpica capa de aplicacin de empresa Java construido con tapicera y Spring consistir en una interfaz de usuario de la parte superior (UI) capa construida con la tapicera, y un nmero de capas inferiores, todos conectados entre s por uno o ms contenedores de primavera. Documentacin de referencia propio Tapestry contiene el siguiente cdigo de consejos de buenas prcticas. (El texto que el autor de este artculo ha aadido Spring est contenido dentro de [] corchetes.) "Un patrn de diseo muy acertado en Tapestry es mantener pginas y componentes muy sencillos, y el delegado como lgica de lo posible a HiveMind [o de primavera, o lo que sea] servicios. Mtodos de escucha ideal sera que no hacen ms que reunir juntos la informacin correcta y pasarlo a un servicio ". La pregunta clave entonces es: cmo un tapiz de pginas de suministro con la colaboracin de los servicios? La respuesta, por lo ideal es que uno querra dependencia inyectar esos servicios directamente en las pginas Tapestry uno. En Tapestry, se puede efectuar esta inyeccin de dependencia mediante una variedad de medios. En esta seccin slo se va a enumerar la inyeccin de dependencia significa que ofrece Spring. La verdadera belleza de el resto de esta integracin Primavera-Tapestry es que el diseo elegante y flexible de Tapestry s mismo hace hacer esto inyeccin de dependencias de Spring administrados frijoles pan comido. (Otra cosa buena es que este cdigo de integracin Primavera-Tapestry fue escrito - y sigue siendo mantenido - por el tapiz creador Ship Howard M. Lewis , as que mis felicitaciones a l por lo que es realmente cierta integracin suave como la seda).
19.6.1 inyectables administrados Primavera-frijoles

Supongamos que tenemos la siguiente definicin simple contenedor de primavera (en el omnipresente formato XML):
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: jee = "http://www.springframework.org/schema/jee" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd "> <beans> <- DataSource -> id = <jee:jndi-lookup "dataSource" jndi-name = "java:DefaultDS" /> <Bean id = "hibSessionFactory" class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<propiedad nombre = "dataSource" ref = "dataSource" /> </ Bean> <Bean id = "TransactionManager" class = "org.springframework.transaction.jta.JtaTransactionManager" /> <Bean id = "asignador" class = "com.whatever.dataaccess.mapper.hibernate.MapperImpl"> <propiedad nombre = "sessionFactory" ref = "hibSessionFactory" /> </ Bean> <- (Transaccional) AuthenticationService -> <Bean id = "authenticationService" class = "org.springframework.transaction.interceptor.TransactionProxyFactoryBe an"> <propiedad nombre = "transactionManager" ref = "transactionManager" /> <propiedad nombre = "target"> <bean class = "com.whatever.services.service.user.AuthenticationServiceImpl"> <propiedad nombre = "mapper" ref = "mapper" /> </ Bean> </ Propiedad> <propiedad nombre = valor = "proxyInterfacesOnly" "true" /> <propiedad nombre = "transactionAttributes"> <valor> * = PROPAGATION_REQUIRED </ Value> </ Propiedad> </ Bean> <- (Transaccional) UserService -> <Bean id = "UserService" class = "org.springframework.transaction.interceptor.TransactionProxyFactoryBe an"> <propiedad nombre = "transactionManager" ref = "transactionManager" /> <propiedad nombre = "target"> <bean class = "com.whatever.services.service.user.UserServiceImpl"> <propiedad nombre = "mapper" ref = "mapper" /> </ Bean> </ Propiedad> <propiedad nombre = valor = "proxyInterfacesOnly" "true" /> <propiedad nombre = "transactionAttributes"> <valor> * = PROPAGATION_REQUIRED </ Value> </ Propiedad> </ Bean> </ Beans>

Dentro de la aplicacin de Tapices, las definiciones de frijol anteriores deben ser cargados en un contenedor de Primavera , y las pginas Tapestry pertinentes deben ser

suministrados (inyectado) con el authenticationService y userService frijoles, que implementan el AuthenticationService y UserService interfaces, respectivamente. En este punto, el contexto de aplicacin est disponible para una aplicacin web llamando esttico Spring funcin de utilidad
WebApplicationContextUtils.getApplicationContext(servletContext) , donde ServletContext es el estndar ServletContext de la especificacin Servlet Java EE.

Como tal, un mecanismo simple para una pgina para obtener una instancia de la UserService , por ejemplo, sera con el cdigo, tales como:
WebApplicationContext appContext WebApplicationContextUtils.getApplicationContext = ( .. getRequestCycle () getRequestContext () getServlet () getServletContext ()).; UserService UserService = (UserService) appContext.getBean ("UserService"); / / ... algo de cdigo que utiliza UserService

Este mecanismo funciona. Dicho esto, se puede hacer mucho menos detallado al encapsular la mayor parte de la funcionalidad en un mtodo de la clase base de la pgina o componente. Sin embargo, en algunos aspectos, va en contra del principio de la COI, idealmente le gustara que la pgina no tener que pedir el contexto de un grano especfico por su nombre, y de hecho, la pgina no se sabe muy bien sobre el contexto en absoluto. Por suerte, hay un mecanismo para permitir esto. Nos basamos en el hecho de que Tapestry ya tiene un mecanismo para aadir propiedades declarativa a una pgina, y de hecho es el mtodo preferido para gestionar todas las propiedades de una pgina de esta manera declarativa, de modo que Tapestry adecuadamente puede manejar su ciclo de vida como parte de la pgina y del ciclo de vida de los componentes.
Nota

La siguiente seccin es aplicable a Tapestry 3.x. Si est utilizando la versin 4.x Tapestry, por favor consulte la seccin titulada la seccin llamada "inyeccin de dependencias Beans primavera en pginas Tapestry - estilo Tapestry 4.x" .
Inyeccin de Dependencia Beans primavera en pginas Tapestry

Primero tenemos que hacer el ApplicationContext a disposicin de la pgina Tapestry o componente sin tener que tener el ServletContext , esto se debe a la etapa del ciclo de vida de la pgina / componente cuando tenemos que acceder a la ApplicationContext , el ServletContext no estarn fcilmente disponibles para la pgina, por lo que no podemos usar
WebApplicationContextUtils.getApplicationContext(servletContext)

directamente. Una forma es mediante la definicin de una versin personalizada del Tapiz IEngine que expone esto por nosotros:
paquete com.whatever.web.xportal; / / Import ...

public class extends MyEngine org.apache.tapestry.engine.BaseEngine { APPLICATION_CONTEXT_KEY pblico static final String = "appContext"; / ** * @ See * / protected void setupForRequest (contexto RequestContext) { . sper setupForRequest (contexto); / / Insertar ApplicationContext en global, si no hay Mapa global = (Mapa) getGlobal (); ApplicationContext ac = (ApplicationContext) global.get (APPLICATION_CONTEXT_KEY); si (ac == NULL) { ac = WebApplicationContextUtils.getWebApplicationContext ( context.getServlet (). getServletContext () ); global.put (APPLICATION_CONTEXT_KEY, ac); } } }

Esta clase de motores pone el contexto de aplicacin de primavera como un atributo llamado "appContext" en este tapiz de aplicacin del 'Global' objeto. Asegrese de registrar el hecho de que este ejemplo especial iEngine se debe utilizar para esta aplicacin Tapestry, con una entrada en el archivo de definicin de aplicacin Tapestry. Por ejemplo:
archivo: xportal.application: <? Xml version = "1.0" encoding = "UTF-8"> <! DOCTYPE aplicacin PBLICA "- / / Apache Software Foundation / / Tapestry especificacin 3.0 / / EN" "Http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd"> Aplicacin < name = "Cualquiera que sea xPortal" motor-class = "com.whatever.web.xportal.MyEngine"> </ Application>

Archivos de definicin de componentes

Ahora en nuestra pgina o archivo de componente definicin (*. Pgina o *. Jwc), simplemente se aade la especificacin de propiedad elementos para agarrar los granos que necesitamos fuera de la ApplicationContext y crear propiedades de la pgina o componente para ellos. Por ejemplo:
<Propiedad de especificacin name = "UserService" type = "com.whatever.services.service.user.UserService"> global.appContext.getBean ("UserService") </ Propiedad de especificaciones> <Propiedad de especificacin name = "authenticationService" type = "com.whatever.services.service.user.AuthenticationService"> global.appContext.getBean ("authenticationService")

</ Propiedad de especificaciones>

La expresin OGNL dentro de la propiedad de especificacin especifica el valor inicial para la propiedad, como una semilla obtenida a partir del contexto. La definicin de pgina entera podra tener este aspecto:
<? Xml version = "1.0" encoding = "UTF-8"> <! DOCTYPE pgina de especificacin PBLICA "- / / Apache Software Foundation / / Tapestry especificacin 3.0 / / EN" "Http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd"> <page-specification class = "com.whatever.web.xportal.pages.Login"> nombre = <property-specification "username" type = "java.lang.String" /> nombre = <property-specification "password" type = "java.lang.String" /> nombre = <property-specification "error" type = "java.lang.String" /> <Propiedad de especificacin name = "UserService" type = "com.whatever.services.service.user.UserService"> global.appContext.getBean ("UserService") </ Propiedad de especificaciones> <Propiedad de especificacin name = "authenticationService" type = "com.whatever.services.service.user.AuthenticationService"> global.appContext.getBean ("authenticationService") </ Propiedad de especificaciones> nombre = <bean "delegate" class = "com.whatever.web.xportal.PortalValidationDelegate" /> <bean nombre = class = "validator" ciclo de vida "org.apache.tapestry.valid.StringValidator" "page" => nombre = <set-property "required" expresin = "true" /> nombre = <set-property "clientScriptingEnabled" expresin = "true" /> </ Bean> componente> id = "inputUsername" type = "ValidField"> <static-binding nombre = valor = "displayName" "Username" /> nombre = <binding "value" expresin = "username" /> nombre = <binding "validator" expresin = "beans.validator" /> </ Component> componente> id = "inputPassword" type = "ValidField"> nombre = <binding "value" expresin = "password" /> nombre = <binding "validator" expresin = "beans.validator" /> <static-binding nombre = valor = "displayName" "Password" /> nombre = <binding "hidden" expresin = "true" /> </ Component> </ Pgina de especificaciones>

Adicin de acceso abstractos

Ahora, en la definicin de la clase Java para la pgina o el propio componente, lo nico que tienes que hacer es aadir un mtodo getter resumen de las propiedades que hemos definido (con el fin de poder acceder a las propiedades).
/ / Nuestra aplicacin UserService; vendr de definicin de pgina public abstract UserService getUserService (); / / Nuestra aplicacin AuthenticationService; vendr de definicin de pgina getAuthenticationService pblico AuthenticationService abstracto ();

En aras de la exhaustividad, toda la clase Java, para una pgina de inicio de sesin en este ejemplo, podra tener este aspecto:
com.whatever.web.xportal.pages paquete; / ** * Permite al usuario iniciar sesin, proporcionando nombre de usuario y contrasea. * Despus de iniciar sesin correctamente, se coloca una cookie en el navegador del cliente * Que proporciona el nombre de usuario predeterminado para las conexiones futuras (la cookie * Persiste durante una semana). * / Ingresar pblico clase abstracta se extiende BasePage implementos ErrorProperty, PageRenderListener { / ** La clave bajo la que el objeto usuario autenticado es almacenado en la visita como * / USER_KEY pblico static final String = "usuario"; / ** El nombre de la cookie que identifica a un usuario ** / . cookie_name privado static final String = Login clase getName () + ". nombre de usuario."; final privado ONE_WEEK static int = 7 * 24 * 60 * 60; getUsername public String abstracto (); setUsername public abstract void (String username); public abstract Cadena getPassword (); public abstract void setPassword (String contrasea); getCallback pblico ICallback abstracto (); setCallback public void resumen (valor ICallback); public abstract UserService getUserService (); getAuthenticationService pblico AuthenticationService abstracto (); IValidationDelegate protegido getValidationDelegate () { volver (IValidationDelegate) getBeans () getBean ("delegado").; } protected void setErrorField (String ComponentID, String mensaje) {

IFormComponent campo = (IFormComponent) getComponent (ComponentID); Delegado IValidationDelegate getValidationDelegate = (); delegate.setFormComponent (campo); delegate.record (nuevo ValidatorException (mensaje)); } / ** * Los intentos de inicio de sesin. * <p> * Si el nombre de usuario no es conocida, o la contrasea no es vlida, entonces un error Mensaje * en la pantalla. ** / public void attemptLogin (IRequestCycle ciclo) { Cadena password = getPassword (); / / Haga un poco de trabajo extra para borrar la contrasea. setPassword (null); Delegado IValidationDelegate getValidationDelegate = (); delegate.setFormComponent ((IFormComponent) getComponent ("inputPassword")); delegate.recordFieldInputValue (null); / / Un error, de un campo de validacin, ya puede haber ocurrido. si (delegate.getHasErrors ()) { volver; } try { . Usuario = Usuario getAuthenticationService () login (getUsername (), getPassword ()); loginUser (usuario, ciclo); } catch (FailedLoginException ex) { . este setError ("No se pudo entrar:" + ex.getMessage ()); volver; } } / ** * Permite configurar el usuario {@ link} como el usuario conectado, crea * Una galleta para su nombre de usuario (para inicios de sesin subsiguientes), * Y redirecciona a la pgina correspondiente, o * Una pgina especificada). ** / public void loginUser (usuario de usuario, ciclo IRequestCycle) { Cadena username = user.getUsername (); / / Obtener el objeto de la visita, lo que probablemente obligar a la / / Creacin del objeto de la visita y una HttpSession Visita = Mapa (Map) getVisit (); visit.put (USER_KEY, usuario);

/ / Despus de iniciar sesin, vaya a la pgina MyLibrary, a menos que se especifique lo contrario Callback = ICallback getCallback (); if (callback == null) { cycle.activate ("Home"); } else { callback.performCallback (ciclo); } IEngine motor getEngine = (); Cookie Cookie Galleta = nuevo (cookie_name, nombre de usuario); cookie.setPath (engine.getServletPath ()); cookie.setMaxAge (ONE_WEEK); / / Grabar el nombre del usuario en una cookie . cycle.getRequestContext () addCookie (cookie); engine.forgetPage (getPageName ()); } public void pageBeginRender (PageEvent evento) { if (getUsername () == null) { setUsername (getRequestCycle () getRequestContext () getCookieValue (cookie_name)..); } } }

Inyeccin de Dependencia Beans primavera en pginas Tapestry - estilo Tapestry 4.x

Efectuar la inyeccin de dependencias de Spring-administrados frijoles en pginas Tapestry en la versin 4.x Tapestry es mucho ms sencillo. Todo lo que se necesita es una simple add-on biblioteca , y una cierta cantidad (pequea) de (esencialmente repetitivo) de configuracin. Simplemente empaquetar e implementar esta biblioteca de las bibliotecas (una de las) otros requeridos por la aplicacin web (por lo general en WEB-INF/lib ). A continuacin, tendr que crear y exponer el contenedor Spring utilizando el mtodo descrito anteriormente . A continuacin, puede inyectar administrados Primavera-judas en Tapestry muy fcilmente, y si estamos usando Java 5, considere la Login desde la pgina anterior: simplemente hay que anotar los mtodos getter adecuados con el fin de inyectar la dependencia de la primavera gestionados userService y authenticationService objetos ( porciones de la definicin de clase se ha elidido para mayor claridad).
com.whatever.web.xportal.pages paquete; Ingresar pblico clase abstracta se extiende BasePage implementos ErrorProperty, PageRenderListener { @ InjectObject ("primavera: UserService") public abstract UserService getUserService (); @ InjectObject ("primavera: authenticationService")

getAuthenticationService pblico AuthenticationService abstracto (); }

Estamos casi listos. Todo lo que queda es la configuracin HiveMind que expone el contenedor Spring almacena en el ServletContext como un servicio HiveMind, por ejemplo:
<? Xml version = "1.0"> <modulo id = "com.javaforge.tapestry.spring" versin "0.1.1" => <Servicio de punto id = "SpringApplicationInitializer" interface = "org.apache.tapestry.services.ApplicationInitializer" visibilidad = "privado"> <invoke-factory> <construct class = "com.javaforge.tapestry.spring.SpringApplicationInitializer"> <Set-property = objeto "beanFactoryHolder" value = "servicio: hivemind.lib.DefaultSpringBeanFactoryHolder" /> </ Construccin> </ Invoke-factory> </ Service-> punto <- Enganchar el resorte de configuracin en la inicializacin de la aplicacin en general. -> <Contribucin id = "configuracin"> tapestry.init.ApplicationInitializers <Comando id = "spring-contexto" objeto = "Servicio: SpringApplicationInitializer" /> </ Contribucin> </ Module>

Si utiliza Java 5 (y as tener acceso a las anotaciones), entonces lo que realmente es. Si usted no est usando Java 5, entonces uno obviamente no anotar las propias clases de pgina Tapestry con anotaciones, sino que simplemente se utiliza XML buena pasada de moda para declarar la inyeccin de dependencia, por ejemplo, dentro de la .page o .jwc archivo para el Login pgina (o componente):
<inject property = "userService" objeto = "spring:userService" /> <inject property = "authenticationService" objeto = "spring:authenticationService" />

En este ejemplo, nos las hemos arreglado para que los frijoles de servicio definidos en un contenedor de Spring que debe proporcionarse a la pgina Tapiz de forma declarativa. La clase de pgina no sabe donde las implementaciones de servicio viene de, y de hecho es fcil de poner en otra aplicacin, por ejemplo, durante las pruebas. Esta inversin de control es uno de los principales objetivos y beneficios de la Spring Framework, y hemos conseguido que se extienden a lo largo de la pila en la presente solicitud de Tapices.

19.7 Recursos adicionales


A continuacin encontrar enlaces a recursos adicionales sobre los frameworks web que se describen en este captulo.

El JSF pgina de inicio El Struts pgina de inicio El WebWork pgina de inicio El Tapiz pgina de inicio

20. Portlet MVC Framework 20.1 Introduccin


La JSR-168 Java Portlet Specification Para obtener ms informacin general acerca de desarrollo de portlets, consulte el documento tcnico de Sun titulado "Introduccin a la JSR 168" , y por supuesto la especificacin JSR-168 s mismo. Adems de apoyar convencional (basado en servlet) Desarrollo Web, primavera tambin es compatible con JSR-168 el desarrollo de portlets. En la medida de lo posible, la MVC Portlet marco es una imagen de espejo del marco Web MVC, y tambin utiliza las abstracciones mismas subyacentes visin y tecnologa de integracin. Por lo tanto, asegrese de revisar los captulos titulados Captulo 17, Web MVC marco y el Captulo 18, Vistas las tecnologas antes de continuar con este captulo.
Nota

Tenga en cuenta que si bien los conceptos de Spring MVC son los mismos que en la primavera de MVC Portlet, hay algunas diferencias notables creadas por el flujo de trabajo nico de portlets JSR-168. La principal forma en que portlet de flujo de trabajo difiere de flujo de trabajo servlet es que la solicitud para el portlet puede tener dos fases distintas: la fase de accin y la eliminacin de render. La fase de accin se ejecuta slo una vez y es donde cualquier 'back-end' cambios o acciones que se producen, como hacer cambios en una base de datos. La fase de render produce entonces lo que se muestra al usuario cada vez que se actualiza la pantalla. El punto crtico aqu es que para una sola peticin general, la fase de accin se ejecuta slo una vez, pero la fase de procesamiento puede ser ejecutado varias veces. Esto proporciona (y requiere) una clara separacin entre las actividades que modifican el estado persistente de su sistema y las actividades que generan lo que se muestra al usuario. Spring Web Flow Spring Web Flow (SWF) aspira a ser la mejor solucin para la gestin del flujo de la pgina web de la aplicacin.

SWF se integra con los marcos existentes como Spring MVC, Struts y JSF, tanto en entornos de servlets y portlets. Si usted tiene un proceso de negocio (o procesos) que se beneficiaran de un modelo conversacional en lugar de un modelo puramente peticin, entonces SWF puede ser la solucin. SWF le permite capturar los flujos de pginas lgicas como mdulos autnomos que son reutilizables en diferentes situaciones, y por lo tanto es ideal para la construccin de mdulos de aplicaciones web que guan al usuario a travs de navegaciones controladas que los procesos de unidad de negocio. Para obtener ms informacin acerca de SWF, consulte el sitio web de Spring Web Flow . Las fases duales de solicitudes de portlets son una de las fortalezas reales de la especificacin JSR-168. Por ejemplo, los resultados de bsqueda dinmica se pueden actualizar de forma rutinaria en la pantalla sin que el usuario explcitamente volver a ejecutar la bsqueda. La mayora de los otros marcos MVC portlet tratar de ocultar completamente las dos fases del desarrollador y hacer que se vea lo ms parecido al desarrollo tradicional servlet como sea posible - creemos que este enfoque elimina uno de los principales beneficios del uso de portlets. As, la separacin de las dos fases se conserva en todo el marco Spring Portlet MVC. La primera manifestacin de este enfoque es que, cuando la versin del servlet de las clases MVC tendr un mtodo que trata de la solicitud, la versin de portlet de las clases MVC tendr dos mtodos que tienen que ver con la solicitud: uno para la fase de accin y un para la fase de render. Por ejemplo, cuando la versin de servlet AbstractController tiene la handleRequestInternal(..) mtodo, la versin de portlet de AbstractController tiene handleActionRequestInternal(..) y handleRenderRequestInternal(..) mtodos. El marco est diseado en torno a un DispatcherPortlet que despacha las peticiones a los manipuladores, con asignaciones de controlador configurable y la resolucin de vista, al igual que el DispatcherServlet en el marco web hace. La carga de archivos tambin se apoya en la misma forma. Resolucin Locale y resolucin tema no se admiten en Portlet MVC - estas reas estn en el mbito del envase portal / portlet y no son apropiados en el nivel de la Primavera. Sin embargo, todos los mecanismos de resorte que dependen de la configuracin regional (por ejemplo, la internacionalizacin de los mensajes) seguir funcionando correctamente porque DispatcherPortlet expone la localizacin actual de la misma manera como DispatcherServlet .
20.1.1 Controladores - El C en MVC

El manejador por defecto sigue siendo una muy simple Controller interfaz, que ofrece slo dos mtodos:
void handleActionRequest(request,response) ModelAndView handleRenderRequest(request,response)

El marco incluye tambin la mayor parte de la jerarqua controlador misma implementacin, tal como AbstractController , SimpleFormController , y as sucesivamente. El enlace de datos, el uso de comandos objeto, la manipulacin del modelo, y la resolucin de vista son todos los mismos que en el marco servlet.
20.1.2 Vistas - El V en MVC

Todas las capacidades de renderizado del marco servlet se usan directamente a travs de un servlet puente especial llamado ViewRendererServlet . Mediante el uso de este servlet, la solicitud de portlet se convierte en una peticin de servlet y la vista puede representarse mediante la infraestructura completa servlet normal. Esto significa que todos los procesadores existentes, tales como JSP, Velocity, etc, se puede seguir utilizando en el portlet.
20.1.3 Web de mbito de frijoles

Spring MVC Portlet apoya frijoles cuyo ciclo de vida est en el mbito de la actual solicitud HTTP o HTTP Session (tanto normales como global). Esto no es una caracterstica especfica de Spring MVC Portlet s mismo, sino ms bien de la WebApplicationContext recipiente (s) que utiliza Spring MVC Portlet. Estos mbitos de frijol se describen en detalle en la Seccin 5.5.4, "Solicitud, sesin y mbitos global de sesin"

20.2 El DispatcherPortlet
Portlet MVC es una solicitud basada en web framework MVC, diseado en torno a un portlet que despacha peticiones a los controladores y ofrece otras funcionalidades para facilitar el desarrollo de aplicaciones de portlet. Spring DispatcherPortlet sin embargo, hace mucho ms que eso. Est completamente integrado con la primavera ApplicationContext y le permite utilizar cada primavera tiene otra caracterstica. Al igual que portlets ordinarias, el DispatcherPortlet se declara en el portlet.xml archivo de la aplicacin web:
<portlet> <portlet-name> muestra </ portlet-name> <portlet-class> org.springframework.web.portlet.DispatcherPortlet </ portlet-clase> <supports> <mime-type> text / html </ mime-type> <portlet-mode> vista </ portlet-mode> </ Soportes> <portlet-info> Muestra <title> Portlet </ title> </ Portlet-info> </ Portlet>

El DispatcherPortlet ahora necesita ser configurado. En el marco MVC Portlet, cada DispatcherPortlet tiene su propio WebApplicationContext , que hereda todos los frijoles ya definidos en la raz

WebApplicationContext

. Estos granos heredados se pueden reemplazar en el campo de aplicacin portlet especfico, y los nuevos alcance especficos de frijoles puede definirse local a una determinada instancia de portlet. El marco de referencia, en la inicializacin de una DispatcherPortlet , busca un archivo llamado [portlet-name]-portlet.xml en la WEB-INF directorio de la aplicacin web y crear los beans definidos all (anulando las definiciones de todos los beans definidos con el mismo nombre en el mbito global). La ubicacin de configuracin utilizado por el DispatcherPortlet puede ser modificado a travs de un parmetro de inicializacin portlet (ver ms abajo para ms detalles). El Spring DispatcherPortlet tiene un poco de frijol especiales que utiliza, con el fin de ser capaz de procesar peticiones y hacer que las vistas apropiadas. Estos granos se incluyen en el marco de primavera y se puede configurar en el WebApplicationContext , as como cualquier otro frijol estara configurado. Cada uno de estos granos se describe con ms detalle a continuacin. En este momento, slo tendremos que hablar de ellos, slo para hacerle saber que existen y para que podamos seguir hablando de la DispatcherPortlet . Para la mayora de los granos, los valores predeterminados se proporcionan para que usted no tiene que preocuparse sobre la configuracin de ellos. Tabla 20.1. Frijoles especiales en la WebApplicationContext
Expresin Explicacin ( Seccin 20.5, "Asignaciones de controlador" ) una lista de pre-y postprocesadores y controladores que se ejecutarn si se ajustan a determinados criterios (por ejemplo, una coincidencia de modo portlet especificado con el controlador) ( Seccin 20,4, "Controllers" ) los granos de proporcionar la funcionalidad real (o al menos, el acceso a la funcionalidad) como parte de la trada MVC ( seccin 20.6 "Vistas y resolverlas" ) capaz de resolver nombres de las vistas para ver las definiciones ( Seccin 20.7, "Multipart (carga de archivos) support" ) ofrece una funcionalidad para procesar envos de archivo de formularios HTML ( Seccin 20.8, "Manejo de excepciones" ) ofrece funcionalidad para asignar excepciones a las vistas o implementar otro cdigo excepcin ms complejo el manejo

manejador de asignacin (s)

controlador (s)

ver resolver resolver multipart manejador de excepcin resolver

Cuando un DispatcherPortlet est configurado para su uso y llega una solicitud para ese usuario especfico DispatcherPortlet , se inicia el procesamiento de la solicitud.

La lista a continuacin describe el proceso completo de una solicitud pasa por si se maneja por un DispatcherPortlet : 1. El entorno local devuelto por PortletRequest.getLocale() est unido a la peticin para que los elementos en el proceso de resolver la localizacin para su empleo en el tratamiento de la solicitud (haciendo que el punto de vista, la preparacin de datos, etc.) 2. Si un dispositivo de resolucin multipart se especifica y esta es una ActionRequest , la solicitud se inspecciona para Multiparts y si se encuentra, se envolvi en una MultipartActionRequest para su posterior procesamiento por otros elementos en el proceso. (Vea la Seccin 20.7, "Multipart (carga de archivos) de apoyo" para obtener ms informacin sobre el manejo de varias partes). 3. Un controlador apropiado est buscado. Si un controlador se encuentra, la cadena de ejecucin asociado con el controlador (pre-procesadores, postprocesadores, controladores) se ejecutar con el fin de preparar un modelo. 4. Si un modelo se devuelve la vista es renderizada, utilizando la resolucin de vista que se ha configurado con la WebApplicationContext . Si no se devuelve modelo (que podra ser debido a una pre-o post-procesador de interceptar la peticin, por ejemplo, por razones de seguridad), no hay vista se representa, puesto que la peticin ya podra haber sido cumplida. Las excepciones que se producen durante el procesamiento de la solicitud de ser recogidos por cualquiera de los dispositivos de resolucin controlador de excepciones que se declaran en el WebApplicationContext . El uso de estos solucionadores de excepcin puede definir el comportamiento personalizado en caso de que tales excepciones son arrojados. Puede personalizar Spring DispatcherPortlet aadiendo parmetros de contexto en el portlet.xml archivo o parmetros init-portlet. Las posibilidades se enumeran a continuacin. Tabla 20.2. DispatcherPortlet parmetros de inicializacin
Parmetro Explicacin Clase que implementa WebApplicationContext , que se utiliza para crear una instancia del contexto utilizado por este portlet. Si este parmetro no se especifica, el XmlPortletApplicationContext se utilizar.

contextClass

Cadena que se pasa a la instancia de contexto (especificado por contextClass ) para indicar donde el contexto (s) se puede encontrar. La cadena se podra dividir en varias cadenas contextConfigLocation (utilizando una coma como delimitador) para apoyar mltiples contextos (en el caso de localizaciones mltiples contextos, para el frijol que se definen dos veces, la ltima tiene prioridad).

Parmetro
namespace

Explicacin El espacio de nombres de la WebApplicationContext . El valor predeterminado es [portlet-name]-portlet . La URL en la que DispatcherPortlet puede acceder a una instancia de ViewRendererServlet (vase la Seccin 20.3, "El ViewRendererServlet " ).

viewRendererUrl

20.3 El ViewRendererServlet
El proceso de mezcla en Portlet MVC es un poco ms compleja que en Web MVC. Con el fin de reutilizar todos los tecnologas de vista de Spring Web MVC, debemos convertir la PortletRequest / PortletResponse a HttpServletRequest / HttpServletResponse y luego llamar al render mtodo de la View . Para ello, DispatcherPortlet utiliza un servlet especial que existe slo para este propsito: la ViewRendererServlet . Para DispatcherPortlet representacin de trabajar, debe declarar una instancia de la ViewRendererServlet en el web.xml archivo de la aplicacin web de la siguiente manera:
<servlet> <servlet-name> ViewRendererServlet </ servlet-name> <servlet-class> org.springframework.web.servlet.ViewRendererServlet </ servlet-clase> </ Servlet> <servlet-mapping> <servlet-name> ViewRendererServlet </ servlet-name> <url-pattern> / WEB-INF/servlet/view </ url-pattern> </ Servlet-mapping>

Para llevar a cabo el procesamiento real, DispatcherPortlet hace lo siguiente: 1. Enlaza el WebApplicationContext a la solicitud como un atributo con el mismo WEB_APPLICATION_CONTEXT_ATTRIBUTE clave que DispatcherServlet usos. 2. Vincula los Model y View objetos a la solicitud para que estn disponibles para el ViewRendererServlet . 3. Construye un PortletRequestDispatcher y realiza una include con el /WEBINF/servlet/view URL que est asignado a la ViewRendererServlet . El ViewRendererServlet es capaz de llamar al render mtodo en la View con los argumentos adecuados. La direccin URL real del ViewRendererServlet se puede cambiar con DispatcherPortlet 's viewRendererUrl parmetro de configuracin.

20,4 Controladores
Los controladores en Portlet MVC son muy similares a los Controladores de Web MVC, y portar cdigo de una a la otra debe ser simple. La base para el MVC Portlet controlador de la arquitectura es la org.springframework.web.portlet.mvc.Controller interfaz, que se enumeran a continuacin.
Controlador de interfaz pblica { / ** * Procesar la solicitud de representacin y devolver un objeto ModelAndView que el * DispatcherPortlet har. * / ModelAndView handleRenderRequest (RenderRequest solicitud, RenderResponse respuesta) throws Exception; / ** * Procesar la solicitud de accin. No hay nada para volver. * / vaco handleActionRequest (ActionRequest solicitud, ActionResponse respuesta) throws Exception; }

Como se puede ver, el Portlet Controller interfaz requiere dos mtodos que controlan las dos fases de una solicitud de portlet: la peticin de accin y la solicitud de representacin. La fase de accin debe ser capaz de manejar una solicitud de accin, y la fase de procesamiento debe ser capaz de manejar una solicitud de representacin y devolver un modelo apropiado y vista. Mientras que el Controller interfaz es bastante abstracto, Spring MVC Portlet ofrece varios controladores que ya contienen una gran cantidad de la funcionalidad que usted puede ser que necesite, la mayora de ellos son muy similares a los controladores de Spring Web MVC. El Controller interfaz slo define la funcionalidad ms comn requiere de cada controlador: el manejo de una solicitud de accin, manejando una solicitud de representacin y devolver un modelo y una vista.
20.4.1 AbstractController y PortletContentGenerator

Por supuesto, slo un Controller interfaz no es suficiente. Para proporcionar una infraestructura bsica, todos Spring Portlet MVC Controller s heredar de AbstractController , una clase que ofrece acceso a Spring ApplicationContext y el control sobre el almacenamiento en cach. Tabla 20.3. Caractersticas que ofrece el AbstractController
Parmetro
requireSession

Explicacin Indica si este Controller requiere una sesin para hacer su

Parmetro

Explicacin trabajo. Esta funcin se ofrece a todos los controladores. Si una sesin no est presente cuando dicho controlador recibe una peticin, se informa al usuario mediante una SessionRequiredException .

Utilice esta opcin si desea manejar por este controlador se sincronizan en la sesin del usuario. Para ser ms especficos, el controlador se extiende anularn las synchronizeSession handleRenderRequestInternal(..) y handleActionRequestInternal(..) los mtodos que se van a sincronizar en la sesin del usuario si se especifica esta variable. Si desea que su controlador para hacer realidad la visin cuando el portlet se encuentra en un estado minimizado, ponga esto en renderWhenMinimized verdad. De forma predeterminada, se establece en false para que portlets que se encuentran en un estado minimizado no muestran ningn contenido. Cuando se desea un controlador para anular la caducidad de la cach predeterminado definido para el portlet, especifique un entero positivo aqu. Por defecto est establecido en -1 , lo que no cambia el almacenamiento en cach de forma predeterminada. Si lo establece a 0 se asegurar el resultado nunca es almacenada en cach.

cacheSeconds

Los requireSession y cacheSeconds propiedades se declaran en el PortletContentGenerator clase, que es la superclase de AbstractController ), pero se incluyen aqu por completitud. Cuando se utiliza el AbstractController como una clase base para los controladores (que no es recomendable, ya que hay un montn de otros controladores que ya podra hacer el trabajo para usted) es suficiente para anular el tanto handleActionRequestInternal(ActionRequest, ActionResponse) o el mtodo handleRenderRequestInternal(RenderRequest, RenderResponse) mtodo (o ambos), aplicar la lgica y devolver un ModelAndView objeto (en el caso de handleRenderRequestInternal ). Las implementaciones por defecto de ambos handleActionRequestInternal(..) y handleRenderRequestInternal(..) lanzar un PortletException . Esto es consistente con el comportamiento de GenericPortlet de la API JSR-168 Especificacin. As que slo es necesario reemplazar el mtodo que el controlador est diseado para manejar.

Aqu es un ejemplo breve que consiste en una clase y una declaracin en el contexto de la aplicacin web.
Ejemplos de paquete; javax.portlet.RenderRequest importacin; importar javax.portlet.RenderResponse; org.springframework.web.portlet.mvc.AbstractController importacin; importar org.springframework.web.portlet.ModelAndView; public class extends SampleController AbstractController { pblico ModelAndView handleRenderRequestInternal (RenderRequest peticin, la respuesta de RenderResponse) { ModelAndView MAV = new ModelAndView ("foo"); mav.addObject ("mensaje", "Hello World!"); volver MAV; } } <bean id= "sampleController" class = "samples.SampleController"> <propiedad name= "cacheSeconds" value= "120" /> </ Bean>

La clase anterior y la declaracin en el contexto de la aplicacin web es todo lo que necesita, adems de la creacin de una asignacin de controlador (vase la Seccin 20.5, "Asignaciones de controlador" ) para conseguir este trabajo controlador muy simple.
20.4.2 Otros controladores sencillos

Aunque se puede extender AbstractController , Spring Portlet MVC proporciona una serie de implementaciones concretas que ofrecen una funcionalidad que se utiliza comnmente en aplicaciones sencillas de MVC. El ParameterizableViewController es bsicamente el mismo que el ejemplo anterior, excepto por el hecho de que usted puede especificar el nombre de la vista que le proporcione en el contexto de la aplicacin web (no es necesario codificar el nombre de la vista). El PortletModeNameViewController utiliza el modo actual del portlet como el nombre de la vista. Por lo tanto, si el portlet est en modo de Vista (es decir PortletMode.VIEW ), entonces usa "vista" como el nombre de la vista.
20.4.3 Controladores de comandos

Spring MVC Portlet tiene exactamente la misma jerarqua de los controladores de comandos como Spring Web MVC. Ellos proporcionan una forma de interactuar con los objetos de datos y enlazar dinmicamente los parmetros de la PortletRequest para el objeto de datos especificado. Sus objetos de datos no tiene que implementar una interfaz de marco de trabajo especfico, por lo que puede manipular directamente los objetos persistentes si lo desea. Vamos a examinar lo que los controladores de comandos estn disponibles, para obtener una visin general de lo que puede hacer con ellos:

AbstractCommandController

- un controlador de comandos que puede utilizar para crear su propio controlador de comando, capaz de parmetros de la peticin de unin a un objeto de datos que especifique. Esta clase no ofrecen una funcionalidad forma, ofrece no obstante caractersticas de validacin y le permite especificar en el controlador de s mismo qu hacer con el objeto de comando que se ha llenado con los parmetros de la peticin. AbstractFormController - una ofrenda abstracto controlador de formulario de soporte de presentacin. El uso de este controlador puede modelar formas y rellenarlas con un objeto de comando que recupere en el controlador. Despus de que un usuario haya llenado el formulario, AbstractFormController une los campos, valida y manos la espalda objeto al controlador para actuar en consecuencia. Funciones soportadas son: el envo de formularios vlidos (nueva presentacin), la validacin y flujo de trabajo forma normal. Usted implementar mtodos para determinar qu puntos de vista se utiliza para la presentacin forma y el xito. Utilice este controlador si necesita formularios, pero no desea especificar qu considera usted va a mostrar al usuario en el contexto de la aplicacin. SimpleFormController - un hormign AbstractFormController que proporciona un apoyo an ms cuando se crea un formulario con un objeto de comando correspondiente. El SimpleFormController le permite especificar un objeto de comando, un nombredevista para el formulario, un nombredevista de la pgina que queremos mostrar al usuario cuando se ha logrado el envo de formularios, y mucho ms. AbstractWizardFormController - un hormign AbstractFormController que proporciona una interfaz de estilo asistente para editar el contenido de un objeto de comando a travs de las pginas de visualizacin mltiple. Soporta mltiples acciones del usuario: acabado, cancelar o cambiar la pgina, todos los cuales son fcilmente especificado en los parmetros de solicitud de la vista.

Estos controladores de comandos son muy poderosos, pero que no se requiere un conocimiento detallado de su funcionamiento con el fin de utilizar de manera eficiente. Revise cuidadosamente los Javadocs para esta jerarqua completa y luego ver algunas implementaciones de ejemplo antes de empezar a utilizarlos.
20.4.4 PortletWrappingController

En lugar de desarrollar nuevos controladores, es posible utilizar los portlets existentes y solicitudes del mapa a ellos desde un DispatcherPortlet . Usando el PortletWrappingController , puede crear instancias existente Portlet como Controller de la siguiente manera:
<bean id = "myPortlet" class = "org.springframework.web.portlet.mvc.PortletWrappingController"> <propiedad nombre = valor = "portletClass" "sample.MyPortlet" /> <propiedad nombre = valor = "portletName" "my-portlet" /> <propiedad nombre = "initParameters"> <valor> config = / WEB-INF/my-portlet-config.xml </ value> </ Propiedad> </ Bean>

Esto puede ser muy valioso ya que a continuacin, puede utilizar interceptores de preproceso y post-proceso de peticiones ir a estos portlets. Desde JSR-168 no es compatible con cualquier tipo de mecanismo de filtro, esto es muy prctico. Por ejemplo, esto puede ser utilizado para envolver el Hibernate OpenSessionInViewInterceptor alrededor de un Portlet MyFaces JSF.

20.5 Asignaciones de controlador


Con una asignacin de controlador puede asignar las solicitudes entrantes de portlet a los controladores apropiados. Hay algunas asignaciones de controlador se pueden utilizar fuera de la caja, por ejemplo, la PortletModeHandlerMapping , pero primero vamos a examinar el concepto general de una HandlerMapping . Nota: Estamos usando intencionalmente el trmino "controlador" en lugar de "controlador". DispatcherPortlet est diseado para ser utilizado con otras formas de procesar las solicitudes de los controladores propios apenas Spring Portlet MVC. Un controlador es cualquier objeto que puede manejar peticiones de portlet. Los controladores son un ejemplo de controladores, y son, por supuesto, el valor predeterminado. Para utilizar algn otro marco con DispatcherPortlet , una aplicacin correspondiente de HandlerAdapter es todo lo que se necesita. La funcionalidad bsica de un HandlerMapping proporciona es la entrega de una HandlerExecutionChain , que debe contener el controlador que coincide con la peticin de entrada, y puede contener tambin una lista de controlador de interceptores que se aplican a la solicitud. Cuando una peticin llega, el DispatcherPortlet lo entregar a la asignacin de controlador para dejarlo inspeccionar la solicitud y llegar a una adecuada HandlerExecutionChain . Entonces el DispatcherPortlet ejecutar el controlador y los interceptores en la cadena (si la hay). Estos conceptos son exactamente los mismos que en Spring Web MVC. El concepto de asignaciones de controlador configurable que puede contener opcionalmente interceptores (ejecutado antes o despus de que el controlador real fue ejecutado, o ambos) es muy potente. Una gran cantidad de soportar la funcionalidad se puede construir en una costumbre HandlerMapping . Piense en una asignacin de controlador personalizado que elige un controlador basado no solamente en el modo de portlet de la solicitud de llegando, pero tambin en un estado especfico de la sesin asociada a la solicitud. En Spring Web MVC, asignaciones de controlador se basan comnmente en las URL. Dado que en realidad no hay tal cosa como un URL dentro de un portlet, debemos usar otros mecanismos para controlar las asignaciones. Los dos ms comunes son el modo de portlet y un parmetro de peticin, pero nada disponible a la solicitud portlet se puede utilizar en una asignacin de controlador de ratn. El resto de esta seccin se describen tres de las asignaciones de Spring MVC Portlet de controlador ms utilizados. Ellos se extienden todos AbstractHandlerMapping y compartir las siguientes propiedades:

interceptors

:. La lista de interceptores de usar HandlerInterceptor s se discuten en la Seccin 20.5.4, "Adicin HandlerInterceptor s " . defaultHandler : el controlador que desea utilizar, cuando esta asignacin de controlador no da lugar a un controlador de juego. order : Basado en el valor de la propiedad de orden (vase el org.springframework.core.Ordered interfaz), la primavera va a clasificar todas las asignaciones de controlador disponible en el contexto y aplicar el manejador primer apareamiento. lazyInitHandlers : Permite la inicializacin perezosa de los manipuladores de Singleton (manipuladores de prototipos siempre perezosamente inicializado). El valor predeterminado es false. Esta propiedad se aplica directamente en los tres controladores de hormign.

20.5.1 PortletModeHandlerMapping

Se trata de una asignacin de controlador sencillo que asigna las solicitudes entrantes en funcin del modo actual del portlet (por ejemplo, 'view', 'edit', 'help'). Un ejemplo:
<bean class = "org.springframework.web.portlet.handler.PortletModeHandlerMapping"> <propiedad nombre = "portletModeMap"> <map> <entry clave = "view" value-ref = "viewHandler" /> <entry clave = "edit" value-ref = "editHandler" /> <entry clave = "help" value-ref = "helpHandler" /> </ Map> </ Propiedad> </ Bean>

20.5.2 ParameterHandlerMapping

Si hay que navegar alrededor a mltiples controladores sin cambiar portlet modo, la forma ms sencilla de hacer esto es con un parmetro de peticin que se utiliza como clave para controlar la asignacin.
ParameterHandlerMapping

utiliza el valor de un parmetro de peticin especfica para controlar la asignacin. El nombre predeterminado del parmetro es 'action' , pero se puede cambiar con el 'parameterName' propiedad. La configuracin de frijol para este mapeo se ver algo como esto:
<bean class = "org.springframework.web.portlet.handler.ParameterHandlerMapping"> <propiedad name=" parameterMap"> <map> <entry clave = "add" value-ref = "addItemHandler" /> <entry clave = "edit" value-ref = "editItemHandler" /> <entry clave = "delete" value-ref = "deleteItemHandler" /> </ Map> </ Propiedad> </ Bean>

20.5.3 PortletModeParameterHandlerMapping

El ms potente capacidad de asignacin de controlador, PortletModeParameterHandlerMapping combina las capacidades de las dos anteriores para permitir la navegacin diferente en cada modo de portlet. Una vez ms el nombre predeterminado del parmetro es "accin", pero se puede cambiar con el parameterName propiedad. Por defecto, el valor del parmetro equivalente, slo podr utilizarse de dos modos diferentes de portlet. Esto es para que si el propio portal cambia el modo de portlet, la solicitud ya no ser vlida en el mapeo. Este comportamiento se puede cambiar estableciendo la allowDupParameters propiedad en true. Sin embargo, esto no es recomendable. La configuracin de frijol para este mapeo se ver algo como esto:
<bean class = "org.springframework.web.portlet.handler.PortletModeParameterHandlerMa pping"> <propiedad nombre = "portletModeParameterMap"> <map> <entry clave = "view"> <- 'view' modo portlet -> <map> <entry clave = "add" value-ref = "addItemHandler" /> <entry clave = "edit" value-ref = "editItemHandler" /> <entry clave = "delete" value-ref = "deleteItemHandler" /> </ Map> </ Entry> <entry clave = "edit"> <- 'editar' portlet mode -> <map> <entry clave = "prefs" value-ref = "prefsHandler" /> <entry clave = "resetPrefs" value-ref = "resetPrefsHandler" /> </ Map> </ Entry> </ Map> </ Propiedad> </ Bean>

Este mapeo puede ser encadenado por delante de un PortletModeHandlerMapping , que puede entonces proporcionar valores predeterminados para cada modo y un defecto en general tambin.
20.5.4 Adicin de HandlerInterceptor s

Mecanismo de Spring manejador de mapeo tiene una nocin de controlador de interceptores, que puede ser muy til cuando se desea aplicar funcionalidades especficas para ciertas peticiones, por ejemplo, la comprobacin de un principal.

Nuevamente Spring MVC Portlet implementa estos conceptos de la misma manera como Web MVC. Los interceptores ubicados en la asignacin de controlador debe implementar HandlerInterceptor del org.springframework.web.portlet paquete. Al igual que la versin de servlet, esta interfaz define tres mtodos: uno que se llama antes de que el controlador real se ejecuta ( preHandle ), que se llamar despus de que el manejador se ejecuta ( postHandle ), y uno que se llama despus de la completa solicitud ha terminado ( afterCompletion ). Estos tres mtodos se debe proporcionar suficiente flexibilidad para hacer todo tipo de pre-y post-procesamiento. El preHandle mtodo devuelve un valor booleano. Puede utilizar este mtodo para romper o continuar con la tramitacin de la cadena de ejecucin. Cuando este mtodo devuelve true , la cadena de ejecucin del gestor continuar. Cuando vuelve false , el DispatcherPortlet asume el propio interceptor se ha hecho cargo de las peticiones (y, por ejemplo, representa una vista apropiada) y no continuar con la ejecucin del otro interceptores y el controlador real en la cadena de ejecucin. El postHandle mtodo slo se llama a un RenderRequest . Los preHandle y afterCompletion mtodos se denominan tanto en un ActionRequest y un RenderRequest . Si usted necesita para ejecutar la lgica en estos mtodos para un solo tipo de solicitud, asegrese de comprobar qu tipo de solicitud es antes de procesarlo.
20.5.5 HandlerInterceptorAdapter

Al igual que con el paquete de servlet, el paquete de portlet tiene una implementacin concreta de HandlerInterceptor llamado HandlerInterceptorAdapter . Esta clase tiene versiones vacas de todos los mtodos para que pueda heredar de esta clase y poner en prctica una o dos mtodos cuando eso es todo lo que necesitas.
20.5.6 ParameterMappingInterceptor

El paquete de portlet tambin tiene un interceptor de hormign llamado ParameterMappingInterceptor que est destinado a ser utilizado con ParameterHandlerMapping y PortletModeParameterHandlerMapping . Este interceptor har que el parmetro que se utiliza para controlar la asignacin que se enven desde un ActionRequest a la posterior RenderRequest . Esto ayudar a asegurar que el RenderRequest est asignado al controlador de la misma ActionRequest . Esto se hace en el preHandle mtodo del interceptor, por lo que an puede modificar el valor del parmetro en el controlador para cambiar el lugar en el RenderRequest se asignar. Tenga en cuenta que este interceptor est llamando setRenderParameter en el ActionResponse , lo que significa que no se puede llamar sendRedirect en el controlador cuando se utiliza este interceptor. Si usted necesita para hacer redirecciones externas entonces usted tendr que enviar el parmetro de asignacin manual o escribir un interceptor diferente de manejar esto para usted.

20,6 Puntos de vista y resolver los

Como se mencion anteriormente, Spring MVC Portlet directamente reutiliza todas las tecnologas de vista de Spring Web MVC. Esto incluye no slo las diversas View implementaciones s mismos, sino tambin las ViewResolver implementaciones. Para obtener ms informacin, consulte el Captulo 18, las tecnologas de Vista y Seccin 17.5, "Resolucin de puntos de vista" , respectivamente. Algunos artculos sobre el uso de la actual View y ViewResolver implementaciones son dignos de mencin:

La mayora de los portales de esperar el resultado de la prestacin de un portlet a ser un fragmento de HTML. Por lo tanto, las cosas como JSP / JSTL, Velocity, FreeMarker y XSLT todo sentido. Pero es poco probable que las opiniones que devuelven otros tipos de documentos tendr ningn sentido en un contexto de portlet. No hay tal cosa como una redireccin HTTP desde un portlet (el sendRedirect(..) mtodo de ActionResponse no se puede utilizar para mantenerse dentro del portal). Por lo tanto, RedirectView y el uso de la 'redirect:' prefijo no funcionar correctamente desde dentro Portlet MVC. Puede que sea posible utilizar el 'forward:' prefijo de dentro Portlet MVC. Sin embargo, recuerda que, dado que usted est en un portlet, no tienes ni idea de lo que la direccin actual parece. Esto significa que usted no puede utilizar una direccin URL relativa al acceso a otros recursos de la aplicacin web y que usted tendr que utilizar una URL absoluta.

Adems, para el desarrollo de JSP, la Primavera de nuevo Taglib y el formulario de nueva primavera taglib ambos trabajan en las vistas de portlet exactamente de la misma manera en que ellos trabajan en las vistas de servlets.

20,7 Multipart (carga de archivos), soporte


Spring MVC Portlet ha incorporado en el apoyo de varias partes para manejar la carga de archivos en aplicaciones de portlet, al igual Web MVC hace. El diseo para el apoyo de varias partes se realiza con conectables PortletMultipartResolver objetos, que se define en la org.springframework.web.portlet.multipart paquete. Spring proporciona un PortletMultipartResolver para su uso con FileUpload Commons . Como la carga de archivos est soportado se describe en el resto de esta seccin. Por defecto, no hay manipulacin de varias partes se llevar a cabo en la primavera de MVC Portlet, ya que algunos desarrolladores querrn manejar Multiparts s mismos. Tendr que activarlo usted mismo mediante la adicin de una resolucin de varias partes con el contexto de la aplicacin web. Despus de haber hecho eso, DispatcherPortlet inspeccionar cada solicitud para ver si contiene una de varias partes. Si no se encuentra multipart, la solicitud continuar como se esperaba. Sin embargo, si se encuentra en varias partes de la solicitud, el PortletMultipartResolver que se ha declarado en su contexto se utilizar. Despus de eso, el atributo multipart en su solicitud ser tratada como cualquier otro atributo.
Nota

Cualquier configurado PortletMultipartResolver bean debe tener el identificador siguiente (o nombre): " portletMultipartResolver ". Si ha definido su PortletMultipartResolver con cualquier otro nombre, entonces el DispatcherPortlet no encontrar su PortletMultipartResolver , y por consiguiente no hay soporte de varias partes estarn en efecto.
20.7.1 Uso de la PortletMultipartResolver

El siguiente ejemplo muestra cmo utilizar el CommonsPortletMultipartResolver :


<Bean id = "portletMultipartResolver" class = "org.springframework.web.portlet.multipart.CommonsPortletMultipartReso lver"> <- Una de las propiedades disponibles, el tamao mximo del archivo en bytes -> <propiedad nombre = valor = "maxUploadSize" "100000" /> </ Bean>

Por supuesto, tambin hay que poner los frascos apropiados en la ruta de clases para la resolucin de varias partes a trabajar. En el caso de la CommonsMultipartResolver , es necesario utilizar commons-fileupload.jar . Asegrese de utilizar al menos la versin 1.1 de FileUpload Commons que las versiones anteriores no son compatibles con JSR168 aplicaciones de portlet. Ahora que ha visto cmo configurar MVC Portlet para manejar peticiones de varias partes, vamos a hablar de cmo se utiliza realmente. Cuando DispatcherPortlet detecta una solicitud de varias partes, se activa el sistema de resolucin que se ha declarado en su contexto y entrega la solicitud. Qu es entonces la resolucin se envuelva el actual ActionRequest en un MultipartActionRequest que tiene soporte para la carga de archivos de varias partes. Usando el MultipartActionRequest se puede obtener informacin acerca de los contenidos Multiparts por esta peticin y de hecho obtener acceso a los archivos de varias partes ellos mismos en sus controladores. Tenga en cuenta que slo puedes recibir archivos con copias de archivos como parte de un ActionRequest , no como parte de un RenderRequest .
20.7.2 Manejo de una carga de archivos en una forma

Despus de la PortletMultipartResolver ha terminado de hacer su trabajo, la solicitud ser procesada como cualquier otra. Para utilizar el PortletMultipartResolver , cree un formulario con un campo de carga (ver ejemplo a continuacin), entonces Primavera enlazar el archivo en el formulario (objeto de soporte). Para que realmente el usuario carga un archivo, tenemos que crear un formulario (JSP / HTML):
<h1> Por favor, sube un archivo </ h1> <= Forma mtodo "post" action = "<portlet:actionURL/>" enctype = "multipart / form-data"> <input type = nombre "file" = "file" /> <input type = "submit" />

</ Form>

Como se puede ver, hemos creado un campo denominado "Archivo" que coincide con la propiedad del bean que contiene el byte[] array. Adems hemos aadido el atributo de codificacin ( enctype="multipart/form-data" ), que es necesario para que el navegador sabe cmo codificar los campos de varias partes (no te olvides de esto!). Al igual que con cualquier otra propiedad que no es automgicamente convertible en una cadena o tipo primitivo, para poder poner los datos binarios en los objetos que tienes que registrar un editor personalizado con el PortletRequestDataBinder . Hay un par de editores disponibles para el manejo de archivos y establecer los resultados en un objeto. Hay una StringMultipartFileEditor capaz de convertir archivos a las cadenas (utilizando un usuario definido conjunto de caracteres), y hay una ByteArrayMultipartFileEditor que convierte archivos en matrices de bytes. Ellos funcin anloga a la CustomDateEditor . As que, para poder subir archivos mediante un formulario, declare la resolucin, una asignacin a un controlador que va a procesar el grano, y el propio controlador.
<Bean id = "portletMultipartResolver" class = "org.springframework.web.portlet.multipart.CommonsPortletMultipartReso lver" /> <bean class = "org.springframework.web.portlet.handler.PortletModeHandlerMapping"> <propiedad nombre = "portletModeMap"> <map> <entry clave = "view" value-ref = "fileUploadController" /> </ Map> </ Propiedad> </ Bean> <bean id = "fileUploadController" class = "examples.FileUploadController"> <propiedad nombre = valor = "commandClass" "examples.FileUploadBean" /> <propiedad nombre = valor = "formView" "fileuploadform" /> <propiedad nombre = valor = "successView" "confirmation" /> </ Bean>

Despus de eso, crear el controlador y la clase real para mantener la propiedad del archivo.
public class extends FileUploadController SimpleFormController { onSubmitAction public void (ActionRequest peticin, la respuesta de ActionResponse, Comando Objeto, errores BindException) throws Exception { / / Convertir el bean FileUploadBean frijol = (FileUploadBean) de comandos; / / Vamos a ver si hay contenido no byte [] file = bean.getFile ();

if (archivo == null) { / / Hmm, eso es extrao, el usuario no ha publicado nada } / / Hacer algo con el archivo aqu } protected void initBinder ( PortletRequest solicitud, PortletRequestDataBinder aglutinante) throws Exception { / / Para ser realmente capaces de convertir instancia Multipart a byte [] / / Tenemos que registrar un editor personalizado binder.registerCustomEditor (byte [] clase, nuevo ByteArrayMultipartFileEditor ().); / / Ahora Spring sabe cmo manejar objeto de varias partes y convertir } } pblico FileUploadBean clase { byte privado [] archivos; public void setFile (byte archivo []) { . este archivo = archivo; } public byte [] getFile () { volver archivo; } }

Como se puede ver, el FileUploadBean tiene una propiedad de tipo byte[] que contiene el archivo. El controlador registra un editor personalizado para dejar de Primavera saber cmo convertir en realidad los objetos de varias partes del resolver se encuentran las propiedades especificadas por el grano. En este ejemplo, no se hace nada con el byte[] propiedad del propio bean, pero en la prctica se puede hacer lo que quiera (lo guarda en una base de datos, enviarlo por correo a alguien, etc.) Un ejemplo equivalente en la que se une un archivo directamente a una propiedad String a mquina en un soporte en forma de objeto podra tener este aspecto:
public class extends FileUploadController SimpleFormController { onSubmitAction public void (ActionRequest peticin, la respuesta de ActionResponse, Comando Objeto, errores BindException) throws Exception { / / Convertir el bean FileUploadBean frijol = (FileUploadBean) de comandos; / / Vamos a ver si hay contenido no Cadena de archivo = bean.getFile (); if (archivo == null) { / / Hmm, eso es extrao, el usuario no ha publicado nada } / / Hacer algo con el archivo aqu

} protected void initBinder ( PortletRequest solicitud, PortletRequestDataBinder aglutinante) throws Exception { / / Para ser realmente capaces de convertir a instancia de varias partes de una cadena / / Tenemos que registrar un editor personalizado binder.registerCustomEditor (String. clase, StringMultipartFileEditor nuevo ()); / / Ahora Spring sabe cmo manejar los objetos de varias partes y convertir } } pblico FileUploadBean clase { String file privado; public void setFile (String file) { . este archivo = archivo; } pblico GETFILE String () { volver archivo; } }

Por supuesto, este ltimo ejemplo slo hace (lgico) tiene sentido en el contexto de la carga de un archivo de texto plano (no funcionara tan bien en el caso de cargar un archivo de imagen). La tercera (y ltima) opcin es donde se une directamente a un MultipartFile bienes declarados en la clase del objeto (forma de respaldo) de. En este caso no es necesario el registro de cualquier editor de propiedades personalizado porque no hay una conversin de tipos a realizar.
public class extends FileUploadController SimpleFormController { onSubmitAction public void (ActionRequest peticin, la respuesta de ActionResponse, Comando Objeto, errores BindException) throws Exception { / / Convertir el bean FileUploadBean frijol = (FileUploadBean) de comandos; / / Vamos a ver si hay contenido no MultipartFile archivo = bean.getFile (); if (archivo == null) { / / Hmm, eso es extrao, el usuario no ha publicado nada } / / Hacer algo con el archivo aqu } } pblico FileUploadBean clase {

archivo MultipartFile privado; public void setFile (archivo MultipartFile) { . este archivo = archivo; } pblico MultipartFile getFile () { volver archivo; } }

20.8 Manejo de excepciones


Al igual Servlet MVC, MVC Portlet proporciona HandlerExceptionResolver s para aliviar el dolor de las excepciones inesperadas que ocurren mientras su solicitud est siendo procesada por un controlador que haca juego con la solicitud. MVC Portlet tambin proporciona un portlet especfico, concreto SimpleMappingExceptionResolver que le permite tomar el nombre de clase de cualquier excepcin que pudiera ser lanzado y asignarla a un nombre de vista.

20.9 Anotacin controlador basado en configuracin


Spring 2.5 introduce un modelo de programacin basado en anotacin para los controladores MVC, usando anotaciones tales como @RequestMapping , @RequestParam , @ModelAttribute , etc Este apoyo anotacin est disponible tanto para Servlet MVC MVC Portlet y. Los controladores implementados en este estilo no tiene que extender las clases especficas de base o implementar interfaces especficas. Adems, por lo general no tienen dependencias directas en Servlet o Portlet API, a pesar de que fcilmente puede tener acceso a las instalaciones de servlet o portlet si se desea. En las secciones siguientes documentar estas anotaciones y cmo son los ms utilizados en un entorno de portlets.
20.9.1 Configuracin del despachador de apoyo anotacin
@RequestMapping

slo se tramitar si el correspondiente HandlerMapping (para anotaciones de nivel de tipo) y / o HandlerAdapter (para anotaciones nivel de mtodo) est presente en el despachador. Este es el caso por defecto en ambos DispatcherServlet y DispatcherPortlet . Sin embargo, si est definiendo personalizados HandlerMappings o HandlerAdapters , entonces usted necesita para asegurarse de que el correspondiente encargo DefaultAnnotationHandlerMapping y / o AnnotationMethodHandlerAdapter se define as - a condicin de que usted tiene la intencin de utilizar @RequestMapping .
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">

<bean class = "org.springframework.web.portlet.mvc.annotation.DefaultAnnotationHandl erMapping" /> <bean class = "org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandle rAdapter" /> / / ... </ Beans> (Controlador definiciones de frijol) ...

Definicin de un DefaultAnnotationHandlerMapping y / o AnnotationMethodHandlerAdapter explcitamente tambin tiene sentido si usted desea personalizar la estrategia de asignacin, por ejemplo, especificar una costumbre WebBindingInitializer (ver ms abajo).
20.9.2 Definicin de un controlador con @Controller

El @Controller anotacin indica que una clase particular sirve la funcin de un controlador. No hay necesidad de extender cualquier clase base del controlador o hacer referencia a la API de portlets. Usted, por supuesto, todava puede hacer referencia Portlet caractersticas especficas si es necesario. El propsito bsico de la @Controller anotacin es actuar como un estereotipo para la clase anotada, lo que indica su funcin. El despachador escanear tales clases anotadas para los mtodos de mapeado, detectando @RequestMapping anotaciones (vase la seccin siguiente). Frijoles anotados controlador puede definirse explcitamente, utilizando una definicin estndar de frijol de primavera en el contexto del despachador. Sin embargo, el @Controller estereotipo tambin permite la deteccin automtica, alineado con el apoyo Spring 2.5 's general para detectar clases de componentes en las definiciones de frijol classpath y auto-registrarse para ellos. Para habilitar la deteccin automtica de dichos controladores anotados, hay que aadir los componentes de exploracin a la configuracin. Esto se consigue fcilmente mediante el esquema de contexto de resorte como se muestra en el fragmento de cdigo XML siguiente:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: p = "http://www.springframework.org/schema/p" xmlns: context = "http://www.springframework.org/schema/context" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/springcontext.xsd ">

<context:component-scan base-package = "org.springframework.samples.petportal.portlet" /> / / ... </ Beans>

20.9.3 Asignacin de peticiones con @RequestMapping

El @RequestMapping anotacin se utiliza para asignar los modos de portlet como 'VIEW' / 'EDIT' a toda una clase o un mtodo de control particular. Normalmente el tipo de nivel de anotacin de mapas de un modo especfico (o modo ms condicin parmetro) en un controlador de formulario, con "estrechamiento" adicionales a nivel de mtodo-las anotaciones de la asignacin primaria para determinados parmetros de la peticin de portlet.
Punta
@RequestMapping en el nivel de tipo puede usarse para implementaciones simples de Controller interfaz. En este caso, el cdigo de procesamiento de la solicitud seguira el tradicional handle(Action|Render)Request firma, mientras que la cartografa del controlador se expresa a travs de un @RequestMapping anotacin. Esto funciona para pre-construidos Controller clases base, como SimpleFormController , tambin.

En la discusin que sigue, nos centraremos en los controladores que se basan en mtodos de control de anotaciones. El siguiente es un ejemplo de un controlador de formulario desde la aplicacin de la muestra PetPortal utilizando esta anotacin:
@ Controller @ RequestMapping ("EDIT") @ SessionAttributes ("sitio") pblico PetSitesEditController clase { petsites propiedades privadas; setPetSites public void (petsites Propiedades) { esta petsites = petsites.; } @ ModelAttribute ("petsites") getPetSites Propiedades pblicas () { Devuelva este petsites.; } @ RequestMapping / / por defecto (action = list) showPetSites public String () { return "petSitesEdit"; } @ RequestMapping (params = "action = add") / / render fase pblico showSiteForm String (modelo Modelo) {

/ / Se utiliza para la forma inicial, as como para Volver a mostrar con errores. if (! model.containsAttribute ("sitio")) { model.addAttribute ("sitio", nueva PetSite ()); } return "petSitesAdd"; } @ RequestMapping (params = "action = add") / / accin de fase populateSite public void ( ModelAttribute @ ("sitio") PetSite petsite, resultado BindingResult, SessionStatus estado, respuesta ActionResponse) { . PetSiteValidator nuevo () validar (petsite, resultado); if (! result.hasErrors ()) { este petSites.put (petSite.getName (), petSite.getUrl ()).; status.setComplete (); response.setRenderParameter ("accin", "lista"); } } @ RequestMapping (params = "action = delete") public void removeSite (@ RequestParam ("sitio") del sitio String, ActionResponse respuesta) { este petSites.remove (sitio).; response.setRenderParameter ("accin", "lista"); } }

20.9.4 compatibles argumentos controlador de mtodos

Mtodos de control que sean anotados con @RequestMapping se les permite tener firmas muy flexibles. Ellos pueden tener argumentos de los tipos siguientes, en orden arbitrario (a excepcin de los resultados de validacin, que deben seguir a la derecha despus de que el objeto de comando correspondiente, si lo desea):

Solicitar y / o respuesta objetos (Portlet API). Usted puede elegir cualquiera especfico de solicitud / respuesta de tipo, por ejemplo PortletRequest / ActionRequest / RenderRequest. Una declarado explcitamente accin / render argumento tambin se utiliza para la asignacin de tipos especficos de solicitud en un mtodo de control (en el caso de ninguna otra informacin dado que diferencia entre la accin y peticiones de renderizado). Sesin de objeto (Portlet API): de PortletSession tipo. Un argumento de este tipo har cumplir la presencia de una sesin correspondiente. Como consecuencia, este argumento nunca ser null . Permite un acceso genrico parmetro de la peticin, as como la peticin / sesin de acceso de atributo, sin vnculos con el nativo de Servlet / Portlet API. java.util.Locale para la configuracin regional actual solicitud (el portal local en un entorno de portlet). java.io.InputStream / java.io.Reader para acceder al contenido de la solicitud. Esta ser la prima InputStream / Reader como expuestos por la API de portlets.

java.io.OutputStream / java.io.Writer

para la generacin de contenido de la respuesta. Este ser el escritor prima OutputStream / as expuestos por la API de portlets. @RequestParam parmetros anotados para el acceso a determinados parmetros de la peticin de portlet. Los valores de parmetros se convierte al tipo de mtodo argumento declarado. java.util.Map / org.springframework.ui.Model / org.springframework.ui.ModelMap para enriquecer el modelo implcito que estar expuesta a la vista web. Comando / forma de obligar a los objetos a los parmetros: como propiedades de frijol o campos, con conversin de tipo adaptable, dependiendo @InitBinder mtodos y / o la configuracin HandlerAdapter - ver el " webBindingInitializer "propiedad en AnnotationMethodHandlerAdapter . Tales objetos de comando junto con sus resultados de validacin se exponen como atributos del modelo, por defecto usando el nombre del comando no calificada de clases en notacin propiedad (por ejemplo, "orderAddress" para el tipo "mypackage.OrderAddress"). Especifique un parmetro de nivel ModelAttribute anotacin para declarar un nombre de modelo atributo especfico. org.springframework.validation.Errors / org.springframework.validation.BindingResult resultados de la validacin de un comando anterior / form objeto (el argumento precedente inmediato). org.springframework.web.bind.support.SessionStatus mango de estado para el marcado de procesamiento de forma tan completa (provocando la limpieza de los atributos de la sesin que se han indicado por los @SessionAttributes anotacin en el nivel de tipo de controlador).

Los tipos de retorno admite los siguientes mtodos de control:

A ModelAndView objeto, con el modelo implcitamente enriquecido con objetos de comando y los resultados de @ModelAttribute mtodos anotados de datos de referencia de acceso. Un Model objeto, con el nombre de la vista determina implcitamente a travs de un RequestToViewNameTranslator y el modelo implcitamente enriquecido con objetos de comando y los resultados de @ModelAttribute mtodos anotados de datos de referencia de acceso. Un Map de objetos para la exposicin de un modelo, con el nombre de la vista determina implcitamente a travs de un RequestToViewNameTranslator y el modelo implcitamente enriquecido con objetos de comando y los resultados de @ModelAttribute mtodos anotados de datos de referencia de acceso. A View objeto, con el modelo implcitamente determinado a travs de objetos de comando y @ModelAttribute datos anotados de referencia los mtodos de acceso. El mtodo de control de programacin tambin puede enriquecer el modelo de la declaracin de un Model argumento (vase ms arriba). Una String valor que se interpreta como nombre de la vista, con el modelo implcitamente determinado a travs de objetos de comando y @ModelAttribute datos anotados de referencia los mtodos de acceso. El

mtodo de control de programacin tambin puede enriquecer el modelo de la declaracin de un Model argumento (vase ms arriba). void si el mtodo se encarga de la respuesta en s misma (por ejemplo, al escribir el contenido de la respuesta directamente). Cualquier otro tipo de valor devuelto ser considerado como un atributo nico modelo que se expone a la vista, utilizando el nombre del atributo especificado por @ModelAttribute en el nivel de mtodo (o el nombre del atributo predeterminado basado en el nombre de la clase del tipo de retorno de lo contrario). El modelo ser implcitamente enriquecido con objetos de comando y los resultados de @ModelAttribute mtodos anotados de datos de referencia de acceso.

20.9.5 parmetros de la peticin de unin a los parmetros del mtodo con


@RequestParam

El @RequestParam anotacin se utiliza para enlazar parmetros de la peticin a un parmetro de mtodo en el controlador. El siguiente fragmento de cdigo de la aplicacin de ejemplo muestra el uso PetPortal:
@ Controller @ RequestMapping ("EDIT") @ SessionAttributes ("sitio") pblico PetSitesEditController clase { / / ... public void removeSite (@ RequestParam ("sitio") del sitio String, ActionResponse respuesta) { este petSites.remove (sitio).; response.setRenderParameter ("accin", "lista"); } / / ... }

Los parmetros que utilizan esta anotacin estn obligadas por defecto, pero se puede especificar que un parmetro es opcional estableciendo @RequestParam 's required atributo a false (por ejemplo, @RequestParam(value="id", required=false) ).
20.9.6 Proporcionar un enlace a los datos del modelo con @ModelAttribute
@ModelAttribute

tiene dos escenarios de uso de controladores. Cuando se coloca en un parmetro de mtodo, @ModelAttribute se utiliza para asignar un atributo de modelo para el parmetro especfico, mtodo anotado (ver el populateSite() mtodo ms abajo). As es como el controlador obtiene una referencia al objeto que contiene los datos introducidos en el formulario. Adems, el parmetro puede ser declarado como el tipo especfico del objeto de soporte en forma de ms que como un genrico java.lang.Object , aumentando as la seguridad de tipos.
@ModelAttribute

se utiliza tambin en el nivel de mtodo para proporcionar datos de referencia para el modelo (ver getPetSites() mtodo ms abajo). Para este uso la

firma del mtodo puede contener los mismos tipos como se document anteriormente para la @RequestMapping anotacin. Nota: @ModelAttribute mtodos anotados se ejecutar antes de que el elegido @RequestMapping mtodo de control de anotaciones. Que efectivamente pre-poblar el modelo implcito con atributos especficos, a menudo cargadas desde una base de datos. Tal atributo puede ya acceder a travs de @ModelAttribute parmetros anotados controlador de mtodos en el mtodo de control elegido, potencialmente con la unin y la validacin se le aplica. El fragmento de cdigo siguiente muestra estos dos usos de esta anotacin:
@ Controller @ RequestMapping ("EDIT") @ SessionAttributes ("sitio") pblico PetSitesEditController clase { / / ... @ ModelAttribute ("petsites") getPetSites Propiedades pblicas () { Devuelva este petsites.; } @ RequestMapping (params = "action = add") / / accin de fase populateSite public void ( ModelAttribute @ ("sitio") PetSite petsite, resultado BindingResult, SessionStatus estado, respuesta ActionResponse) { . PetSiteValidator nuevo () validar (petsite, resultado); if (! result.hasErrors ()) { este petSites.put (petSite.getName (), petSite.getUrl ()).; status.setComplete (); response.setRenderParameter ("accin", "lista"); } } }

20.9.7 Especificacin de atributos para almacenar en una reunin con


@SessionAttributes

El tipo de nivel @SessionAttributes anotacin declara atributos de sesin utilizados por un controlador especfico. Normalmente, esto mostrar una lista de los nombres de los atributos del modelo o tipo de atributos del modelo que debe ser transparente almacenados en la sesin o algn almacenamiento conversacional, sirviendo de soporte en forma de frijol, entre las solicitudes posteriores. El fragmento de cdigo siguiente muestra el uso de esta anotacin:
@ Controller @ RequestMapping ("EDIT") @ SessionAttributes ("sitio") pblico PetSitesEditController clase { / / ...

20.9.8 Personalizacin WebDataBinder inicializacin

Para personalizar el parmetro de la peticin vinculante con PropertyEditors, etc, a travs de Spring WebDataBinder , puede utilizar @InitBinder -anotado mtodos dentro de su controlador o exteriorizar su configuracin, proporcionando una costumbre WebBindingInitializer .
Personalizacin de los datos obligatorios con @InitBinder

Anotacin de los mtodos de controlador con @InitBinder permite configurar datos de la web que vinculan directamente dentro de la clase del controlador. @InitBinder identifica los mtodos que inicializan el WebDataBinder que se utiliza para rellenar comando y los argumentos de formularios para objetos de mtodos de control anotadas. Tales mtodos init-aglutinante apoyar todos los argumentos que @RequestMapping apoya, a excepcin de objetos de comando / forma y los correspondientes objetos de resultado de validacin. Init-aglutinante mtodos no deben tener un valor de retorno. Por lo tanto, normalmente se declara como void . Argumentos tpicos incluyen WebDataBinder en combinacin con WebRequest o java.util.Locale , permitiendo que el cdigo de registro especficas para cada contexto editores. El siguiente ejemplo muestra el uso de @InitBinder para configurar un CustomDateEditor para todos java.util.Date propiedades de formulario.
@ Controller pblico MyFormController clase { @ InitBinder public void initBinder (WebDataBinder aglutinante) { SimpleDateFormat dateFormat = new SimpleDateFormat ("aaaa-MMdd"); dateFormat.setLenient (false); binder.registerCustomEditor (Fecha. clase, nuevo CustomDateEditor (dateFormat, false)); } / / ... }

Configuracin de una costumbre WebBindingInitializer

Para exteriorizar la inicializacin del enlace de datos, puede proporcionar una implementacin personalizada de la WebBindingInitializer interfaz, que le habilite mediante el suministro de una configuracin personalizada para un bean AnnotationMethodHandlerAdapter , reemplazando as la configuracin predeterminada.

20,10 Portlet implementacin de aplicaciones

El proceso de implementacin de una aplicacin MVC Portlet primavera no es diferente a cualquier despliegue JSR-168 aplicacin de portlets. Sin embargo, esta zona es bastante confuso, en general, que merece la pena hablar aqu brevemente. En general, el contenedor portal / portlet se ejecuta en una aplicacin web en el contenedor de servlets y los portlets se ejecutan en otra aplicacin web en el contenedor servlet. A fin de que la aplicacin de web contenedor de portlets para hacer llamadas en su portlet aplicacin de web que debe hacer contexto transversal llamadas a un servlet bien conocido que proporciona acceso a los servicios de la portlet define en su portlet.xml archivo. La especificacin JSR-168 no especifica exactamente cmo esto sucede, por lo que cada contenedor portlet tiene su propio mecanismo para esto, que por lo general implica algn tipo de "proceso de implementacin" que hace que los cambios en la webapp portlet s mismo y luego registra los portlets dentro de la portlet contenedor. Como mnimo, el web.xml archivo en el portlet aplicacin de web se modifica para inyectar el servlet bien conocido de que el contenedor de portlets llamar. En algunos casos, un servlet solo dar servicio a todos los portlets de la aplicacin web, en otros casos, habr una instancia del servlet para cada portlet. Algunos contenedores de portlets tambin inyectar bibliotecas y / o archivos de configuracin en la aplicacin web tambin. El contenedor de portlet tambin debe hacer su desarrollo de la Biblioteca de etiquetas JSP de portlet a disposicin de su webapp. La conclusin es que es importante para entender las necesidades de implementacin de su portal de destino y asegrese de que se cumplen (por lo general siguiendo el proceso de implementacin automatizada que proporciona). Asegrese de revisar cuidadosamente la documentacin de su portal para este proceso. Una vez que haya implementado el portlet, revise la resultante web.xml archivo para la cordura. Algunos portales ms antiguos han sido conocidos por corromper a la definicin de la ViewRendererServlet , rompiendo as la prestacin de los portlets.

Parte VI. Integracin


Esta parte de la documentacin de referencia abarca la integracin de la infraestructura de Spring con una serie de Java EE (y afines) tecnologas.

Captulo 21, Remoting y servicios web utilizando Spring Captulo 22, Enterprise JavaBeans (EJB) integracin Captulo 23, JMS (Java Message Service) Captulo 24, JMX Captulo 25, JCA CCI Captulo 26, Email Captulo 27, la ejecucin de tareas y programacin Captulo 28, soporte de idioma dinmico Captulo 29, Abstraction cach

21. Remoting y servicios web utilizando Spring 21.1 Introduccin


Spring ofrece clases de integracin para la comunicacin remota de soporte utilizando diversas tecnologas. El soporte de comunicacin remota facilita el desarrollo de los servicios habilitados a distancia, ejecutado por sus habituales (Primavera) POJOs. En la actualidad, Spring soporta las tecnologas de comunicacin remota siguientes:

Remote Method Invocation (RMI). Mediante el uso de la RmiProxyFactoryBean y la RmiServiceExporter Spring soporta tanto tradicionales RMI (con java.rmi.Remote interfaces y java.rmi.RemoteException ) y remoting transparente a travs de invocadores RMI (con cualquier interfaz de Java). Invocador Spring HTTP. Spring proporciona una estrategia de comunicacin remota especial que permite la serializacin de Java a travs de HTTP, el apoyo a cualquier interfaz de Java (al igual que el invocador RMI). Las clases de apoyo correspondientes son HttpInvokerProxyFactoryBean y HttpInvokerServiceExporter . Hesse. Mediante el uso de Spring HessianProxyFactoryBean y la HessianServiceExporter transparente que puede exponer sus servicios utilizando el binario ligero basado en HTTP protocolo proporcionado por Caucho. Burlap. Burlap se basa en XML Caucho de alternativa a Hesse. Spring ofrece clases de apoyo, como BurlapProxyFactoryBean y BurlapServiceExporter . JAX-RPC. Spring ofrece soporte para la comunicacin remota a travs de servicios web JAX-RPC (J2EE 1.4 's servicio web API). JAX-WS. Spring ofrece soporte para la comunicacin remota a travs de servicios web JAX-WS (el sucesor de JAX-RPC, introducido en Java EE 5 y Java 6). JMS. Remoting utiliza JMS como protocolo subyacente es apoyado a travs de la JmsInvokerServiceExporter y JmsInvokerProxyFactoryBean clases.

Durante el examen de las capacidades de comunicacin remota de primavera, vamos a utilizar el modelo de dominio siguientes servicios correspondientes:
Cuenta public class implementa Serializable { private String nombre; public String getName () { devolver el nombre; } setName public void (String nombre) { . este nombre = nombre; } } pblico AccountService interfaz { public void insertAccount (Cuenta de cuentas); pblicos getAccounts Lista <cuenta> (String nombre);

} RemoteAccountService public interface extiende remoto { insertAccount public void (cuenta Account) throws RemoteException; <Cuenta> Lista pblica getAccounts (String name) throws RemoteException; } / / La aplicacin no hacer nada en el momento pblico AccountServiceImpl clase implementa AccountService { insertAccount public void (Cuenta acc) { / / Hacer algo ... } pblicos getAccounts Lista <cuenta> (String nombre) { / / Hacer algo ... } }

Vamos a empezar a exponer el servicio a un cliente remoto mediante RMI y hablar un poco acerca de las desventajas de usar RMI. A continuacin, le siguen mostrando un ejemplo de uso de Hesse como el protocolo.

21.2 La exposicin de servicios utilizando RMI


Con el apoyo de Spring para RMI, transparente puede exponer sus servicios a travs de la infraestructura de RMI. Despus de esta configuracin, que bsicamente tienen una configuracin similar a EJBs remotos, excepto por el hecho de que no hay soporte estndar para la propagacin de contexto de seguridad o propagacin de transacciones remoto. Spring proporciona ganchos para ese contexto invocacin adicional cuando se utiliza el invocador RMI, por lo que puede por ejemplo conectar marcos de seguridad o credenciales de seguridad personalizados aqu.
21.2.1 Exportacin del servicio mediante la RmiServiceExporter

Usando el RmiServiceExporter , podemos exponer la interfaz de nuestro objeto AccountService como objeto RMI. La interfaz puede ser accedido utilizando RmiProxyFactoryBean , o a travs de llanura RMI en caso de un servicio tradicional de RMI. El RmiServiceExporter apoya explcitamente la exposicin de cualquier servicio no RMI RMI a travs de invocadores. Por supuesto, primero tenemos que crear nuestro servicio en el contenedor de Spring:
<bean id = "accountService" class = "example.AccountServiceImpl"> <- Las propiedades adicionales, tal vez un DAO? -> </ Bean>

A continuacin tendremos que exponer nuestro servicio mediante la RmiServiceExporter :


<bean class = "org.springframework.remoting.rmi.RmiServiceExporter">

<- No necesariamente tiene que ser el mismo nombre que el grano a ser exportados -> <propiedad nombre = valor = "serviceName" "AccountService" /> <propiedad nombre = "service" ref = "accountService" /> <propiedad nombre = valor = "serviceInterface" "example.AccountService" /> <- Por defecto es 1099 -> <propiedad nombre = valor = "registryPort" "1199" /> </ Bean>

Como se puede ver, estamos reemplazando el puerto del registro RMI. A menudo, el servidor de aplicaciones tambin mantiene un registro RMI y es prudente para no interferir con eso. Por otra parte, el nombre de servicio se utiliza para enlazar el servicio bajo. As que ahora mismo, el servicio estar obligado a 'rmi://HOST:1199/AccountService' . Vamos a utilizar la URL para enlazar posteriormente en el servicio en el lado del cliente.
Nota

El servicePort propiedad ha sido omitido (por defecto es 0). Esto significa que un puerto annimo se utiliza para comunicarse con el servicio.
21.2.2 Vinculacin en el servicio en el cliente

Nuestro cliente es un objeto simple utilizando el AccountService para gestionar las cuentas:
pblico SimpleObject clase { AccountService AccountService privado; public void setAccountService (AccountService AccountService) { este AccountService = AccountService.; } / / Mtodos adicionales utilizando el AccountService }

Para establecer un vnculo en el servicio al cliente, vamos a crear un contenedor Spring separado, que contiene el objeto simple y los servicios que unen los bits de configuracin:
<bean class = "example.SimpleObject"> <propiedad nombre = "accountService" ref = "accountService" /> </ Bean> <bean id = "accountService" class = "org.springframework.remoting.rmi.RmiProxyFactoryBean"> <propiedad nombre = valor = "serviceUrl" "rmi://HOST:1199/AccountService" /> <propiedad nombre = valor = "serviceInterface" "example.AccountService" /> </ Bean>

Eso es todo lo que necesitamos hacer para apoyar a la cuenta de servicio remoto en el cliente. Primavera transparente crear un invocador y remotamente habilitar el servicio de cuenta a travs de la RmiServiceExporter . En el cliente lo estamos vinculando en el uso de la RmiProxyFactoryBean .

21.3 Uso de arpillera arpillera o llamar a los servicios de forma remota a travs de HTTP
Hesse ofrece un binario basado en HTTP protocolo de comunicacin remota. Es desarrollado por Caucho y ms informacin acerca de Hessian, se puede encontrar en http://www.caucho.com .
21.3.1 Cableado del DispatcherServlet de arpillera y compaa.

Hesse comunica a travs de HTTP y lo hace utilizando un servlet personalizado. El uso de Spring DispatcherServlet principios, como se conoce a partir de Spring Web MVC uso, usted puede fcilmente conectar hasta un servlet exponer sus servicios. En primer lugar vamos a tener que crear un nuevo servlet en la aplicacin (este es un extracto de 'web.xml' ):
<servlet> <servlet-name> remota </ servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </ servlet-clase> <load-on-startup> 1 </ load-on-startup> </ Servlet> <servlet-mapping> <servlet-name> remota </ servlet-name> <url-pattern> / remoto / * </ url-pattern> </ Servlet-mapping>

Probablemente usted est familiarizado con Spring DispatcherServlet principios y si es as, usted sabe que ahora tendr que crear un contenedor de Spring recurso de configuracin llamado 'remoting-servlet.xml' (por el nombre de nuestro servlet) en el 'WEB-INF' directorio. El contexto de aplicacin se utilizar en la siguiente seccin. Como alternativa, considere el uso de la ms simple de Spring HttpRequestHandlerServlet . Esto le permite incluir las definiciones exportador remotos en su contexto raz de la aplicacin (por defecto en 'WEBINF/applicationContext.xml' ), con definiciones de servlets individuales que apuntan a los frijoles exportadores especficos. Cada nombre de servlet debe coincidir con el nombre del bean de su exportador objetivo en este caso.
21.3.2 Exposicin de los granos mediante el HessianServiceExporter

En el contexto de la aplicacin de nueva creacin denominada remoting-servlet.xml , vamos a crear un HessianServiceExporter exportacin de sus servicios:
<bean id = "accountService" class = "example.AccountServiceImpl"> <- Las propiedades adicionales, tal vez un DAO? ->

</ Bean> <bean name = "/AccountService" class = "org.springframework.remoting.caucho.HessianServiceExporter"> <propiedad nombre = "service" ref = "accountService" /> <propiedad nombre = valor = "serviceInterface" "example.AccountService" /> </ Bean>

Ahora estamos listos para vincular en el servicio al cliente. No asignacin de controlador explcito se especifica, asignar las direcciones URL peticin a los servicios, por lo que BeanNameUrlHandlerMapping se utilizar: Por lo tanto, el servicio se exportar a la direccin indicada a travs de su nombre de frijol en el que contiene DispatcherServlet "cartografa s (como se define ms arriba): 'http://HOST:8080/remoting/AccountService' . Como alternativa, cree un HessianServiceExporter en su contexto raz de la aplicacin (por ejemplo, en 'WEB-INF/applicationContext.xml' ):
<bean name = "accountExporter" class = "org.springframework.remoting.caucho.HessianServiceExporter"> <propiedad nombre = "service" ref = "accountService" /> <propiedad nombre = valor = "serviceInterface" "example.AccountService" /> </ Bean>

En este ltimo caso, definir un servlet correspondiente para este exportador en 'web.xml' , con el mismo resultado final: El exportador conseguir asignado a la ruta de solicitud /remoting/AccountService . Tenga en cuenta que el nombre de servlet tiene que coincidir con el nombre del exportador de frijol blanco.
<servlet> <servlet-name> accountExporter </ servlet-name> <servlet-class> org.springframework.web.context.support.HttpRequestHandlerServlet </ servlet-clase> </ Servlet> <servlet-mapping> <servlet-name> accountExporter </ servlet-name> <url-pattern> / remoto / AccountService </ url-pattern> </ Servlet-mapping>

21.3.3 Vinculacin al servicio del cliente

Usando el HessianProxyFactoryBean podemos vincular al servicio al cliente. Los mismos principios se aplican como con el ejemplo RMI. Vamos a crear una fbrica de beans separado o contexto de aplicacin y mencionar los frijoles siguientes cuando el SimpleObject est utilizando el AccountService para gestionar las cuentas:
<bean class = "example.SimpleObject"> <propiedad nombre = "accountService" ref = "accountService" /> </ Bean> <bean id = "accountService" class = "org.springframework.remoting.caucho.HessianProxyFactoryBean">

<propiedad nombre = valor = "serviceUrl" "http://remotehost:8080/remoting/AccountService" /> <propiedad nombre = valor = "serviceInterface" "example.AccountService" /> </ Bean>

21.3.4 Uso de arpillera

No discutiremos arpillera, el equivalente basado en XML de Hessian, en detalle aqu, ya que est configurado y configurar exactamente de la misma manera que la variante Hessian se explica ms arriba. Basta con sustituir la palabra Hessian con Burlap y ya est todo listo para ir.
21.3.5 La aplicacin de autenticacin bsica HTTP a un servicio expuesto a travs de arpillera arpillera o

Una de las ventajas de arpillera arpillera y es que podemos fcilmente aplicar la autenticacin bsica HTTP, ya que ambos protocolos estn basados en HTTP. El servidor HTTP normal mecanismo de seguridad se puede aplicar fcilmente mediante el uso de los web.xml caractersticas de seguridad, por ejemplo. Por lo general, no se utiliza por usuario las credenciales de seguridad aqu, sino ms bien las credenciales compartidas definidas en la Hessian/BurlapProxyFactoryBean nivel (similar a un JDBC DataSource ).
<bean class = "org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> <propiedad nombre = "interceptors" ref = "authorizationInterceptor" /> </ Bean> <Bean id = "authorizationInterceptor" class = "org.springframework.web.servlet.handler.UserRoleAuthorizationIntercep tor"> <propiedad nombre = valor = "authorizedRoles" "administrator,operator" /> </ Bean>

Este es un ejemplo en el que se menciona expresamente la BeanNameUrlHandlerMapping y establecer un interceptor que permite slo los administradores y operadores de llamar a los granos mencionados en este contexto de aplicacin.
Nota

Por supuesto, este ejemplo no muestra un tipo flexible de infraestructura de seguridad. Para obtener ms opciones en cuanto a seguridad se refiere, echar un vistazo a el proyecto Spring Security en http://static.springsource.org/springsecurity/site/ .

21.4 La exposicin de los servicios que utilizan HTTP invocadores

A diferencia de arpillera y Hesse, que son protocolos ligeros utilizando sus propios mecanismos de serializacin delgados, primavera invocadores HTTP utiliza el mecanismo estndar de serializacin de Java para exponer servicios a travs de HTTP. Esto tiene una ventaja enorme si sus argumentos y tipos devueltos son tipos complejos que no se pueden serializar utilizando los mecanismos de serializacin de Hesse y el uso de la arpillera (consulte la siguiente seccin para ms consideraciones al elegir una tecnologa de comunicacin remota). Bajo el cap, Spring utiliza cualquiera de los servicios estndar proporcionados por J2SE para realizar llamadas HTTP o Commons HttpClient . Usa este ltimo si necesita una funcionalidad ms avanzada y fcil de usar. Consulte jakarta.apache.org / commons / httpclient para ms informacin.
21.4.1 La exposicin del objeto de servicio

La creacin de la infraestructura invocador HTTP para un objeto de servicio se parece mucho a la manera que usted hara lo mismo con arpillera o arpillera. As como apoyo Hessian proporciona la HessianServiceExporter , el apoyo del resorte de HttpInvoker proporciona la org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter . Para exponer la AccountService (mencionado anteriormente) dentro de un Spring Web MVC DispatcherServlet , la siguiente configuracin tiene que estar en su lugar en el contexto de la aplicacin del despachador:
<propiedad nombre = "service" ref = "accountService" /> <propiedad nombre = valor = "serviceInterface" "example.AccountService" /> </ Bean>

Tal definicin exportador sern expuestos a travs de la DispatcherServlet instalaciones 's de mapas estndar, tal como se explica en la seccin sobre arpillera. Por otra parte, crear un HttpInvokerServiceExporter en su contexto raz de la aplicacin (por ejemplo, en 'WEB-INF/applicationContext.xml' ):
<propiedad nombre = "service" ref = "accountService" /> <propiedad nombre = valor = "serviceInterface" "example.AccountService" /> </ Bean>

Adems, definir un servlet correspondiente para este exportador en 'web.xml' , con el nombre de servlet que coincida con el nombre del exportador de frijol blanco:
<servlet> <servlet-name> accountExporter </ servlet-name> <servlet-class> org.springframework.web.context.support.HttpRequestHandlerServlet </ servlet-clase> </ Servlet> <servlet-mapping> <servlet-name> accountExporter </ servlet-name>

<url-pattern> / remoto / AccountService </ url-pattern> </ Servlet-mapping>

Si se ejecuta fuera de un contenedor de servlets y est utilizando Sun Java 6, entonces se puede utilizar la aplicacin incorporada en el servidor HTTP. Se puede configurar el SimpleHttpServerFactoryBean junto con un SimpleHttpInvokerServiceExporter como se muestra en este ejemplo:
<Nombre del bean = "accountExporter" class = "org.springframework.remoting.httpinvoker.SimpleHttpInvokerServiceExpo rter"> <propiedad nombre = "service" ref = "accountService" /> <propiedad nombre = valor = "serviceInterface" "example.AccountService" /> </ Bean> <Bean id = "HTTPServer" class = "org.springframework.remoting.support.SimpleHttpServerFactoryBean"> <propiedad nombre = "contexts"> <util:map> <entry clave = "/remoting/AccountService" value-ref = "accountExporter" /> </ Util: mapa> </ Propiedad> <propiedad nombre = valor = "port" "8080" /> </ Bean>

21.4.2 Vinculacin en el servicio en el cliente

Una vez ms, la vinculacin al servicio del cliente se parece mucho a la forma en que lo hara al usar arpillera o arpillera. El uso de un proxy, Primavera ser capaz de traducir las llamadas a las peticiones HTTP POST a la URL que apunta a la exportacin de servicios.
<propiedad nombre = valor = "serviceUrl" "http://remotehost:8080/remoting/AccountService" /> <propiedad nombre = valor = "serviceInterface" "example.AccountService" /> </ Bean>

Como se ha mencionado antes, puedes elegir lo que el cliente HTTP que desea utilizar. Por defecto, el HttpInvokerProxy utiliza la funcionalidad de J2SE HTTP, pero tambin puede utilizar los Comunes HttpClient estableciendo la httpInvokerRequestExecutor propiedad:
<propiedad nombre = "httpInvokerRequestExecutor"> <bean class = "org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExe cutor" /> </ Propiedad>

21.5 Los servicios Web

Spring proporciona soporte completo para Java estndar API de servicios web:

Exponer servicios web utilizando JAX-RPC Acceso a servicios web utilizando JAX-RPC Exponer servicios web utilizando JAX-WS Acceso a servicios web utilizando JAX-WS

Nota

Por qu dos estndar Java API de servicios web? JAX-RPC 1.1 es el estndar API de servicios web en J2EE 1.4. Como su nombre lo indica, se centra en en los enlaces de RPC, que se convirtieron cada vez menos popular en el ltimo par de aos. Como consecuencia de ello, ha sido reemplazado por JAX-WS 2.0 en Java EE 5, siendo ms flexibles en trminos de enlaces, sino tambin ser muy anotacin basada. JAX-WS 2.1 tambin se incluye en Java 6 (o ms especficamente, en el JDK de Sun 1.6.0_04 y anteriores; Sun JDK 1.6.0 anteriores versiones incluyen JAX-WS 2.0), integrado con una funcin en el JDK del servidor HTTP. La primavera puede trabajar tanto con Java estndar API de servicios web. En Java EE 5 / Java 6, la opcin obvia es JAX-WS. En entornos J2EE 1.4 que se ejecutan en Java 5, es posible que tenga la opcin de conectar un proveedor de JAX-WS, consulte la documentacin del Java EE del servidor. Adems del apoyo de stock para JAX-RPC y JAX-WS Core en primavera, la cartera de primavera tambin cuenta con Spring Web Services , una solucin para el primer contrato, los servicios web basados en documentos - muy recomendable para la construccin de modernas y con futuro servicios web .
21.5.1 Exposicin de servlet servicios basados en web utilizando JAX-RPC

Spring proporciona una clase base conveniente para las implementaciones de JAX-RPC servlet endpoint - ServletEndpointSupport . Para exponer nuestro AccountService extendemos Spring ServletEndpointSupport clase e implementar nuestra lgica de negocio aqu, por lo general la delegacin de la llamada a la capa de negocio.
/ ** * JAX-RPC compatible RemoteAccountService aplicacin que simplemente delegados * Para la implementacin AccountService en el contexto raz de la aplicacin web. * * Esta clase contenedora es necesario porque JAX-RPC requiere trabajar con especial * Clases de punto final. Si necesita un servicio existente a la exportacin, un contenedor que * Extends ServletEndpointSupport para un acceso simple contexto de aplicacin es * Simple JAX-RPC manera conforme. *

* Esta es la clase ha registrado en el servidor JAX-RPC implementacin. * En el caso del eje, esto ocurre en "server-config.wsdd", respectivamente, a travs de * Llamadas despliegue. El motor de servicios web gestiona el ciclo de vida de las instancias de * De esta clase: Un contexto de aplicacin de primavera slo se puede acceder aqu. * / Import org.springframework.remoting.jaxrpc.ServletEndpointSupport; AccountServiceEndpoint clase pblica se extiende ServletEndpointSupport implementos RemoteAccountService { AccountService negocio privado; vaco protegido OnInit () { este getBean BIZ = (AccountService) getWebApplicationContext () ("AccountService")..; } public void insertAccount (Cuenta acc) throws RemoteException { biz.insertAccount (acc); } Cuenta pblica [] getAccounts (String name) throws RemoteException { retorno biz.getAccounts (nombre); } }

Nuestra AccountServletEndpoint necesita para funcionar en la misma aplicacin web como el contexto primavera para permitir el acceso a las instalaciones de la primavera. En el caso del Eje, copie el AxisServlet definicin en su 'web.xml' , y establecer el punto final en 'server-config.wsdd' (o utilice la herramienta de despliegue). Ver el JPetStore aplicacin de ejemplo donde el OrderService se expone como un servicio web utilizando Axis.
21.5.2 Acceso a los servicios web utilizando JAX-RPC

Spring proporciona dos granos de fbrica para crear JAX-RPC proxy de servicios Web, es decir, LocalJaxRpcServiceFactoryBean y JaxRpcPortProxyFactoryBean . El primero slo puede devolver una clase JAX-RPC servicio para nosotros trabajar con ellos. Esta ltima es la versin de pleno derecho que puede devolver un proxy que implementa nuestra interfaz de servicio de negocio. En este ejemplo se utiliza el ltimo para crear un proxy para el AccountService punto final expusimos en la seccin anterior. Ver que la primavera tiene un gran soporte para servicios web que requieren poco esfuerzo de codificacin - la mayor parte de la configuracin se realiza en el archivo de configuracin de Spring como de costumbre:
<bean id = "accountWebService" class = "org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean"> <propiedad nombre = valor = "serviceInterface" "example.RemoteAccountService" /> <propiedad nombre = valor = "wsdlDocumentUrl" "http://localhost:8080/account/services/accountService?WSDL" />

<propiedad nombre = valor = "namespaceUri" "http://localhost:8080/account/services/accountService" /> <propiedad nombre = valor = "serviceName" "AccountService" /> <propiedad nombre = valor = "portName" "AccountPort" /> </ Bean>

Donde serviceInterface es nuestra interfaz de negocio a distancia, los clientes van a utilizar. wsdlDocumentUrl es la direccin del archivo WSDL. Primavera necesita esto en tiempo de inicio para crear la JAX-RPC Service. namespaceUri corresponde al targetNamespace en el archivo. wsdl. serviceName se corresponde con el nombre del servicio en el archivo. wsdl. portName se corresponde con el nombre del puerto en el archivo. wsdl. El acceso al servicio web ahora es muy fcil ya que tenemos una fbrica de beans para lo que va a exponer como RemoteAccountService interfaz. Podemos conectar esto en primavera:
<bean id = "client" class = "example.AccountClientImpl"> ... <propiedad nombre = "service" ref = "accountWebService" /> </ Bean>

Desde el cdigo de cliente que puede acceder al servicio web como si fuera una clase normal, excepto que arroja RemoteException .
pblico AccountClientImpl clase { servicio privado RemoteAccountService; public void setService (RemoteAccountService servicio) { este Servicio =.; } pblico foo vaco () { try { service.insertAccount (...); } catch (RemoteException ex) { / / Ay! } } }

Podemos deshacernos de la marcada RemoteException desde la primavera soporta la conversin automtica a su desenfrenado correspondiente RemoteException . Esto requiere que proporcionemos una interfaz no RMI tambin. Nuestra configuracin actual:
<bean id = "accountWebService" class = "org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean"> <propiedad nombre = valor = "serviceInterface" "example.AccountService" /> <propiedad nombre = valor = "portInterface" "example.RemoteAccountService" /> ... </ Bean>

Donde serviceInterface se cambia a nuestro interfaz RMI no. Nuestra interfaz RMI ahora se define mediante la propiedad portInterface . Nuestro cdigo de cliente puede ahora evitar la manipulacin java.rmi.RemoteException :
pblico AccountClientImpl clase { servicio privado AccountService; public void setService (AccountService servicio) { este Servicio =.; } pblico foo vaco () { service.insertAccount (...); } }

Recuerde que tambin puede caer el "portInterface" parte y especificar una interfaz de negocio claro como "ServiceInterface". En este caso, JaxRpcPortProxyFactoryBean cambiar automticamente a la JAX-RPC "Interfaz de Invocacin Dinmica", realizando invocaciones dinmicas sin un taln de puerto fijo. La ventaja es que usted ni siquiera necesita tener una RMI Java compatible con interfaz de puerto alrededor (por ejemplo, en el caso de un servicio de destino que no sea Java Web), todo lo que necesitas es una interfaz de negocio correspondiente. Echa un vistazo a JaxRpcPortProxyFactoryBean javadoc 's para obtener ms informacin sobre las implicaciones de tiempo de ejecucin.
21.5.3 Registro de JAX-RPC haba Asignaciones

Para transferir objetos complejos a travs del cable, como Account que debe registrar las asignaciones de frijol en el lado del cliente.
Nota

En el lado del servidor utilizando Axis Registro de correlaciones de frijol se realiza generalmente en el 'server-config.wsdd' archivo. Usaremos Axis para registrar las asignaciones de frijol en el lado del cliente. Para ello, se requiere el registro de la haba asignaciones de programacin:
public class extends AxisPortProxyFactoryBean JaxRpcPortProxyFactoryBean { protected void postProcessJaxRpcService (Servicio servicio) { TypeMappingRegistry registro service.getTypeMappingRegistry = (); Mapeo TypeMapping = registry.createTypeMapping (); registerBeanMapping (cartografa, Cuenta de clase "Cuenta".); registry.register ("http://schemas.xmlsoap.org/soap/encoding/", la cartografa); } protected void registerBeanMapping (cartografa TypeMapping, el tipo de clase, String nombre) {

QName qName = new QName ("http://localhost:8080/account/services/accountService", nombre); mapping.register (tipo, qName, nuevo BeanSerializerFactory (tipo, qName), nuevo BeanDeserializerFactory (tipo, qName)); } }

21.5.4 El registro de su propio controlador de JAX-RPC

En esta seccin vamos a registrar nuestro propio javax.rpc.xml.handler.Handler para el proxy de servicio web en el que podemos hacer un cdigo personalizado antes de que el mensaje SOAP se enva a travs del cable. El Handler es una interfaz de devolucin de llamada. Hay una clase base comodidad proporcionada en jaxrpc.jar , a saber javax.rpc.xml.handler.GenericHandler que extenderemos:
AccountHandler clase pblica se extiende GenericHandler { pblicos QName [] () {getHeaders return null; } handleRequest public boolean (contexto MessageContext) { SOAPMessageContext smc = (SOAPMessageContext) el contexto; SoapMessage msg = smc.getMessage (); try { SOAPEnvelope sobre msg.getSOAPPart = () getEnvelope ().; Cabecera SOAPHeader = envelope.getHeader (); ... } catch (SOAPException ex) { throw new JAXRPCException (ex); } return true; } }

Lo que tenemos que hacer ahora es dejar constancia de nuestra AccountHandler a JAXRPC servicio por lo que sera invocar handleRequest(..) antes de que el mensaje se enva a travs del cable. Spring tiene en este momento de escribir ningn apoyo declarativo para registrar los controladores, por lo que debe utilizar el enfoque programtico. Sin embargo primavera ha hecho muy fcil para nosotros hacer esto, ya que puede anular el postProcessJaxRpcService(..) mtodo que est diseado para esto:
public class extends AccountHandlerJaxRpcPortProxyFactoryBean JaxRpcPortProxyFactoryBean { protected void postProcessJaxRpcService (Servicio servicio) { QName puerto = new QName (esta getNamespaceUri (), esta getPortName ().).; . Lista lista = service.getHandlerRegistry () getHandlerChain (puerto); list.add (nuevo HandlerInfo (AccountHandler. clase, null, null)); logger.info ("Registered JAX-RPC AccountHandler en el puerto" + puerto);

} }

La ltima cosa que debemos recordar que hacer es cambiar la configuracin de Spring para utilizar nuestro grano de fbrica:
<bean id = "accountWebService" class = "example.AccountHandlerJaxRpcPortProxyFactoryBean"> ... </ Bean>

21.5.5 Exposicin de servlet servicios basados en web utilizando JAX-WS

Spring proporciona una clase base ideal para implementaciones de JAX-WS servlet endpoint - SpringBeanAutowiringSupport . Para exponer nuestro AccountService extendemos Spring SpringBeanAutowiringSupport clase e implementar nuestra lgica de negocio aqu, por lo general la delegacin de la llamada a la capa de negocio. Nosotros simplemente vamos a usar 2,5 Spring 's @Autowired anotacin para expresar este tipo de dependencias en administradas Primavera-judas.
/ ** * JAX-WS cumple AccountService aplicacin que simplemente delegados * Para la implementacin AccountService en el contexto raz de la aplicacin web. * * Esta clase contenedora es necesario porque JAX-WS requiere trabajar con especial * Clases de punto final. Si necesita un servicio existente a la exportacin, un contenedor que * Extiende SpringBeanAutowiringSupport para la primavera sencillo autowiring frijol (a travs de * La anotacin @ autoconectados) es el ms simple JAX-WS manera conforme. * * Esta es la clase ha registrado en el servidor JAX-WS implementacin. * En el caso de un servidor Java EE 5, esto simplemente se define como un servlet * En web.xml, con el servidor de detectar que este es un punto final de JAX-WS y reaccionar * En consecuencia. El nombre de servlet normalmente debe coincidir con el nombre especificado WS servicio. * * El motor de servicios web gestiona el ciclo de vida de las instancias de esta clase. * Spring referencias de frijol slo se transferirn aqu. * / org.springframework.web.context.support.SpringBeanAutowiringSupport importacin; @ WebService (serviceName = "AccountService") public class extends AccountServiceEndpoint SpringBeanAutowiringSupport { @ Autoconectados AccountService negocio privado; @ WebMethod

insertAccount public void (Cuenta acc) { biz.insertAccount (acc); } @ WebMethod Cuenta Pblica [] getAccounts (String nombre) { retorno biz.getAccounts (nombre); } }

Nuestra AccountServletEndpoint necesita para funcionar en la misma aplicacin web como el contexto primavera para permitir el acceso a las instalaciones de la primavera. Este es el caso por defecto en Java EE 5 ambientes, utilizando el modelo de contrato para el despliegue JAX-WS servlet. Ver Java EE 5 tutoriales de servicios web para ms detalles.
21.5.6 Exportacin de servicios web independientes utilizando JAX-WS

El built-in JAX-WS proveedor que viene con el JDK de Sun 1.6 soporta la exposicin de servicios web utilizando el servidor integrado HTTP que se incluye en JDK 1.6 tambin. Spring SimpleJaxWsServiceExporter detecta todos @WebService frijoles anotados en el contexto de la aplicacin de Primavera, la exportacin a travs del defecto JAX-WS servidor (el servidor HTTP JDK 1.6). En este escenario, las instancias de punto final se definen y gestionan como granos de primavera en s, sino que se ha registrado en el motor JAX-WS pero su ciclo de vida ser de hasta el contexto de aplicacin de primavera. Esto significa que la funcionalidad del resorte como la inyeccin de dependencia explcita puede aplicarse a los casos de punto final. Por supuesto, la anotacin impulsada por inyeccin a travs de @Autowired funcionar tan bien.
<bean class = "org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter"> <propiedad nombre = valor = "baseAddress" "http://localhost:8080/" /> </ Bean> <bean id = "accountServiceEndpoint" class = "example.AccountServiceEndpoint"> ... </ Bean> ...

El AccountServiceEndpoint pueden derivar de Spring SpringBeanAutowiringSupport pero no tiene por qu desde el punto final es un completo Primavera-bean gestionado aqu. Esto significa que la aplicacin de punto final puede parecerse a la siguiente, sin ninguna superclase declar - y Spring @Autowired anotacin configuracin an siendo honrado:
@ WebService (serviceName = "AccountService") AccountServiceEndpoint clase pblica { @ Autoconectados AccountService negocio privado;

@ WebMethod insertAccount public void (Cuenta acc) { biz.insertAccount (acc); } @ WebMethod pblicos getAccounts Lista <cuenta> (String nombre) { retorno biz.getAccounts (nombre); } }

21.5.7 Exportacin de servicios web mediante el apoyo de la RI JAX-WS de primavera

JAX-WS RI de Sun, desarrollado como parte del proyecto GlassFish, el apoyo barcos primavera como parte de su proyecto de JAX-WS Commons. Esto permite definir JAXWS como puntos finales administrados por resorte granos, similares a la modalidad autnoma discutido en la seccin anterior - pero esta vez en un entorno de Servlet Tenga en cuenta que esto no es porttil en un entorno Java EE 5, sino que se destina principalmente. por falta de EE ambientes tales como Tomcat, la incorporacin de la RI JAX-WS como parte de la aplicacin web. La diferencia con el estilo estndar de la exportacin de servlet basados en criterios de valoracin es que el ciclo de vida de las instancias propias de punto final estar a cargo de la primavera aqu, y que slo habr un servlet JAX-WS se define en el web.xml . Con el estndar Java EE 5 estilos (como se muestra arriba), usted tendr una definicin servlet por extremo de servicio, con cada punto final es normalmente delega en frijol de primavera (a travs del uso de @Autowired , como se muestra arriba). Echa un vistazo a https://jax-ws-commons.dev.java.net/spring/ para obtener detalles sobre la configuracin y el tipo de uso.
21.5.8 Acceso a los servicios web utilizando JAX-WS

Anlogo al soporte JAX-RPC, Spring ofrece dos granos de fbrica para crear JAX-WS servidores proxy de servicio web, es decir, LocalJaxWsServiceFactoryBean y JaxWsPortProxyFactoryBean . El primero slo puede devolver una clase JAX-WS servicio para nosotros trabajar con ellos. Esta ltima es la versin de pleno derecho que puede devolver un proxy que implementa nuestra interfaz de servicio de negocio. En este ejemplo se utiliza el ltimo para crear un proxy para el AccountService punto final (de nuevo):
<bean id = "accountWebService" class = "org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean"> <propiedad nombre = valor = "serviceInterface" "example.AccountService" /> <propiedad nombre = valor = "wsdlDocumentUrl" "http://localhost:8888/AccountServiceEndpoint?WSDL" /> <propiedad nombre = valor = "namespaceUri" "http://example/" /> <propiedad nombre = valor = "serviceName" "AccountService" /> <propiedad nombre = valor = "portName" "AccountServiceEndpointPort" /> </ Bean>

Donde serviceInterface es nuestra interfaz de negocio a los clientes a utilizar. wsdlDocumentUrl es la direccin del archivo WSDL. Primavera necesita este un tiempo de inicio para crear la JAX-WS Servicio. namespaceUri corresponde al targetNamespace en el archivo. wsdl. serviceName se corresponde con el nombre del servicio en el archivo. wsdl. portName se corresponde con el nombre del puerto en el archivo. wsdl. El acceso al servicio web ahora es muy fcil ya que tenemos una fbrica de beans para lo que va a exponer como AccountService interfaz. Podemos conectar esto en primavera:
<bean id = "client" class = "example.AccountClientImpl"> ... <propiedad nombre = "service" ref = "accountWebService" /> </ Bean>

Desde el cdigo de cliente que puede acceder al servicio web tal y como si se tratara de una clase normal:
pblico AccountClientImpl clase { servicio privado AccountService; public void setService (AccountService servicio) { este Servicio =.; } pblico foo vaco () { service.insertAccount (...); } }

NOTA: Lo anterior est ligeramente simplificado en que JAX-WS requiere interfaces de punto final y clases de implementacin para ser anotado con @WebService , @SOAPBinding anotaciones etc. Esto significa que usted no puede (fcilmente) utilizar simples interfaces Java y clases de implementacin de punto final como artefactos JAXWS, que hay que anotar en consecuencia en primer lugar. Consulte la documentacin de JAX-WS para obtener ms informacin sobre estos requisitos.

21,6 JMS
Tambin es posible exponer a los servicios de manera transparente mediante JMS como el protocolo de comunicacin subyacente. El soporte remoto JMS en el Spring Framework es bastante bsico - enva y recibe en el same thread y en el mismo no transaccional Session , y como tal el rendimiento va a ser muy dependiente de la implementacin. Tenga en cuenta que estas limitaciones de un nico subproceso y no transaccionales slo se aplican a la ayuda de Spring Remoting JMS. Consulte el Captulo 23, JMS (Java Message Service) para obtener informacin sobre un amplio soporte de Spring JMS para mensajera basada. La siguiente interfaz se utiliza tanto en el servidor como en el cliente.

paquete com.foo; pblico CheckingAccountService interfaz { cancelAccount public void (Long accountId); }

La siguiente implementacin sencilla de la interfaz anterior se utiliza en el lado del servidor.


paquete com.foo; pblico SimpleCheckingAccountService clase implementa CheckingAccountService { cancelAccount public void (Long accountId) { System.out.println ("Cancelacin de la cuenta [" + accountId + "]"); } }

Este archivo de configuracin contiene los granos de JMS de infraestructura que son compartidos tanto en el cliente y el servidor.
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd "> <bean id = "connectionFactory" class = "org.apache.activemq.ActiveMQConnectionFactory"> <propiedad nombre = valor = "brokerURL" "tcp://ep-t43:61616" /> </ Bean> <bean id = "queue" class = "org.apache.activemq.command.ActiveMQQueue"> <constructor-arg value = "mmm" /> </ Bean> </ Beans>

21.6.1 configuracin del lado del servidor

En el servidor, basta con exponer el objeto de servicio utilizando el JmsInvokerServiceExporter .


<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/springbeans.xsd ">

<Bean id = "checkingAccountService" class = "org.springframework.jms.remoting.JmsInvokerServiceExporter"> <propiedad nombre = valor = "serviceInterface" "com.foo.CheckingAccountService" /> <propiedad nombre = "service"> <bean class = "com.foo.SimpleCheckingAccountService" /> </ Propiedad> </ Bean> <bean class = "org.springframework.jms.listener.SimpleMessageListenerContainer"> <propiedad nombre = "connectionFactory" ref = "connectionFactory" /> <propiedad nombre = "destination" ref = "queue" /> <propiedad nombre = valor = "concurrentConsumers" "3" /> <propiedad nombre = "messageListener" ref = "checkingAccountService" /> </ Bean> </ Beans> paquete com.foo; org.springframework.context.support.ClassPathXmlApplicationContext importacin; Servidor public class { public static void main (String [] args) throws Exception { ClassPathXmlApplicationContext nuevo (new String [] {"com / foo / server.xml", "com / foo / jms.xml"}); } }

21.6.2 configuracin del lado del cliente

El cliente slo tiene que crear un proxy de cliente que se va a implementar el acuerdo al interfaz ( CheckingAccountService ). El objeto resultante creado desde la parte trasera de la definicin de frijol siguiente se puede inyectar en otros objetos del lado del cliente y el proxy se encargar de reenviar la llamada al objeto del lado del servidor a travs de JMS.
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd "> <Bean id = "checkingAccountService" class = "org.springframework.jms.remoting.JmsInvokerProxyFactoryBean"> <propiedad nombre = valor = "serviceInterface" "com.foo.CheckingAccountService" /> <propiedad nombre = "connectionFactory" ref = "connectionFactory" /> <propiedad nombre = "queue" ref = "queue" /> </ Bean>

</ Beans> paquete com.foo; org.springframework.context.ApplicationContext importacin; org.springframework.context.support.ClassPathXmlApplicationContext importacin; public class Cliente { public static void main (String [] args) throws Exception { ApplicationContext ctx = new ClassPathXmlApplicationContext ( new String [] {"com / foo / client.xml", "com / foo / jms.xml"}); CheckingAccountService servicio = (CheckingAccountService) ctx.getBean ("checkingAccountService"); service.cancelAccount (nuevo Largo (10)); } }

Usted tambin puede desear investigar el apoyo prestado por el Lingo proyecto, que (para citar la propaganda homepage) "... es un POJO ligero basado remoting y biblioteca mensajera basada en libreras de comunicacin remota Spring Framework, que se extiende a apoyar JMS. "

21.7 Deteccin automtica no est implementado para interfaces remotas


La razn principal por la que la deteccin automtica de interfaces implementadas no se produce para las interfaces remotas es no abrir demasiadas puertas a las personas que llaman a distancia. El objeto de destino podra implementar interfaces internas de devolucin de llamada como InitializingBean o DisposableBean que uno no desea exponer a las personas que llaman. Ofreciendo un proxy con todas las interfaces implementadas por el objetivo general no tiene importancia en el caso local. Pero cuando se exporta un servicio remoto, debe exponer una interfaz de servicio especfico, con acciones especficas destinadas a uso a distancia. Adems de las interfaces internas de devolucin de llamada, el objetivo podra implementar varias interfaces de negocio, con slo uno de ellos destinado a la exposicin a distancia. Por estas razones, se requiere una interfaz de servicio que se determine. Esto es un compromiso entre la comodidad configuracin y el riesgo de exposicin accidental de mtodos internos. Siempre que especifica una interfaz de servicio no es demasiado esfuerzo, y te pone en el lado seguro con respecto a la exposicin controlada de mtodos especficos.

21.8 Consideraciones al momento de elegir una tecnologa

Tecnologa de todos y cada uno se presenta aqu tiene sus inconvenientes. Usted debe considerar cuidadosamente sus necesidades, los servicios que se exponen y los objetos que va a enviar a travs del cable al elegir una tecnologa. Cuando se utiliza RMI, no es posible acceder a los objetos a travs del protocolo HTTP, a menos que est canalizando el trfico RMI. RMI es un protocolo bastante grueso y resistente que soporta en todo el objeto de serializacin que es importante cuando se utiliza un modelo de datos compleja que requiere la serializacin por el cable. Sin embargo, RMI-JRMP est ligada a los clientes de Java: es una solucin de comunicacin remota de Java-a-Java. HTTP Spring invocador es una buena opcin si usted necesita basado en HTTP remoto, pero tambin se basan en la serializacin de Java. Comparte la infraestructura bsica con invocadores RMI, simplemente usando HTTP como transporte. Tenga en cuenta que invocadores HTTP no slo se limita a Java-a-Java remoting, sino tambin a la primavera en el cliente y en el servidor. (Esto ltimo tambin se aplica a invocador Spring RMI para no RMI interfaces.) Hesse y / o arpillera podra proporcionar un valor significativo cuando se opera en un entorno heterogneo, ya que permiten explcitamente para no Java clientes. Sin embargo, no Java apoyo es todava limitada. Problemas conocidos incluyen la serializacin de objetos de Hibernate en combinacin con las colecciones perezosamente-inicializado. Si usted tiene un modelo de datos, considere el uso de RMI o invocadores HTTP en lugar de Hesse. JMS puede ser til para proporcionar grupos de servicios y permitiendo que el agente de JMS para cuidar de equilibrio de carga, el descubrimiento y la auto-conmutacin por error. Por defecto: serializacin de Java se utiliza cuando se utiliza JMS remoto pero el proveedor de JMS podra utilizar un mecanismo diferente para el formato de alambre, como XStream para que los servidores puedan aplicarse en otras tecnologas. Por ltimo, pero no menos importante, EJB tiene una ventaja sobre RMI ya que soporta el estndar basado en funciones de autenticacin y autorizacin de transacciones y la propagacin a distancia. Es posible obtener invocadores RMI o invocadores HTTP para soportar la difusin de contexto de seguridad tambin, aunque esto no est previsto para la primavera de ncleo: Hay slo ganchos adecuados para conectar soluciones de terceros o personalizados aqu.

21.9 Acceso a los servicios REST en el cliente


El RestTemplate es la clase principal para el acceso del cliente a los servicios RESTful. Es conceptualmente similar a otras clases de plantilla en la primavera, como JdbcTemplate y JmsTemplate y otras clases de plantilla se encuentran en otros proyectos de la cartera de primavera. RestTemplate comportamiento 's es personalizada, proporcionando mtodos de devolucin de llamada y configurar el HttpMessageConverter utiliza para convertir los objetos en el cuerpo de la peticin HTTP y para deserializar una respuesta de vuelta en un objeto. Como es comn el uso de XML como un formato de mensaje, Spring proporciona un MarshallingHttpMessageConverter que usa el marco del objeto a XML que es parte

de la org.springframework.oxm paquete. Esto le da una amplia gama de opciones de XML a Objeto tecnologas de mapeo para elegir. En esta seccin se describe cmo utilizar la RestTemplate y sus asociados HttpMessageConverters .
21.9.1 RestTemplate

La invocacin de servicios REST en Java se suele hacer uso de una clase de ayuda, tales como Jakarta Commons HttpClient . Para las operaciones comunes RESTO este enfoque es demasiado baja como se muestra a continuacin.
Uri String = "http://example.com/hotels/1/bookings"; PostMethod mensaje = new PostMethod (uri); Solicitud String = / / crear contenido peticin de reserva post.setRequestEntity (StringRequestEntity nuevo (request)); httpClient.executeMethod (post); si (== HttpStatus.SC_CREATED post.getStatusCode ()) { Ubicacin Header = post.getRequestHeader ("Location"); if (ubicacin! = null) { System.out.println ("Creado nueva reserva a:" + location.getValue ()); } }

RestTemplate proporciona mayores opciones de nivel que corresponden a cada una de las seis principales mtodos HTTP que hacen que la invocacin de muchos servicios RESTful una sola lnea y aplicar las mejores prcticas de REST. Tabla 21.1. Resumen de los mtodos RestTemplate
Mtodo HTTP DELETE GET Mtodo RestTemplate borrar getForObject getForEntity CABEZA OPCIONES PUBLICAR headForHeaders (String url, String ... URLVariables) optionsForAllow (String url, String ... URLVariables) postForLocation (String url, solicitud Object, String ... URLVariables) postForObject (url String, Object Request, Clase <T> responseType, String ... uriVariables)

PUT

put (String url, solicitud Object, String ... URLVariables)

Los nombres de RestTemplate mtodos siguen una convencin de nomenclatura, la primera parte indica qu mtodo HTTP se invoca y la segunda parte indica lo que se devuelve. Por ejemplo, el mtodo getForObject() llevar a cabo un GET, convertir la respuesta HTTP a un tipo de objeto de su eleccin y volver a ese objeto. El mtodo postForLocation() va a hacer un POST, que convierte el objeto especificado en una peticin HTTP y devolver la cabecera de la respuesta HTTP Lugar donde el objeto recin creado se puede encontrar. En caso de una excepcin al procesar la peticin HTTP, una excepcin del tipo RestClientException ser lanzado; este comportamiento se puede cambiar conectando otro ResponseErrorHandler aplicacin en el RestTemplate . Los objetos iban y volver de estos mtodos se convierten y de mensajes HTTP por HttpMessageConverter casos. Convertidores para los principales tipos MIME estn registrados por defecto, pero usted tambin puede escribir su propio convertidor y registrarlo a travs de los messageConverters() de propiedad de frijol. Los casos registrados convertidor por defecto con la plantilla Puede anular esta configuracin predeterminada utilizando los messageConverters() propiedad de bean como sera necesario si se utiliza el MarshallingHttpMessageConverter o MappingJackson2HttpMessageConverter . Cada mtodo tiene argumentos URI plantilla en dos formas, ya sea como una String argumentos de longitud variable o una Map<String,String> . Por ejemplo,
String resultado = restTemplate.getForObject ("http://example.com/hotels/ {hotel} / reservas / reserva {}", . Cadena de clase, "42", "21");

utilizando argumentos de longitud variable y


Mapa <String, String> vars = Collections.singletonMap ("hotel", "42"); Resultado Cadena = restTemplate.getForObject ("http://example.com/hotels/ {hotel} / habitaciones / {hotel}", cadena de clase, de Vars.);

utilizando un Map<String,String> . Para crear una instancia de RestTemplate slo tiene que llamar a la omisin no-arg constructor. Para ello se utilizarn las clases estndar de Java desde el java.net paquete como la implementacin subyacente para crear peticiones HTTP. Esto puede cambiarse mediante la especificacin de una implementacin de ClientHttpRequestFactory . Spring proporciona la implementacin HttpComponentsClientHttpRequestFactory que utiliza el Apache HttpComponents HttpClient para crear solicitudes. HttpComponentsClientHttpRequestFactory se configura mediante una instancia de org.apache.http.client.HttpClient que a su

vez puede ser configurado con la informacin de credenciales o la agrupacin de conexiones funcionalidad.
Punta

Tenga en cuenta que el java.net ejecucin de las peticiones HTTP puede provocar una excepcin al acceder al estado de una respuesta que representa un error (por ejemplo, 401). Si esto es un problema, cambiar a HttpComponentsClientHttpRequestFactory lugar. En el ejemplo anterior utilizando Apache HttpComponents HttpClient directamente reescrito para usar el RestTemplate se muestra a continuacin
uri = "http://example.com/hotels/ {id} / reservas"; RestTemplate plantilla = new RestTemplate (); La reserva Reserva = / / crear objeto de reserva URI ubicacin = template.postForLocation (uri, reserva, "1");

La interfaz de devolucin de llamada general es RequestCallback y se llama al mtodo execute se invoca.


pblico <T> T execute (String url, mtodo HttpMethod, requestCallback requestCallback, ResponseExtractor <T> responseExtractor, String ... URLVariables) / / Tambin tiene una sobrecarga con URLVariables como String> <String, Map.

El RequestCallback interfaz se define como


requestCallback interfaz pblica { vaco doWithRequest (solicitud ClientHttpRequest) throws IOException; }

y le permite manipular las cabeceras de peticin y escribir en el cuerpo de la peticin. Cuando se utiliza el mtodo de ejecucin no tiene que preocuparse acerca de cualquier gestin de recursos, la plantilla siempre se cerrar la solicitud y controlar los errores. Consulte la documentacin de la API para obtener ms informacin sobre cmo utilizar el mtodo de ejecucin y el significado de sus argumentos otro mtodo.
Trabajar con el URI

Para cada uno de los principales mtodos HTTP, el RestTemplate ofrece variantes que puede tomar un URI de cadena o java.net.URI como primer argumento.

Las variantes de cadena URI aceptar argumentos de plantilla como argumento de serie de longitud variable o como Map<String,String> . Tambin asumen la cadena de URL no est codificado y necesita ser codificada. Por ejemplo el siguiente:
restTemplate.getForObject ("lista http://example.com/hotel", la clase String.);

llevar a cabo un GET en http://example.com/hotel%20list . Esto significa que si la cadena de URL de entrada ya est codificada, se codifica dos veces - es decir http://example.com/hotel%20list se convertir http://example.com/hotel%2520list . Si este no es el efecto que se buscaba, utilice el java.net.URI variante del procedimiento, que asume la direccin ya est codificado tambin es generalmente til si desea volver a utilizar un solo (completamente expandida) URI varias veces. El UriComponentsBuilder clase se puede utilizar para crear y codificar la URI incluyendo soporte para las plantillas de URI. Por ejemplo, puede comenzar con una cadena URL:
UriComponents uriComponents = UriComponentsBuilder.fromUriString ("http://example.com/hotels/ {hotel} / reservas / reserva {}"). Build () . Expand ("42", "21") . Encode (); Uri = URI uriComponents.toUri ();

O especificar individualmente cada componente URI:


UriComponents uriComponents = UriComponentsBuilder.newInstance () . Plan ("http"). Host ("example.com"). Ruta ("/ hoteles / hotel de {} {/ Reservas / Reserva}"). Build () . Expand ("42", "21") . Encode (); Uri = URI uriComponents.toUri ();

Tratando con cabeceras de peticin y respuesta

Adems de los mtodos descritos anteriormente, el RestTemplate tambin tiene el exchange() mtodo, que puede ser utilizado para la ejecucin arbitraria mtodo HTTP basado en el HttpEntity clase. Tal vez lo ms importante, el exchange() mtodo puede ser utilizado para agregar cabeceras de peticin y leer las cabeceras de respuesta. Por ejemplo:
RequestHeaders HttpHeaders = new HttpHeaders (); requestHeaders.set ("MyRequestHeader", "MyValue"); HttpEntity requestEntity = HttpEntity nuevo (requestHeaders) <>; HttpEntity respuesta <String> = template.exchange ("http://example.com/hotels/ {hotel}",

HttpMethod.GET, requestEntity, String clase ", 42").; Cadena responseHeader = response.getHeaders () GetFirst ("MyResponseHeader").; Cuerpo String = response.getBody ();

En el ejemplo anterior, primero preparar una entidad de solicitud que contiene el MyRequestHeader cabecera. A continuacin, recuperar la respuesta, y leer el MyResponseHeader y el cuerpo.
21.9.2 HTTP conversin de mensajes

Objetos y pasa al regresar de la mtodos getForObject() , postForLocation() , y put() se convierten a las solicitudes HTTP y de las respuestas HTTP por HttpMessageConverters . El HttpMessageConverter interfaz se muestra ms abajo para dar una mejor idea de su funcionalidad
public interface HttpMessageConverter <T> { / / Indica si la clase dada y tipo de material puede ser ledo por el convertidor. booleano canRead (Clase clazz, MediaType mediaType <>); / / Indica si la clase dada y el tipo de medios de comunicacin pueden ser escritos por este convertidor. booleano CanWrite (Clase clazz, MediaType mediaType <>); / / Devuelve la lista de objetos mediaType compatibles con este convertidor. Lista <MediaType> getSupportedMediaTypes (); / / Lee un objeto del tipo especificado en el mensaje de entrada dado, y lo devuelve. T lectura (Clase <T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException; / / Escribir un objeto especificado en el mensaje de salida dado. void write (T t, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException; }

Implementaciones concretas de los principales medios de comunicacin (MIME) se proporcionan en el marco y est registrado por defecto con el RestTemplate en el lado del cliente y con AnnotationMethodHandlerAdapter en el lado del servidor. Las implementaciones de HttpMessageConverter s se describen en las siguientes secciones. Para todos los convertidores de un tipo de medio predeterminado se utiliza, pero puede suprimirse mediante el establecimiento de la supportedMediaTypes propiedad de bean

StringHttpMessageConverter

Un HttpMessageConverter aplicacin que puede leer y escribir cadenas de la peticin HTTP y la respuesta. De forma predeterminada, este convertidor soporta todos los tipos de medios de texto ( text/* ), y escribe con un Content-Type de text/plain .
FormHttpMessageConverter

Un HttpMessageConverter aplicacin que puede leer y escribir los datos del formulario de solicitud y respuesta HTTP. De forma predeterminada, este convertidor lee y escribe el tipo de medio application/x-www-form-urlencoded . Los datos del formulario se leen y se escriben en una MultiValueMap<String, String> .
ByteArrayHttpMessageConverter

Un HttpMessageConverter aplicacin que puede leer y escribir matrices de bytes de la peticin HTTP y la respuesta. De forma predeterminada, este convertidor soporta todos los tipos de medios ( */* ), y escribe con un Content-Type de application/octetstream . Esto puede ser anulado por el establecimiento de la propiedad supportedMediaTypes y primordial getContentType(byte[]) .
MarshallingHttpMessageConverter

Un HttpMessageConverter aplicacin que puede leer y escribir XML utilizando Spring Marshaller y Unmarshaller abstracciones de la org.springframework.oxm paquete. Este convertidor requiere un Marshaller y Unmarshaller antes de que pueda ser utilizado. stos pueden inyectarse a travs de constructor o propiedades del bean. Por defecto, este convertidor de soportes ( text/xml ) y ( application/xml ).
MappingJackson2HttpMessageConverter (o MappingJacksonHttpMessageConverter con 1.x Jackson)

Un HttpMessageConverter aplicacin que puede leer y escribir usando JSON Jackson ObjectMapper . Asignacin de JSON se puede personalizar segn sea necesario a travs de la utilizacin de anotaciones previstas Jackson. Cuando el control se necesita ms, una costumbre ObjectMapper se puede inyectar a travs de la ObjectMapper propiedad para los casos personalizados serializadores JSON / deserializadores es necesario informar a los tipos especficos. Por defecto, este convertidor de soportes ( application/json ).
SourceHttpMessageConverter

Un HttpMessageConverter aplicacin que puede leer y escribir javax.xml.transform.Source de la peticin HTTP y la respuesta. Slo DOMSource , SAXSource y StreamSource son compatibles. Por defecto, este convertidor de soportes ( text/xml ) y ( application/xml ).

BufferedImageHttpMessageConverter

Un HttpMessageConverter aplicacin que puede leer y escribir java.awt.image.BufferedImage de la peticin HTTP y la respuesta. Este convertidor lee y escribe el tipo de papel que admite Java I / O API.

22. Enterprise JavaBeans (EJB) integracin 22.1 Introduccin


Como un contenedor ligero, Spring es a menudo considerado como un reemplazo EJB. Creemos que para muchos, si no la mayora de las aplicaciones y casos de uso, Primavera como un contenedor, junto con su rica funcionalidad de apoyo en el mbito de las transacciones, ORM y el acceso JDBC, es una mejor opcin que la aplicacin de una funcionalidad equivalente a travs de un contenedor EJB y los EJB . Sin embargo, es importante tener en cuenta que el uso de Spring no le impedir usar EJBs. De hecho, Spring hace que sea mucho ms fcil acceder a los EJB y aplicar EJBs y la funcionalidad dentro de ellos. Adems, la utilizacin de primavera para acceder a los servicios prestados por los EJB permite la implementacin de estos servicios de forma transparente para luego ser cambiado entre lo local EJB, EJB remoto, o POJO (Plain Old Java objeto) variantes, sin el cdigo de cliente que tiene que ser cambiado. En este captulo, vamos a ver cmo primavera puede ayudarle a acceder y ejecutar EJBs. Spring proporciona un valor especial cuando se accede a beans de sesin (SLSBs), as que empezar hablando de esto.

22.2 Acceso a los EJBs


22.2.1 Conceptos

Para invocar un mtodo de un bean de sesin local o remoto sin estado, cdigo de cliente normalmente debe realizar una bsqueda JNDI para obtener el (local o remota) EJB objeto principal, y luego utilizar la llamada a 'crear' mtodo de ese objeto para obtener el real (local o remota) EJB objeto. Uno o ms mtodos son invocados en el EJB. Para evitar repetido cdigo de bajo nivel, muchas aplicaciones EJB utiliza el Servicio de Localizacin y Delegadas patrones negocios. Estos son mejores que la fumigacin bsquedas JNDI en todo el cdigo del cliente, pero sus implementaciones habituales tienen desventajas significativas. Por ejemplo:

Normalmente cdigo usando EJBs depende Service Locator o Business Delegate nicos, por lo que es difcil de probar. En el caso del patrn Service Locator utiliza sin un Delegado de negocios, cdigo de la aplicacin todava termina encima de tener que invocar al mtodo create () en una casa de EJB, y tratar con las excepciones debidas. Por lo tanto,

sigue estando vinculada a la API EJB y la complejidad del modelo de programacin EJB. Implementar el patrn Business Delegate tpicamente resulta en la duplicacin de cdigo importante, donde tenemos que escribir numerosos mtodos que simplemente llaman al mismo mtodo en el EJB.

El enfoque de la primavera es permitir la creacin y uso de objetos proxy, normalmente configurado dentro de un contenedor de primavera, que actan como delegados comerciales sin cdigo. Usted no tiene que escribir otra Locator Service, otro JNDI o duplicar mtodos en un Business Delegate codificadas a mano a menos que en realidad se est agregando valor real de dicho cdigo.
22.2.2 Acceso a los locales SLSBs

Supongamos que tenemos un controlador de red que necesita usar un local EJB. Vamos a seguir las mejores prcticas de negocios y el uso de la interfaz EJB Mtodos patrn, por lo que la interfaz local del EJB EJB no se extiende a una empresa especfica de interfaz mtodos. Llamemos a esta empresa mtodos interfaz MyComponent .
public interface MyComponent { ... }

Una de las razones principales para utilizar el modelo de negocios mtodos de interfaz es asegurarse de que la sincronizacin entre firmas de mtodo en la interfaz local y clase de implementacin del bean es automtica. Otra razn es que luego hace que sea mucho ms fcil para nosotros para cambiar a un POJO (Plain Old Java objeto) la ejecucin del servicio si tiene sentido hacerlo. Por supuesto, tambin ser necesario implementar la interfaz inicial local y proporcionar una implementacin de la clase que implementa SessionBean y la MyComponent interfaz de mtodos de negocio. Ahora la codificacin Java slo tendremos que hacer para conectar nuestro controlador de capa web con la aplicacin EJB es exponer un mtodo setter de tipo MyComponent en el controlador. Esto guardar la referencia como una variable de instancia en el controlador:
myComponent MyComponent privado; public void setMyComponent (MyComponent myComponent) { este myComponent = myComponent.; }

Estamos posteriormente puede utilizar esta variable de instancia en cualquier mtodo de negocio en el controlador. Ahora, suponiendo que estamos obteniendo nuestro objeto de controlador de un contenedor Spring, podemos (en el mismo contexto) configurar un LocalStatelessSessionProxyFactoryBean instancia, que ser el objeto de proxy EJB. La configuracin del proxy, y el ajuste de la myComponent propiedad del controlador se realiza con una entrada de configuracin, tales como:
<Bean id = "myComponent" class = "org.springframework.ejb.access.LocalStatelessSessionProxyFactoryBean" > <propiedad nombre = valor = "jndiName" "ejb/myBean" />

<propiedad nombre = valor = "businessInterface" "com.mycom.MyComponent" /> </ Bean> <bean id = "myController" class = "com.mycom.myController"> <propiedad nombre = "myComponent" ref = "myComponent" /> </ Bean>

Hay un montn de trabajo sucediendo detrs de las escenas, cortesa del framework Spring AOP, aunque no estn obligados a trabajar con los conceptos de AOP para disfrutar de los resultados. El myComponent bean definicin crea un proxy para el EJB que implementa la interfaz mtodo comercial. La casa local EJB se almacena en cach en el arranque, por lo que slo hay un nico lookup JNDI. Cada vez que el EJB se invoca, el proxy invoca el classname mtodo en el local de EJB e invoca el mtodo correspondiente en el negocio EJB. El myController bean definicin establece el myComponent propiedad de la clase del controlador al proxy EJB. Alternativamente (y, preferiblemente, en el caso de muchas definiciones de proxy de este tipo), puede utilizar el <jee:local-slsb> elemento de configuracin en Spring "jee" espacio de nombres:
<Jee: local-SLSB id = "myComponent" JNDI name = "ejb / myBean" negocios interface = "com.mycom.MyComponent" /> <bean id = "myController" class = "com.mycom.myController"> <propiedad nombre = "myComponent" ref = "myComponent" /> </ Bean>

Este mecanismo de acceso EJB proporciona enorme simplificacin de cdigo de la aplicacin: el cdigo de nivel de web (o cualquier otro cdigo de cliente EJB) no tiene ninguna dependencia en el uso de EJB. Si queremos sustituir la referencia EJB con un POJO o un objeto de burla o del recibo de otra prueba, simplemente se podra cambiar el myComponent definicin de bean sin cambiar una lnea de cdigo Java. Adems, no hemos tenido que escribir una sola lnea de bsqueda JNDI u otro cdigo de plomera EJB como parte de nuestra aplicacin. Los puntos de referencia y de la experiencia en aplicaciones reales indican que la sobrecarga de rendimiento de este enfoque (que implica la invocacin reflectante de la EJB objetivo) es mnimo, y es tpicamente indetectable en el uso tpico. Recuerde que no queremos hacer de grano fino llamadas a EJBs de todos modos, ya que hay un costo asociado a la infraestructura EJB en el servidor de aplicaciones. Hay una advertencia con respecto a la bsqueda JNDI. En un recipiente de granos, esta clase normalmente se utiliza mejor como un singleton (simplemente no hay razn para que sea un prototipo). Sin embargo, si ese caf en grano pre-instancia de singletons (al igual que los diversos XML ApplicationContext variantes) es posible que tenga un problema si el recipiente de granos se carga antes que el contenedor EJB carga el objetivo EJB. Esto se debe a la bsqueda JNDI se llevar a cabo en el init() mtodo de esta clase y se almacenan en cach, pero el EJB no se han consolidado a la ubicacin de destino todava. La solucin es no pre-instanciar este objeto de fbrica, pero permitir

que sea creado en el primer uso. En los contenedores XML, esto se controla a travs del lazy-init atributo. Aunque esto no ser de inters para la mayora de los usuarios de primavera, las personas que realizan el trabajo de programacin con EJB AOP puede que desee ver en LocalSlsbInvokerInterceptor .
22.2.3 SLSBs acceso remoto

Acceso a EJBs remotos es esencialmente idntica a acceder a los EJB locales, excepto que el SimpleRemoteStatelessSessionProxyFactoryBean o <jee:remote-slsb> elemento de configuracin se utiliza. Por supuesto, con o sin resorte, la semntica de invocacin remota aplicar una llamada a un mtodo en un objeto en otra mquina virtual en otro ordenador es a veces tienen que ser tratados de manera diferente en trminos de escenarios de uso y manejo de fallos. Soporte de Spring EJB cliente agrega una ventaja ms en el enfoque no-Spring. Normalmente es problemtico para el cdigo de cliente EJB para cambiar fcilmente de ida y vuelta entre la llamada a EJBs forma local o remota. Esto se debe a que los mtodos de interfaz remotos debern declarar que tirar RemoteException y cdigo cliente debe lidiar con esto, mientras que los mtodos de interfaz locales no lo hacen. El cdigo de cliente por escrito para EJBs locales que debe ser trasladado a los EJB remotos normalmente tiene que ser modificado para agregar control de las excepciones a distancia, y el cdigo de cliente escritos para EJB remotos que necesita ser trasladado a EJBs locales, puede permanecer igual, pero hacer una gran cantidad de manipulacin innecesaria de excepciones remotas, o debe ser modificado para eliminar ese cdigo. Con el proxy Spring EJB remoto, no se puede declarar cualquier lugar arrojado RemoteException en su Interfaz de mtodo de negocios e implementacin de EJB cdigo, tiene una interfaz remota que es idntica excepto que se lance RemoteException , y se basan en el proxy para el tratamiento de forma dinmica las dos interfaces como si fueran el mismo. Es decir, el cdigo de cliente no tiene que tratar con el revisadas RemoteException clase. Cualquier real RemoteException que se produce durante la invocacin EJB ser re-lanzado como el no facturado RemoteAccessException clase, que es una subclase de RuntimeException . El servicio de destino se puede cambiar a voluntad entre un local o remota EJB EJB (o un objeto Java incluso normal) la ejecucin, sin saber el cdigo de cliente o el cuidado. Por supuesto, esto es opcional, no hay nada que nos impida declarar RemoteExceptions en tu interfaz de negocios.
22.2.4 Acceso a EJB 2.x SLSBs frente EJB 3 SLSBs

Acceso a EJB Session Beans y EJB 2.x 3 beans de sesin a travs de primavera es en gran parte transparente. De acceso EJB Spring, incluidos los <jee:local-slsb> y <jee:remote-slsb> instalaciones, transparente adaptarse al componente real en tiempo de ejecucin. Ellos se encargan de una interfaz de inicio si se encuentra (EJB 2.x estilo), o realizar invocaciones consecutivas componentes si no se dispone de interfaz inicial EJB (3 Estilo). Nota: Para los Beans de sesin EJB 3, que efectivamente podra utilizar un JndiObjectFactoryBean / <jee:jndi-lookup> tambin, ya que las referencias de

componentes totalmente utilizables estn expuestos a simples bsquedas JNDI all. Definicin explcita <jee:local-slsb> / <jee:remote-slsb> bsquedas simplemente proporciona la configuracin EJB acceso coherente y explcita.

22.3 Uso de las clases EJB Spring apoyo a la ejecucin


22.3.1 EJB 2.x clases base

Spring ofrece clases de conveniencia para ayudarle a implementar EJB. Estos estn diseados para fomentar la buena prctica de poner la lgica de negocio detrs de EJB POJO, EJB dejando responsables de la demarcacin de la transaccin y (opcionalmente) la comunicacin remota. Para implementar un bean de sesin con o sin estado, o un bean controlado por mensaje, slo tiene que derivar su clase de implementacin de AbstractStatelessSessionBean , AbstractStatefulSessionBean y AbstractMessageDrivenBean / AbstractJmsMessageDrivenBean , respectivamente. Considere la posibilidad de un bean de sesin sin estado ejemplo que en realidad los delegados de la aplicacin a un objeto de servicio llanura java. Tenemos la interfaz de negocio:
public interface MyComponent { myMethod public void (...); ... }

Tambin tenemos la llanura objeto Java implementacin:


pblico MyComponentImpl clase implementa MyComponent { public String myMethod (...) { ... } ... }

Y, finalmente, el bean de sesin sin estado propio:


pblico MyFacadeEJB clase extiende AbstractStatelessSessionBean implementa MyFacadeLocal { Mycomp MyComponent privado; / ** * Obtenga nuestro servicio objeto POJO de la BeanFactory / ApplicationContext * @ See # org.springframework.ejb.support.AbstractStatelessSessionBean onEjbCreate () * / onEjbCreate protected void () throws CreateException { Mycomp = (MyComponent) getBeanFactory (). getBean ( ServicesConstants.CONTEXT_MYCOMP_ID); }

/ / Para el mtodo de negocio, delegar en POJO servicio impl. public String myFacadeMethod (...) { volver myComp.myMethod (...); } ... }

La primavera EJB clases base de apoyo de forma predeterminada crear y cargar un contenedor de IoC primavera como parte de su ciclo de vida, el cual estar disponible para el EJB (por ejemplo, tal como se utiliza en el cdigo anterior para obtener el objeto de servicio POJO). La carga se realiza a travs de un objeto de la estrategia que es una subclase de BeanFactoryLocator . La aplicacin efectiva de BeanFactoryLocator utilizado por defecto es ContextJndiBeanFactoryLocator , que crea el ApplicationContext desde unos lugares recurso especificado como una variable de entorno JNDI (en el caso de las clases EJB, en java:comp/env/ejb/BeanFactoryPath ). Si hay una necesidad de cambiar la estrategia de carga BeanFactory / ApplicationContext, el valor predeterminado BeanFactoryLocator aplicacin utilizado puede ser anulado por una llamada al setBeanFactoryLocator() mtodo, ya sea en setSessionContext() , o en el constructor real del EJB. Por favor, consulte los Javadocs para ms detalles. Como se describe en los Javadocs, Stateful Session Beans esperando ser pasiva y reactiva como parte de su ciclo de vida, y que utilizan una instancia del contenedor no serializable (que es el caso normal) tendr que llamar manualmente unloadBeanFactory() y loadBeanFactory() de ejbPassivate() y ejbActivate() , respectivamente, para descargar y volver a cargar el BeanFactory de pasivacin y activacin, ya que no puede ser salvado por el contenedor EJB. El comportamiento por defecto de la ContextJndiBeanFactoryLocator clase es para cargar un ApplicationContext para el uso de un EJB, y es adecuado para algunas situaciones. Sin embargo, es problemtico cuando el ApplicationContext se carga un nmero de granos, o la inicializacin de los granos es mucho tiempo o intensivo de la memoria (tal como un Hibernate SessionFactory inicializacin, por ejemplo), ya que cada EJB tendr su propia copia. En este caso, el usuario puede querer reemplazar el valor predeterminado ContextJndiBeanFactoryLocator uso y utilizar otro BeanFactoryLocator variante, como la ContextSingletonBeanFactoryLocator que puede cargar y utilizar un contenedor comn para ser utilizado por varios EJBs u otros clientes. Hacer esto es relativamente sencilla, mediante la adicin de cdigo similar a este para el EJB:
/ ** * Reemplazar la implementacin predeterminada BeanFactoryLocator * @ See # javax.ejb.SessionBean setSessionContext (javax.ejb.SessionContext) * / public void setSessionContext (SessionContext sessionContext) { . sper setSessionContext (sessionContext); setBeanFactoryLocator (ContextSingletonBeanFactoryLocator.getInstance ()); setBeanFactoryLocatorKey (ServicesConstants.PRIMARY_CONTEXT_ID); }

A continuacin, deber crear un archivo de definicin de bean llamado beanRefContext.xml . Este archivo define todas las fbricas de frijol (usualmente en la forma de contextos de aplicacin) que pueden ser utilizados en el EJB. En muchos casos, este archivo slo contiene una definicin de frijol nica tal como esta (donde businessApplicationContext.xml contiene las definiciones de frijol para todos los POJOs de servicios empresariales):
<beans> <constructor-arg value = "businessApplicationContext.xml" /> </ Bean> </ Beans>

En el ejemplo anterior, la ServicesConstants.PRIMARY_CONTEXT_ID constante se define como sigue:


ServicesConstants.PRIMARY_CONTEXT_ID pblico static final String = "businessBeanFactory";

Por favor, consulte los respectivos Javadocs para los BeanFactoryLocator y ContextSingletonBeanFactoryLocator clases para ms informacin sobre su uso.
22.3.2 interceptor EJB 3 inyeccin

Para Beans de sesin EJB 3 y beans controlados por mensajes, Spring ofrece un interceptor conveniente que resuelve Spring 2.5 's @Autowired anotacin en la clase del componente EJB: org.springframework.ejb.interceptor.SpringBeanAutowiringInterceptor . Este interceptor se puede aplicar a travs de un @Interceptors anotacin en la clase de componentes EJB, oa travs de un interceptor-binding elemento XML del descriptor de despliegue EJB.
@ Stateless @ Interceptores (SpringBeanAutowiringInterceptor.class) pblico MyFacadeEJB clase implementa MyFacadeLocal { / / Automticamente inyecta con una coincidencia de frijol de primavera @ Autoconectados Mycomp MyComponent privado; / / Para el mtodo de negocio, delegar en POJO servicio impl. public String myFacadeMethod (...) { volver myComp.myMethod (...); } ... } SpringBeanAutowiringInterceptor por defecto obtiene granos de destino en un ContextSingletonBeanFactoryLocator , con el contexto definido en un archivo de definicin de bean llamado beanRefContext.xml . Por defecto, una definicin de

contexto solo se espera, que se obtiene por tipo en lugar de por su nombre. Sin embargo, si tiene que elegir entre varias definiciones de contexto, una clave especfica localizador es necesario. La clave de localizacin (es decir, el nombre de la definicin de contexto

en beanRefContext.xml ) se puede especificar explcitamente o bien a travs de reemplazar el getBeanFactoryLocatorKey mtodo en una costumbre SpringBeanAutowiringInterceptor subclase. Como alternativa, considere reemplazar SpringBeanAutowiringInterceptor 's getBeanFactory mtodo, por ejemplo, la obtencin de una visin compartida ApplicationContext de una clase de soporte personalizado.

23. JMS (Java Message Service) 23.1 Introduccin


Spring proporciona un marco de integracin JMS que simplifica el uso de la API de JMS al igual que la integracin de Spring hace por el API JDBC. JMS se pueden dividir en dos reas de funcionalidad, es decir, la produccin y el consumo de los mensajes. El JmsTemplate clase se utiliza para la produccin de mensajes y recepcin de mensajes sncrona. Para la recepcin asncrona similar a Java EE message-driven bean estilo, Spring ofrece una serie de contenedores de escucha de mensajes que se utilizan para crear controlado por mensajes POJOs (PDM). El paquete org.springframework.jms.core proporciona la funcionalidad bsica para el uso de JMS. Contiene clases JMS de plantilla que simplifican el uso de las JMS por la manipulacin de la creacin y la liberacin de los recursos, al igual que la JdbcTemplate hace por JDBC. El principio de diseo comunes a las clases de plantilla de primavera es proporcionar mtodos de ayuda para realizar operaciones comunes y de uso ms sofisticado, delegar la esencia de la tarea de procesamiento de devolucin de llamada para las interfaces de usuario implementado. La plantilla JMS sigue el mismo diseo. Las clases ofrecen varios mtodos de conveniencia para el envo de mensajes, consumiendo un mensaje de forma sncrona, y la exposicin de la sesin JMS y productor de mensajes para el usuario. El paquete org.springframework.jms.support proporciona JMSException funcionalidad de traduccin. La traduccin convierte la marcada JMSException jerarqua a una jerarqua de espejo de excepciones no controladas. Si hay algn proveedor de subclases especficas de la revisadas javax.jms.JMSException , esta excepcin se envuelve en el sin marcar UncategorizedJmsException . El paquete org.springframework.jms.support.converter ofrece un MessageConverter abstraccin para convertir entre objetos Java y mensajes JMS. El paquete org.springframework.jms.support.destination ofrece diversas estrategias para la gestin de destinos JMS, tales como el suministro de un servicio de localizacin de destinos almacenados en JNDI. Finalmente, el paquete org.springframework.jms.connection proporciona una implementacin de la ConnectionFactory adecuado para su uso en aplicaciones independientes. Tambin contiene una implementacin de Spring PlatformTransactionManager para JMS (el llamado astutamente

JmsTransactionManager

). Esto permite la integracin sin fisuras de JMS como un recurso transaccional en los mecanismos de gestin de transacciones de Spring.

23.2 Uso de Spring JMS


23.2.1 JmsTemplate

El JmsTemplate clase es la clase central en el paquete bsico de JMS. Simplifica el uso de JMS, ya que se encarga de la creacin y liberacin de recursos al enviar o recibir mensajes de forma sincrnica. El cdigo que utiliza el JmsTemplate slo necesita implementar interfaces de devolucin de llamada que les concedan un contrato claramente definido de alto nivel. El MessageCreator interfaz crea un mensaje de devolucin de llamada dado una Session facilitada por el cdigo de llamada en JmsTemplate . Con el fin de permitir el uso ms complejo de la API de JMS, la devolucin de llamada SessionCallback proporciona al usuario con la sesin JMS y la devolucin de llamada ProducerCallback expone una Session y MessageProducer par. El API JMS expone dos tipos de mtodos de envo, que tenga modo de entrega, prioridad, tiempo-a-vivir como Calidad de Servicio (QoS) y uno que no requiera parmetros QOS que utiliza los valores predeterminados. Puesto que hay muchos mtodos en enviar JmsTemplate , el ajuste de los parmetros de QoS han sido expuestos como propiedades del bean de evitar la duplicacin en el nmero de mtodos de envo. Del mismo modo, el valor de tiempo de espera para recibir llamadas sincrnicas se establece mediante la propiedad setReceiveTimeout . Algunos proveedores JMS permiten el ajuste de los valores por defecto QOS administrativo a travs de la configuracin de la ConnectionFactory. Esto tiene el efecto de que una llamada a MessageProducer 's mtodo send send(Destination destination, Message message) se utilizan diferentes valores por defecto QOS que los especificados en la especificacin JMS. Con el fin de proporcionar una gestin coherente de valores QOS, el JmsTemplate por lo tanto debe estar especficamente habilitado para usar sus propios valores QOS estableciendo la propiedad booleana isExplicitQosEnabled a true .
Nota

Las instancias de la JmsTemplate clase son thread-safe, una vez configurado. Esto es importante porque significa que puede configurar una sola instancia de un JmsTemplate y luego inyectar de forma segura esta referencia comn a mltiples colaboradores. Para ser claros, el JmsTemplate tiene estado, ya que mantiene una referencia a un ConnectionFactory , pero este estado no es un estado de conversacin.
23.2.2 Conexiones

El JmsTemplate requiere una referencia a un ConnectionFactory . El ConnectionFactory es parte de la especificacin JMS y sirve como punto de entrada

para trabajar con JMS. Es utilizado por la aplicacin cliente como una fbrica para crear conexiones con el proveedor de JMS y encapsula diversos parmetros de configuracin, muchos de los cuales son especficos del proveedor, como las opciones de configuracin de SSL. Cuando se utiliza JMS dentro de un EJB, el vendedor proporciona implementaciones de las interfaces JMS para que puedan participar en la gestin de transacciones declarativa y llevar a cabo la agrupacin de conexiones y sesiones. Para poder utilizar esta aplicacin, Java EE contenedores suelen requerir que se declara una fbrica de conexiones JMS como un recurso-ref en el interior del EJB o descriptores de despliegue de servlets. Para asegurar el uso de estas funciones con la JmsTemplate dentro de un EJB, la aplicacin cliente debe asegurarse de que hace referencia a la implementacin administrada de la ConnectionFactory .
Almacenamiento en cach los recursos de mensajera

La norma API consiste en crear muchos objetos intermedios. Para enviar un mensaje al siguiente 'API' paseo se realiza
ConnectionFactory-> Conexin-> Session-> MessageProducer-> enviar

Entre el ConnectionFactory y la operacin de envo son tres objetos intermedios que son creados y destruidos. Para optimizar el uso de recursos y aumentar el rendimiento de dos implementaciones de IConnectionFactory se proporcionan.
SingleConnectionFactory

Spring proporciona una implementacin de la ConnectionFactory interfaz, SingleConnectionFactory , que devolver la misma Connection en todo createConnection() las llamadas y hacer caso omiso de las llamadas a close() . Esto es til para pruebas y entornos independientes de modo que la misma conexin se pueden utilizar para mltiples JmsTemplate llamadas que puede abarcar cualquier nmero de transacciones. SingleConnectionFactory toma una referencia a un estndar ConnectionFactory que normalmente vienen de JNDI.
CachingConnectionFactory

El CachingConnectionFactory ampla la funcionalidad de SingleConnectionFactory y agrega el almacenamiento en cach de Sesiones, MessageProducers y MessageConsumers. El tamao de cach inicial se establece en 1, utilice el SessionCacheSize propiedad para aumentar el nmero de sesiones en cach. Tenga en cuenta que el nmero real de sesiones cach ser ms que ese nmero como sesiones se almacenan en cach en funcin de su modo de confirmacin, por lo que puede ser de hasta 4 instancias de sesin en cach cuando SessionCacheSize se establece en uno, uno para cada AcknowledgementMode. MessageProducers MessageConsumers y se almacenan en cach en su sesin de posesin y tambin tener en cuenta las propiedades nicas de los productores y consumidores en cach. MessageProducers se almacenan en cach en funcin de su destino. MessageConsumers se almacenan en cach basado en una clave compuesta por el destino, la bandera de

selector, entrega noLocal, y el nombre de la suscripcin duradera (si se crea consumidores duraderos).
23.2.3 Gestin de Destinos

Destinos, como ConnectionFactories, son objetos JMS administrados que pueden ser almacenados y recuperados en JNDI. Cuando se configura un contexto de aplicacin Spring puede utilizar el generador de clases JNDI JndiObjectFactoryBean / <jee:jndi-lookup> para realizar la inyeccin de dependencia en referencia a su objeto a destinos JMS. Sin embargo, con frecuencia esta estrategia es engorroso si hay un gran nmero de destinos en la aplicacin o si hay gestin de destinos advanced caractersticas nicas al proveedor JMS. Ejemplos de dicha gestin avanzada destino sera la creacin de destinos dinmica o el apoyo a un espacio de nombres jerrquico de los destinos. Los JmsTemplate delega la resolucin de un nombre de destino a un objeto de destino JMS a una implementacin de la interfaz DestinationResolver . DynamicDestinationResolver es la aplicacin predeterminada que utiliza JmsTemplate y tiene capacidad para resolver los destinos dinmicos. A JndiDestinationResolver , se precisa que acta como un servicio de localizacin para los destinos que figuran en JNDI y opcionalmente cae de nuevo a la conducta contenida en DynamicDestinationResolver . Muy a menudo los destinos utilizados en una aplicacin JMS slo se conocen en tiempo de ejecucin y por lo tanto no puede ser administrativamente creado cuando se implementa la aplicacin. Esto es a menudo porque hay una lgica compartida entre aplicaciones interactan los componentes del sistema que crean destinos en tiempo de ejecucin de acuerdo con una convencin de nomenclatura conocido. A pesar de que la creacin de destinos dinmicos no es parte de la especificacin JMS, la mayora de los vendedores han proporcionado esta funcionalidad. Destinos dinmicos se crean con un nombre definido por el usuario que los diferencia de los destinos temporales y no suelen estar registrados en JNDI. La API utiliza para crear destinos dinmicos vara de un proveedor a otro ya que las propiedades asociadas con el destino son especficos del proveedor. Sin embargo, una opcin sencilla implementacin que se hace a veces por los vendedores es hacer caso omiso de las advertencias de la especificacin JMS y utilizar el TopicSession mtodo createTopic(String topicName) o el QueueSession mtodo createQueue(String queueName) para crear un nuevo destino con propiedades de destino por defecto . Dependiendo de la implementacin de proveedor, DynamicDestinationResolver entonces puede tambin crear un destino fsico en lugar de slo resolver uno. El pubSubDomain propiedad booleana se utiliza para configurar la JmsTemplate con el conocimiento de lo que JMS dominio est siendo utilizado. Por defecto, el valor de esta propiedad es falso, indicando que el dominio de punto-a-punto, colas, se utilizar. Esta propiedad utilizada por JmsTemplate determina el comportamiento de la resolucin destino dinmico a travs de las implementaciones de la DestinationResolver interfaz. Tambin puede configurar el JmsTemplate con un destino predeterminado por la defaultDestination propiedad. El destino predeterminado se utilizar con enviar y recibir las operaciones que no se refieran a un destino especfico.

23.2.4 Contenedores de escucha de mensajes

Uno de los usos ms comunes de los mensajes JMS en el mundo EJB es conducir beans controlados por mensajes (MDB). Spring ofrece una solucin para crear controlado por mensajes POJOs (PDM) de una manera que no haga un usuario a un contenedor EJB. (Vase la Seccin 23.4.2, "Recepcin Asncrona - controlados por mensajes POJOs" para la cobertura detallada de la ayuda de Spring MDP). Un contenedor de escucha de mensajes se utiliza para recibir los mensajes de una cola de mensajes JMS y conducir el MessageListener que se inyecta en l. El contenedor oyente es responsable de todo enhebrado de la recepcin de mensajes y despachos en el oyente para su procesamiento. Un contenedor de escucha de mensajes es el intermediario entre el MDP y un proveedor de mensajera, y se encarga de registrar para recibir mensajes, participar en las transacciones, la adquisicin de recursos y la liberacin, la conversin de excepcin y cosas por el estilo. Esto permite que un desarrollador de aplicaciones para escribir la lgica de negocio (posiblemente compleja) asociados con la recepcin de un mensaje (y, posiblemente, la respuesta a la misma), y los delegados repetitivo cuestiones de infraestructura JMS para el marco. Hay dos contenedores estndar JMS escucha de mensajes que vienen con la primavera, cada uno con su conjunto de funciones especializadas.
SimpleMessageListenerContainer

Este contenedor de escucha de mensajes es el ms simple de los dos sabores estndar. Se crea un nmero fijo de sesiones JMS y los consumidores en el inicio, registra el oyente mediante el estndar JMS MessageConsumer.setMessageListener() mtodo, y deja en manos del proveedor de JMS para realizar callback de detector. Esta variante no permite la adaptacin dinmica a las demandas de ejecucin o para la participacin en las operaciones gestionadas externamente. Compatibilidad De lo contrario, se queda muy cerca del espritu de la especificacin JMS independiente - pero generalmente no es compatible con Java EE restricciones de JMS.
DefaultMessageListenerContainer

Este contenedor de escucha de mensajes es el que se utiliza en la mayora de los casos. En contraste con SimpleMessageListenerContainer , esta variante de contenedor se permite para la adaptacin dinmica a las demandas de tiempo de ejecucin y es capaz de participar en transacciones gestionados externamente. Cada mensaje recibido se ha registrado en una transaccin XA cuando se configura con un JtaTransactionManager , procesamiento, podra tomar ventaja de la semntica de transaccin XA. Este contenedor oyente logra un buen equilibrio entre los requisitos de bajos en el proveedor de JMS, funcionalidad avanzada, como la participacin de la transaccin, y la compatibilidad con entornos Java EE.
23.2.5 Gestin de transacciones

Spring proporciona un JmsTransactionManager que gestiona operaciones para un solo JMS ConnectionFactory . Esto permite a las aplicaciones JMS para aprovechar las caractersticas de las transacciones gestionadas de Spring como se describe en el

Captulo 12, Gestin de Operaciones . El JmsTransactionManager realiza transacciones de recursos locales, que obliga a un JMS Connection / Sesin par del especificado ConnectionFactory al hilo. JmsTemplate detecta automticamente estos recursos transaccionales y opera en consecuencia. En un entorno Java EE, el ConnectionFactory ser agrupar conexiones y sesiones, por lo que esos recursos se utilicen eficiente reutilizar en las transacciones. En un entorno independiente, usando Spring SingleConnectionFactory resultar en una compartida JMS Connection , con cada transaccin que tiene su propia e independiente Session . Como alternativa, considere el uso de un adaptador especfico del proveedor, tales como la agrupacin de ActiveMQ de PooledConnectionFactory clase.
JmsTemplate tambin se puede utilizar con el JtaTransactionManager y un XAcapaz JMS ConnectionFactory para realizar transacciones distribuidas. Tenga en

cuenta que este requiere el uso de un gestor de transacciones JTA as como una adecuada XA-configurado ConnectionFactory! (Consulte la documentacin del / de Java EE del servidor proveedor de JMS.) La reutilizacin de cdigo a travs de un entorno administrado y no administrado transaccional puede ser confuso cuando se utiliza la API de JMS para crear una Session de una Connection . Esto se debe a la API de JMS slo tiene un mtodo de fbrica para crear una Session y requiere valores para la transaccin y los modos de reconocimiento. En un entorno administrado, el establecimiento de estos valores es la responsabilidad de la infraestructura transaccional del medio ambiente, por lo que estos valores son ignorados por la envoltura del proveedor para la conexin de JMS. Cuando se utiliza el JmsTemplate en un entorno no administrado puede especificar estos valores mediante el uso de las propiedades sessionTransacted y sessionAcknowledgeMode . Cuando se utiliza un PlatformTransactionManager con JmsTemplate , la plantilla siempre se le dar una transaccin JMS Session .

23.3 Envo de un Message


El JmsTemplate contiene muchos mtodos de conveniencia para enviar un mensaje. Hay mtodos de envo que especifican el destino utilizando un javax.jms.Destination objeto y los que especifican el destino mediante una cadena para su uso en una bsqueda JNDI. El mtodo de envo que toma ningn argumento destino usa el destino predeterminado. Aqu est un ejemplo que enva un mensaje a una cola mediante la aplicacin 1.0.2.
javax.jms.ConnectionFactory importacin; javax.jms.JMSException importacin; importar javax.jms.Message; javax.jms.Queue importacin; importar javax.jms.session; importar org.springframework.jms.core.MessageCreator; org.springframework.jms.core.JmsTemplate importacin; JmsQueueSender clase pblica { jmsTemplate JmsTemplate privado; cola cola privada;

public void setConnectionFactory (ConnectionFactory cf) { . este jmsTemplate = new JmsTemplate (cf); } public void setQueue (cola de la cola) { esta cola = cola.; } simpleSend public void () { este jmsTemplate.send. (esta cola., MessageCreator nuevo () { pblico createMessage Mensaje (Session session) throws JMSException { volver session.createTextMessage ("mundo cola hola"); } }); } }

En este ejemplo se utiliza el MessageCreator devolucin de llamada para crear un mensaje de texto desde el suministrado Session objeto. El JmsTemplate se construye haciendo pasar una referencia a un ConnectionFactory . Como alternativa, un constructor de argumento cero y ConnectionFactory se proporciona y se puede utilizar para la construccin de la instancia en estilo JavaBean (utilizando un BeanFactory o llano cdigo Java). Como alternativa, considere que se derivan de Spring JmsGatewaySupport clase base comodidad, que ofrece pre-construidos para la configuracin de las propiedades del bean JMS. El mtodo de send(String destinationName, MessageCreator creator) le permite enviar un mensaje con el nombre de la cadena del destino. Si estos nombres estn registrados en JNDI, debe establecer la propiedad destinationResolver de la plantilla a una instancia de JndiDestinationResolver . Si ha creado el JmsTemplate y especific un destino predeterminado, el send(MessageCreator c) enva un mensaje a ese destino.
23.3.1 Uso de convertidores Mensaje

Con el fin de facilitar el envo de los objetos del modelo de dominio, el JmsTemplate tiene varias envan mtodos que toman un objeto de Java como un argumento para el contenido de un mensaje de datos. La sobrecarga de mtodos convertAndSend() y receiveAndConvert() en JmsTemplate delegado el proceso de conversin a una instancia de la MessageConverter interfaz. Esta interfaz define un contrato simple de convertir entre objetos Java y mensajes JMS. La implementacin predeterminada SimpleMessageConverter soporta la conversin entre String y TextMessage , byte[] y BytesMesssage y java.util.Map y MapMessage . Al utilizar el convertidor, usted y su cdigo de aplicacin puede centrarse en el objeto comercial que se envan o reciben a travs de JMS y no preocuparse por los detalles de la forma en que se representa como un mensaje JMS. El recinto de seguridad ya contiene una MapMessageConverter que utiliza la reflexin para convertir entre un JavaBean y una MapMessage . Otras opciones de aplicacin populares que usted puede ser que se implementan son los convertidores que utilizan un

paquete XML existente maniobra, como JAXB, Castor, XMLBeans o XStream, para crear un TextMessage que representa al objeto. Para adaptarse a la configuracin de las propiedades de un mensaje, encabezados y el cuerpo que no puede ser genrica encapsulado dentro de una clase de convertidor, el MessagePostProcessor interfaz le permite acceder al mensaje despus de haber sido convertida, pero antes de que se enva. El siguiente ejemplo muestra cmo modificar una cabecera de mensaje y una propiedad despus de un java.util.Map se convierte en un mensaje.
sendWithConversion public void () { Mapa map = new HashMap (); map.put ("Nombre", "Marca"); map.put ("Edad", new Integer (47)); jmsTemplate.convertAndSend ("testQueue", mapa, MessagePostProcessor nuevo () { Mensaje postProcessMessage pblico (mensaje Mensaje) throws JMSException { message.setIntProperty ("AccountID", 1234); message.setJMSCorrelationID ("123-00001"); devolver mensaje; } }); }

Esto resulta en un mensaje de la forma:


MapMessage = { Header = { ... cabeceras estndar ... CorrelationID = {} 123-00001 } Propiedades = { AccountID = {entero: 1234} } Fields = { Nombre = {String: Mark} Edad = {entero: 47} } }

23.3.2 SessionCallback y ProducerCallback

Si bien las operaciones de envo cubren muchos escenarios de uso comunes, hay casos en que se desea realizar operaciones mltiples en un JMS Session o MessageProducer . El SessionCallback y ProducerCallback exponer el JMS Session y Session / MessageProducer par respectivamente. Los execute() mtodos en JmsTemplate ejecutar estos mtodos de devolucin de llamada.

23.4 Recepcin de un mensaje

23.4.1 Recepcin sncrona

Mientras JMS se asocia tpicamente con el procesamiento asincrnico, es posible consumir los mensajes de forma sincrnica. La sobrecarga receive(..) mtodos proporcionan esta funcionalidad. Durante una recepcin sincrnica, los bloques de subproceso de llamada hasta que un mensaje est disponible. Esta puede ser una operacin peligrosa, ya que el subproceso de llamada potencialmente puede ser bloqueado de forma indefinida. El ReceiveTimeout propiedad especifica el tiempo que el receptor debe esperar antes de dar la espera de un mensaje.
23.4.2 Recepcin Asncrona - controlados por mensajes POJOs

De manera similar a un bean gestionado por mensajes (MDB) en el mundo EJB, el POJO controlado por mensajes (MDP) acta como receptor de mensajes JMS. La restriccin de una (pero vase tambin ms adelante para la discusin de la MessageListenerAdapter clase) en un MDP es que debe implementar el javax.jms.MessageListener interfaz. Tenga tambin en cuenta que, en el caso de que su POJO va a recibir mensajes en mltiples hilos, es importante asegurarse de que su aplicacin es segura para subprocesos. A continuacin se muestra una implementacin simple de un MDP:
javax.jms.JMSException importacin; importar javax.jms.Message; importar javax.jms.MessageListener; importar javax.jms.TextMessage; ExampleListener clase pblica implementa MessageListener { public void onMessage (mensaje Mensaje) { if (mensaje instanceof TextMessage) { try { System.out.println (. ((TextMessage) Mensaje) getText ()); } catch (JMSException ex) { throw new RuntimeException (ex); } } else { throw new IllegalArgumentException ("Mensaje debe ser de tipo TextMessage"); } } }

Una vez que haya implementado su MessageListener , es el momento para crear un contenedor de escucha de mensajes. A continuacin encontrar un ejemplo de cmo definir y configurar uno de los contenedores de escucha de mensajes que se incluye con muelle (en este caso el DefaultMessageListenerContainer ).
<- Este es el controlado por mensajes POJO (MDP) ->

<bean id = "messageListener" class = "jmsexample.ExampleListener" /> <- Y este es el contenedor de escucha de mensajes -> <bean id = "jmsContainer" class = "org.springframework.jms.listener.DefaultMessageListenerContainer"> <propiedad nombre = "connectionFactory" ref = "connectionFactory" /> <propiedad nombre = "destination" ref = "destination" /> <propiedad name="messageListener" ref="messageListener" /> </ Bean>

Por favor, consulte el Javadoc de primavera de los contenedores oyente varios mensajes para una descripcin completa de las funciones compatibles con cada aplicacin.
23.4.3 El SessionAwareMessageListener interfaz

El SessionAwareMessageListener interfaz es una interfaz Primavera-especfico que ofrece un contrato similar al de JMS MessageListener interfaz, sino que tambin proporciona el mtodo de tratamiento de mensajes con acceso a la JMS Session de la que el Message fue recibido.
paquete org.springframework.jms.listener; SessionAwareMessageListener interfaz pblica { vaco onMessage (mensaje Mensaje, Session session) throws JMSException; }

Usted puede elegir que sus MDPs implementar esta interfaz (en lugar de la estndar JMS MessageListener interfaz) si desea que sus MDP para poder responder a los mensajes recibidos (mediante la Session suministrado en el onMessage(Message, Session) mtodo). Todas las implementaciones de contenedores mensaje oyente que se incluyen en Spring tiene soporte para MDPs que implementan ya sea el MessageListener o SessionAwareMessageListener interfaz. Las clases que implementan la SessionAwareMessageListener vienen con la advertencia de que se atan a la primavera a travs de la interfaz. La eleccin de si desea o no utilizar se deja enteramente a usted como un desarrollador de aplicaciones o arquitecto. Por favor, tenga en cuenta que la 'onMessage(..)' mtodo de la SessionAwareMessageListener interfaz arroja JMSException . En contraste con el estndar JMS MessageListener interfaz, cuando se utiliza el SessionAwareMessageListener interfaz, es la responsabilidad del cdigo de cliente para manejar cualquier excepcin producida.
23.4.4 Los MessageListenerAdapter

El MessageListenerAdapter clase es el ltimo componente de apoyo a la mensajera asncrona Primavera: en pocas palabras, se permite exponer cualquier clase como un MDP (hay por supuesto algunas restricciones).

Considere la siguiente definicin de interfaz. Observe que, aunque la interfaz extiende ni el MessageListener ni SessionAwareMessageListener interfaces, que todava puede ser utilizado como un MDP mediante el uso de la MessageListenerAdapter clase. Obsrvese tambin cmo los mtodos de manipulacin de mensajes diferentes son fuertemente tipados de acuerdo con los contenidos de las distintas Message tipos que pueden recibir y manejar.
MessageDelegate interfaz pblica { vaco handleMessage (String mensaje); vaco handleMessage (mensaje el mapa); vaco handleMessage (byte [mensaje]); vaco handleMessage (mensaje Serializable); } DefaultMessageDelegate clase pblica implementa MessageDelegate { / / Se elide aplicacin de claridad ... }

En particular, observe que la implementacin anterior de la MessageDelegate interfaz (lo anterior DefaultMessageDelegate clase) no tiene ninguna dependencia JMS en absoluto. La verdad es un POJO que vamos a hacer en un MDP a travs de la siguiente configuracin.
<- Este es el controlado por mensajes POJO (MDP) -> <bean id="messageListener" class="org.springframework.jms.listener.adapter.MessageListenerAdapter "> <constructor-arg> <bean class="jmsexample.DefaultMessageDelegate"/> </ Constructor-arg> </ Bean> <- Y este es el contenedor de escucha de mensajes ... -> <bean id = "jmsContainer" class = "org.springframework.jms.listener.DefaultMessageListenerContainer"> <propiedad nombre = "connectionFactory" ref = "connectionFactory" /> <propiedad nombre = "destination" ref = "destination" /> <propiedad name="messageListener" ref="messageListener" /> </ Bean>

A continuacin se muestra un ejemplo de otro MDP que slo puede manejar la recepcin de JMS TextMessage mensajes. Observe cmo el mtodo de tratamiento de mensajes se llama en realidad 'receive' (el nombre del mtodo de tratamiento de mensajes en un MessageListenerAdapter defecto es 'handleMessage' ), pero se puede configurar (como se ver ms adelante). Observe tambin cmo el 'receive(..)' mtodo es fuertemente tipado para recibir y responder slo a JMS TextMessage mensajes.
TextMessageDelegate interfaz pblica { anular la recepcin (mensaje TextMessage); }

DefaultTextMessageDelegate clase pblica implementa TextMessageDelegate { / / Se elide aplicacin de claridad ... }

La configuracin de los acompaantes MessageListenerAdapter se vera as:


<bean id = "messageListener" class = "org.springframework.jms.listener.adapter.MessageListenerAdapter"> <constructor-arg> <bean class = "jmsexample.DefaultTextMessageDelegate" /> </ Constructor-arg> <propiedad nombre = valor = "defaultListenerMethod" "receive" /> <- No queremos extraccin automtica contexto del mensaje -> <propiedad nombre = "messageConverter"> <null/> </ Propiedad> </ Bean>

Tenga en cuenta que si el anterior 'messageListener' JMS recibe una Message de un tipo distinto de TextMessage , un IllegalStateException ser lanzado (y posteriormente se ingiere). Otra de las capacidades de la MessageListenerAdapter clase es la capacidad de enviar automticamente una copia de una respuesta de Message si un mtodo de controlador devuelve un valor no nulo. Considere la posibilidad de la interfaz y clase:
ResponsiveTextMessageDelegate interfaz pblica { / / Note el tipo de cambio ... Cadena de recepcin (TextMessage mensaje); } DefaultResponsiveTextMessageDelegate clase pblica implementa ResponsiveTextMessageDelegate { / / Se elide aplicacin de claridad ... }

Si lo anterior DefaultResponsiveTextMessageDelegate se utiliza en conjuncin con un MessageListenerAdapter entonces cualquier valor no nulo que se devuelve desde la ejecucin de la 'receive(..)' mtodo (en la configuracin por defecto) se convierte en un TextMessage . El resultado TextMessage ser enviada al Destination (si existe) se define en el JMS Reply-To propiedad del original Message , o la omisin Destination situado en las MessageListenerAdapter (si se ha configurado), y si no Destination se encuentra a continuacin, un InvalidDestinationException ser lanzado (y por favor tenga en cuenta que esta excepcin no se traga y se propagar la pila de llamadas).
23.4.5 Procesamiento de mensajes dentro de las transacciones

Invocar un escucha de mensajes dentro de una transaccin slo requiere la reconfiguracin del contenedor oyente. Transacciones de recursos locales simplemente se puede activar a travs de la sessionTransacted bandera en la definicin de contenedor oyente. Cada invocacin escucha de mensajes funcionar entonces en una transaccin activa JMS, con la

recepcin de mensajes deshace en caso de fallo oyente ejecucin. Envo de un mensaje de respuesta (a travs de SessionAwareMessageListener ) ser parte de la misma transaccin local, pero cualquier operacin de otros recursos (por ejemplo, acceso a base de datos) se operan de manera independiente. Esto por lo general requiere la deteccin de mensajes duplicados en la aplicacin oyente, que cubre el caso para tratamientos de base de datos se ha comprometido, pero el procesamiento de mensajes no cometi.
<bean id = "jmsContainer" class = "org.springframework.jms.listener.DefaultMessageListenerContainer"> <propiedad nombre = "connectionFactory" ref = "connectionFactory" /> <propiedad nombre = "destination" ref = "destination" /> <propiedad nombre = "messageListener" ref = "messageListener" /> <propiedad name="sessionTransacted" value="true"/> </ Bean>

Para participar en una transaccin administrada externamente, tendr que configurar un gestor de transacciones y el uso de un recipiente oyente que apoya las operaciones gestionadas externamente: tpicamente DefaultMessageListenerContainer . Para configurar un contenedor de escucha de mensajes para la participacin transaccin XA, tendr que configurar un JtaTransactionManager (que, por defecto, los delegados al subsistema de transacciones de Java EE del servidor). Tenga en cuenta que el subyacente ConnectionFactory JMS tiene que ser XA-capaz y debidamente registrados con su coordinador de transacciones JTA! (Compruebe la configuracin de su servidor Java EE de recursos JNDI.) Esto permite la recepcin de mensajes, as como el acceso de base de datos por ejemplo, para ser parte de la misma transaccin (con unificadas semntica de confirmacin, a expensas de los gastos generales de registro de transacciones XA).
<bean id = "transactionManager" class = "org.springframework.transaction.jta.JtaTransactionManager" />

A continuacin, slo tiene que aadir a nuestra configuracin del contenedor antes. El contenedor se har cargo del resto.
<bean id = "jmsContainer" class = "org.springframework.jms.listener.DefaultMessageListenerContainer"> <propiedad nombre = "connectionFactory" ref = "connectionFactory" /> <propiedad nombre = "destination" ref = "destination" /> <propiedad nombre = "messageListener" ref = "messageListener" /> <propiedad name="transactionManager" ref="transactionManager"/> </ Bean>

23.5 Soporte para puntos finales Mensaje JCA


A partir de la versin 2.5, Spring tambin proporciona soporte para un JCA a base MessageListener contenedor. El JmsMessageEndpointManager intentar determinar automticamente la ActivationSpec nombre de la clase del proveedor ResourceAdapter nombre de clase. Por lo tanto, normalmente es posible proporcionar

slo genrico Spring JmsActivationSpecConfig como se muestra en el siguiente ejemplo.


<bean class = "org.springframework.jms.listener.endpoint.JmsMessageEndpointManager"> <propiedad nombre = "resourceAdapter" ref = "resourceAdapter" /> <propiedad nombre = "activationSpecConfig"> <bean class = "org.springframework.jms.listener.endpoint.JmsActivationSpecConfig"> <propiedad nombre = valor = "destinationName" "myQueue" /> </ Bean> </ Propiedad> <propiedad nombre = "messageListener" ref = "myMessageListener" /> </ Bean>

Alternativamente, puede establecer un JmsMessageEndpointManager con un determinado ActivationSpec objeto. El ActivationSpec objeto tambin puede provenir de una bsqueda JNDI (usando <jee:jndi-lookup> ).
<bean class = "org.springframework.jms.listener.endpoint.JmsMessageEndpointManager"> <propiedad nombre = "resourceAdapter" ref = "resourceAdapter" /> <propiedad nombre = "activationSpec"> <bean class = "org.apache.activemq.ra.ActiveMQActivationSpec"> <propiedad nombre = valor = "destination" "myQueue" /> <propiedad nombre = valor = "destinationType" "javax.jms.Queue" /> </ Bean> </ Propiedad> <propiedad nombre = "messageListener" ref = "myMessageListener" /> </ Bean>

Utilizando Spring ResourceAdapterFactoryBean , el objetivo ResourceAdapter puede ser configurado localmente como se representa en el siguiente ejemplo.
<bean id = "resourceAdapter" class = "org.springframework.jca.support.ResourceAdapterFactoryBean"> <propiedad nombre = "resourceAdapter"> <bean class = "org.apache.activemq.ra.ActiveMQResourceAdapter"> <propiedad nombre = valor = "serverUrl" "tcp://localhost:61616" /> </ Bean> </ Propiedad> <propiedad nombre = "workManager"> <bean class = "org.springframework.jca.work.SimpleTaskWorkManager" /> </ Propiedad> </ Bean>

La especificado WorkManager tambin puede apuntar a un grupo de subprocesos especfica del entorno - por lo general a travs SimpleTaskWorkManager's "asyncTaskExecutor" de propiedad. Considere la posibilidad de definir un grupo de

subprocesos compartido para todos sus ResourceAdapter casos, si usted usa varios adaptadores. En algunos entornos (por ejemplo WebLogic 9 o superior), la totalidad ResourceAdapter objeto se puede obtener de JNDI vez (utilizando <jee:jndilookup> ). Las escuchas de mensajes basados en Primavera-Entonces puede interactuar con los alojados en servidor ResourceAdapter , tambin utilizando el servidor integrado de WorkManager . Por favor consulte el JavaDoc para JmsMessageEndpointManager , JmsActivationSpecConfig y ResourceAdapterFactoryBean para ms detalles. Spring tambin proporciona un mensaje genrico JCA gestor de punto final que no est ligada a JMS: org.springframework.jca.endpoint.GenericMessageEndpointManager . Este componente permite utilizar cualquier tipo de escucha de mensajes (por ejemplo, un MessageListener CCI) y cualquier objeto ActivationSpec especfica del proveedor. Echa un vistazo a la documentacin de su proveedor de JCA para averiguar acerca de las capacidades reales de su conector y consultar GenericMessageEndpointManager JavaDoc 's para los detalles de configuracin especficos de resorte.
Nota

JCA gestin basada en criterio de valoracin mensaje es muy similar a EJB 2.1 Message-Driven Beans, sino que utiliza el mismo contrato subyacente proveedor de recursos. Al igual que con los bancos multilaterales de desarrollo EJB 2.1, cualquier interfaz de escucha de mensajes admite su proveedor de JCA puede ser utilizado en el contexto de primavera tambin. Primavera sin embargo proporciona apoyo explcito "conveniencia" para JMS, JMS, simplemente porque es el punto final de la API ms comunes utilizados en el contrato de gestin JCA punto final.

23,6 JMS Soporte Espacio de nombres


Spring 2.5 introduce un espacio de nombres XML para simplificar la configuracin de JMS. Para utilizar los elementos del espacio de nombres JMS tendr que hacer referencia al esquema de JMS:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: jms = "http://www.springframework.org/schema/jms" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd "> <- <bean/> Definiciones aqu -> </ Beans>

El espacio de nombres se compone de dos elementos de nivel superior: <listenercontainer/> y <jca-listener-container/> ambos de los cuales pueden contener uno o ms <listener/> elementos secundarios. Aqu est un ejemplo de una configuracin bsica para dos oyentes.
<jms:listener-container> <jms:listener destination = "queue.orders" ref = "orderService" method = "placeOrder" /> <jms:listener destination = "queue.confirmations" ref = "confirmationLogger" method = "log" /> </ Jms: oyente-container>

El ejemplo anterior es equivalente a la creacin de dos distintas definiciones de escucha de caf en grano y dos distintos MessageListenerAdapter definiciones de frijol como se demuestra en la Seccin 23.4.4, "Los MessageListenerAdapter " . Adems de los atributos que se muestran ms arriba, el listener elemento puede contener varios los opcionales. La siguiente tabla describe todos los atributos disponibles: Tabla 23.1. Atributos del JMS <listener> elemento
Atributo Descripcin

identificacin Un nombre de frijol para el contenedor oyente de alojamiento. Si no se

especifica un nombre de frijol se genera automticamente.


destino (requerido) ref (necesario) mtodo

El nombre de destino para esta escucha, resuelto a travs de la DestinationResolver estrategia. El nombre del objeto bean manejador. El nombre del mtodo controlador va a invocar. Si la ref apunta a un MessageListener o Spring SessionAwareMessageListener , este atributo puede ser omitido. El nombre del destino de respuesta predeterminado para enviar mensajes de respuesta a. Esto se aplicar en caso de un mensaje de solicitud que no lleve un "JMSReplyTo" de campo. El tipo de este destino ser determinado por el oyente-contenedor "destino de tipo" atributo. Nota: slo se aplica a un mtodo de detector con un valor de retorno, para que cada objeto resultado se convierte en un mensaje de respuesta. El nombre de la suscripcin duradera, si la hay. Un selector de mensajes opcional para el oyente.

-respuesta destino

suscripcin selector

El <listener-container/> elemento tambin acepta varios atributos opcionales. Esto permite la personalizacin de las distintas estrategias (por ejemplo, TaskExecutor y destinationResolver), as como la configuracin bsica de JMS y referencias de

recursos. El uso de estos atributos, es posible definir altamente personalizados contenedores oyente mientras se beneficia de la comodidad del espacio de nombres.
<Jms: oyente contenedor connection-factory = "myConnectionFactory" tareas ejecutor = "myTaskExecutor" -resolver destino = "myDestinationResolver" transaccin-manager = "myTransactionManager" concurrencia = "10"> <jms:listener destination = "queue.orders" ref = "orderService" method = "placeOrder" /> <jms:listener destination = "queue.confirmations" ref = "confirmationLogger" method = "log" /> </ Jms: oyente-container>

La siguiente tabla describe todos los atributos disponibles. Consulte el Javadoc de nivel de clase de la AbstractMessageListenerContainer y sus subclases concretas para obtener ms detalles sobre las propiedades individuales. El Javadoc tambin proporciona una discusin de opciones de transaccin y los escenarios de reenvo de mensajes. Tabla 23.2. Atributos del JMS <listener-container> elemento
Atributo contenedor de tipo connectionfactory tareaejecutora destinoresolver mensajeconvertidor destino de tipo Descripcin

El tipo de este contenedor oyente. Las opciones disponibles son: default , simple , default102 o simple102 (el valor por defecto es 'default' ). Una referencia a la JMS ConnectionFactory bean (bean el nombre por defecto es 'connectionFactory' ). Una referencia a la primavera TaskExecutor para los invocadores Receptor de JMS. Una referencia a la DestinationResolver estrategia para resolver JMS Destinations . Una referencia a la MessageConverter estrategia para convertir mensajes JMS a los argumentos de mtodo detector. El valor predeterminado es un SimpleMessageConverter . El tipo de destino de JMS para este oyente: queue , topic o durableTopic . El valor predeterminado es queue . especificado al usar suscripciones duraderas. El nivel de cach para los recursos JMS: none , connection , session , consumer o auto . Por defecto ( auto ), el nivel de cach efectivamente ser "consumidor", a menos que un gestor de transacciones externo se ha especificado - en cuyo caso el valor por defecto ser eficaz none (suponiendo Java EE estilo de gestin de transacciones donde el dado

ID de cliente El ID de cliente JMS para este contenedor oyente. Necesita ser

cache

Atributo

Descripcin

ConnectionFactory es un XA- piscina consciente). Los nativos JMS modo de confirmacin: auto , client , dups-ok o transacted . Un valor de transacted localmente se activa una reconocer transaccin Session . Como alternativa, especifique la transactionmanager atributo se describe a continuacin. El valor predeterminado es auto . Una referencia a un externo PlatformTransactionManager (por lo transaccingeneral un coordinador de transacciones XA-basado, por ejemplo, Spring manager JtaTransactionManager ). Si no se especifica, reconociendo nativo ser utilizado (ver "reconocer" atributo). El nmero de sesiones simultneas / consumidores al inicio de cada oyente. O bien puede ser un simple nmero que indica el nmero mximo (por ejemplo, "5") o un rango que indica la inferior, as como el lmite concurrencia superior (por ejemplo, "3-5"). Tenga en cuenta que un mnimo especificado es slo una sugerencia y puede ser ignorado durante la ejecucin. El valor predeterminado es 1; mantener concurrencia limitada a 1 en el caso de un oyente tema o si ordenamiento cola es importante, la posibilidad de elevar lo de las colas generales. El nmero mximo de mensajes que se carga en una sola sesin. Tenga en prefetch cuenta que el aumento de este nmero podra conducir a la inanicin de los consumidores simultneos!

Configuracin de un contenedor oyente JCA-basado con el apoyo "jms" esquema es muy similar.
<Jms: JCA-oyente-container recursos adapter = "myResourceAdapter" -resolver destino = "myDestinationResolver" transaccin-manager = "myTransactionManager" concurrencia = "10"> <jms:listener destination = "queue.orders" ref = "myMessageListener" /> </ Jms: JCA-oyente-container>

Las opciones de configuracin disponibles para la variante de JCA se describen en la siguiente tabla: Tabla 23,3. Atributos del JMS <jca-listener-container/> elemento
Atributo recursos adaptador activacin de las Descripcin

Una referencia a la JCA ResourceAdapter bean (bean el nombre por defecto es 'resourceAdapter' ). Una referencia a la JmsActivationSpecFactory . El valor

Atributo especificaciones de fbrica destino-resolver mensajeconvertidor destino de tipo ID de cliente

Descripcin

predeterminado es detectar automticamente el proveedor de JMS y su ActivationSpec clase (ver DefaultJmsActivationSpecFactory ) Una referencia a la DestinationResolver estrategia para resolver JMS Destinations . Una referencia a la MessageConverter estrategia para convertir mensajes JMS a los argumentos de mtodo detector. El valor predeterminado es un SimpleMessageConverter . El tipo de destino de JMS para este oyente: queue , topic o durableTopic . El valor predeterminado es queue . El ID de cliente JMS para este contenedor oyente. Necesita ser especificado al usar suscripciones duraderas. Los nativos JMS modo de confirmacin: auto , client , dups-ok o transacted . Un valor de transacted localmente se activa una transaccin Session . Como alternativa, especifique la transactionmanager atributo se describe a continuacin. El valor predeterminado es auto . Una referencia a una primavera JtaTransactionManager o un javax.transaction.TransactionManager para dando inicio a una transaccin XA para cada mensaje entrante. Si no se especifica, reconociendo nativo se usar (ver el "reconocimiento" atributo). El nmero de sesiones simultneas / consumidores al inicio de cada oyente. O bien puede ser un simple nmero que indica el nmero mximo (por ejemplo, "5") o un rango que indica la inferior, as como el lmite superior (por ejemplo, "3-5"). Tenga en cuenta que un mnimo especificado solo es un pequeo y por lo general se tendr en cuenta en tiempo de ejecucin cuando se utiliza un contenedor JCA oyente. El valor predeterminado es 1. El nmero mximo de mensajes que se carga en una sola sesin. Tenga en cuenta que el aumento de este nmero podra conducir a la inanicin de los consumidores simultneos!

reconocer

transaccinmanager

concurrencia

prefetch

24. JMX 24.1 Introduccin


El soporte JMX en Spring le proporciona las caractersticas para integrarse fcilmente y de forma transparente su aplicacin de primavera en una infraestructura de JMX. JMX? Este captulo no es una introduccin a JMX ... no trata de explicar las motivaciones de por qu uno podra querer utilizar JMX (o incluso lo que las letras representan en realidad JMX). Si usted es nuevo en JMX, echa un vistazo a la Seccin 24.8, "Recursos adicionales" al final de este captulo.

En concreto, el apoyo de Spring JMX proporciona cuatro funciones principales:


El registro automtico de cualquier frijol de primavera como un MBean JMX Un mecanismo flexible para el control de la interfaz de gestin de los frijoles La exposicin declarativa de MBeans ms remoto, JSR-160 conectores El sencillo proxy MBean de los recursos tanto locales como remotos

Estas caractersticas estn diseadas para trabajar sin acoplamiento componentes de la aplicacin de cualquiera de las interfaces de primavera o JMX y clases. En efecto, la mayor parte de sus clases de la aplicacin no tiene que ser consciente de cualquiera de primavera o JMX con el fin de tomar ventaja de las caractersticas del resorte JMX.

24.2 Exportacin de sus granos a JMX


La clase principal en JMX Spring marco es la MBeanExporter . Esta clase se encarga de tomar los granos de primavera y registrarlos con un JMX MBeanServer . Por ejemplo, considere la siguiente clase:
paquete org.springframework.jmx; pblico JmxTestBean clase implementa IJmxTestBean { private String nombre; edad int privado; privado isSuperman booleano; ObtenerLongevidad public int () { volver edad; } setAge public void (int edad) { esta edad = edad.; } setName public void (String nombre) { . este nombre = nombre; } public String getName () { devolver el nombre; } public int suma (int x, int y) { return x + y; } dontExposeMe public void () { tirar RuntimeException nuevo (); } }

Para acceder a los mtodos y propiedades de este grano como atributos y operaciones de un MBean slo tiene que configurar una instancia de la MBeanExporter clase en el archivo de configuracin y pase el frijol, como se muestra a continuacin:

<beans> <- Este grano no debe ser inicializado con pereza si el exportador va a suceder -> <bean id = clase = "exporter" "org.springframework.jmx.export.MBeanExporter" lazy-init="false"> <propiedad nombre = "beans"> <map> clave = <entry "bean:name=testBean1" value-ref = "testBean" /> </ Map> </ Propiedad> </ Bean> <bean id = "testBean" class = "org.springframework.jmx.JmxTestBean"> <propiedad nombre = valor = "name" "TEST" /> <propiedad nombre = valor = "age" "100" /> </ Bean> </ Beans>

La definicin de frijol pertinente del fragmento anterior es la configuracin exporter de frijol. El beans propiedad cuenta la MBeanExporter exactamente cules de sus granos deben ser exportados a la JMX MBeanServer . En la configuracin predeterminada, la clave de cada entrada en el beans Map se utiliza como ObjectName del bean referenciado por el valor de la entrada correspondiente. Este comportamiento se puede cambiar como se describe en la Seccin 24.4, "Control del ObjectName s para sus granos " . Con esta configuracin, el testBean frijol se expone como un MBean bajo el ObjectName bean:name=testBean1 . Por defecto, todas las propiedades pblicas del frijol se exponen como atributos y todos los mtodos pblicos (bar los heredados del Object clase) se exponen como operaciones.
24.2.1 Creacin de un MBeanServer

La configuracin anterior se supone que la aplicacin se est ejecutando en un entorno que tiene una (y slo una) MBeanServer ya se est ejecutando. En este caso, Spring intentar localizar el funcionamiento MBeanServer y registrar sus frijoles con ese servidor (si lo hay). Este comportamiento es til cuando la aplicacin se ejecuta dentro de un contenedor como Tomcat o WebSphere de IBM que tiene su propio MBeanServer . Sin embargo, este enfoque no es til en un entorno autnomo, o cuando se ejecuta dentro de un contenedor que no proporciona un MBeanServer . Para hacer frente a esto usted puede crear un MBeanServer instancia declarativa mediante la adicin de una instancia de la org.springframework.jmx.support.MBeanServerFactoryBean clase a su configuracin. Tambin puede asegurarse de que un determinado MBeanServer se usa al establecer el valor de la MBeanExporter 's server alojamiento a la MBeanServer valor devuelto por un MBeanServerFactoryBean ; por ejemplo:
<beans>

<bean id = "mbeanServer" class = "org.springframework.jmx.support.MBeanServerFactoryBean" /> <! este bean necesita ser ansiosamente pre-instanciada para que el exportador de ocurrir; esto significa que no se deben marcar como perezosamente inicializado -> <bean id = "exporter" class = "org.springframework.jmx.export.MBeanExporter"> <propiedad nombre = "beans"> <map> clave = <entry "bean:name=testBean1" value-ref = "testBean" /> </ Map> </ Propiedad> <propiedad nombre = "server" ref = "mbeanServer" /> </ Bean> <bean id = "testBean" class = "org.springframework.jmx.JmxTestBean"> <propiedad nombre = valor = "name" "TEST" /> <propiedad nombre = valor = "age" "100" /> </ Bean> </ Beans>

Aqu una instancia de MBeanServer es creado por el MBeanServerFactoryBean y se suministra a la MBeanExporter a travs de la propiedad del servidor. Cuando usted proporciona su propio MBeanServer ejemplo, el MBeanExporter no intentar localizar un funcionamiento MBeanServer y utilizar el suministrado MBeanServer ejemplo. Para que esto funcione correctamente, debe (por supuesto) tienen una implementacin JMX en su ruta de clase.
24.2.2 La reutilizacin de una ya existente MBeanServer

Si no hay ningn servidor se especifica, el MBeanExporter intenta detectar automticamente un funcionamiento MBeanServer . Esto funciona en la mayora de medio ambiente en el que slo un MBeanServer ejemplo se utiliza, sin embargo, cuando existan varias instancias, el exportador puede elegir el servidor equivocado. En tales casos, se debe usar el MBeanServer agentId para indicar qu instancia a utilizar:
<beans> <bean id = "mbeanServer" class = "org.springframework.jmx.support.MBeanServerFactoryBean"> <- Indica que mirar primero para un servidor -> <propiedad nombre = valor = "locateExistingServerIfPossible" "true" /> <- Bsqueda de la instancia MBeanServer con el AgentId dado -> <Nombre de propiedad = "AgentId" value = "agentId> ejemplo <MBeanServer" /> </ Bean> <bean id = "exporter" class = "org.springframework.jmx.export.MBeanExporter"> <propiedad nombre = "server" ref = "mbeanServer" />

... </ Bean> </ Beans>

Para las plataformas / casos donde el actual MBeanServer tiene una dinmica (o desconocido) agentId que se recupera a travs de mtodos de bsqueda, se debe utilizar mtodo de fbrica :
<beans> <bean id = "exporter" class = "org.springframework.jmx.export.MBeanExporter"> <propiedad nombre = "server"> <- MBeanServerLocator Custom -> <bean class = factory-method "platform.package.MBeanServerLocator" = "locateMBeanServer" /> </ Propiedad> <- Otros granos aqu -> </ Bean> </ Beans>

24.2.3 Lazy-inicializadas MBeans

Si configura un frijol con la MBeanExporter que tambin est configurado para la inicializacin perezosa, entonces el MBeanExporter no se rompa este contrato y evitar crear una instancia del bean. En su lugar, se registrar un proxy con el MBeanServer y aplazar la obtencin de la haba del contenedor hasta la primera invocacin en el proxy se produce.
24.2.4 Registro automtico de MBeans

Los granos que se exportan a travs de la MBeanExporter y ya estn MBeans vlidos se registran como se encuentra, la MBeanServer sin necesidad de intervencin de la primavera. MBeans pueden ser detectados automticamente por el MBeanExporter estableciendo la autodetect de la propiedad true :
<bean id = "exporter" class = "org.springframework.jmx.export.MBeanExporter"> <propiedad nombre = valor = "autodetect" "true" /> </ Bean> nombre = <bean "spring:mbean=true" class = "org.springframework.jmx.export.TestDynamicMBean" />

Aqu, el frijol llamado spring:mbean=true ya es un vlido JMX MBean y se registrar automticamente en la primavera. De forma predeterminada, el frijol que se encuentran detectado automticamente por JMX registro tienen su nombre del bean utiliza como ObjectName . Este comportamiento puede ser anulado, segn se detalla en la Seccin 24.4, "Control del ObjectName s para sus granos " .

24.2.5 Controlar el comportamiento de registro

Considere el escenario donde un resorte MBeanExporter intenta registrar un MBean con un MBeanServer utilizando el ObjectName 'bean:name=testBean1' . Si un MBean instancia ya ha sido registrado bajo ese mismo ObjectName , el comportamiento predeterminado es no (y lanzar un InstanceAlreadyExistsException ). Es posible controlar el comportamiento de exactamente lo que ocurre cuando un MBean se ha registrado en un MBeanServer . Soporte de Spring JMX permite tres comportamientos diferentes de registro para controlar el comportamiento de registro cuando el proceso de registro comprueba que un MBean ya ha sido registrado bajo el mismo ObjectName ; estos comportamientos registro se resumen en la siguiente tabla: Tabla 24.1. Comportamientos de registro
Registro de comportamiento Explicacin

Este es el comportamiento por defecto de registro. Si un MBean instancia ya ha sido registrado bajo el mismo ObjectName , el MBean que se est REGISTRATION_FAIL_ON_EXISTING registrando no sern registrados y un InstanceAlreadyExistsException ser lanzado ser. El actual MBean se ve afectada. Si un MBean instancia ya ha sido registrado bajo el mismo ObjectName , el MBean que se est registrando no se registrarn. El actual MBean no se ve afectada, y no Exception ser lanzado ser. REGISTRATION_IGNORE_EXISTING Esto es til en situaciones donde mltiples aplicaciones desea compartir una comn MBean en un compartido MBeanServer . Si un MBean instancia ya ha sido registrado bajo el mismo ObjectName , el actual MBean que se REGISTRATION_REPLACE_EXISTING registr previamente ser registrada y el nuevo MBean se registrar en su lugar (el nuevo MBean sustituye eficazmente el ejemplo anterior).

Los valores anteriores se definen como constantes en la MBeanRegistrationSupport clase (la MBeanExporter clase se deriva de esta superclase). Si desea cambiar el comportamiento predeterminado de registro, slo tiene que establecer el valor de la registrationBehaviorName propiedad en su MBeanExporter definicin de uno de esos valores. El siguiente ejemplo ilustra cmo efectuar un cambio en el comportamiento por defecto para el registro REGISTRATION_REPLACE_EXISTING comportamiento:
<beans>

<bean id = "exporter" class = "org.springframework.jmx.export.MBeanExporter"> <propiedad nombre = "beans"> <map> clave = <entry "bean:name=testBean1" value-ref = "testBean" /> </ Map> </ Propiedad> <propiedad nombre = valor = "registrationBehaviorName" "REGISTRATION_REPLACE_EXISTING" /> </ Bean> <bean id = "testBean" class = "org.springframework.jmx.JmxTestBean"> <propiedad nombre = valor = "name" "TEST" /> <propiedad nombre = valor = "age" "100" /> </ Bean> </ Beans>

24.3 El control de la interfaz de gestin de los frijoles


En el ejemplo anterior, que tena poco control sobre la interfaz de gestin de la haba, todas las propiedades y mtodos pblicos de cada grano exportado fue expuesto como atributos JMX y operaciones, respectivamente. Para ejercer un control ms preciso sobre exactamente qu propiedades y mtodos de los beans exportados son realmente expuestos como atributos JMX y operaciones, Spring JMX proporciona un mecanismo amplio y extensible para el control de las interfaces de administracin de sus granos.
24.3.1 El MBeanInfoAssembler Interface

Detrs de las escenas, los MBeanExporter delegados a una implementacin de la org.springframework.jmx.export.assembler.MBeanInfoAssembler interfaz que se encarga de definir la interfaz de gestin de cada grano que se est expuesto. La implementacin por defecto,
org.springframework.jmx.export.assembler.SimpleReflectiveMBeanInfoAsse mbler , simplemente define una interfaz de gestin que expone todas las propiedades y

mtodos pblicos (como se vio en los ejemplos anteriores). Spring proporciona dos implementaciones adicionales de la MBeanInfoAssembler interfaz que le permiten controlar la interfaz de gestin generados usando ya sea a nivel de fuente metadatos o cualquier interfaz arbitraria.
24.3.2 Usando Fuente Nivel de metadatos (anotaciones JDK 5.0)

Usando el MetadataMBeanInfoAssembler puede definir las interfaces de administracin para sus granos utilizando metadatos del nivel de fuente. La lectura de los metadatos est encapsulado por el org.springframework.jmx.export.metadata.JmxAttributeSource interfaz. Primavera JMX proporciona una implementacin predeterminada que utiliza anotaciones JDK 5.0, a saber
org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource . El MetadataMBeanInfoAssembler se debe configurar con una instancia de la

aplicacin de la JmxAttributeSource interfaz para que funcione correctamente (no hay por defecto). Para marcar un grano para la exportacin a JMX, debe anotar la clase de bean con el ManagedResource anotacin. Cada mtodo que desea exponer como una operacin debe estar marcado con el ManagedOperation anotacin y cada propiedad que desea exponer deben estar marcados con el ManagedAttribute anotacin. Al marcar las propiedades que puede omitir cualquiera de la anotacin del captador o el colocador para crear un atributo de slo escritura o de slo lectura, respectivamente. El siguiente ejemplo muestra la versin anotada de la JmxTestBean clase que vimos anteriormente:
paquete org.springframework.jmx; importar org.springframework.jmx.export.annotation.ManagedResource; importar org.springframework.jmx.export.annotation.ManagedOperation; importar org.springframework.jmx.export.annotation.ManagedAttribute; @ ManagedResource (ObjectName = "bean: nombre = testBean4", description = "Mi bean gestionado", log = true, logfile = "jmx.log", currencyTimeLimit = 15, persistPolicy = "OnUpdate", persistPeriod = 200, persistLocation = "foo", persistName = "bar") pblico AnnotationTestBean clase implementa IJmxTestBean { private String nombre; edad int privado; @ ManagedAttribute (description = "El atributo Age", currencyTimeLimit = 15) ObtenerLongevidad public int () { volver edad; } setAge public void (int edad) { esta edad = edad.; } @ ManagedAttribute (description = "El atributo Name", currencyTimeLimit = 20, defaultValue = "bar", persistPolicy = "OnUpdate") setName public void (String nombre) { . este nombre = nombre; } @ ManagedAttribute (defaultValue = "foo", = 300 persistPeriod) public String getName () { devolver el nombre; } @ ManagedOperation (description = "Sumar dos nmeros") @ ManagedOperationParameters ({ @ ManagedOperationParameter (name = "x", description = "El primer nmero"), @ ManagedOperationParameter (name = "y", description = "El segundo nmero")})

public int suma (int x, int y) { return x + y; } dontExposeMe public void () { tirar RuntimeException nuevo (); } }

Aqu se puede ver que el JmxTestBean clase est marcada con el ManagedResource anotacin y que esta ManagedResource anotacin est configurado con un conjunto de propiedades. Estas propiedades se pueden utilizar para configurar varios aspectos de la MBean que se genera por la MBeanExporter , y se explican con mayor detalle ms adelante en la seccin titulada Seccin 24.3.3, "Nivel de Fuente tipos de metadatos" . Tambin se dar cuenta de que tanto la age y el name las propiedades se anotan con el ManagedAttribute anotacin, pero en el caso de la age la propiedad, slo el captador est marcada. Esto har que ambas de estas propiedades para ser incluido en la interfaz de gestin como atributos, pero la age atributo ser de slo lectura. Por ltimo, te dars cuenta de que el add(int, int) mtodo est marcado con el ManagedOperation mientras que el atributo dontExposeMe() mtodo no es. Esto har que la interfaz de gestin para contener slo una operacin, add(int, int) , cuando se utiliza el MetadataMBeanInfoAssembler . La configuracin siguiente muestra cmo configurar el MBeanExporter utilizar el MetadataMBeanInfoAssembler :
<beans> <bean id = "exporter" class = "org.springframework.jmx.export.MBeanExporter"> <propiedad nombre = "assembler" ref = "assembler" /> <propiedad nombre = "namingStrategy" ref = "namingStrategy" /> <propiedad nombre = valor = "autodetect" "true" /> </ Bean> <Bean id = "jmxAttributeSource" class = "org.springframework.jmx.export.annotation.AnnotationJmxAttributeSourc e" /> <- Va a crear la interfaz de administracin mediante metadatos anotacin -> <Bean id = "ensamblador" class = "org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler"> <propiedad nombre = "attributeSource" ref = "jmxAttributeSource" /> </ Bean> <- Recoger el ObjectName de la anotacin -> <Bean id = "NamingStrategy" class = "org.springframework.jmx.export.naming.MetadataNamingStrategy">

<propiedad nombre = "attributeSource" ref = "jmxAttributeSource" /> </ Bean> <bean id = "testBean" class = "org.springframework.jmx.AnnotationTestBean"> <propiedad nombre = valor = "name" "TEST" /> <propiedad nombre = valor = "age" "100" /> </ Bean> </ Beans>

Aqu se puede ver que un MetadataMBeanInfoAssembler frijol se ha configurado con una instancia de la AnnotationJmxAttributeSource clase y se pasa al MBeanExporter travs de la propiedad ensamblador. Esto es todo lo que se requiere para aprovechar las interfaces de administracin basadas en metadatos para sus MBeans expuestos por resorte.
24.3.3 Nivel de Fuente tipos de metadatos

Los siguientes tipos de metadatos de nivel de fuente estn disponibles para su uso en la primavera de JMX: Tabla 24,2. Nivel de Fuente tipos de metadatos
Propsito Marque todas las instancias de una Class como JMX recursos administrados Anotacin Tipo de anotacin

@ManagedResource

Clase

Marcar un mtodo como una @ManagedOperation operacin JMX Marcar un getter o setter como la mitad de un atributo @ManagedAttribute JMX Definir descripciones de los parmetros de operacin
@ManagedOperationParameter y @ManagedOperationParameters

Mtodo Mtodo (getters y setters solamente) Mtodo

Los parmetros de configuracin estn disponibles para su uso en este tipo de metadatos a nivel de cdigo fuente: Tabla 24.3. Nivel Fuente Parmetros de los metadatos
Parmetro Descripcin Se aplica a

Parmetro

Descripcin Utilizado por

Se aplica a

ObjectName

MetadataNamingStrategy

para determinar el ObjectName de un recurso administrado Define la descripcin del ambiente de los recursos, atributo u operacin Establece el valor de la

ManagedResource

ManagedResource , ManagedAttribute , ManagedOperation , ManagedOperationParameter

description

currencyTimeLimit currencyTimeLimit campo

descriptor Establece el valor de la defaultValue campo descriptor

ManagedResource , ManagedAttribute

defaultValue

ManagedAttribute

log

Establece el valor del log campo ManagedResource descriptor Establece el valor del logFile de campo descriptor Establece el valor de la persistPolicy campo descriptor Establece el valor de la persistPeriod campo descriptor Establece el valor de la persistLocation campo descriptor
ManagedResource

logFile

persistPolicy

ManagedResource

persistPeriod

ManagedResource

persistLocation

ManagedResource

persistName

Establece el valor de la ManagedResource persistName campo descriptor Establece el nombre para mostrar ManagedOperationParameter de un parmetro de operacin Establece el ndice de un parmetro de operacin
ManagedOperationParameter

name

index

24.3.4 El AutodetectCapableMBeanInfoAssembler interfaz

Para simplificar an ms la configuracin, Spring introduce el AutodetectCapableMBeanInfoAssembler interfaz que extiende la MBeanInfoAssembler interfaz para aadir soporte para la deteccin automtica de los recursos MBean. Si configura el MBeanExporter con una instancia de AutodetectCapableMBeanInfoAssembler entonces se le permite "votar" sobre la inclusin de los granos de exposicin a JMX. Fuera de la caja, la nica implementacin de la AutodetectCapableMBeanInfo interfaz es el MetadataMBeanInfoAssembler que votarn para incluir cualquier bean que est marcado con el ManagedResource atributo. El enfoque predeterminado en este caso es utilizar el nombre del bean como el ObjectName lo que resulta en una configuracin como esta:
<beans> <bean id = "exporter" class = "org.springframework.jmx.export.MBeanExporter"> <- Observe cmo no "frijoles" se configura explcitamente aqu -> <propiedad nombre = valor = "autodetect" "true" /> <propiedad nombre = "assembler" ref = "assembler" /> </ Bean> <bean id = "testBean" class = "org.springframework.jmx.JmxTestBean"> <propiedad nombre = valor = "name" "TEST" /> <propiedad nombre = valor = "age" "100" /> </ Bean> <bean id = "assembler" class = "org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler"> <propiedad nombre = "attributeSource"> <bean class = "org.springframework.jmx.export.annotation.AnnotationJmxAttributeSourc e" /> </ Propiedad> </ Bean> </ Beans>

Tenga en cuenta que en esta configuracin no judas se pasan a la MBeanExporter , sin embargo, la JmxTestBean todava se registrar ya que est marcado con el ManagedResource atributo y el MetadataMBeanInfoAssembler lo detecta y votos para incluirlo. El nico problema con este enfoque es que el nombre de la JmxTestBean ahora tiene un significado comercial. Puede resolver este problema cambiando el comportamiento predeterminado de ObjectName creacin tal como se define en la Seccin 24.4, "Control del ObjectName s para sus granos " .
24.3.5 Definicin de interfaces de gestin que utilizan las interfaces de Java

Adems de la MetadataMBeanInfoAssembler , Spring tambin incluye la InterfaceBasedMBeanInfoAssembler que le permite limitar los mtodos y

propiedades que se exponen basado en el conjunto de mtodos definidos en un conjunto de interfaces. Aunque el mecanismo estndar para exponer MBeans es el uso de interfaces y un esquema de denominacin simple, el InterfaceBasedMBeanInfoAssembler extiende esta funcionalidad mediante la eliminacin de la necesidad de que las convenciones de nomenclatura, que le permite utilizar ms de una interfaz y la eliminacin de la necesidad de que los granos de implementar las interfaces MBean . Considere la posibilidad de esta interfaz que se utiliza para definir una interfaz de gestin de la JmxTestBean clase que vimos anteriormente:
pblico IJmxTestBean interfaz { public int suma (int x, int y); myOperation pblica de largo (); ObtenerLongevidad public int (); setAge public void (int edad); setName public void (String nombre); public String getName (); }

Esta interfaz define los mtodos y propiedades que se exponen como operaciones y atributos del MBean JMX. El cdigo siguiente muestra cmo configurar Spring JMX para usar esta interfaz como la definicin de la interfaz de administracin:
<beans> <bean id = "exporter" class = "org.springframework.jmx.export.MBeanExporter"> <propiedad nombre = "beans"> <map> clave = <entry "bean:name=testBean5" value-ref = "testBean" /> </ Map> </ Propiedad> <propiedad nombre = "assembler"> <bean class = "org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssem bler"> <propiedad nombre = "managedInterfaces"> <valor> org.springframework.jmx.IJmxTestBean </ value> </ Propiedad> </ Bean> </ Propiedad> </ Bean> <bean id = "testBean" class = "org.springframework.jmx.JmxTestBean"> <propiedad nombre = valor = "name" "TEST" /> <propiedad nombre = valor = "age" "100" /> </ Bean>

</ Beans>

Aqu se puede ver que el InterfaceBasedMBeanInfoAssembler est configurado para utilizar el IJmxTestBean interfaz en la construccin de la interfaz de gestin de cualquier grano. Es importante comprender que los granos procesados por el InterfaceBasedMBeanInfoAssembler no se requieren para implementar la interfaz utilizada para generar la interfaz de administracin JMX. En el caso anterior, el IJmxTestBean interfaz se utiliza para la construccin de todas las interfaces de gestin para todos los granos. En muchos casos esto no es el comportamiento deseado y es posible que desee utilizar diferentes interfaces para diferentes granos. En este caso, se puede pasar InterfaceBasedMBeanInfoAssembler un Properties ejemplo a travs de la interfaceMappings propiedad, donde la clave de cada entrada es el nombre del bean y el valor de cada entrada es una lista separada por comas de nombres de interfaz a utilizar para ese grano. Si no se especifica la interfaz de administracin a travs de cualquiera de los managedInterfaces o interfaceMappings propiedades, entonces el InterfaceBasedMBeanInfoAssembler se reflejar en el frijol y el uso de todas las interfaces implementadas por ese grano para crear la interfaz de gestin.
24.3.6 Usando MethodNameBasedMBeanInfoAssembler

El MethodNameBasedMBeanInfoAssembler le permite especificar una lista de nombres de los mtodos que se expondrn a JMX como atributos y operaciones. El cdigo siguiente muestra un ejemplo de configuracin para esto:
<bean id = "exporter" class = "org.springframework.jmx.export.MBeanExporter"> <propiedad nombre = "beans"> <map> clave = <entry "bean:name=testBean5" value-ref = "testBean" /> </ Map> </ Propiedad> <propiedad nombre = "assembler"> <bean class = "org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAsse mbler"> <propiedad nombre = "managedMethods"> <valor> add, myOperation, getName, setName, ObtenerLongevidad </ value> </ Propiedad> </ Bean> </ Propiedad> </ Bean>

Aqu se puede ver que los mtodos de add y myOperation se exponen como operaciones JMX y getName() , setName(String) y getAge() ser expuesto como el medio apropiado de un atributo JMX. En el cdigo anterior, las asignaciones de mtodos se aplican a los granos que estn expuestos a JMX. Para controlar la exposicin al mtodo en forma de frijol por-bean, utilice el methodMappings propiedad

de MethodNameMBeanInfoAssembler para asignar nombres de frijol a las listas de nombres de mtodo.

24.4 Control del ObjectName s para sus granos


Detrs de las escenas, los MBeanExporter delegados a una implementacin de la ObjectNamingStrategy obtener ObjectName s para cada uno de los granos que se registren. La implementacin por defecto, KeyNamingStrategy , ser, por defecto, utilice la llave del beans Map como ObjectName . Adems, el KeyNamingStrategy puede asignar la clave del beans Map a una entrada en un Properties de archivo (o los archivos) para resolver el ObjectName . Adems de la KeyNamingStrategy , Spring proporciona dos adicionales ObjectNamingStrategy implementaciones: el IdentityNamingStrategy que construye un ObjectName basa en la identidad JVM del grano y la MetadataNamingStrategy que usa los metadatos de nivel de fuente para obtener el ObjectName .
24.4.1 Lectura ObjectName s de Properties

Usted puede configurar su propio KeyNamingStrategy instancia y configurarlo para leer ObjectName s de un Properties ejemplo en vez de usar la tecla de frijol. El KeyNamingStrategy intentar encontrar una entrada en la Properties con una tecla correspondiente a la tecla de frijol. Si no se encuentra una entrada o si la Properties de la instancia es null entonces la clave bean utiliza. El cdigo siguiente muestra un ejemplo de configuracin para el KeyNamingStrategy :
<beans> <bean id = "exporter" class = "org.springframework.jmx.export.MBeanExporter"> <propiedad nombre = "beans"> <map> <entry clave = "testBean" value-ref = "testBean" /> </ Map> </ Propiedad> <propiedad nombre = "namingStrategy" ref = "namingStrategy" /> </ Bean> <bean id = "testBean" class = "org.springframework.jmx.JmxTestBean"> <propiedad nombre = valor = "name" "TEST" /> <propiedad nombre = valor = "age" "100" /> </ Bean> <bean id = "namingStrategy" class = "org.springframework.jmx.export.naming.KeyNamingStrategy"> <propiedad nombre = "mappings"> <props> <prop clave = "testBean"> bean: nombre = testBean1 </ prop> </ Accesorios> </ Propiedad> <propiedad nombre = "mappingLocations"> names1.properties <valor>, names2.properties </ value> </ Propiedad>

</ Bean </ Beans>

He aqu un ejemplo de KeyNamingStrategy est configurado con un Properties instancia que se fusionaron a partir de la Properties instancia definida por la propiedad de mapas y los archivos de propiedades ubicadas en las rutas definidas por la propiedad asignaciones. En esta configuracin, el testBean frijol se les dar la ObjectName bean:name=testBean1 ya que es la entrada en el Properties instancia que tenga una tecla correspondiente a la clave de frijol. Si no hay ninguna entrada en el Properties instancia se puede encontrar a continuacin, el nombre clave de frijol se utiliza como ObjectName .
24.4.2 Uso de la MetadataNamingStrategy

El MetadataNamingStrategy utiliza el objectName propiedad de la ManagedResource atributo en cada bean para crear el ObjectName . El cdigo siguiente muestra la configuracin para la MetadataNamingStrategy :
<beans> <bean id = "exporter" class = "org.springframework.jmx.export.MBeanExporter"> <propiedad nombre = "beans"> <map> <entry clave = "testBean" value-ref = "testBean" /> </ Map> </ Propiedad> <propiedad nombre = "namingStrategy" ref = "namingStrategy" /> </ Bean> <bean id = "testBean" class = "org.springframework.jmx.JmxTestBean"> <propiedad nombre = valor = "name" "TEST" /> <propiedad nombre = valor = "age" "100" /> </ Bean> <bean id = "namingStrategy" class = "org.springframework.jmx.export.naming.MetadataNamingStrategy"> <propiedad nombre = "attributeSource" ref = "attributeSource" /> </ Bean> <Bean id = "attributeSource" class = "org.springframework.jmx.export.annotation.AnnotationJmxAttributeSourc e" /> </ Beans>

Si no objectName se ha previsto la ManagedResource atributo, entonces un ObjectName ser creado con el siguiente formato: [totalmente calificado-packagename]: type = [a corto classname] name = [bean-name]. Por ejemplo, la generada ObjectName para el bean siguiente sera: com.foo: type = MyClass, name = myBean.
<bean id = "myBean" class = "com.foo.MyClass" />

24.4.3 Configuracin de exportacin basada en anotacin MBean

Si prefiere utilizar el enfoque basado en anotacin para definir las interfaces de administracin, y luego una subclase conveniencia de MBeanExporter est disponible: AnnotationMBeanExporter . Cuando se define una instancia de esta subclase, la namingStrategy , assembler , y attributeSource configuracin ya no es necesaria, ya que siempre usar estndar Java anotacin basada en metadatos (autodeteccin siempre est habilitada tambin). De hecho, en lugar de definir un MBeanExporter frijol, una sintaxis ms simple, incluso con el apoyo de la @EnableMBeanExport @Configuration anotacin.
@ Configuracin @ EnableMBeanExport AppConfig clase pblica { }

Si prefiere configuracin basada en XML del " context:mbean-export' elemento tiene el mismo propsito.
<context:mbean-export/>

Puede proporcionar una referencia a un MBean determinado server , si es necesario, y el defaultDomain atributo (propiedad de AnnotationMBeanExporter ) acepta un valor alternativo para los generados MBean ObjectNames dominios. Esto se usara en lugar del nombre de paquete completo como se describe en la seccin anterior sobre MetadataNamingStrategy .
@ EnableMBeanExport (server = "myMBeanServer", defaultdomain = "mydomain") @ Configuracin ContextConfiguration { } <context:mbean-export server = "myMBeanServer" default-domain = "myDomain" />

Nota

No usar interfaz proxies basados AOP en combinacin con la deteccin automtica de anotaciones JMX en sus clases de frijol. 'Hide' basados Interface-apoderados de la clase de destino, que tambin oculta la JMX logr anotaciones de recursos. Por lo tanto, el uso de la clase de objetivos poderes en tal caso: a travs de la creacin de la bandera 'proxy-target-class' en <aop:config/> , <tx:annotation-driven/> , etc De lo contrario, los granos de JMX puede ser ignorado en el inicio ...

24,5 JSR-160 Conectores


Para el acceso remoto, Spring JMX mdulo ofrece dos FactoryBean implementaciones dentro del org.springframework.jmx.support paquete para la creacin de los dos conectores de servidor y de cliente.

24.5.1 Conectores del lado del servidor

Tener Spring JMX crear, iniciar y exponer un JSR-160 JMXConnectorServer utilizar la siguiente configuracin:
<bean id = "serverConnector" class = "org.springframework.jmx.support.ConnectorServerFactoryBean" />

Por defecto ConnectorServerFactoryBean crea un JMXConnectorServer obligado a "service:jmx:jmxmp://localhost:9875" . El serverConnector bean expone as el local MBeanServer a los clientes a travs del protocolo JMXMP en localhost, puerto 9875. Tenga en cuenta que el protocolo JMXMP se marca como opcional en la especificacin JSR 160: en la actualidad, la principal fuente abierta JMX implementacin, MX4J, y el que viene con J2SE 5.0 no son compatibles con JMXMP. Para especificar otra direccin URL y registrar el JMXConnectorServer s mismo con el MBeanServer utilizar el serviceUrl y ObjectName propiedades, respectivamente:
<Bean id = "serverConnector" class = "org.springframework.jmx.support.ConnectorServerFactoryBean"> <propiedad nombre = valor = "objectName" "connector:name=rmi" /> Nombre <property = "serviceUrl" value = "servicio: jmx: rmi :/ / localhost / jndi / rmi :/ / localhost: 1099/myconnector" /> </ Bean>

Si el ObjectName propiedad se establece en la primavera registrar automticamente su conexin con el MBeanServer bajo que ObjectName . El siguiente ejemplo muestra el conjunto de parmetros que se pueden pasar a la ConnectorServerFactoryBean al crear un JMXConnector:
<Bean id = "serverConnector" class = "org.springframework.jmx.support.ConnectorServerFactoryBean"> <propiedad nombre = valor = "objectName" "connector:name=iiop" /> Nombre <property = "serviceUrl" value = "servicio: jmx: iiop :/ / localhost / jndi / iiop :/ / localhost: 900/myconnector" /> <propiedad nombre = valor = "threaded" "true" /> <propiedad nombre = valor = "daemon" "true" /> <propiedad nombre = "environment"> <map> <entry clave = valor = "someKey" "someValue" /> </ Map> </ Propiedad> </ Bean>

Tenga en cuenta que cuando se utiliza un conector basado en RMI se necesita el servicio de bsqueda (tnameserv o rmiregistry) para poner en marcha a fin de que el registro del nombre para completar. Si usted est usando la primavera para exportar servicios a distancia para usted a travs de RMI, entonces Primavera ya se han construido un registro RMI. Si no, usted puede comenzar fcilmente un registro mediante el siguiente cdigo de configuracin:

<bean id = "registry" class = "org.springframework.remoting.rmi.RmiRegistryFactoryBean"> <propiedad nombre = valor = "port" "1099" /> </ Bean>

24.5.2 Conectores del lado del cliente

Para crear un MBeanServerConnection a una distancia JSR-160 habilitado MBeanServer utilizar el MBeanServerConnectionFactoryBean como se muestra a continuacin:
<bean id = "clientConnector" class = "org.springframework.jmx.support.MBeanServerConnectionFactoryBean"> <propiedad nombre = valor = "serviceUrl" "service:jmx:rmi://localhost/jndi/rmi://localhost:1099/jmxrmi" /> </ Bean>

24.5.3 JMX sobre arpillera / Hessen / SOAP

JSR-160 permite extensiones a la forma en que la comunicacin se realiza entre el cliente y el servidor. Los ejemplos anteriores utilizan el obligatorio basado en RMI aplicacin requerida por la especificacin JSR-160 (IIOP y JRMP) y el JMXMP (opcional). Mediante el uso de otros proveedores o implementaciones JMX (como MX4J ) puede tomar ventaja de protocolos como SOAP, arpillera, arpillera ms simple HTTP o SSL y otros:
<bean id = "serverConnector" class = "org.springframework.jmx.support.ConnectorServerFactoryBean"> <propiedad nombre = valor = "objectName" "connector:name=burlap" /> <propiedad nombre = valor = "serviceUrl" "service:jmx:burlap://localhost:9874" /> </ Bean>

En el caso del ejemplo anterior, se utiliz MX4J 3.0.0, vase la documentacin oficial de MX4J para ms informacin.

24,6 MBeans acceso a travs de servidores proxy


Primavera JMX permite crear proxies que redirigir las llamadas a MBeans matriculados en un local o remoto MBeanServer . Estos poderes le proporcionar una interfaz estndar de Java a travs del cual se puede interactuar con los MBeans. El cdigo siguiente muestra cmo configurar un proxy para un MBean ejecutando en un local MBeanServer :
<bean id = "proxy" class = "org.springframework.jmx.access.MBeanProxyFactoryBean"> <propiedad nombre = valor = "objectName" "bean:name=testBean" /> <propiedad nombre = valor = "proxyInterface" "org.springframework.jmx.IJmxTestBean" /> </ Bean>

Aqu se puede ver que se crea un proxy para el MBean registrada bajo el ObjectName : bean:name=testBean . El conjunto de interfaces que implementarn el proxy es controlado por el proxyInterfaces propiedad y las normas para los mtodos de

asignacin y las propiedades de estas interfaces para las operaciones y atributos en el MBean son las mismas reglas utilizadas por el InterfaceBasedMBeanInfoAssembler . El MBeanProxyFactoryBean puede crear un proxy para cualquier MBean que se puede acceder a travs de un MBeanServerConnection . De forma predeterminada, el local MBeanServer se encuentra y se utiliza, pero se puede modificar esto y proporcionar una MBeanServerConnection apuntando a una distancia MBeanServer para atender a los proxies que apuntan a MBeans remotos:
<Bean id = "clientConnector" class = "org.springframework.jmx.support.MBeanServerConnectionFactoryBean"> <propiedad nombre = valor = "serviceUrl" "service:jmx:rmi://remotehost:9875" /> </ Bean> <bean id = "proxy" class = "org.springframework.jmx.access.MBeanProxyFactoryBean"> <propiedad nombre = valor = "objectName" "bean:name=testBean" /> <propiedad nombre = valor = "proxyInterface" "org.springframework.jmx.IJmxTestBean" /> <propiedad nombre = "server" ref = "clientConnector" /> </ Bean>

Aqu se puede ver que creamos una MBeanServerConnection apuntando a una mquina remota usando el MBeanServerConnectionFactoryBean . Esta MBeanServerConnection se pasa entonces a la MBeanProxyFactoryBean a travs de la server propiedad. El proxy que se crea enviar todas las invocaciones a la MBeanServer a travs de este MBeanServerConnection .

24.7 Notificaciones
Oferta de Spring JMX incluye soporte completo para notificaciones JMX.
24.7.1 Los oyentes Registro de Notificaciones

Soporte de Spring JMX hace que sea muy fcil de registrar cualquier nmero de NotificationListeners con cualquier nmero de MBeans (esto incluye MBeans exportados por Spring MBeanExporter y MBeans registrado a travs de algn otro mecanismo). A modo de ejemplo, considere la situacin donde a uno le gustara ser informado (a travs de una Notification ) todas y cada atributo de un cambio de destino MBean.
paquete com.example; importar javax.management.AttributeChangeNotification; importar javax.management.Notification; javax.management.NotificationFilter importacin; importar javax.management.NotificationListener; ConsoleLoggingNotificationListener clase pblica implementos NotificationListener, NotificationFilter {

handleNotification public void (Notificacin notificacin, objeto handback) { System.out.println (notificacin); System.out.println (handback); } public boolean isNotificationEnabled (notificacin de notificacin) { volver AttributeChangeNotification clase IsAssignableFrom (notification.getClass ())..; } } <beans> <bean id = "exporter" class = "org.springframework.jmx.export.MBeanExporter"> <propiedad nombre = "beans"> <map> clave = <entry "bean:name=testBean1" value-ref = "testBean" /> </ Map> </ Propiedad> <propiedad nombre = "notificationListenerMappings"> <map> <entry clave = "bean:name=testBean1"> <bean class = "com.example.ConsoleLoggingNotificationListener" /> </ Entry> </ Map> </ Propiedad> </ Bean> <bean id = "testBean" class = "org.springframework.jmx.JmxTestBean"> <propiedad nombre = valor = "name" "TEST" /> <propiedad nombre = valor = "age" "100" /> </ Bean> </ Beans>

Con la configuracin anterior en su lugar, cada vez que un JMX Notification se emite desde el MBean de destino ( bean:name=testBean1 ), el ConsoleLoggingNotificationListener frijol que se registr como oyente a travs de la notificationListenerMappings propiedad sern notificados. El ConsoleLoggingNotificationListener frijol puede tomar cualquier accin que considere apropiada en respuesta a la Notification . Tambin puede utilizar los nombres de frijol rectas como el vnculo entre los granos exportados y los oyentes:
<beans> <bean id = "exporter" class = "org.springframework.jmx.export.MBeanExporter"> <propiedad nombre = "beans"> <map> clave = <entry "bean:name=testBean1" value-ref = "testBean" /> </ Map>

</ Propiedad> <propiedad nombre = "notificationListenerMappings"> <map> <entry key = "testBean "> <bean class = "com.example.ConsoleLoggingNotificationListener" /> </ Entry> </ Map> </ Propiedad> </ Bean> <bean id = "testBean" class="org.springframework.jmx.JmxTestBean"> <propiedad nombre = valor = "name" "TEST" /> <propiedad nombre = valor = "age" "100" /> </ Bean> </ Beans>

Si se quiere registrar un solo NotificationListener ejemplo para todos los granos que encierra la MBeanExporter est exportando, se pueden utilizar los comodines especiales '*' (sans comillas) como la clave para una entrada en el notificationListenerMappings mapa de la propiedad, por ejemplo:
<propiedad nombre = "notificationListenerMappings"> <map> <entry clave = "*"> <bean class = "com.example.ConsoleLoggingNotificationListener" /> </ Entry> </ Map> </ Propiedad>

Si uno tiene que hacer lo inverso (es decir, registrar un nmero de oyentes distintos contra un MBean), entonces uno tiene que usar la notificationListeners lista de propiedades en su lugar (y con preferencia a la notificationListenerMappings propiedad). Esta vez, en lugar de configurar una simple NotificationListener para un MBean solo configura un NotificationListenerBean instancias ... un NotificationListenerBean encapsula un NotificationListener y el ObjectName (o ObjectNames ) que se va a registrar en contra de un MBeanServer . El NotificationListenerBean tambin encapsula un nmero de otras propiedades tales como un NotificationFilter y un objeto handback arbitrario que se puede utilizar en escenarios de notificacin avanzada JMX. La configuracin cuando se utiliza NotificationListenerBean casos no es muy diferentes a lo que se present anteriormente:
<beans> <bean id = "exporter" class = "org.springframework.jmx.export.MBeanExporter"> <propiedad nombre = "beans"> <map> clave = <entry "bean:name=testBean1" value-ref = "testBean" /> </ Map> </ Propiedad>

<propiedad nombre = "notificationListeners"> <list> <bean class = "org.springframework.jmx.export.NotificationListenerBean"> <constructor-arg> <bean class = "com.example.ConsoleLoggingNotificationListener" /> </ Constructor-arg> <propiedad nombre = "mappedObjectNames"> <list> frijol <valor>: name = testBean1 </ value> </ List> </ Propiedad> </ Bean> </ List> </ Propiedad> </ Bean> <bean id = "testBean" class = "org.springframework.jmx.JmxTestBean"> <propiedad nombre = valor = "name" "TEST" /> <propiedad nombre = valor = "age" "100" /> </ Bean> </ Beans>

El ejemplo anterior es equivalente al ejemplo de la primera notificacin. Asumamos entonces que queremos que se nos da un objeto handback cada vez que una Notification se levanta, y que, adems, queremos filtrar los extraos Notifications mediante el suministro de un NotificationFilter . (Para una discusin completa de lo que un objeto handback es, de hecho, lo que es un NotificationFilter es, por favor, consulte la seccin de la especificacin JMX (1,2) titulado 'The JMX Notification Model' .)
<beans> <bean id = "exporter" class = "org.springframework.jmx.export.MBeanExporter"> <propiedad nombre = "beans"> <map> clave = <entry "bean:name=testBean1" value-ref = "testBean1" /> clave = <entry "bean:name=testBean2" value-ref = "testBean2" /> </ Map> </ Propiedad> <propiedad nombre = "notificationListeners"> <list> <bean class = "org.springframework.jmx.export.NotificationListenerBean"> <constructor-arg ref = "customerNotificationListener" /> <propiedad nombre = "mappedObjectNames"> <list> <- Se encarga de notificaciones de dos MBeans distintas -> frijol <valor>: name = testBean1 </ value> frijol <valor>: name = testBean2 </ value> </ List>

</ Propiedad> <propiedad nombre = "handback"> <bean class = "java.lang.String"> valor = <constructor-arg "This podra ser anything..." /> </ Bean> </ Propiedad> <propiedad nombre = "notificationFilter" ref = "customerNotificationListener" /> </ Bean> </ List> </ Propiedad> </ Bean> <- Implementa la NotificationListener y NotificationFilter interfaces -> <bean id = "customerNotificationListener" class = "com.example.ConsoleLoggingNotificationListener" /> <bean id = "testBean1" class = "org.springframework.jmx.JmxTestBean"> <propiedad nombre = valor = "name" "TEST" /> <propiedad nombre = valor = "age" "100" /> </ Bean> <bean id = "testBean2" class = "org.springframework.jmx.JmxTestBean"> <propiedad nombre = valor = "name" "ANOTHER TEST" /> <propiedad nombre = valor = "age" "200" /> </ Bean> </ Beans>

24.7.2 Notificaciones de publicacin

Spring proporciona apoyo no slo por registrarse para recibir Notifications , pero tambin para la publicacin de Notifications .
Nota

Tenga en cuenta que esta seccin es realmente slo es relevante en Spring beans gestionados que han sido expuestos como MBeans mediante un MBeanExporter ; ningn existentes, definidas por el usuario MBeans debe utilizar la API JMX estndar para la publicacin de notificacin. La interfaz principal de apoyo a Spring JMX publicacin de notificacin es el NotificationPublisher interfaz (definida en el org.springframework.jmx.export.notification paquete). Cualquier bean que va a ser exportado como un MBean a travs de un MBeanExporter instancia puede poner en prctica lo relacionado NotificationPublisherAware interfaz para acceder a un NotificationPublisher ejemplo. El NotificationPublisherAware interfaz simplemente suministra una instancia de un NotificationPublisher al bean de aplicacin a travs de un mtodo de establecimiento sencillo, que el grano puede entonces utilizar para publicar Notifications .

Como se indica en el Javadoc para la NotificationPublisher clase, logr frijoles que se publican eventos a travs de la NotificationPublisher mecanismo no es responsable de la administracin del estado de cualquier detector de notificacin y similares ... Soporte de Spring JMX se encargar de manejar todos los aspectos de infraestructura JMX. Todo lo que uno necesita hacer como desarrollador de la aplicacin es poner en prctica el NotificationPublisherAware interfaz y comenzar a eventos de publicacin mediante el cable NotificationPublisher ejemplo. Tenga en cuenta que el NotificationPublisher se establecer despus de que el bean gestionado ha sido registrado con una MBeanServer . El uso de un NotificationPublisher ejemplo es bastante sencillo ... uno simplemente crea una JMX Notification instancia (o una instancia de una adecuada Notification subclase), se rellena la notificacin con los datos pertinentes para el caso de que se va a publicar, y uno invoca el sendNotification(Notification) en la NotificationPublisher ejemplo, pasando la Notification . A continuacin encontrar un ejemplo simple ... En este escenario, los casos exportados de la JmxTestBean va a publicar un NotificationEvent cada vez que el add(int, int) operacin se invoca.
paquete org.springframework.jmx; importar org.springframework.jmx.export.notification.NotificationPublisherAware ; org.springframework.jmx.export.notification.NotificationPublisher importacin; importar javax.management.Notification; pblico JmxTestBean clase implementa IJmxTestBean, NotificationPublisherAware { private String nombre; edad int privado; privado isSuperman booleano; editor NotificationPublisher privado; / / Getters y setters otras omitidas por claridad public int suma (int x, int y) { int respuesta = x + y; este publisher.sendNotification (nueva Notificacin ("add", este, 0)).; volver responder; } dontExposeMe public void () { tirar RuntimeException nuevo (); } public void setNotificationPublisher (NotificationPublisher notificationPublisher) { este editor = notificationPublisher.; } }

El NotificationPublisher interfaz y la maquinaria para conseguir que todo el trabajo es una de las caractersticas ms agradables de soporte de Spring JMX. Sin embargo, s vienen con la etiqueta de precio de acoplar sus clases tanto a la primavera y JMX, como siempre, el consejo es ser pragmtico ... si necesita la funcionalidad ofrecida por el NotificationPublisher y puede aceptar el acoplamiento de ambos primavera y JMX, y luego hacerlo.

24.8 Recursos adicionales


Esta seccin contiene enlaces a recursos adicionales sobre JMX.

La pgina de inicio JMX en Sun La especificacin JMX (JSR-000003) La especificacin JMX Remote API (JSR-000 160) La pgina de inicio MX4J (una implementacin de cdigo abierto de diversas especificaciones JMX) Primeros pasos con JMX - un artculo introductorio de Sun.

25. JCA CCI 25.1 Introduccin


Java EE proporciona una especificacin para normalizar el acceso a los sistemas de informacin de empresa (EIS): la JCA (J2EE Connector Architecture). Esta especificacin se divide en varias partes diferentes:

SPI (interfaces de proveedor de servicios) que el proveedor conector debe implementar. Estas interfaces constituir un adaptador de recursos que se pueden implementar en un servidor de aplicaciones Java EE. En este escenario, el servidor administra la agrupacin de conexiones, transacciones y seguridad (Modo administrado). El servidor de aplicaciones tambin es responsable de la gestin de la configuracin, que se lleva a cabo fuera de la aplicacin cliente. Un conector puede ser utilizado sin un servidor de aplicaciones, as, en este caso, la aplicacin debe configurar directamente (no administrado modo). CCI (Common Client Interface) que una aplicacin puede utilizar para interactuar con el conector y as comunicarse con un EIS. Una API para la demarcacin de transaccin local es siempre as.

El objetivo de la ayuda Spring CCI es proporcionar clases para acceder a un conector de CCI en estilo Spring tpico, el aprovechamiento de los recursos en general Spring Framework y las instalaciones de gestin de transacciones.
Nota

El lado del cliente de conectores no usar todos los das CCI. Algunos conectores de exponer sus propias API, que dispone del adaptador de recursos JCA para utilizar los contratos del sistema de un contenedor Java EE (agrupacin de conexiones, transacciones globales, seguridad). Primavera no ofrece un apoyo especial para tal

conector especfico del API.

25.2 Configuracin de la CCI


25.2.1 Configuracin del conector

La base de recursos a utilizar JCA CCI es la ConnectionFactory interfaz. El conector empleado debe proporcionar una implementacin de esta interfaz. Para utilizar el conector, se puede desplegar en el servidor de aplicaciones y buscar la ConnectionFactory de JNDI entorno del servidor (modo administrado). El conector debe ser empaquetado como un archivo RAR (adaptador de recursos de archivo) y contienen un ra.xml archivo para describir las caractersticas de implementacin. El nombre real del recurso se especifica cuando se implementa. Para acceder a ella en primavera, slo tiene que utilizar Spring JndiObjectFactoryBean / <jee:jndilookup> buscar a la fbrica por su nombre JNDI. Otra forma de utilizar un conector para insertarlo en la aplicacin (no administrado modo), no se utiliza un servidor de aplicaciones para instalar y configurarlo. Spring ofrece la posibilidad de configurar un conector como un grano, siempre a travs de un FactoryBean ( LocalConnectionFactoryBean ). De esta manera, slo se necesita la biblioteca del conector en la ruta de clase (sin archivo RAR y no ra.xml descriptor es necesario). La biblioteca debe extraer el archivo RAR del conector, si es necesario. Una vez que tenga acceso a su ConnectionFactory ejemplo, se puede inyectar en sus componentes. Estos componentes pueden ser codificados en contra de la llanura API CCI o clases de primavera apalancamiento de apoyo para CCI acceso (por ejemplo CciTemplate ).
Nota

Cuando se utiliza un conector en modo no administrado, no podr utilizar las transacciones globales, porque el recurso no est dado de alta / cotizar en la transaccin global actual del subproceso actual. El recurso no es simplemente conocimiento de ningn transacciones globales en Java EE que se est ejecutando.
25.2.2 ConnectionFactory configuracin en la primavera

Con el fin de hacer conexiones con el EIA, es necesario obtener un ConnectionFactory del servidor de aplicaciones si se encuentra en un modo de gestin, o directamente a partir de la primavera si se encuentra en un modo no administrado. En un modo de gestin, se accede a una ConnectionFactory de JNDI, sus propiedades se pueden configurar en el servidor de aplicaciones.
id = <jee:jndi-lookup "eciConnectionFactory" jndi-name = "eis/cicseci" />

En el modo no administrado, debe configurar el ConnectionFactory que desea utilizar en la configuracin de la primavera como un JavaBean. El LocalConnectionFactoryBean clase ofrece este estilo de instalacin, pasando el ManagedConnectionFactory implementacin de su conector, dejando al descubierto el nivel de aplicacin CCI ConnectionFactory .
<bean id = "eciManagedConnectionFactory" class = "com.ibm.connector2.cics.ECIManagedConnectionFactory"> <propiedad nombre = valor = "serverName" "TXSERIES" /> <propiedad nombre = valor = "connectionURL" "tcp://localhost/" /> <propiedad nombre = valor = "portNumber" "2006" /> </ Bean> <bean id = "eciConnectionFactory" class = "org.springframework.jca.support.LocalConnectionFactoryBean"> <propiedad nombre = "managedConnectionFactory" ref = "eciManagedConnectionFactory" /> </ Bean>

Nota

Usted no puede crear instancias directamente un determinado ConnectionFactory . Tienes que ir a travs de la aplicacin correspondiente del ManagedConnectionFactory interfaz para el conector. Esta interfaz es parte de la especificacin JCA SPI.
25.2.3 Configuracin de conexiones CCI

JCA ICC permite al desarrollador configurar las conexiones a las EIS utilizando el ConnectionSpec implementacin de su conector. Con el fin de configurar sus propiedades, es necesario envolver la fbrica de conexiones de destino con un adaptador dedicado, ConnectionSpecConnectionFactoryAdapter . As, el dedicado ConnectionSpec se puede configurar con la propiedad connectionSpec (como un bean de interior). Esta propiedad no es obligatorio porque la CCI ConnectionFactory interfaz define dos mtodos diferentes para obtener una conexin CCI. Algunos de los ConnectionSpec propiedades con frecuencia puede configurarse en el servidor de aplicaciones (en modo administrado) o en el correspondiente local de ManagedConnectionFactory aplicacin.
pblico ConnectionFactory interfaz implementa Serializable, Referenceable { ... Conexin getConnection () throws ResourceException; GetConnection Connection (ConnectionSpec ConnectionSpec) throws ResourceException; ... }

Spring proporciona un ConnectionSpecConnectionFactoryAdapter que permite especificar un ConnectionSpec instancia que se utilizar para todas las operaciones en una fbrica determinada. Si el adaptador de connectionSpec propiedad se especifica, el adaptador utiliza la getConnection variante con el ConnectionSpec argumento, de lo contrario la variante sin argumento.

<Bean id = "ManagedConnectionFactory" class = "com.sun.connector.cciblackbox.CciLocalTxManagedConnectionFactory"> <propiedad nombre = valor = "connectionURL" "jdbc:hsqldb:hsql://localhost:9001" /> <propiedad nombre = valor = "driverName" "org.hsqldb.jdbcDriver" /> </ Bean> <Bean id = "targetConnectionFactory" class = "org.springframework.jca.support.LocalConnectionFactoryBean"> <propiedad nombre = "managedConnectionFactory" ref = "managedConnectionFactory" /> </ Bean> <Bean id = "ConnectionFactory" class = "org.springframework.jca.cci.connection.ConnectionSpecConnectionFactor yAdapter"> <propiedad nombre = "targetConnectionFactory" ref = "targetConnectionFactory" /> <propiedad nombre = "connectionSpec"> <bean class = "com.sun.connector.cciblackbox.CciConnectionSpec"> <propiedad nombre = valor = "user" "sa" /> <propiedad nombre = valor = "password" "" /> </ Bean> </ Propiedad> </ Bean>

25.2.4 Usando una sola conexin CCI

Si desea utilizar una nica conexin CCI, Spring ofrece un nuevo ConnectionFactory adaptador para manejar esto. El SingleConnectionFactory clase de adaptador se abrir una conexin nica con pereza y cerrarla cuando este grano es destruido al cierre de la aplicacin. En esta clase se expondr especiales Connection proxy que se comportan en consecuencia, todos compartiendo la misma conexin fsica subyacente.
<Bean id = "eciManagedConnectionFactory" class = "com.ibm.connector2.cics.ECIManagedConnectionFactory"> <propiedad nombre = valor = "serverName" "TEST" /> <propiedad nombre = valor = "connectionURL" "tcp://localhost/" /> <propiedad nombre = valor = "portNumber" "2006" /> </ Bean> <Bean id = "targetEciConnectionFactory" class = "org.springframework.jca.support.LocalConnectionFactoryBean"> <propiedad nombre = "managedConnectionFactory" ref = "eciManagedConnectionFactory" /> </ Bean> <Bean id = "eciConnectionFactory" class = "org.springframework.jca.cci.connection.SingleConnectionFactory"> <propiedad nombre = "targetConnectionFactory" ref = "targetEciConnectionFactory" /> </ Bean>

Nota

Esta ConnectionFactory adaptador no directamente se puede configurar con un ConnectionSpec . Utilizar un intermediario ConnectionSpecConnectionFactoryAdapter que el SingleConnectionFactory habla a si se requiere una sola conexin para un determinado ConnectionSpec .

25.3 Utilizando el soporte de Spring CCI acceso


25.3.1 Registro de conversin

Uno de los objetivos de la ayuda JCA CCI es proporcionar instalaciones convenientes para manipular los registros de CCI. El desarrollador puede especificar la estrategia de creacin de los registros y extraer datas de los registros, para uso con Spring CciTemplate . Las siguientes interfaces configurar la estrategia a utilizar de entrada y registros de salida si no quiere trabajar con registros directamente en la aplicacin. Con el fin de crear una entrada de Record , el programador puede utilizar una aplicacin especializada de la RecordCreator interfaz.
RecordCreator interfaz pblica { Record createRecord (RecordFactory recordFactory) throws ResourceException, DataAccessException; }

Como se puede ver, la createRecord(..) mtodo recibe un RecordFactory ejemplo como parmetro, que corresponde a la RecordFactory de la ConnectionFactory utilizado. Esta referencia se puede utilizar para crear IndexedRecord o MappedRecord casos. El siguiente ejemplo muestra cmo utilizar el RecordCreator interfaz y registros indexados / mapeados.
MyRecordCreator clase pblica implementa RecordCreator { pblico createRecord Record (RecordFactory recordFactory) throws ResourceException { IndexedRecord entrada = recordFactory.createIndexedRecord ("entrada"); input.add (new Integer (id)); regresar de entrada; } }

Una salida Record puede ser utilizado para recibir datos desde el EIA. Por lo tanto, una implementacin especfica de la RecordExtractor interfaz se puede pasar a Spring CciTemplate para extraer datos de la salida de Record .
public interface RecordExtractor { Objeto extractData (record Record) throws ResourceException, SQLException, DataAccessException; }

El siguiente ejemplo muestra cmo utilizar el RecordExtractor interfaz.

pblico MyRecordExtractor clase implementa RecordExtractor { pblico extractData Object (record Record) throws ResourceException { CommAreaRecord commAreaRecord = (CommAreaRecord) registro; String str = new String (commAreaRecord.toByteArray ()); Cadena campo1 String.Substring = (0, 6); Cadena campo2 = String.Substring (6, 1); return new OutputObject (Long.parseLong (campo1), campo2); } }

25.3.2 El CciTemplate

El CciTemplate es la clase central del paquete de apoyo bsico CCI ( org.springframework.jca.cci.core ). Se simplifica el uso de la CCI, ya que controla la creacin y liberacin de recursos. Esto ayuda a evitar errores comunes como el olvido de cerrar siempre la conexin. Se preocupa por el ciclo de vida de objetos de conexin e interaccin, dejando que se centran en la generacin de cdigo de aplicacin los registros de entrada de datos de la aplicacin y la extraccin de datos de la aplicacin a partir de los registros de salida. La especificacin JCA CCI define dos mtodos distintos para llamar a las operaciones en un EIS. El CCI Interaction interfaz proporciona dos firmas de mtodo ejecutar:
javax.resource.cci.Interaction interfaz pblica { ... Boolean ejecutar (InteractionSpec especificaciones, entrada de grabacin, salida de grabacin) throws ResourceException; Registre ejecutar (InteractionSpec especificaciones, Registro de entrada) throws ResourceException; ... }

Dependiendo del mtodo de plantilla llamada, CciTemplate sabr que execute el mtodo para llamar la interaccin. En cualquier caso, una inicializado correctamente InteractionSpec ejemplo es obligatoria.
CciTemplate.execute(..)

se puede utilizar de dos maneras:

Con Direct Record argumentos. En este caso, slo tendr que pasar el registro de entrada en el CCI, y el objeto devuelto ser el correspondiente registro de salida ICC. Con los objetos de la aplicacin, utilizando la correlacin de registro. En este caso, es necesario proporcionar correspondiente RecordCreator y RecordExtractor casos.

Con el primer enfoque, los siguientes mtodos de la plantilla se utilizar. Estos mtodos se corresponden directamente con los de la Interaction de interfaz.
pblico CciTemplate clase implementa CciOperations {

Registro pblico de ejecucin (InteractionSpec spec, Registro inputRecord) lanza DataAccessException {... } public void ejecutar (InteractionSpec especificaciones, inputRecord Record, Record outputRecord) lanza DataAccessException {... } }

Con el segundo enfoque, tenemos que especificar la creacin del registro y las estrategias de registro de extraccin como argumentos. Las interfaces utilizadas son aquellas describen en la seccin anterior sobre la conversin de registro. Los correspondientes CciTemplate mtodos son los siguientes:
pblico CciTemplate clase implementa CciOperations { Registro pblico de ejecucin (InteractionSpec especificaciones, RecordCreator inputCreator) lanza DataAccessException {... } public Object execute (InteractionSpec spec, Registro inputRecord, RecordExtractor outputExtractor) lanza DataAccessException {... } public Object execute (InteractionSpec especificaciones, RecordCreator creador, RecordExtractor extractor) lanza DataAccessException {... } }

A menos que el outputRecordCreator propiedad se establece en la plantilla (vase la seccin siguiente), todos los mtodos llamar al correspondiente execute mtodo de la CCI Interaction con dos parmetros: InteractionSpec entrada y Record , que recibe una salida Record como valor de retorno.
CciTemplate tambin proporciona mtodos para crear IndexRecord y MappedRecord fuera un RecordCreator aplicacin, a travs de su createIndexRecord(..) y createMappedRecord(..) mtodos. Esto puede ser usado dentro de las implementaciones de DAO para crear Record casos a pasar a la correspondiente CciTemplate.execute(..) mtodos. pblico CciTemplate clase implementa CciOperations { pblico IndexedRecord createIndexedRecord (String name) throws DataAccessException {... } pblico MappedRecord createMappedRecord (String name) throws DataAccessException {... } }

25.3.3 DAO apoyo

Soporte de Spring CCI proporciona una clase abstracta para DAOs, el apoyo a la inyeccin de un ConnectionFactory o un CciTemplate casos. El nombre de la clase

es CciDaoSupport : Proporciona simples setConnectionFactory y setCciTemplate mtodos. Internamente, esta clase va a crear un CciTemplate instancia para un pasado como ConnectionFactory , exponindolo a las implementaciones concretas de acceso a datos en las subclases.
public abstract class {CciDaoSupport public void setConnectionFactory (ConnectionFactory ConnectionFactory) {... } pblico ConnectionFactory getConnectionFactory () {...

} }

public void setCciTemplate (CciTemplate cciTemplate) {... pblico CciTemplate getCciTemplate () {... } }

25.3.4 Salida automtica generacin de registros

Si el conector utilizado slo admite el Interaction.execute(..) mtodo con los registros de entrada y salida como parmetros (es decir, se requiere el registro de salida deseado para ser pasado en lugar de devolver un registro de salida apropiado), se puede establecer la outputRecordCreator caracterstica de la CciTemplate para generar automticamente un registro de salida para ser llenado por el conector JCA cuando se recibe la respuesta. Este disco se devuelve al llamador de la plantilla. Esta propiedad simplemente mantiene una implementacin de la RecordCreator interfaz, que se utiliza para ese propsito. El RecordCreator interfaz ya ha sido discutido en la Seccin 25.3.1, "conversin Record" . El outputRecordCreator propiedad debe ser especificado directamente en la CciTemplate . Esto se podra hacer en el cdigo de la aplicacin de este modo:
cciTemplate.setOutputRecordCreator (nuevo EciOutputRecordCreator ());

O (recomendado) en la configuracin del resorte, si la CciTemplate est configurado como una instancia de bean dedicado:
<bean id = "eciOutputRecordCreator" class = "eci.EciOutputRecordCreator" /> <bean id = "cciTemplate" class = "org.springframework.jca.cci.core.CciTemplate"> <propiedad nombre = "connectionFactory" ref = "eciConnectionFactory" /> <propiedad nombre = "outputRecordCreator" ref = "eciOutputRecordCreator" /> </ Bean>

Nota

Como la CciTemplate clase es segura para los subprocesos, por lo general se puede configurar como una instancia compartida.

25.3.5 Resumen

La siguiente tabla resume los mecanismos de la CciTemplate clase y los mtodos correspondientes pidieron a la CCI Interaction interfaz: Tabla 25.1. El uso de Interaction ejecutar mtodos
CciTemplate outputRecordCreator propiedad no se establece ejecutar mtodo llamado sobre la Interaccin CCI Registre ejecutar (InteractionSpec, Record) Boolean ejecutar (InteractionSpec, Record, Record) anular la ejecucin (InteractionSpec, Record, Record) anular la ejecucin (InteractionSpec, Record, Record) Registre ejecutar (InteractionSpec, Record) anular la ejecucin (InteractionSpec, Record, Record) Registre ejecutar (InteractionSpec, Record) anular la ejecucin (InteractionSpec, Record, Record) Registre ejecutar (InteractionSpec, Record) anular la ejecucin (InteractionSpec, Record, Record)

CciTemplate firma del mtodo

Registre ejecutar (InteractionSpec, Record) Registre ejecutar (InteractionSpec, Record)

establecer

anular la ejecucin (InteractionSpec, Record, Record)

no se establece

anular la ejecucin (InteractionSpec, Record, Record) Registre ejecutar (InteractionSpec, RecordCreator) Registre ejecutar (InteractionSpec, RecordCreator) Registre ejecutar (InteractionSpec, Grabar, RecordExtractor) Registre ejecutar (InteractionSpec, Grabar, RecordExtractor) Registre ejecutar (InteractionSpec, RecordCreator, RecordExtractor) Registre ejecutar (InteractionSpec, RecordCreator, RecordExtractor)

establecer

no se establece

establecer

no se establece

establecer

no se establece

establecer

25.3.6 El uso de un CCI Connection y Interaction directa


CciTemplate

tambin ofrece la posibilidad de trabajar directamente con las conexiones e interacciones CCI, de la misma manera como JdbcTemplate y JmsTemplate . Esto es til cuando se desea realizar varias operaciones en una conexin CCI o la interaccin, por ejemplo. La interfaz ConnectionCallback proporciona un CCI Connection como argumento, con el fin de realizar operaciones de encargo en ella, adems de la CCI ConnectionFactory que la Connection se ha creado con. El ltimo puede ser til por ejemplo para obtener un asociado RecordFactory instancia y crear registros indexados / mapeado, por ejemplo.
ConnectionCallback interfaz pblica { DoInConnection Object (conexin Connection, ConnectionFactory ConnectionFactory) lanza ResourceException, SQLException, DataAccessException; }

La interfaz InteractionCallback ofrece la CCI Interaction , con el fin de realizar operaciones de encargo en ella, adems de la correspondiente CCI ConnectionFactory .
InteractionCallback interfaz pblica { Objeto doInInteraction (interaccin Interaction, ConnectionFactory ConnectionFactory) lanza ResourceException, SQLException, DataAccessException; }

Nota
InteractionSpec

objetos pueden ser compartidos a travs de mltiples llamadas de plantilla o de nueva creacin dentro de cada mtodo de devolucin de llamada. Esto depende completamente de la implementacin DAO.
25.3.7 Ejemplo para CciTemplate uso

En esta seccin, el uso de la CciTemplate se mostrar a una configuracin de acceso con CICS ECI modo, con el IBM CICS ECI conector. En primer lugar, algunas inicializaciones de la CCI InteractionSpec se debe hacer para especificar qu programa CICS para acceder y cmo interactuar con l.
ECIInteractionSpec InteractionSpec = new ECIInteractionSpec (); interactionSpec.setFunctionName ("MYPROG"); interactionSpec.setInteractionVerb (ECIInteractionSpec.SYNC_SEND_RECEIVE);

A continuacin, el programa se puede utilizar a travs de CCI plantilla primavera y especificar la correspondencia entre los objetos personalizados y CCI Records .
public class extends MyDaoImpl CciDaoSupport implementa MyDao { pblico OutputObject getData (entrada InputObject) { ECIInteractionSpec InteractionSpec = ...; OutputObject salida = (ObjectOutput) getCciTemplate (). Execute (InteractionSpec, RecordCreator nuevo () { pblico createRecord Record (RecordFactory recordFactory) throws ResourceException { return new CommAreaRecord (input.toString () () getBytes.); } }, nuevo RecordExtractor () { pblico extractData Object (record Record) throws ResourceException { CommAreaRecord commAreaRecord = (CommAreaRecord) registro; String str = new String (commAreaRecord.toByteArray ()); Cadena campo1 String.Substring = (0, 6); Cadena campo2 = String.Substring (6, 1); return new OutputObject (Long.parseLong (campo1), campo2); } }); devolver una salida; } }

Como se discuti anteriormente, las devoluciones de llamada se puede utilizar para trabajar directamente en las conexiones CCI o interacciones.
public class extends MyDaoImpl CciDaoSupport implementa MyDao { pblico OutputObject getData (entrada InputObject) { ObjectOutput salida = (ObjectOutput) getCciTemplate (). Execute ( ConnectionCallback nuevo () { doInConnection public Object (conexin Connection, fbrica ConnectionFactory) lanza ResourceException { / / Hacer algo ... } }); } devolver una salida; } }

Nota

Con un ConnectionCallback , la Connection utilizada ser gestionado y cerrado por el CciTemplate , pero cualquiera de las interacciones creadas en la conexin debe ser gestionada por la implementacin de devolucin de llamada.

Para obtener una devolucin de llamada ms especfica, se puede implementar un InteractionCallback . El pasado como Interaction ser gestionado y cerrado por el CciTemplate en este caso.
public class extends MyDaoImpl CciDaoSupport implementa MyDao { pblico getData String (entrada String) { ECIInteractionSpec InteractionSpec = ...; Cadena de produccin = (String) getCciTemplate (). Execute (InteractionSpec, InteractionCallback nuevo () { doInInteraction public Object (interaccin Interaction, fbrica ConnectionFactory) lanza ResourceException { Registro de entrada = new CommAreaRecord (inputString.getBytes ()); Salida de grabacin = new CommAreaRecord (); interaction.execute (holder.getInteractionSpec (), entrada, salida); volver new String (output.toByteArray ()); } }); devolver una salida; } }

En los ejemplos anteriores, la configuracin correspondiente de los granos de primavera involucradas podra tener este aspecto en modo no administrado:
<bean id = "managedConnectionFactory" class = "com.ibm.connector2.cics.ECIManagedConnectionFactory"> <propiedad nombre = valor = "serverName" "TXSERIES" /> <propiedad nombre = valor = "connectionURL" "local:" /> <propiedad nombre = valor = "userName" "CICSUSER" /> <propiedad nombre = valor = "password" "CICS" /> </ Bean> <bean id = "connectionFactory" class = "org.springframework.jca.support.LocalConnectionFactoryBean"> <propiedad nombre = "managedConnectionFactory" ref = "managedConnectionFactory" /> </ Bean> <bean id = "COMPONENTE"> class = "mypackage.MyDaoImpl"> <propiedad nombre = "connectionFactory" ref = "connectionFactory" /> </ Bean>

En el modo administrado (es decir, en un entorno Java EE), la configuracin podra tener el siguiente aspecto:
id = <jee:jndi-lookup "connectionFactory" jndi-name = "eis/cicseci" /> <bean id = "COMPONENTE"> class = "MyDaoImpl"> <propiedad nombre = "connectionFactory" ref = "connectionFactory" />

</ Bean>

25,4 Modeling CCI acceso como objetos de operacin


El org.springframework.jca.cci.object paquete contiene clases de apoyo que permiten acceder a las EIS en un estilo diferente: a travs de los objetos reutilizables de operacin, de forma anloga a los objetos de Spring operacin JDBC JDBC (ver captulo). Esto generalmente va a encapsular la API CCI: un objeto de entrada de nivel de aplicacin se pasa al objeto de operacin, por lo que se puede construir el registro de entrada y luego convertir los datos de registro recibidas a un objeto de salida de nivel de aplicacin y devolverla. Nota: Este mtodo se basa en el nivel interno CciTemplate clase y los RecordCreator / RecordExtractor interfaces, la reutilizacin de la maquinaria del ncleo de Spring apoyo CCI.
25.4.1 MappingRecordOperation
MappingRecordOperation

esencialmente realiza el mismo trabajo que CciTemplate , sino que representa un procedimiento especfico, pre-configurado operacin como un objeto. Se dispone de dos mtodos de plantilla para especificar cmo convertir un objeto de entrada a un registro de entrada, y cmo convertir un registro de salida para un objeto de salida (mapeo de registro):
createInputRecord(..) a una entrada de Record extractOutputData(..) desde una salida Record

para especificar cmo convertir un objeto de entrada para especificar cmo extraer un objeto de salida

Aqu estn las firmas de estos mtodos:


MappingRecordOperation pblico clase abstracta se extiende EisOperation { ... protegido abstracto createInputRecord Record (RecordFactory recordFactory, objeto inputObject) lanza ResourceException, DataAccessException {... } Objeto protegido abstracto extractOutputData (Record outputRecord) lanza ResourceException, SQLException, DataAccessException {... } ... }

A partir de entonces, con el fin de ejecutar una operacin de EIS, es necesario utilizar un nico mtodo ejecutar, pasando un objeto de entrada de nivel de aplicacin y la recepcin de un objeto de salida de nivel de aplicacin como resultado:
MappingRecordOperation pblico clase abstracta se extiende EisOperation { ...

public Object ejecutar (Object inputObject) throws DataAccessException { ... }

Como se puede ver, en contra de la CciTemplate clase, esta execute(..) mtodo no tiene un InteractionSpec como argumento. En su lugar, la InteractionSpec es global para la operacin. El siguiente constructor debe ser utilizado para crear instancias de un objeto con una operacin especfica InteractionSpec :
InteractionSpec spec = ...; EisOperation MyMappingRecordOperation = MyMappingRecordOperation nuevo (getConnectionFactory (), especificaciones); ...

25.4.2 MappingCommAreaOperation

Algunos conectores usan registros basados en una COMMAREA que representa una matriz de bytes que contiene los parmetros para enviar el EIA y los datos devueltos por el mismo. Spring proporciona una clase de operacin especial para trabajar directamente en COMMAREA ms que en los registros. El MappingCommAreaOperation clase extiende la MappingRecordOperation clase para proporcionar ese apoyo COMMAREA especial. Se utiliza implcitamente el CommAreaRecord clase como entrada y tipo de registro de salida, y ofrece dos nuevos mtodos para convertir un objeto de entrada en un COMMAREA entrada y la salida COMMAREA en un objeto de salida.
MappingCommAreaOperation pblico clase abstracta se extiende MappingRecordOperation { ... byte protegidos resumen [] objectToBytes (Object inObject) throws IOException, DataAccessException; protegido de objetos abstractos bytesToObject (byte [] bytes) throws IOException, DataAccessException; ... }

25.4.3 Salida automtica generacin de registros

Como cada MappingRecordOperation subclase se basa en CciTemplate internamente, de la misma manera para generar automticamente los registros de salida como con CciTemplate est disponible. Cada objeto proporciona una operacin correspondiente setOutputRecordCreator(..) mtodo. Para obtener ms informacin, consulte la Seccin 25.3.4, "Generacin automtica de registros de salida" .
25.4.4 Resumen

El enfoque objeto operacin usa los registros de la misma manera como la CciTemplate clase. Tabla 25,2. El uso de Interaccin ejecutar mtodos

MappingRecordOperation

firma del mtodo

mtodo execute pidi outputRecordCreator propiedad a la CCI Interaction Registre ejecutar (InteractionSpec, Record) Boolean ejecutar (InteractionSpec, Record, Record)

MappingRecordOperation

Object execute (Object)

no se establece

Object execute (Object)

establecer

25.4.5 Ejemplo para MappingRecordOperation uso

En esta seccin, el uso de la MappingRecordOperation se muestra para acceder a una base de datos con el conector Blackbox CCI.
Nota

La versin original de este conector es proporcionado por el SDK de Java EE (versin 1.3), disponible de Sun. En primer lugar, algunas inicializaciones de la CCI InteractionSpec se debe hacer para especificar qu instancia de SQL a ejecutar. En esta muestra, se define directamente la forma de convertir los parmetros de la peticin a un rcord de CCI y la manera de convertir el registro del resultado CCI a una instancia de la Person de clase.
PersonMappingOperation clase pblica se extiende MappingRecordOperation { PersonMappingOperation pblico (ConnectionFactory ConnectionFactory) { setConnectionFactory (ConnectionFactory); CciInteractionSpec InteractionSpec = new CciConnectionSpec (); interactionSpec.setSql ("SELECT * FROM persona donde person_id =?"); setInteractionSpec (InteractionSpec); } protegida Record createInputRecord (RecordFactory recordFactory, objeto inputObject) lanza ResourceException { Id = Integer (Entero) inputObject; IndexedRecord entrada = recordFactory.createIndexedRecord ("entrada"); input.add (new Integer (id)); regresar de entrada; } Objeto protegido extractOutputData (Record outputRecord) lanza ResourceException, SQLException { ResultSet rs = (ResultSet) outputRecord; Persona persona = null; if (rs.next ()) {

Persona persona = new Persona (); person.setId (rs.getInt ("person_id")); person.setLastName (rs.getString ("person_last_name")); person.setFirstName (rs.getString ("person_first_name")); } regresar persona; } }

A continuacin, la aplicacin puede ejecutar el objeto de la operacin, con el identificador de personas como argumento. Tenga en cuenta que la operacin objeto se podra establecer como instancia compartida, ya que es seguro para subprocesos.
public class extends MyDaoImpl CciDaoSupport implementa MyDao { GetPerson persona pblica (int id) { Consulta PersonMappingOperation = PersonMappingOperation nuevo (getConnectionFactory ()); Persona persona = (Persona) query.execute (new Integer (id)); regresar persona; } }

La configuracin correspondiente de los granos de primavera podra tener el siguiente aspecto en modo no administrado:
<Bean id = "ManagedConnectionFactory" class = "com.sun.connector.cciblackbox.CciLocalTxManagedConnectionFactory"> <propiedad nombre = valor = "connectionURL" "jdbc:hsqldb:hsql://localhost:9001" /> <propiedad nombre = valor = "driverName" "org.hsqldb.jdbcDriver" /> </ Bean> <Bean id = "targetConnectionFactory" class = "org.springframework.jca.support.LocalConnectionFactoryBean"> <propiedad nombre = "managedConnectionFactory" ref = "managedConnectionFactory" /> </ Bean> <Bean id = "ConnectionFactory" class = "org.springframework.jca.cci.connection.ConnectionSpecConnectionFactor yAdapter"> <propiedad nombre = "targetConnectionFactory" ref = "targetConnectionFactory" /> <propiedad nombre = "connectionSpec"> <bean class = "com.sun.connector.cciblackbox.CciConnectionSpec"> <propiedad nombre = valor = "user" "sa" /> <propiedad nombre = valor = "password" "" /> </ Bean> </ Propiedad> </ Bean> <bean id = "COMPONENTE"> class = "MyDaoImpl"> <propiedad nombre = "connectionFactory" ref = "connectionFactory" /> </ Bean>

En el modo administrado (es decir, en un entorno Java EE), la configuracin podra tener el siguiente aspecto:
id = <jee:jndi-lookup "targetConnectionFactory" jndi-name = "eis/blackbox" /> <Bean id = "ConnectionFactory" class = "org.springframework.jca.cci.connection.ConnectionSpecConnectionFactor yAdapter"> <propiedad nombre = "targetConnectionFactory" ref = "targetConnectionFactory" /> <propiedad nombre = "connectionSpec"> <bean class = "com.sun.connector.cciblackbox.CciConnectionSpec"> <propiedad nombre = valor = "user" "sa" /> <propiedad nombre = valor = "password" "" /> </ Bean> </ Propiedad> </ Bean> <bean id = "COMPONENTE"> class = "MyDaoImpl"> <propiedad nombre = "connectionFactory" ref = "connectionFactory" /> </ Bean>

25.4.6 Ejemplo para MappingCommAreaOperation uso

En esta seccin, el uso de la MappingCommAreaOperation se muestra: acceder a un modo de CICS con ECI con el IBM CICS ECI conector. En primer lugar, el CCI InteractionSpec necesita ser inicializado para especificar qu programa CICS para acceder y cmo interactuar con l.
EciMappingOperation pblico clase abstracta se extiende MappingCommAreaOperation { EciMappingOperation pblico (ConnectionFactory ConnectionFactory, String ProgramName) { setConnectionFactory (ConnectionFactory); ECIInteractionSpec InteractionSpec = new ECIInteractionSpec (), interactionSpec.setFunctionName (ProgramName); interactionSpec.setInteractionVerb (ECIInteractionSpec.SYNC_SEND_RECEIVE); interactionSpec.setCommareaLength (30); setInteractionSpec (InteractionSpec); setOutputRecordCreator (nuevo EciOutputRecordCreator ()); } EciOutputRecordCreator privado static class implementa RecordCreator { pblico createRecord Record (RecordFactory recordFactory) throws ResourceException { volver CommAreaRecord nuevo (); } } }

El resumen EciMappingOperation clase puede ser subclase especificar la correspondencia entre los objetos personalizados y Records .
public class extends MyDaoImpl CciDaoSupport implementa MyDao { pblico OutputObject getData (Integer id) { Consulta EciMappingOperation = EciMappingOperation nuevo (getConnectionFactory (), "MYPROG") { byte [] abstracto protegido objectToBytes (Object inObject) throws IOException { Id = Integer (Entero) inObject; volver String.valueOf (id); } Objeto protegido abstracto bytesToObject (byte [] bytes) throws IOException; String str = new String (bytes); Cadena campo1 str.substring = (0, 6); Cadena campo2 = str.substring (6, 1); Cadena = field3 str.substring (7, 1); return new OutputObject (campo1, campo2, campo3); } }); return (OutputObject) query.execute (new Integer (id)); } }

La configuracin correspondiente de los granos de primavera podra tener el siguiente aspecto en modo no administrado:
<bean id = "managedConnectionFactory" class = "com.ibm.connector2.cics.ECIManagedConnectionFactory"> <propiedad nombre = valor = "serverName" "TXSERIES" /> <propiedad nombre = valor = "connectionURL" "local:" /> <propiedad nombre = valor = "userName" "CICSUSER" /> <propiedad nombre = valor = "password" "CICS" /> </ Bean> <bean id = "connectionFactory" class = "org.springframework.jca.support.LocalConnectionFactoryBean"> <propiedad nombre = "managedConnectionFactory" ref = "managedConnectionFactory" /> </ Bean> <bean id = "COMPONENTE"> class = "MyDaoImpl"> <propiedad nombre = "connectionFactory" ref = "connectionFactory" /> </ Bean>

En el modo administrado (es decir, en un entorno Java EE), la configuracin podra tener el siguiente aspecto:
id = <jee:jndi-lookup "connectionFactory" jndi-name = "eis/cicseci" /> <bean id = "COMPONENTE"> class = "MyDaoImpl"> <propiedad nombre = "connectionFactory" ref = "connectionFactory" /> </ Bean>

25.5 Transacciones
JCA especifica varios niveles de soporte de transacciones para los adaptadores de recursos. El tipo de transacciones que el adaptador de recursos admite se especifica en su ra.xml archivo. Bsicamente, existen tres opciones: ninguno (por ejemplo con conector CICS EPI), las transacciones locales (por ejemplo con un conector CICS ECI), las transacciones globales (por ejemplo, con un conector IMS).
<connector> <resourceadapter> <- NoTransaction <transaction-support> </ transaccin de apoyo> > <- LocalTransaction <transaction-support> </ transaccin de apoyo> -> XATransaction <transaction-support> </ transaccin de apoyo> <resourceadapter> <connector>

Para las transacciones globales, puede utilizar la infraestructura de operacin genrica de Spring para demarcar transacciones, con JtaTransactionManager como backend (coordinador de la delegacin en Java EE del servidor de transacciones distribuidas debajo). Para las transacciones locales en un nico CCI ConnectionFactory , Spring proporciona una estrategia de gestin de la transaccin especfica para CCI, anloga a la DataSourceTransactionManager para JDBC. La API CCI define un objeto transaccin local y los correspondientes mtodos locales de demarcacin de transaccin. Spring CciLocalTransactionManager ejecuta dichas operaciones locales de CCI, completamente compatible con genrico Spring PlatformTransactionManager abstraccin.
id = <jee:jndi-lookup "eciConnectionFactory" jndi-name = "eis/cicseci" /> <Bean id = "eciTransactionManager" class = "org.springframework.jca.cci.connection.CciLocalTransactionManager"> <propiedad nombre = "connectionFactory" ref = "eciConnectionFactory" /> </ Bean>

Ambas estrategias de transaccin se puede utilizar con cualquiera de las instalaciones del resorte de demarcacin de la transaccin, ya sea declarativo o programtico. Esto es una consecuencia de genrica Spring PlatformTransactionManager abstraccin, que desacopla la demarcacin de transaccin de la estrategia de ejecucin real. Basta con cambiar entre JtaTransactionManager y CciLocalTransactionManager segn sea necesario, manteniendo la demarcacin de la transaccin tal y como son.

Para obtener ms informacin sobre las instalaciones para realizar transacciones de Spring, vase el captulo Captulo 12, Gestin de Operaciones .

26. Email 26.1 Introduccin


Biblioteca dependencias Los frascos adicionales siguientes para estar en el classpath de la aplicacin con el fin de poder utilizar la biblioteca de la Spring Framework de correo electrnico.

El JavaMail mail.jar biblioteca El JAF activation.jar biblioteca

Todas estas bibliotecas estn disponibles gratuitamente en la web. El Spring Framework proporciona una biblioteca de utilidades tiles para el envo de correo electrnico que protege al usuario de los detalles del sistema de distribucin subyacente y es responsable del manejo de los recursos bajo nivel en nombre del cliente. El org.springframework.mail paquete es el paquete de nivel de raz para soporte de correo electrnico del Marco de Spring. La interfaz central para el envo de mensajes de correo electrnico es el MailSender interfaz; un objeto de valor simple que encapsula las propiedades de un correo simple como desde y hacia (adems de muchos otros) es la SimpleMailMessage clase. Este paquete tambin contiene una jerarqua de excepciones comprobadas que proporcionan un mayor nivel de abstraccin sobre las excepciones de nivel ms bajo del sistema de correo con la excepcin raz de ser MailException . Por favor, consulte las JavaDocs para ms informacin sobre la jerarqua de correo excepcin rico. El org.springframework.mail.javamail.JavaMailSender interfaz aade funciones especializadas JavaMail como soporte MIME mensaje al MailSender interfaz (de la que hereda). JavaMailSender tambin proporciona una interfaz de devolucin de llamada para la preparacin de JavaMail mensajes MIME, llamado
org.springframework.mail.javamail.MimeMessagePreparator

26.2 Uso
Supongamos que hay una interfaz de negocios llamado OrderManager :
pblico OrderManager interfaz { vaco PlaceOrder (orden de pedido); }

Supongamos tambin que existe un requisito que indica que un mensaje de correo electrnico con un nmero de orden tiene que ser generado y enviado a un cliente realiza el pedido correspondiente.
26.2.1 Basic MailSender y SimpleMailMessage uso
org.springframework.mail.MailException importacin; importar org.springframework.mail.MailSender; org.springframework.mail.SimpleMailMessage importacin; SimpleOrderManager clase pblica implementa OrderManager { MailSender MailSender privado; templateMessage SimpleMailMessage privado; setMailSender public void (MailSender MailSender) { este MailSender = MailSender.; } public void setTemplateMessage (SimpleMailMessage templateMessage) { este templateMessage = templateMessage.; } PlaceOrder public void (orden de pedido) { / / Los clculos de negocios ... / / Llamar a los colaboradores para conservar el orden ... / / Crear un hilo de seguridad "copia" del mensaje de plantilla y personalizarla SimpleMailMessage msg = nuevo SimpleMailMessage (esto templateMessage.); msg.setTo (. order.getCustomer () getEmailAddress ()); msg.setText ( "Estimado" + order.getCustomer (). GetFirstName () + Order.getCustomer (). ObtenerApellidoPaterno () + ", Gracias por poner orden. Su nmero de orden es" + Order.getOrderNumber ()); try { este mailSender.send (msg).; } catch (MailException ex) { / / Slo tiene que registrar y seguir ... System.err.println (ex.getMessage ()); } } }

A continuacin encontrar las definiciones de frijol para el cdigo de arriba:


<bean id = "mailSender" class = "org.springframework.mail.javamail.JavaMailSenderImpl"> <propiedad nombre = valor = "host" "mail.mycompany.com" /> </ Bean> <- Esto es un mensaje de plantilla que podemos pre-cargar con el estado por defecto ->

<bean id = "templateMessage" class = "org.springframework.mail.SimpleMailMessage"> <propiedad nombre = valor = "from" "customerservice@mycompany.com" /> <propiedad nombre = valor = "subject" "Your order" /> </ Bean> <bean id = "orderManager" class = "com.mycompany.businessapp.support.SimpleOrderManager"> <propiedad nombre = "mailSender" ref = "mailSender" /> <propiedad nombre = "templateMessage" ref = "templateMessage" /> </ Bean>

26.2.2 Uso de la JavaMailSender y la MimeMessagePreparator

Aqu hay otra aplicacin de OrderManager utilizando el MimeMessagePreparator interfaz de devolucin de llamada. Tenga en cuenta en este caso que la mailSender propiedad es de tipo JavaMailSender para que seamos capaces de utilizar el JavaMail MimeMessage clase:
importar javax.mail.Message; javax.mail.MessagingException importacin; importar javax.mail.internet.InternetAddress; javax.mail.internet.MimeMessage importacin; javax.mail.internet.MimeMessage importacin; org.springframework.mail.MailException importacin; importar org.springframework.mail.javamail.JavaMailSender; importar org.springframework.mail.javamail.MimeMessagePreparator; SimpleOrderManager clase pblica implementa OrderManager { MailSender JavaMailSender privado; setMailSender public void (JavaMailSender MailSender) { este MailSender = MailSender.; } PlaceOrder public void (orden de pedido final) { / / Los clculos de negocios ... / / Llamar a los colaboradores para conservar el orden ... Preparador MimeMessagePreparator MimeMessagePreparator = new () { public void prepare (MimeMessage MimeMessage) throws Exception { mimeMessage.setRecipient (Message.RecipientType.TO, nuevo InternetAddress (order.getCustomer () getEmailAddress ().)); mimeMessage.setFrom (nuevo InternetAddress ("mail@mycompany.com")); mimeMessage.setText ( "Estimado" + order.getCustomer (). GetFirstName () + "" + Order.getCustomer (). ObtenerApellidoPaterno ()

+ ", Gracias por poner orden. Su nmero de orden es" + Order.getOrderNumber ()); } }; try { este mailSender.send (preparador).; } catch (MailException ex) { / / Slo tiene que registrar y seguir ... System.err.println (ex.getMessage ()); } } }

Nota

El cdigo electrnico es una preocupacin transversal y bien podra ser un candidato para la refactorizacin en un aspecto personalizado Spring AOP , que luego podra ser ejecutado en joinpoints apropiados en el OrderManager objetivo. El Spring Framework de buques correos de apoyo con la implementacin JavaMail estndar. Por favor, consulte las JavaDocs relevantes para ms informacin.

26,3 Usando el JavaMail MimeMessageHelper


Una clase que viene muy bien cuando se trata de mensajes de JavaMail es el org.springframework.mail.javamail.MimeMessageHelper clase, que le protege de tener que usar el API JavaMail detallado. Usando el MimeMessageHelper es bastante fcil crear un MimeMessage :
/ / Por supuesto que utilizara DI en ningn caso en el mundo real JavaMailSenderImpl remitente JavaMailSenderImpl = new (); sender.setHost ("mail.host.com"); MimeMessage message = sender.createMimeMessage (); MimeMessageHelper helper = new MimeMessageHelper (mensaje); helper.setTo ("test@host.com"); helper.setText ("Gracias por ordenar"); sender.send (mensaje);

26.3.1 Envo de archivos adjuntos y recursos en lnea

Mensajes de correo electrnico de varias partes, tanto para permitir archivos adjuntos y recursos en lnea. Ejemplos de recursos en lnea sera imgenes o una hoja de estilo que desea utilizar en su mensaje, pero que no desea que se muestre como un archivo adjunto.
Archivos adjuntos

En el ejemplo siguiente se muestra cmo utilizar el MimeMessageHelper para enviar un correo electrnico junto con un archivo adjunto de imagen JPEG individual.
JavaMailSenderImpl remitente JavaMailSenderImpl = new ();

sender.setHost ("mail.host.com"); MimeMessage message = sender.createMimeMessage (); / / Usar la bandera true para indicar que necesita un mensaje de varias MimeMessageHelper helper = new MimeMessageHelper (mensaje, true); helper.setTo ("test@host.com"); helper.setText ("Echa un vistazo a esta imagen"); / / Vamos a conectar el infame archivo de Windows muestra (esta vez copiado en c :/) FileSystemResource archivo = new FileSystemResource (new File ("c :/ sample.jpg")); helper.addAttachment ("CoolImage.jpg", archivo); sender.send (mensaje);

Inline recursos

En el ejemplo siguiente se muestra cmo utilizar el MimeMessageHelper para enviar un correo electrnico junto con una imagen en lnea.
JavaMailSenderImpl remitente JavaMailSenderImpl = new (); sender.setHost ("mail.host.com"); MimeMessage message = sender.createMimeMessage (); / / Usar la bandera true para indicar que necesita un mensaje de varias MimeMessageHelper helper = new MimeMessageHelper (mensaje, true); helper.setTo ("test@host.com"); / / Usar la bandera true para indicar que el texto se incluye HTML helper.setText ("<html> <body> <img src='cid:identifier1234'> </ body> </ html>", true); / / Vamos a incluir el infame archivo de Windows muestra (esta vez copiado en c :/) FileSystemResource res = new FileSystemResource (new File ("c :/ sample.jpg")); helper.addInline ("identifier1234", res); sender.send (mensaje);

Advertencia

Recursos en lnea se aade al mensaje MIME mediante la especificada Content-ID ( identifier1234 en el ejemplo anterior). El orden en el que se va a agregar el texto y el recurso son muy importantes. Asegrese de aadir primero el texto y despus de que los recursos. Si usted lo est haciendo al revs, no va a funcionar!
26.3.2 Creacin de contenido de correo electrnico utilizando una biblioteca de plantillas

El cdigo en los ejemplos anteriores creados explcitamente el contenido del mensaje de correo electrnico, utilizando mtodos tales como llama message.setText(..) . Esto

est bien para casos sencillos, y que est bien en el contexto de los ejemplos antes mencionados, donde la intencin era mostrar los conceptos bsicos de la API. En su aplicacin empresarial tpica, sin embargo, no se va a crear el contenido de sus mensajes de correo electrnico utilizando el mtodo anterior para un nmero de razones.

La creacin de contenido basado en HTML de correo electrnico en el cdigo de Java es tedioso y propenso a errores No hay una clara separacin entre la lgica de visualizacin y la lgica de negocio Cambio de la estructura de presentacin de los contenidos de correo electrnico requiere escribir cdigo Java, volver a compilar, volver a implementar ...

Normalmente, el enfoque adoptado para hacer frente a estos problemas es usar una biblioteca de plantillas como FreeMarker o Velocidad para definir la estructura de presentacin de los contenidos de correo electrnico. Esto hace que el cdigo de la tarea slo con la creacin de los datos que van a ser prestados en la plantilla de correo electrnico y enviar el correo electrnico. En definitiva, es una buena prctica para cuando el contenido de sus mensajes de correo electrnico se hace an moderadamente complejo, y con clases de apoyo Spring Framework para la FreeMarker y la velocidad se hace muy fcil de hacer. A continuacin encontrar un ejemplo de cmo utilizar la biblioteca de plantillas Velocity para crear el contenido de correo electrnico.
Un ejemplo de velocidad basado en

Para usar Velocity para crear la plantilla de correo electrnico (s), usted tendr que tener las bibliotecas de velocidad disponible en su ruta de clase. Tambin tendr que crear una o varias plantillas de Velocity para el contenido del correo electrnico que la aplicacin necesita. Ponemos a tu disposicin la plantilla de Velocity que este ejemplo va a utilizar. Como usted puede ver que es basado en HTML, y puesto que es texto plano que pueden ser creados usando el HTML o editor de texto favorito.
# En la com / foo / paquete <html> <body> <h3> Hola $ {} user.userName, bienvenidos a la Chipping Sodbury onthe-Hill tablones de anuncios </ h3> <div> Su direccin de correo electrnico es <a href = "mailto:${user.emailAddress}"> $ {} user.emailAddress </ a>. </ Div> </ Body> </ Html>

Ponemos a tu disposicin un cdigo simple y primavera configuracin XML que hace uso de la plantilla de la velocidad por encima de la creacin de contenido de correo electrnico y enviar por correo electrnico (s).
paquete com.foo;

importar org.apache.velocity.app.VelocityEngine; importar org.springframework.mail.javamail.JavaMailSender; org.springframework.mail.javamail.MimeMessageHelper importacin; importar org.springframework.mail.javamail.MimeMessagePreparator; org.springframework.ui.velocity.VelocityEngineUtils importacin; javax.mail.internet.MimeMessage importacin; importar java.util.HashMap; importar java.util.Map; SimpleRegistrationService clase pblica implementa RegistrationService { MailSender JavaMailSender privado; velocityEngine VelocityEngine privado; setMailSender public void (JavaMailSender MailSender) { este MailSender = MailSender.; } public void setVelocityEngine (VelocityEngine velocityEngine) { este velocityEngine = velocityEngine.; } public void registro (usuario Usuario) { / / Es la lgica de registro ... sendConfirmationEmail (usuario); } private void sendConfirmationEmail (usuario de usuario final) { Preparador MimeMessagePreparator MimeMessagePreparator = new () { public void prepare (MimeMessage MimeMessage) throws Exception { MimeMessageHelper mensaje = new MimeMessageHelper (MimeMessage); message.setTo (user.getEmailAddress ()); message.setFrom ("webmaster@csonth.gov.uk"); / / puede ser parametrizado ... Mapa model = new HashMap (); model.put ("usuario", el usuario); String texto = VelocityEngineUtils.mergeTemplateIntoString ( velocityEngine, "com / dns / registro confirmation.vm", modelo); message.setText (texto, true); } }; este mailSender.send (preparador).; } } <? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd "> <bean id = "mailSender" class = "org.springframework.mail.javamail.JavaMailSenderImpl">

<propiedad nombre = valor = "host" "mail.csonth.gov.uk" /> </ Bean> <bean id = "registrationService" class = "com.foo.SimpleRegistrationService"> <propiedad nombre = "mailSender" ref = "mailSender" /> <propiedad nombre = "velocityEngine" ref = "velocityEngine" /> </ Bean> <bean id = "velocityEngine" class = "org.springframework.ui.velocity.VelocityEngineFactoryBean"> <propiedad nombre = "velocityProperties"> <valor> resource.loader = class class.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader </ Value> </ Propiedad> </ Bean> </ Beans>

27. Ejecucin de tareas y programacin 27.1 Introduccin


El Spring Framework proporciona abstracciones para la ejecucin asincrnica y la programacin de tareas con los TaskExecutor y TaskScheduler interfaces, respectivamente. La primavera tambin cuenta con las implementaciones de las interfaces que soportan grupos de subprocesos o la delegacin en CommonJ dentro de un entorno de servidor de aplicaciones. En ltima instancia el uso de estas implementaciones detrs de las interfaces comunes abstrae las diferencias entre Java SE 5, Java SE 6 y entornos Java EE. Spring tambin ofrece clases de integracin para apoyar la programacin con el Timer , parte del JDK desde 1,3, y el Programador de Cuarzo ( http://quartz-scheduler.org ). Tanto de los programadores se configuran mediante un FactoryBean con referencias facultativos de Timer o Trigger de los casos, respectivamente. Por otra parte, una clase de conveniencia tanto para el programador de cuarzo y el Timer est disponible que le permite invocar un mtodo de un objeto de destino actual (anloga a la normalidad MethodInvokingFactoryBean operacin).

27.2 La Primavera TaskExecutor abstraccin


Spring 2.0 introduce una nueva abstraccin para hacer frente a los ejecutores. Ejecutores son el nombre de Java 5 para el concepto de grupos de subprocesos. El "ejecutor" de nomenclatura se debe al hecho de que no hay garanta de que la aplicacin subyacente es realmente una piscina; un ejecutor puede ser de un solo subproceso o sncrono incluso. Abstraccin Spring oculta los detalles de implementacin entre Java SE 1.4, Java SE 5 y entornos Java EE.

Spring TaskExecutor interfaz es idntica a la java.util.concurrent.Executor interfaz. De hecho, su principal razn de ser es abstraer la necesidad de Java 5 al utilizar grupos de subprocesos. La interfaz tiene un nico mtodo execute(Runnable task) que acepta una tarea de ejecucin basado en la semntica y la configuracin del grupo de subprocesos. El TaskExecutor fue creado originalmente para dar otros componentes de primavera una abstraccin para la agrupacin de subprocesos cuando sea necesario. Los componentes como el ApplicationEventMulticaster , JMS de AbstractMessageListenerContainer y la integracin de cuarzo y todos utilizan la TaskExecutor abstraccin a subprocesos del grupo. Sin embargo, si los frijoles necesita comportamiento agrupacin de subprocesos, es posible utilizar esta abstraccin para sus propias necesidades.
27.2.1 TaskExecutor tipos

Hay un nmero de pre-construidos implementaciones de TaskExecutor incluidos con la distribucin de primavera. Con toda probabilidad, usted no debe necesitar para implementar su propio.
SimpleAsyncTaskExecutor

Esta aplicacin no vuelve a utilizar cualquier hilo, sino que pone en marcha un nuevo hilo para cada invocacin. Sin embargo, se admite un lmite de concurrencia que bloquee las llamadas que estn por encima del lmite hasta una ranura ha sido liberado. Si usted est buscando para una verdadera puesta en comn, siga desplazndose al final de la pgina.
SyncTaskExecutor

Esta aplicacin no se ejecuta de forma asncrona invocaciones. En su lugar, cada invocacin tiene lugar en el subproceso de la llamada. Se utiliza sobre todo en situaciones en las que mltiples hilos no es necesaria como casos de prueba simple.
ConcurrentTaskExecutor

Esta implementacin es un contenedor de una Java 5 java.util.concurrent.Executor . Hay una alternativa, ThreadPoolTaskExecutor , que expone los Executor parmetros de configuracin como propiedades del bean. Es raro que utilizar el ConcurrentTaskExecutor pero si el ThreadPoolTaskExecutor no es lo suficientemente robusta para sus necesidades, el ConcurrentTaskExecutor es una alternativa.
SimpleThreadPoolTaskExecutor

Esta implementacin es en realidad una subclase de cuarzo de SimpleThreadPool que escuche a las devoluciones de llamada de ciclo de vida de la primavera. Se suele utilizar cuando se tiene un grupo de subprocesos que

pueden necesitar ser compartida por ambos componentes de cuarzo y no de cuarzo.


ThreadPoolTaskExecutor

No es posible utilizar cualquier backport o alternate versiones de la java.util.concurrent paquete con esta aplicacin. Tanto Doug Lea y Dawid Kurzyniec implementaciones de utilizar estructuras diferentes paquetes que les impiden trabajar correctamente. Esta aplicacin slo se puede utilizar en un entorno Java 5, pero tambin es el ms comnmente utilizado en dicho entorno. Expone las propiedades del bean para configurar un java.util.concurrent.ThreadPoolExecutor y lo envuelve en una TaskExecutor . Si necesitas algo avanzado, como un ScheduledThreadPoolExecutor , se recomienda que utilice un ConcurrentTaskExecutor lugar.
TimerTaskExecutor

Esta aplicacin utiliza un nico TimerTask como su aplicacin de respaldo. Es diferente de la SyncTaskExecutor en que las llamadas a mtodos se ejecutan en un hilo separado, a pesar de que son sincrnicos en ese hilo.
WorkManagerTaskExecutor

CommonJ es un conjunto de especificaciones desarrolladas conjuntamente entre BEA e IBM. Estas especificaciones no son estndares de Java EE, sino que son de serie en toda BEA y las implementaciones de IBM Application Server. Esta aplicacin utiliza la WorkManager CommonJ como su aplicacin de soporte y es la clase de conveniencia central para la creacin de una referencia CommonJ WorkManager en un contexto de primavera. Similar a la SimpleThreadPoolTaskExecutor , esta clase implementa la interfaz WorkManager y por lo tanto puede ser utilizado directamente como un WorkManager tambin.
27.2.2 Uso de un TaskExecutor

Spring TaskExecutor implementaciones se utilizan como simples JavaBeans. En el siguiente ejemplo, se define un bean que utiliza el ThreadPoolTaskExecutor para imprimir de forma asncrona a cabo un conjunto de mensajes.
importar org.springframework.core.task.TaskExecutor; pblico TaskExecutorExample clase { MessagePrinterTask clase privada implementa Runnable { String mensaje privado; pblico MessagePrinterTask (String mensaje) { este mensaje = mensaje.;

} public void run () { System.out.println (mensaje); } } TaskExecutor TaskExecutor privado; pblico TaskExecutorExample (TaskExecutor TaskExecutor) { este TaskExecutor = TaskExecutor.; } printMessages public void () { for (int i = 0; i <25, i + +) { taskExecutor.execute (nuevo MessagePrinterTask ("Mensaje" + i)); } } }

Como se puede ver, en lugar de recuperar un hilo de la piscina y la ejecucin de s mismo, se agrega la Runnable a la cola y la TaskExecutor utiliza sus reglas internas para decidir cuando la tarea se ejecuta. Para configurar las reglas que el TaskExecutor va a utilizar, propiedades simples de frijol han sido expuestos.
<bean id = "taskExecutor" class = "org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <propiedad nombre = valor = "corePoolSize" "5" /> <propiedad nombre = valor = "maxPoolSize" "10" /> <propiedad nombre = valor = "queueCapacity" "25" /> </ Bean> <bean id = "taskExecutorExample" class = "TaskExecutorExample"> <constructor-arg ref = "taskExecutor" /> </ Bean>

27.3 La Primavera TaskScheduler abstraccin


Adems de la TaskExecutor abstraccin, Spring 3,0 introduce una TaskScheduler con una variedad de mtodos para la programacin de las tareas a ejecutar en algn momento en el futuro.
pblico TaskScheduler interfaz { ScheduledFuture horario (tarea Runnable, gatillo de disparo); ScheduledFuture horario (tarea Runnable, startTime fecha); ScheduledFuture scheduleAtFixedRate (tarea Runnable, startTime Fecha, periodo de tiempo); ScheduledFuture scheduleAtFixedRate (tarea Runnable, largo perodo de tiempo);

ScheduledFuture scheduleWithFixedDelay (tarea Runnable, startTime Fecha, retraso); ScheduledFuture scheduleWithFixedDelay (tarea Runnable, retraso); }

El mtodo ms sencillo es el llamado 'plan' que toma un Runnable y Date solamente. Eso har que la tarea se ejecute una vez transcurrido el tiempo especificado. Todos los otros mtodos son capaces de programar las tareas a ejecutar repetidamente. Los mtodos de tipo fijo y fijo-se demora para la ejecucin simple, peridico, pero el mtodo que acepta un disparo es mucho ms flexible.
27.3.1 El Trigger interfaz

El Trigger interfaz es esencialmente inspirado por JSR-236, que, en la primavera de 3,0, todava no se ha implementado oficialmente. La idea bsica de la Trigger es que los tiempos de ejecucin puede ser determinada sobre la base de resultados de la ejecucin del pasado o incluso condiciones arbitrarias. Si estas determinaciones se toman en cuenta los resultados de la ejecucin anterior, en que la informacin est disponible en un TriggerContext . El Trigger interfaz en s es bastante simple:
Gatillo {public interface Fecha nextExecutionTime (TriggerContext triggerContext); }

Como se puede ver, el TriggerContext es la parte ms importante. Se encapsula todos los datos pertinentes, y est abierto para la extensin en el futuro si es necesario. El TriggerContext es una interfaz (un SimpleTriggerContext aplicacin se utiliza por defecto). Aqu puedes ver qu mtodos estn disponibles para Trigger implementaciones.
pblico TriggerContext interfaz { LastScheduledExecutionTime Date (); LastActualExecutionTime Date (); LastCompletionTime Date (); }

27.3.2 Trigger implementaciones

Spring proporciona dos implementaciones de la Trigger de la interfaz. La ms interesante es la CronTrigger . Permite la programacin de tareas basadas en expresiones cron. Por ejemplo, la siguiente tarea est programada para ejecutarse 15 minutos despus de cada hora, pero slo durante las "horas de oficina" 9-a-5 durante la semana.

scheduler.schedule (tarea, CronTrigger nuevo ("* 15 ** 09.17 lunvie"));

El otro fuera de la caja de la implementacin es un PeriodicTrigger que acepta un perodo fijo, un valor opcional retardo inicial, y un booleano para indicar si el perodo debe interpretarse como una tasa fija o un retardo fijo. Desde el TaskScheduler interfaz ya define los mtodos para la planificacin de tareas a una tasa fija o con un retardo fijo, esos mtodos deben ser utilizados directamente siempre que sea posible. El valor de la PeriodicTrigger aplicacin es que puede ser utilizado dentro de los componentes que dependen de la Trigger abstraccin. Por ejemplo, puede ser conveniente para permitir desencadenantes peridicos, disparadores basados en cron-, e implementaciones de disparo incluso personalizados que se utilizan de manera intercambiable. Este componente podra aprovechar la inyeccin de dependencia para que esos Triggers puede ser configurado externamente.
27.3.3 TaskScheduler implementaciones

Al igual que con Spring TaskExecutor abstraccin, el principal beneficio de la TaskScheduler es que el cdigo basndose en el comportamiento de la programacin no tiene por qu ser acoplado a una determinada implementacin del planificador. La flexibilidad que esto ofrece es particularmente relevante cuando se ejecuta en entornos de servidor de aplicaciones donde las discusiones no deben ser creados directamente por la propia aplicacin. Para estos casos, Spring ofrece una TimerManagerTaskScheduler que los delegados a una instancia CommonJ TimerManager, normalmente se configura con una bsqueda JNDI. Una alternativa ms simple, la ThreadPoolTaskScheduler , puede utilizarse siempre que la gestin de rosca externa no es un requisito. Internamente, se delega en un ScheduledExecutorService ejemplo. ThreadPoolTaskScheduler realmente implementa Spring TaskExecutor interfaz, as, de modo que un solo caso se puede utilizar para la ejecucin asncrona lo antes posible, as como programar y potencialmente recurrente, ejecuciones.

27.4 Apoyo a la Ejecucin de anotacin y programacin asncrona


Spring proporciona soporte de anotaciones para la programacin de tareas a la vez y ejecucin del mtodo asincrnico.
27.4.1 Habilitar las anotaciones de planificacin

Para activar el soporte para @Scheduled y @Async anotaciones add @EnableScheduling y @EnableAsync a uno de tus @Configuration clases:
@ Configuracin @ EnableAsync @ EnableSCheduling AppConfig clase pblica { }

Usted es libre de escoger y elegir las anotaciones pertinentes para su aplicacin. Por ejemplo, si slo necesitan apoyo para @Scheduled , simplemente omita @EnableAsync . Para mayor control de grano fino que, adems, puede implementar la SchedulingConfigurer y / o AsyncConfigurer interfaces. Consulte el Javadoc para ms detalles. Si prefiere utilizar la configuracin XML <task:annotation-driven> elemento.
<task:annotation-driven ejecutor = "myExecutor" planificador = "myScheduler" /> <task:executor id = "myExecutor" pool-size = "5" /> <task:scheduler id = "myScheduler" pool-size = "10" />}

Aviso con lo anterior XML que un ejecutor de referencia se proporciona para el manejo de las tareas que corresponden a mtodos con el @Async anotacin, y el planificador de referencia se proporciona para la gestin de esos mtodos anotados con @Scheduled .
27.4.2 La anotacin @ programadas

La anotacin @ programadas se puede aadir a un mtodo junto con los metadatos de disparo. Por ejemplo, el siguiente mtodo se invoca cada 5 segundos con un retardo fijo, lo que significa que el perodo se mide desde el tiempo de finalizacin de cada invocacin anterior.
@ Programada (fixedDelay = 5000) doSomething public void () { / / Algo que se debe ejecutar peridicamente }

Si la ejecucin de un tipo de inters fijo se desea, slo tiene que cambiar el nombre de propiedad especificado en la anotacin. A continuacin se ejecutar cada 5 segundos medidos entre las horas de inicio sucesivas de cada invocacin.
@ Programada (fixedRate = 5000) doSomething public void () { / / Algo que se debe ejecutar peridicamente }

Para las tareas de retardo fijo y fijo, de un retraso inicial puede especificarse indicando el nmero de milisegundos de espera antes de la primera ejecucin del mtodo.
@ Programada (initialDelay = 1000, fixedRate = 5000) doSomething public void () { / / Algo que se debe ejecutar peridicamente }

Si la programacin peridica simple no es suficiente expresivo, y luego una expresin cron puede ser proporcionado. Por ejemplo, el siguiente ejecutar nicamente en das laborables.
@ Programadas (cron = "* / 5 **** LUN-VIE") doSomething public void () { / / Algo que se debe llevar a cabo de lunes a viernes solamente

Tenga en cuenta que los mtodos que se deben tener programadas devuelve void y no debe esperar ningn argumento. Si el mtodo tiene que interactuar con otros objetos del contexto de aplicacin, a continuacin, las que normalmente se habran llevado a cabo mediante la inyeccin de dependencia.
Nota

Asegrese de que usted no est inicializando varias instancias de la misma clase anotacin @ programadas en tiempo de ejecucin, a menos que se desee programar devoluciones de llamada a cada uno de esos casos. En relacin con esto, asegrese de que usted no usa @ Configurable en las clases de frijol que estn anotados con @ programado y registrado como granos de primavera regulares con el contenedor: Se termina la inicializacin del doble de lo contrario, una vez que a travs del envase y una vez a travs del aspecto configurable @ , con la consecuencia de cada mtodo @ programadas que se invoca dos veces.
27.4.3 La anotacin @ Async

El @Async anotacin se puede proporcionar un mtodo para que la invocacin de este mtodo se producir de forma asncrona. En otras palabras, la persona que llama inmediatamente despus de regresar invocacin y la ejecucin real del mtodo se produzca en una tarea que se ha sometido a una primavera TaskExecutor . En el caso ms sencillo, la anotacin puede ser aplicado a un void mtodo de devolucin.
@ Async doSomething void () { / / Esto se ejecutar de forma asincrnica }

A diferencia de los mtodos anotados con @Scheduled anotacin, estos mtodos pueden esperar argumentos, porque van a ser invocado contra una forma "normal" de las personas que llaman en tiempo de ejecucin en lugar de una tarea programada est gestionado por el contenedor. Por ejemplo, la siguiente es una aplicacin legtima de la @Async anotacin.
@ Async vaco doSomething (String s) { / / Esto se ejecutar de forma asincrnica }

Incluso los mtodos que devuelven un valor puede ser invocado de forma asincrnica. Sin embargo, tales mtodos estn obligados a tener un Future valor de retorno con tipo. Esto todava proporciona el beneficio de la ejecucin asncrona para que el llamante pueda realizar otras tareas antes de llamar a get() sobre ese futuro.
@ Async ReturnSomething <String> Futuro (int i) { / / Esto se ejecutar de forma asincrnica }

@Async

no se puede utilizar en conjuncin con las devoluciones de llamada de ciclo de vida tales como @PostConstruct . Para inicializar de forma asncrona granos de primavera que actualmente tienen que utilizar un bean separado inicializar primavera que invoca al @Async mtodo anotado en el blanco entonces.
pblico SampleBeanImpl clase implementa SampleBean { @ Async doSomething void () {...} } SampleBeanInititalizer clase pblica { final privado frijol SampleBean; SampleBeanInitializer pblico (SampleBean frijol) { este bean bean =.; } @ PostConstruct public void initialize () { bean.doSomething (); } }

27.4.4 Ejecutor calificacin con @ Async

De forma predeterminada cuando se especifica @Async en un mtodo, el ejecutor que ser utilizado es el que se suministra a la 'anotacin impulsada por "elemento como se describe anteriormente. Sin embargo, el value del atributo @Async anotacin se puede utilizar cuando se necesita para indicar que un ejecutor diferente al predeterminado se debe utilizar cuando se ejecuta un mtodo dado.
@ Async ("otherExecutor") vaco doSomething (String s) { / / Esto se ejecutar de forma asincrnica "otherExecutor" }

En este caso, "otherExecutor" puede ser el nombre de cualquier Executor de frijol en el recipiente de Primavera, o puede ser el nombre de un partido de clasificacin asociado con ningn Executor , por ejemplo, tal como se especifica en la <qualifier> elemento o Spring @Qualifier anotacin.

27.5 El Trabajo Espacio de nombres


Comenzando con Spring 3.0, hay un espacio de nombres XML para configurar TaskExecutor y TaskScheduler casos. Tambin proporciona una manera conveniente de configurar tareas para ser programado con un gatillo.
27.5.1 El "programador" elemento

El elemento siguiente crear un ThreadPoolTaskScheduler instancia con el tamao del grupo de subprocesos especificado.

<task:scheduler id = "scheduler" pool-size = "10" />

El valor proporcionado para el atributo 'id' se usa como prefijo para los nombres de rosca dentro de la piscina. El "programador" elemento es relativamente sencillo. Si usted no proporciona un atributo 'pool-size', el grupo de subprocesos predeterminado slo tendr un solo hilo. No hay otras opciones de configuracin para el programador.
27.5.2 El 'ejecutor' elemento

El siguiente crear un ThreadPoolTaskExecutor ejemplo:


<task:executor id = "executor" pool-size = "10" />

Al igual que con los anteriores planificador, el valor proporcionado por el atributo 'id' se usa como prefijo para los nombres de rosca dentro de la piscina. En cuanto al tamao de la piscina se refiere, el elemento ejecutor es compatible con ms opciones de configuracin que el elemento planificador. Por un lado, el grupo de subprocesos para un ThreadPoolTaskExecutor es en s misma ms configurable. En lugar de un solo tamao, la piscina un ejecutor de hilo pueden tener valores diferentes para el ncleo y el tamao mximo. Si un nico valor se proporciona a continuacin, el ejecutor tendr una agrupacin de hebras de tamao fijo (el ncleo y tamaos mximos son el mismo). Sin embargo, el 'ejecutor' elemento de atributo 'pool-size' tambin acepta un rango en forma de "min-max".
Tarea <: id = ejecutor "executorWithPoolSizeRange" pool-size = "5-25" cola de capacidad = "100" />

Como se puede ver en esa configuracin, el valor de una 'cola-capacidad "tambin ha sido proporcionada. La configuracin del grupo de subprocesos tambin debe ser considerado a la luz de capacidad de la cola del albacea. Para una descripcin completa de la relacin entre el tamao de la piscina y capacidad de la cola, consulte la documentacin de ThreadPoolExecutor . La idea principal es que cuando una tarea se presenta, el ejecutor intentar primero utilizar un hilo suelto si el nmero de threads activos actualmente es menor que el tamao del ncleo. Si el tamao del ncleo se ha alcanzado, entonces la tarea se aade a la cola tan larga como su capacidad no se ha alcanzado todava. Slo entonces, si la capacidad de la cola ha sido alcanzado, el ejecutor crear un nuevo hilo ms all del tamao del ncleo. Si el tamao mximo ha sido alcanzado, entonces el ejecutor va a rechazar la tarea. De forma predeterminada, la cola es ilimitado, pero esto no suele ser la configuracin deseada, ya que puede conducir a OutOfMemoryErrors suficientes si las tareas se agregan a la cola mientras que todos los subprocesos del grupo estn ocupados. Adems, si la cola es ilimitado, entonces el tamao mximo no tiene ningn efecto en absoluto. Puesto que el albacea siempre tratar de la cola antes de crear un nuevo hilo ms all del tamao del ncleo, una cola debe tener una capacidad finita para el grupo de subprocesos para crecer ms all del tamao del ncleo (por eso una piscina de tamao fijo es el caso nico sensato al usar una cola infinita). En un momento, vamos a examinar los efectos de la configuracin de mantenimiento de conexin que aade otro factor a considerar cuando se proporciona una configuracin

de tamao de la piscina. En primer lugar, vamos a considerar el caso, como se mencion anteriormente, cuando una tarea se rechaza. De forma predeterminada, cuando una tarea es rechazado, un ejecutor grupo de subprocesos lanzar un TaskRejectedException . Sin embargo, la poltica de rechazo est realmente configurable. La excepcin se produce cuando se utiliza la poltica de rechazo por defecto que es el AbortPolicy implementacin. Para aplicaciones en las que algunas de las tareas pueden ser saltadas con mucha carga, ya sea la DiscardPolicy o DiscardOldestPolicy puede estar configurado en su lugar. Otra opcin que funciona bien para las aplicaciones que necesitan para estrangular las tareas presentadas bajo una carga pesada es la CallerRunsPolicy . En lugar de lanzar una excepcin o tareas de descarte, que la poltica simplemente har que el subproceso que est llamando al mtodo de envo para ejecutar la tarea en s. La idea es que una persona que llama ser ocupado durante la ejecucin de la tarea y no poder presentar otras tareas inmediatamente. Por lo tanto, proporciona una forma sencilla para estrangular la carga entrante manteniendo al mismo tiempo los lmites de la agrupacin de hebras y cola. Normalmente, esto permite que el ejecutor para "ponerse al da" en las tareas que se manejan y por lo tanto libera cierta capacidad en la cola, en la piscina, o ambas cosas. Cualquiera de estas opciones se puede elegir de una enumeracin de valores para el atributo 'rechazo-poltica' en el 'ejecutor' elemento.
Tarea <: id = ejecutor "executorWithCallerRunsPolicy" pool-size = "5-25" cola de capacidad = "100" rechazo-poltica = "CALLER_RUNS" />

27.5.3 Los elementos en listas-tareas "

La caracterstica ms poderosa de espacio de nombres tarea de Primavera es el soporte para la configuracin de las tareas programadas para dentro de un contexto de aplicacin de primavera. Esto sigue un enfoque similar al de otros "mtodoinvocadores" en la primavera, como la que proporciona el espacio de nombres para configurar JMS controlados por mensajes POJOs. Bsicamente un "ref" atributo puede apuntar a cualquier objeto Primavera-administrado, y el "mtodo" atributo proporciona el nombre de un mtodo que se invoca en el objeto. He aqu un ejemplo simple.
<task:scheduled-tasks planificador "myScheduler" => <task:scheduled ref = "beanA" method = "methodA" fixed-delay = "5000" /> </ Tarea:-tareas programadas> <task:scheduler id = "myScheduler" pool-size = "10" />

Como se puede ver, el programador hace referencia el elemento externo, y cada tarea individual incluye la configuracin de sus metadatos gatillo. En el ejemplo anterior, que los metadatos define un disparador peridico con un retardo fijo que indica el nmero de milisegundos de espera despus de cada ejecucin de la tarea se ha completado. Otra opcin es "tasa fija", lo que indica la frecuencia con el mtodo debe ser ejecutado independientemente del tiempo que cualquier ejecucin tomas anteriores. Adems, para ambas tareas retardo fijo y fijo a un parmetro "retardo a la conexin inicial 'puede especificarse indicando el nmero de milisegundos de espera antes de la primera ejecucin del mtodo. Para un mayor control, un "cron" atributo se puede proporcionar en su lugar. He aqu un ejemplo que demuestra estas otras opciones.

<task:scheduled-tasks planificador "myScheduler" => <task:scheduled ref = "beanA" method = "methodA" fixed-delay = "5000" initial-delay = "1000" /> <task:scheduled ref = "beanB" method = "methodB" fixed-rate = "5000" /> <task:scheduled ref = "beanC" method = cron "methodC" = "*/5 * * * * MON-FRI" /> </ Tarea:-tareas programadas> <task:scheduler id = "myScheduler" pool-size = "10" />

27.6 Utilizacin del Programador de cuarzo


Cuarzo utiliza Trigger , Job y JobDetail objetos para realizar la programacin de todo tipo de trabajos. Para los conceptos bsicos detrs de Cuarzo, echar un vistazo a http://quartz-scheduler.org . Por razones de conveniencia, Spring ofrece un par de clases que simplifican el uso de cuarzo dentro de las aplicaciones basadas en Spring.
27.6.1 Uso de la JobDetailBean
JobDetail

objetos contienen toda la informacin necesaria para ejecutar un trabajo. El Spring Framework proporciona una JobDetailBean que hace que el JobDetail ms de un JavaBean real con parmetros por defecto. Vamos a echar un vistazo a un ejemplo:
<bean name = "exampleJob" class = "org.springframework.scheduling.quartz.JobDetailBean"> <propiedad nombre = valor = "jobClass" "example.ExampleJob" /> <propiedad nombre = "jobDataAsMap"> <map> <entry clave = valor = "timeout" "5" /> </ Map> </ Propiedad> </ Bean>

El frijol detalles del trabajo tiene toda la informacin que necesita para ejecutar el trabajo ( ExampleJob ). El tiempo de espera se especifica en la hoja de trabajo de datos. El mapa de trabajo de datos est disponible a travs de la JobExecutionContext (pasa a usted en tiempo de ejecucin), pero el JobDetailBean tambin asigna las propiedades del mapa de trabajo de datos a las propiedades de la tarea actual. As que en este caso, si el ExampleJob contiene una propiedad denominada timeout , el JobDetailBean automticamente se entender por:
paquete de ejemplo; public class extends ExampleJob QuartzJobBean { private int timeout; / ** * Setter llamado despus de la ExampleJob se crea una instancia * Con el valor de la JobDetailBean (5) * / setTimeout public void (int timeout) { Este timeout = tiempo de espera.; }

protected void executeInternal (ctx JobExecutionContext) throws JobExecutionException { / / Hacer el trabajo real } }

Todos los ajustes adicionales de la haba detalles del trabajo son, por supuesto, a su disposicin tambin. Nota: El uso del name y group de propiedades, puede modificar el nombre y el grupo del trabajo, respectivamente. Por defecto, el nombre del trabajo coincide con el nombre del bean del bean detalles del trabajo (en el ejemplo anterior, esto es exampleJob ).
27.6.2 Uso de la MethodInvokingJobDetailFactoryBean

A menudo, slo tiene que llamar a un mtodo en un objeto especfico. Usando el MethodInvokingJobDetailFactoryBean que puede hacer exactamente esto:
<bean id = "jobDetail" class = "org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryB ean"> <propiedad nombre = "targetObject" ref = "exampleBusinessObject" /> <propiedad nombre = valor = "targetMethod" "doIt" /> </ Bean>

En el ejemplo de arriba resultar en la doIt mtodo que se llama en la exampleBusinessObject mtodo (ver a continuacin):
pblico ExampleBusinessObject clase { / / Propiedades y colaboradores doIt public void () { / / Hacer el trabajo real } } <bean id = "exampleBusinessObject" class = "examples.ExampleBusinessObject" />

Usando el MethodInvokingJobDetailFactoryBean , no es necesario crear una lnea de puestos de trabajo que acaba de invocar un mtodo, y slo tiene que crear el objeto comercial real y el alambre hasta el objeto de detalle. De forma predeterminada, Jobs cuarzo son aptridas, dando lugar a la posibilidad de puestos de trabajo que interfieren entre s. Si especifica dos factores desencadenantes de la misma JobDetail , podra ser posible que antes de la primera tarea ha terminado, la segunda se iniciar. Si JobDetail clases implementan la Stateful interfaz, esto no va a suceder. El segundo trabajo no se iniciar antes de que el primero haya terminado. Para hacer que los puestos objeto de la MethodInvokingJobDetailFactoryBean no concurrente, establezca el concurrent bandera false .

<bean id = "jobDetail" class = "org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryB ean"> <propiedad nombre = "targetObject" ref = "exampleBusinessObject" /> <propiedad nombre = valor = "targetMethod" "doIt" /> <propiedad nombre = valor = "concurrent" "false" /> </ Bean>

Nota

De forma predeterminada, los trabajos se ejecutarn de forma concurrente.


27.6.3 Cableado trabajos usando disparadores y la SchedulerFactoryBean

Hemos creado los detalles del trabajo y el empleo. Tambin hemos revisado el grano de la comodidad que le permite invocar un mtodo de un objeto especfico. Por supuesto, todava tenemos que programar los trabajos ellos mismos. Esto se hace usando disparadores y un SchedulerFactoryBean . Varios factores desencadenantes estn disponibles dentro de Cuarzo. Spring ofrece dos disparadores subclases con valores predeterminados convenientes: CronTriggerBean y SimpleTriggerBean . Disparadores deben ser programada. Spring ofrece una SchedulerFactoryBean que expone a factores desencadenantes que se establezcan como propiedades. SchedulerFactoryBean horarios de los puestos de trabajo reales con los factores desencadenantes. Ponemos a tu disposicin un par de ejemplos:
<bean id = "simpleTrigger" class = "org.springframework.scheduling.quartz.SimpleTriggerBean"> <- Ver el ejemplo de mtodo de invocacin de trabajo por encima > <propiedad nombre = "jobDetail" ref = "jobDetail" /> <- 10 segundos -> <propiedad nombre = valor = "startDelay" "10000" /> <- Repetir cada 50 segundos -> <propiedad nombre = valor = "repeatInterval" "50000" /> </ Bean> <bean id = "cronTrigger" class = "org.springframework.scheduling.quartz.CronTriggerBean"> <propiedad nombre = "jobDetail" ref = "exampleJob" /> <- Correr todas las maanas a las 6 AM -> <Nombre de propiedad = "cronExpression" value = "0 0 6 **?" </ Bean>

/>

Ahora que hemos establecido dos disparadores, uno corriendo cada 50 segundos con un retraso inicial de 10 segundos y una cada maana a las 6 PM. Para finalizar todo, tenemos que configurar el SchedulerFactoryBean :
<bean class = "org.springframework.scheduling.quartz.SchedulerFactoryBean"> <propiedad nombre = "triggers"> <list> <ref frijol = "cronTrigger" /> <ref frijol = "simpleTrigger" />

</ List> </ Propiedad> </ Bean>

Ms propiedades disponibles para el SchedulerFactoryBean para que pueda establecer, como los calendarios utilizados por los detalles del trabajo, propiedades para personalizar el cuarzo con, etc Echa un vistazo a la Javadoc SchedulerFactoryBean para ms informacin.

28. Apoyo en el idioma dinmico 28.1 Introduccin


Por qu slo estos idiomas? Los idiomas disponibles se eligieron porque a) las lenguas tienen mucha fuerza en la comunidad Java de la empresa, b) no se presentaron solicitudes para otros idiomas en el plazo de Primavera desarrollo 2,0, y c) los desarrolladores de Spring estaban ms familiarizados con ellos. No hay nada que impida la inclusin de otros idiomas, aunque. Si desea ver el apoyo a <inserte su idioma preferido dinmica aqu>, siempre se puede plantear una cuestin en la primavera de JIRA pgina (o implementar ese apoyo usted mismo). Spring 2.0 introduce soporte completo para el uso de clases y objetos que se han definido utilizando un lenguaje dinmico (como JRuby) con Spring. Este soporte permite escribir cualquier nmero de clases en un idioma admitido dinmico, y tienen el contenedor Spring transparentemente instancias, configurar y dependencia inyectar los objetos resultantes. Los lenguajes dinmicos soportados actualmente son:

JRuby 0.9 / 1.0 Groovy 1,0 / 1,5 BeanShell 2.0

Totalmente ejemplos de trabajo de donde este soporte de lenguajes dinmicos pueden ser de utilidad inmediata se describen en la Seccin 28.4, "Escenarios" . Nota: Slo las versiones especficas que se indican arriba son compatibles en la primavera de 2,5. En particular, JRuby 1,1 (que introdujo muchos cambios en el API incompatibles) no se admite en este punto del tiempo.

28,2 Un ejemplo primero


El grueso de este captulo se ocupa de describir el soporte de lenguajes dinmicos en detalle. Antes de entrar en todos los detalles del soporte de lenguajes dinmicos, echemos un vistazo a un pequeo ejemplo de un bean definido en un lenguaje dinmico. El lenguaje dinmico para este bean primera es maravilloso (la base de este ejemplo fue

tomado de la serie de pruebas de primavera, as que si quieres ver ejemplos equivalentes en cualquiera de los otros idiomas soportados, echa un vistazo al cdigo fuente). Ponemos a tu disposicin el Messenger interfaz que el frijol Groovy se va a aplicar, y tenga en cuenta que esta interfaz se define de manera clara Java. Los objetos dependientes que se inyectan con una referencia al Messenger no sabr que la implementacin subyacente es un script de Groovy.
paquete org.springframework.scripting; pblico Mensajero interfaz { Cadena getMessage (); }

Esta es la definicin de una clase que tiene una dependencia en el Messenger de interfaz.
paquete org.springframework.scripting; DefaultBookingService clase pblica implementa BookingService { privado de mensajera Messenger; public void setMessenger (Mensajero mensajero) { este mensajero = mensajero.; } processBooking public void () { / / Utilizar el objeto Mensajero inyectado ... } }

Aqu es una implementacin del Messenger de interfaz en Groovy.


/ / Desde "Messenger.groovy" el archivo paquete org.springframework.scripting.groovy; / / Importar la interfaz de Messenger (escrito en Java) que se ejecutar importacin org.springframework.scripting.Messenger / / Define la aplicacin en Groovy GroovyMessenger clase implementa Mensajero { Cadena mensaje }

Por ltimo, aqu estn las definiciones de frijol que afectar a la inyeccin de la maravillosa definido Messenger aplicacin en una instancia de la DefaultBookingService clase.
Nota

Para utilizar las etiquetas personalizadas dinmicas del lenguaje dinmico para

definir el idioma de respaldo frijoles, usted necesita tener el prembulo de esquemas XML en la parte superior de su archivo de configuracin XML de Spring. Tambin es necesario utilizar un resorte ApplicationContext aplicacin como su contenedor IoC. Uso de los frijoles dinmica en idioma respaldados con una llanura BeanFactory aplicacin es compatible, pero usted tiene que manejar la tubera de la parte interna del resorte para hacerlo. Para obtener ms informacin sobre el esquema basado en configuracin, consulte el Apndice E, esquema XML de configuracin basada en .
<? Xml version = "1.0" encoding = "UTF-8"> xmlns: lang = "http://www.springframework.org/schema/lang" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd "> <- Esta es la definicin de frijol para la ejecucin Mensajero Groovy con respaldo -> <lang:groovy id = "messenger" script-source "classpath:Messenger.groovy" => <lang:property name = value = "message" "I puede hacer La Frug" /> </ Lang: groovy> <- Un bean por lo dems normal que se inyecta por el Mensajero Groovy con respaldo -> <bean id = "bookingService" class = "xyDefaultBookingService"> <propiedad nombre = "messenger" ref = "messenger" /> </ Bean> </ Beans>

El bookingService frijol (un DefaultBookingService ) ahora puede usar su privado messenger variable miembro como normal porque el Messenger de instancia que se inyect en l es un Messenger de la instancia. No hay nada especial aqu, simplemente Java y Groovy sin formato. Esperemos que el fragmento de cdigo XML anterior se explica por s, pero no te preocupes excesivamente si no lo es. Sigue leyendo para los detalles en profundidad sobre las causas y los motivos de la configuracin anterior.

28.3 Definicin de frijol que estn respaldados por los lenguajes dinmicos
En esta seccin se describe exactamente cmo se defina frijoles primavera administrados en cualquiera de los idiomas soportados dinmicos. Tenga en cuenta que este captulo no trata de explicar la sintaxis y los idiomas de los idiomas soportados dinmicos. Por ejemplo, si desea usar Groovy para escribir algunas de las clases en su aplicacin, entonces se asume que usted ya sabe Groovy. Si necesita

ms detalles sobre los lenguajes dinmicos en s, por favor consulte la Seccin 28.6, "Recursos adicionales" al final de este captulo.
28.3.1 conceptos comunes

Los pasos a seguir en el uso dinmico de idioma respaldados por los frijoles son los siguientes: 1. Escriba el cdigo de prueba para el idioma fuente dinmica (naturalmente) 2. A continuacin, escriba el cdigo de idioma fuente dinmica en s :) 3. Defina sus lengua dinmicos respaldados en grano, utilizando el apropiado <lang:language/> elemento en la configuracin XML (por supuesto puede definir dichos beans mediante programacin utilizando la API de Primavera aunque usted tendr que consultar el cdigo fuente para obtener instrucciones sobre cmo hacer esto ya que este tipo de configuracin avanzada no se trata en este captulo). Cuenta que este es un paso iterativo. Usted necesitar por lo menos una definicin de frijol por archivo fuente dinmica idioma (aunque la misma dinmica de archivos fuente, por supuesto, el lenguaje puede hacer referencia a las definiciones de frijol mltiples). Los dos primeros pasos (las pruebas y escribir sus archivos dinmicos de cdigo de idioma) estn ms all del alcance de este captulo. Consulte la especificacin del lenguaje y / o el manual de referencia para el idioma elegido dinmica y el crack con el desarrollo de sus archivos dinmicos de cdigo de idioma. En primer lugar, tendr que leer el resto de este captulo, sin embargo, como soporte de lenguajes dinmicos Spring hace algunos supuestos (pequeo) sobre el contenido de los archivos dinmicos idioma de origen.
El <lang:language/> elemento

XML Schema Todos los ejemplos de configuracin en este captulo emplean el soporte de Esquemas XML nuevo que se ha aadido en la primavera de 2,0. Es posible renunciar a la utilizacin de esquemas XML y seguir con la validacin de estilo antiguo DTD basada en la primavera de tus archivos XML, pero luego se pierden en la comodidad que ofrece el <lang:language/> elemento. Ver el conjunto de pruebas de primavera para ver ejemplos de la configuracin de estilo antiguo que no requieren de esquemas XML basado en la validacin (que es bastante detallado y no oculta ninguna de la implementacin subyacente de Primavera de usted). El ltimo paso consiste en definir dinmica en idioma respaldados por las definiciones de frijol, uno para cada bean que desea configurar (esto no es diferente de la normal configuracin JavaBean). Sin embargo, en lugar de especificar el nombre de clase completo de la clase que se va a crear instancias y configurar el contenedor, se utiliza el <lang:language/> elemento para definir el lenguaje dinmico apoyado por bean. Cada uno de los idiomas soportados tiene su correspondiente <lang:language/> elemento:

<lang:jruby/> (JRuby) <lang:groovy/> (Groovy) <lang:bsh/> (BeanShell)

Los atributos exactos y elementos secundarios que estn disponibles para la configuracin depende de exactamente qu idioma el grano se ha definido en (las secciones especficas del idioma a continuacin proporcionan la plena verdad sobre esto).
Frijoles actualizables

Una de las (si no la) mayor valor convincente aade el soporte de lenguajes dinmicos en primavera es la funcin "bean actualizable. Un bean es un bean actualizable dinmico-language-backed que con una pequea cantidad de configuracin, una juda dinmica-language-backed puede controlar los cambios en su archivo de cdigo fuente subyacente de recursos y vuelva a cargar s mismo cuando el archivo de idioma fuente dinmica se cambia (por ejemplo cuando un desarrollador edita y guarda los cambios realizados en el archivo del sistema de archivos). Esto permite a los desarrolladores desplegar cualquier nmero de archivos dinmicos idioma de origen como parte de una aplicacin, configurar el contenedor de Spring para crear beans respaldados por dinmicas archivos de idioma fuente (utilizando los mecanismos descritos en este captulo), y ms tarde, a medida que cambian las necesidades o algn otro factor externo entra en juego, slo tiene que editar un archivo de idioma fuente dinmica y tener cualquier cambio que haga se refleja en el grano que est respaldado por la dinmica de archivos cambiado el idioma de origen. No hay necesidad de cerrar una aplicacin en ejecucin (o volver a implementar en el caso de una aplicacin de web). El frijol dinmico-language-backed as enmendada recoger el nuevo estado y la lgica de la dinmica de archivos fuente modificados idioma.
Nota

Tenga en cuenta que esta funcin est desactivada de forma predeterminada. Echemos un vistazo a un ejemplo para ver lo fcil que es comenzar a usar frijoles actualizables. Para activar la funcin de frijoles efmero, slo tiene que especificar exactamente un atributo adicional en el <lang:language/> elemento de la definicin de bean. As que si nos guiamos por el ejemplo de ms arriba en este captulo, esto es lo que iba a cambiar en la configuracin de Spring XML para efectuar frijoles actualizables:
<beans> <- Este frijol es ahora "actualizable", debido a la presencia del atributo 'refresh-delay-check' -> <Lang: groovy id = "mensajero" refresh-check-delay = "5000" <- cambiar refrescante con 5 segundos entre cheques -> guin-source = "classpath: Messenger.groovy">

<lang:property name = value = "message" "I puede hacer La Frug" /> </ Lang: groovy> <bean id = "bookingService" class = "xyDefaultBookingService"> <propiedad nombre = "messenger" ref = "messenger" /> </ Bean> </ Beans>

Eso es realmente todo lo que tienes que hacer. El 'refresh-check-delay' atributo definido en el 'messenger' definicin de bean es el nmero de milisegundos despus de que se actualice el grano con los cambios realizados en la subyacente dinmica de archivos fuente del lenguaje. Se puede desactivar el comportamiento de actualizacin mediante la asignacin de un valor negativo para el 'refresh-check-delay' atributo. Recuerde que, por defecto, el comportamiento de actualizacin est desactivada. Si usted no desea que el comportamiento de actualizacin, entonces simplemente no se define el atributo. Si a continuacin, ejecute la siguiente aplicacin podemos ejercer la funcin actualizable, por favor, disculpe travesuras del "salto a travs de aros-a-pausa-la ejecucin-" en este segmento siguiente de cdigo. El System.in.read() llamada slo est all para que la ejecucin del programa se detiene mientras yo (el autor) se apagan y editar la subyacente dinmica de archivos fuente lenguaje para que la actualizacin se disparar en el bean dinmico-language-backed cuando el programa se reanuda la ejecucin.
org.springframework.context.ApplicationContext importacin; org.springframework.context.support.ClassPathXmlApplicationContext importacin; importar org.springframework.scripting.Messenger; Boot public final class { public static void main (String [] args definitivo) throws Exception { ApplicationContext ctx = new ClassPathXmlApplicationContext ("beans.xml"); Mensajero mensajero = (Messenger) ctx.getBean ("mensajero"); System.out.println (messenger.getMessage ()); / / Pausa ejecucin mientras salgo y realizar cambios en el archivo fuente ... System.in.read (); System.out.println (messenger.getMessage ()); } }

Supongamos a continuacin, para los fines de este ejemplo, que todas las llamadas a la getMessage() mtodo de Messenger implementaciones tienen que ser cambiado de tal manera que el mensaje est rodeado por comillas. A continuacin se presentan los cambios que yo (el autor) hacen a la Messenger.groovy archivo de origen cuando la ejecucin del programa se detiene.
paquete org.springframework.scripting

GroovyMessenger clase implementa Mensajero { String mensaje privado = "Bingo" pblico getMessage String () { / / Cambiar la implementacin para rodear el mensaje entre comillas return "'" + este mensaje. + "'" } public void setMessage (String mensaje) { esto. message = mensaje } }

Cuando se ejecuta el programa, la salida antes de la pausa de entrada ser I Can Do The Frug . Despus de que el cambio en el archivo fuente se hace y se guarda, y el programa reanuda la ejecucin, el resultado de llamar al getMessage() mtodo en el dinmico lenguaje de respaldo Messenger implementacin ser 'I Can Do The Frug' (ntese la inclusin de las cotizaciones adicionales). Es importante entender que los cambios en una secuencia de comandos no desencadenar una actualizacin si los cambios ocurren dentro de la ventana de la 'refresh-checkdelay' valor. Es igualmente importante entender que los cambios en la secuencia de comandos no estn realmente "cogido" hasta que un mtodo es llamado cuando el frijol dinmica en idioma apoyado por Washington. Slo cuando un mtodo es llamado en un grano dinmico-language-backed que comprueba si su fuente de escritura subyacente ha cambiado. Las excepciones relativas a la actualizacin de la secuencia de comandos (por ejemplo, encontrar un error de compilacin, o encontrar que el archivo de secuencia de comandos se ha suprimido) resultar en una excepcin grave se propaga al cdigo de llamada. El comportamiento de frijol actualizable descrito anteriormente no se aplica a los archivos de origen de lenguaje dinmico definido mediante el <lang:inline-script/> notacin elemento (vase la seccin denominada "lnea los archivos dinmicos de cdigo de idioma" ). Adems, slo se aplica a los frijoles que los cambios realizados en el archivo fuente subyacente realmente se pueden detectar, por ejemplo, en el cdigo que comprueba la fecha de ltima modificacin de un archivo de idioma fuente dinmica que existe en el sistema de archivos.
Inline dinmicos archivos de idioma fuente

El soporte de lenguaje dinmico tambin puede atender a dinmicos archivos de idioma de origen que se incrustan directamente en las definiciones de frijol de primavera. Ms especficamente, el <lang:inline-script/> elemento permite definir el idioma de origen dinmico inmediatamente dentro de un archivo de configuracin de Spring. Un ejemplo tal vez har que el cristal escritura caracterstica lnea clara:
<lang:groovy id = "messenger"> <lang:inline-script> paquete org.springframework.scripting.groovy; importacin org.springframework.scripting.Messenger

GroovyMessenger clase implementa Mensajero { Cadena mensaje } </ Lang: inline-script> <lang:property name = value = "message" "I puede hacer La Frug" /> </ Lang: groovy>

Si ponemos a un lado las cuestiones relativas a si es una buena prctica para definir el origen de lenguaje dinmico dentro de un archivo de configuracin de Spring, el <lang:inline-script/> elemento puede ser til en algunos escenarios. Por ejemplo, podramos querer aadir rpidamente una primavera Validator implementacin de un Spring MVC Controller . Esto no es ms que un momento de trabajo con fuente en lnea. (Vase la Seccin 28.4.2, "Validadores con secuencias de comandos" para un ejemplo.) A continuacin encontrar un ejemplo de la definicin de la fuente de un grano de JRuby basada directamente en un archivo de configuracin de Spring XML utilizando la inline: notacin. (Ntese el uso de los caracteres <para indicar un '<' carcter. En tal caso, que rodea la fuente en lnea en un <![CDATA[]]> regin podra ser mejor.)
<lang:jruby id = "messenger" script-interfaces "org.springframework.scripting.Messenger" => <lang:inline-script> require 'java' include_class 'org.springframework.scripting.Messenger' clase RubyMessenger <Mensajero def setMessage (mensaje) @ @ Message = mensaje final def getMessage @ @ Mensaje final final </ Lang: inline-script> <Lang: nombre de la propiedad = "mensaje" value = "Hello World!" /> </ Lang: JRuby>

Entendimiento inyeccin de constructor en el contexto de la dinmica de lengua respaldados por frijoles

Hay una cosa muy importante a tener en cuenta con respecto al apoyo de lenguaje dinmico Spring. Es decir, no es (actualmente) posible suministrar argumentos de constructor a la dinmica de lengua respaldados frijoles (y por lo tanto constructor de inyeccin no est disponible para la dinmica de lengua respaldados frijoles). Con el fin de hacer este tratamiento especial de constructores y propiedades 100% claro, la siguiente mezcla de cdigo y configuracin no funcionar.

/ / Desde "Messenger.groovy" el archivo paquete org.springframework.scripting.groovy; importacin org.springframework.scripting.Messenger GroovyMessenger clase implementa Mensajero { GroovyMessenger () {} / / Este constructor no est disponible para la inyeccin de constructor GroovyMessenger (String mensaje) { este mensaje = mensaje.; } Cadena mensaje Cadena anotherMessage } <Lang: groovy id = "badMessenger" guin-source = "classpath: Messenger.groovy"> <- Este argumento constructor siguiente * no * se inyecta en el GroovyMessenger -> <- De hecho, esto no est permitido, incluso de acuerdo con el esquema -> <constructor-arg value = "Esto *not* trabajar" /> <- Slo los valores dinmico-language-backed <lang:property name directamente a travs de </ Lang> de propiedad se inyectan en el objeto -> = value = "anotherMessage" "Passed la object" dynamic-language-backed />

En la prctica, esta limitacin no es tan importante como parece a primera vista ya que la inyeccin setter es el estilo inyeccin favorecida por la gran mayora de los desarrolladores de todos modos (vamos a dejar el debate sobre si esto es una buena cosa para otro da).
28.3.2 JRuby frijoles

La biblioteca JRuby dependencias El soporte de scripting en la primavera de JRuby requiere las siguientes bibliotecas para estar en el classpath de la aplicacin.
jruby.jar

Desde la pgina principal JRuby ... "JRuby es un 100% pura Java implementacin del lenguaje de programacin Ruby." En consonancia con la filosofa de ofrecer Spring eleccin, soporte de lenguajes dinmicos primavera tambin es compatible con beans definidos en el lenguaje JRuby. El lenguaje JRuby est basado en el lenguaje Ruby bastante intuitivo, y tiene soporte

para Inline expresiones regulares, bloques (cierres), y toda una serie de otras caractersticas que hacen que las soluciones para algunos problemas de dominio de un conjunto mucho ms fcil de desarrollar. La implementacin de la compatibilidad de idioma JRuby dinmica en primavera es interesante, ya que lo que sucede es lo siguiente: Spring crea un proxy dinmico JDK implementar todas las interfaces que se especifican en las 'script-interfaces' valor del atributo del <lang:ruby> elemento (por eso debe proporcionar al menos una interfaz en el valor del atributo, y (en consecuencia) a las interfaces de programa al usar JRuby respaldados frijoles). Veamos un ejemplo totalmente funcional de la utilizacin de un grano de JRuby-based. Aqu est la aplicacin JRuby del Messenger interfaz que se defini anteriormente en este captulo (para su conveniencia se repite ms adelante).
paquete org.springframework.scripting; pblico Mensajero interfaz { Cadena getMessage (); } require 'java' clase RubyMessenger incluir org.springframework.scripting.Messenger def setMessage (mensaje) @ @ Message = mensaje final def getMessage @ @ Mensaje final final # Esta ltima lnea no es esencial (pero vase ms abajo) RubyMessenger.new

Y aqu est el cdigo XML Spring que define una instancia de la RubyMessenger frijol JRuby.
<Lang: JRuby id = "messageService" script-interfaces = "org.springframework.scripting.Messenger" guin-source = "classpath: RubyMessenger.rb"> <Lang: nombre de la propiedad = "mensaje" value = "Hello World!" /> </ Lang: JRuby>

Tome nota de la ltima lnea de esa fuente JRuby ( 'RubyMessenger.new' ). Al usar JRuby en el contexto del apoyo dinmico lenguaje de Primavera, se recomienda crear instancias y devolver una nueva instancia de la clase JRuby que desea utilizar como un bean dinmica en idioma respaldado por el resultado de la ejecucin de su fuente de

JRuby. Usted puede lograr esto simplemente crear una nueva instancia de la clase JRuby en la ltima lnea del archivo de origen, as:
require 'java' include_class 'org.springframework.scripting.Messenger' # Class misma definicin que anteriormente ... # Instanciar y devolver una nueva instancia de la clase RubyMessenger RubyMessenger.new

Si se olvida de hacer esto, no es el fin del mundo, lo que sin embargo se traducir en la primavera de tener que arrastre (reflexivamente) a travs de la representacin de tipo de la clase JRuby buscando una clase para crear instancias. En el gran esquema de las cosas esto va a ser tan rpido que nunca lo note, pero es algo que se puede evitar con slo tener una lnea como la de arriba como la ltima lnea de su script JRuby. Si no se proporciona una lnea, o si la primavera no puede encontrar una clase JRuby en el script para crear instancias de un opaco entonces ScriptCompilationException ser lanzada inmediatamente despus de que la fuente es ejecutado por el intrprete JRuby. El texto clave que lo identifica como la causa de la excepcin se encuentra inmediatamente a continuacin (as que si su contenedor Spring desencadena la siguiente excepcin al crear el dinmico lenguaje de respaldo frijol y el siguiente texto hay en el StackTrace correspondiente, ste ser espero que le permiten identificar fcilmente y solucionar el problema):
org.springframework.scripting.ScriptCompilationException: Compilation of JRuby script returned ''

Para corregir esto, simplemente cree una nueva instancia de cualquiera clase que desea exponer como un grano de JRuby-dinmico-idioma apoyado (como se muestra arriba). Tenga en cuenta que en realidad se puede definir tantas clases y objetos como desee en su script JRuby, lo importante es que el archivo de origen en su conjunto debe devolver un objeto (por Spring para configurar). Consulte Seccin 28.4, "Escenarios" de algunos escenarios en los que es posible que desee usar JRuby basados en granos.
28.3.3 Groovy frijoles

La maravillosa biblioteca dependencias El soporte de scripting Groovy en primavera requiere las siguientes bibliotecas para estar en el classpath de la aplicacin.
groovy-1.5.5.jar asm-2.2.2.jar antlr-2.7.6.jar

Desde la pgina principal Groovy ...

"Groovy es un lenguaje gil dinmica para la plataforma Java 2 que tiene muchas de las caractersticas que la gente le gusta tanto en lenguajes como Python, Ruby y Smalltalk, ponindolas a disposicin de los desarrolladores de Java usando una sintaxis similar a Java". Si usted ha ledo este captulo directamente desde la parte superior, ya habr visto un ejemplo de un bean Groovy-dinmico-idioma apoyado por Washington. Veamos otro ejemplo (utilizando de nuevo un ejemplo del conjunto de pruebas de la primavera).
paquete org.springframework.scripting; Calculadora {public interface int suma (int x, int y); }

Aqu es una implementacin de la Calculator interfaz en Groovy.


/ / Desde "calculator.groovy" el archivo paquete org.springframework.scripting.groovy GroovyCalculator clase implementa Calculadora { int suma (int x, int y) { x + y } } <- Desde 'beans.xml' el archivo -> <beans> <lang:groovy id = "calculator" script-source = "classpath:calculator.groovy" /> </ Beans>

Por ltimo, he aqu una pequea aplicacin que permite ejercer la configuracin anterior.
paquete org.springframework.scripting; org.springframework.context.ApplicationContext importacin; org.springframework.context.support.ClassPathXmlApplicationContext importacin; pblico principal de la clase { public static void main (String [] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext ("beans.xml"); Calculadora calc = (Calculator) ctx.getBean ("calculadora"); System.out.println (calc.add (2, 8)); } }

La salida resultante de la ejecucin del anterior programa (como era de esperar) 10 . (Ejemplo Emocionante, eh? Recuerde que el propsito es ilustrar el concepto., Por favor consulte el proyecto de lenguaje dinmico escaparate para un ejemplo ms complejo, o de hecho la Seccin 28.4, "Escenarios" ms adelante en este captulo).

Es importante que no se define ms de una clase por archivo fuente Groovy. Si bien esto es perfectamente legal en Groovy, es (posiblemente) una mala prctica: en aras de un enfoque coherente, debe (en opinin de este autor) respetar las convenciones estndar de Java de uno (pblico) de clase por archivo fuente.
Personalizacin de objetos maravillosos a travs de una devolucin de llamada

El GroovyObjectCustomizer interfaz es una devolucin de llamada que le permite conectar lgica de creacin adicional en el proceso de crear un bean de respaldo Groovy. Por ejemplo, las implementaciones de esta interfaz podra invocar cualquier mtodo de inicializacin requerido (s), o configurar algunos valores de propiedad predeterminados o especificar una MetaClass .
pblico GroovyObjectCustomizer interfaz { vaco personalizar (GroovyObject goo); }

El Spring Framework se crea una instancia de su Groovy respaldado por bean, y luego pasar lo creado GroovyObject al especificado GroovyObjectCustomizer si se ha definido. Usted puede hacer lo que quiera con el cable GroovyObject referencia: se espera que el establecimiento de una costumbre MetaClass es lo que la mayora de la gente va a querer hacer con esta devolucin de llamada, y se puede ver un ejemplo de hacer ms adelante.
SimpleMethodTracingCustomizer public final class implementa GroovyObjectCustomizer { public void personalizar (GroovyObject goo) { DelegatingMetaClass metaclase = new DelegatingMetaClass (goo.getMetaClass ()) { InvokeMethod public Object (objeto Object, methodName String, Object [] argumentos) { System.out.println ("Invocacin" methodName + + "."); volver sper InvokeMethod (objeto, methodName, argumentos).; } }; metaClass.initialize (); goo.setMetaClass (metaclase); } }

Una discusin completa de meta-programacin Groovy est ms all del alcance del manual de referencia de primavera. Consulte la seccin correspondiente del manual de referencia Groovy, o hacer una bsqueda en lnea: hay un montn de artculos sobre este tema. En realidad, haciendo uso de un GroovyObjectCustomizer es fcil si se utiliza el soporte de espacio de nombres Spring 2.0.
<- Definir la GroovyObjectCustomizer como cualquier otro frijol -> <bean id = "tracingCustomizer" class = "example.SimpleMethodTracingCustomizer" />

<-! ... y conctelo al deseado frijol Groovy por el atributo 'personalizador-ref' -> <Lang: groovy id = "calculadora" guin-source = "classpath: org / springframework / scripts / Groovy / Calculator.groovy" personalizador-ref = "tracingCustomizer" />

Si no se utiliza el soporte de espacio de nombres Spring 2.0, puede utilizar el GroovyObjectCustomizer funcionalidad.
<bean id = "calculator" class = "org.springframework.scripting.groovy.GroovyScriptFactory"> <constructor-arg value = "classpath:org/springframework/scripting/groovy/Calculator.groovy" /> <- Definir la GroovyObjectCustomizer (como un bean de interior) -> <constructor-arg> <bean id = "tracingCustomizer" class = "example.SimpleMethodTracingCustomizer" /> </ Constructor-arg> </ Bean> <bean class = "org.springframework.scripting.support.ScriptFactoryPostProcessor" />

28.3.4 frijoles BeanShell

La biblioteca BeanShell dependencias El soporte de scripts BeanShell en primavera requiere las siguientes bibliotecas para estar en el classpath de la aplicacin.
bsh-2.0b4.jar

Desde la pgina principal BeanShell ... "BeanShell es un pequeo intrprete gratuito, integrable fuente Java con caractersticas de lenguaje dinmico, escrito en Java. BeanShell ejecuta dinmicamente la sintaxis estndar de Java y lo ampla con las comodidades de secuencias de comandos comunes, tales como los tipos sueltos, comandos y cierres de mtodos como los de Perl y JavaScript ". En contraste con Groovy, BeanShell respaldados por las definiciones de frijol requieren alguna configuracin (pequeo) adicional. La puesta en prctica del apoyo BeanShell lenguaje dinmico en primavera es interesante, ya que lo que sucede es lo siguiente: Spring crea un proxy dinmico JDK implementar todas las interfaces que se especifican en las 'script-interfaces' valor del atributo del <lang:bsh> elemento (por eso debe proporcionar al menos una interfaz en el valor del atributo, y (en consecuencia) a las interfaces de programa al usar BeanShell respaldados frijoles). Esto significa que cada llamada a un mtodo en un objeto BeanShell respaldado pasa por el mecanismo de invocacin dinmica JDK proxy.

Veamos un ejemplo totalmente funcional de utilizar un bean BeanShell basada en que implementa el Messenger interfaz que se defini anteriormente en este captulo (repetido a continuacin para su conveniencia).
paquete org.springframework.scripting; pblico Mensajero interfaz { Cadena getMessage (); }

Aqu est la ejecucin del BeanShell (el trmino se utiliza libremente aqu) del Messenger de interfaz.
Cadena de mensaje; Cadena getMessage () { devolver mensaje; } vaco setMessage (String unMensaje) { message = unMensaje; }

Y aqu est el cdigo XML Spring que define un "ejemplo" de lo anterior "clase" (de nuevo, el trmino se utiliza de manera muy informal aqu).
<Lang: bsh id = "messageService" script-source = "classpath: BshMessenger.bsh" script-interfaces = "org.springframework.scripting.Messenger"> <Lang: nombre de la propiedad = "mensaje" value = "Hello World!" /> </ Lang: bsh>

Consulte Seccin 28.4, "Escenarios" de algunos escenarios en los que es posible que desee usar BeanShell basados en granos.

28.4 Escenarios
Los escenarios posibles en primavera definir administrados frijoles en un lenguaje de script sera beneficioso, por supuesto, muchas y variadas. En esta seccin se describen dos casos de uso posibles para el soporte de lenguajes dinmicos en la primavera.
28.4.1 secuencias de comandos Spring MVC Controladores

Un grupo de clases que pueden beneficiarse del uso de lenguaje dinmico respaldados frijoles es que los controladores de Spring MVC. En primavera puras aplicaciones MVC, el flujo de navegacin a travs de una aplicacin web es en gran medida determinado por el cdigo encapsulado dentro de sus controladores Spring MVC. A medida que el flujo de navegacin y otra lgica la capa de presentacin de una aplicacin web debe ser actualizado para responder a cuestiones o apoyar cambios en los requisitos de negocio, bien puede ser ms fcil de llevar a cabo los cambios

necesarios tales editando uno o ms archivos dinmicos Idioma de origen y ver los cambios se reflejan inmediatamente en el estado de una aplicacin en ejecucin. Recuerde que en el modelo ligero arquitectnico adoptado por proyectos como Primavera, normalmente se aspira a tener una capa de presentacin muy finas, con toda la lgica de negocio sustancioso de una aplicacin que se est contenida en el dominio y las clases de servicio de la capa. El desarrollo de Spring MVC como controladores dinmicos idioma respaldados frijoles le permite cambiar la lgica de la capa de presentacin con slo editar y guardar archivos de texto, cualquier cambio en estos archivos dinmicos idioma de origen que (dependiendo de la configuracin) automticamente se reflejar en los granos que estn respaldados dinmicas de los archivos de idioma de origen.
Nota

Para efectuar este automtico 'pickup' de cualquier cambio dinmico de idioma respaldados frijoles, se le han tenido que habilitar la funcionalidad de los "frijoles actualizables. Vea la seccin llamada "frijoles" actualizable para un tratamiento completo de esta caracterstica. Encontrar ms adelante un ejemplo de un
org.springframework.web.servlet.mvc.Controller

implementado usando el

lenguaje Groovy dinmico.


/ / En el archivo '/ WEB-INF/groovy/FortuneController.groovy' paquete org.springframework.showcase.fortune.web importacin org.springframework.showcase.fortune.service.FortuneService importacin org.springframework.showcase.fortune.domain.Fortune importacin org.springframework.web.servlet.ModelAndView importacin org.springframework.web.servlet.mvc.Controller importacin javax.servlet.http.HttpServletRequest importacin javax.servlet.http.HttpServletResponse FortuneController clase implementa Controller { @ Propiedad FortuneService fortuneService ModelAndView handleRequest ( HttpServletRequest solicitud, HttpServletResponse HttpServletResponse) { return new ModelAndView ("saber", "fortuna", este fortuneService.tellFortune. ()) } } <Lang: groovy id = "fortuna" refresh-check-delay = "3000" guin-source = "/ WEBINF/groovy/FortuneController.groovy"> nombre = <lang:property "fortuneService" ref = "fortuneService" /> </ Lang: groovy>

28.4.2 Validadores con secuencias de comandos

Otra rea de desarrollo de aplicaciones con la primavera que se pueden beneficiar de la flexibilidad que ofrece la dinmica de lengua respaldados frijoles es la de validacin. Puede ser ms fcil de expresar la lgica de validacin compleja utilizando un lenguaje dinmico libremente con tipo (que tambin tiene soporte para Inline expresiones regulares) en lugar de regular de Java. Una vez ms, el desarrollo de validadores como dinmica en idioma respaldados frijoles le permite cambiar la lgica de validacin, simplemente editar y guardar un archivo de texto simple, dichos cambios (dependiendo de la configuracin) automticamente se reflejar en la ejecucin de una aplicacin en ejecucin y no lo hara requieren el reinicio de una aplicacin.
Nota

Tenga en cuenta que para poder efectuar el automtico 'pickup' de cualquier cambio dinmico de idioma respaldados frijoles, se le han tenido que activar la funcin de los "frijoles actualizables. Vea la seccin llamada "frijoles" actualizable para un tratamiento completo y detallado de esta funcin. Encontrar ms adelante un ejemplo de un Spring
org.springframework.validation.Validator

implementado usando el lenguaje Groovy dinmico. (Consulte la Seccin 7.2, "Validacin utilizando Spring Validator interfaz " para una discusin de la Validator interfaz.)
importacin org.springframework.validation.Validator importar org.springframework.validation.Errors importacin org.springframework.beans.TestBean TestBeanValidator clase implementa Validator { booleano soportes (Clase clazz) { volver testBean. clase. IsAssignableFrom (clazz) } invalidar validar (Object bean, Errores) { if (bean.name?. trim ()?. size ()> 0) { volver } errors.reject ("espacio en blanco", "No se puede estar compuesto enteramente de espacios en blanco.") } }

28,5 Bits and bobs


Esta ltima seccin contiene algunos bits y bobs relacionados con el soporte de lenguajes dinmicos.

28.5.1 AOP - asesorar a los frijoles con guin

Es posible utilizar el Spring AOP marco para asesorar a granos de secuencias de comandos. The Spring AOP marco realmente no sabe que un grano que est siendo asesorado puede ser un grano de secuencias de comandos, por lo que todos los casos de uso del AOP y la funcionalidad que usted puede usar o tratar de utilizar a trabajar con los granos de secuencias de comandos. Slo hay una (pequea) lo que usted necesita para tener en cuenta al asesorar a los frijoles con guin ... no puede utilizar proxies basados en clases, debe utilizar la interfaz basados en proxies . Est claro que no slo se limita a asesorar a los frijoles con guin ... tambin puede escribir aspectos s mismos en un lenguaje soportado dinmico y utilizar esos granos para asesorar a otros beans Spring. Esto realmente sera un uso elevado de la lengua de apoyo dinmico sin embargo.
28.5.2 Alcance

En caso de que no sea inmediatamente obvio, frijoles con guin puede ser, por supuesto mbito al igual que cualquier otro frijol. El scope de atributo en los diversos <lang:language/> elementos le permite controlar el alcance de la haba con guin subyacente, tal como lo hace con un grano regular. (El mbito predeterminado es singleton , al igual que sucede con "regulares" frijoles.) Encontrar ms adelante un ejemplo del uso del scope atributo para definir un bean Groovy mbito como un prototipo .
<? Xml version = "1.0" encoding = "UTF-8"> xmlns: lang = "http://www.springframework.org/schema/lang" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd "> <lang:groovy id = "messenger" script-source = "classpath:Messenger.groovy" scope="prototype"> <lang:property name = value = "message" "I puede hacer La RoboCop" /> </ Lang: groovy> <bean id = "bookingService" class = "xyDefaultBookingService"> <propiedad nombre = "messenger" ref = "messenger" /> </ Bean> </ Beans>

Consulte Seccin 5.5, "Bean mbitos" en el Captulo 5, El contenedor IoC para una discusin ms completa del soporte de alcance en el marco de la Primavera.

28.6 Recursos adicionales

A continuacin encontrar enlaces a recursos adicionales sobre los distintos idiomas dinmicos que figuran en este captulo.

El JRuby pgina de inicio La maravillosa pgina de inicio El BeanShell pgina de inicio

Algunos de los miembros ms activos de la comunidad de Primavera tambin han aadido soporte para varios lenguajes dinmicos adicionales por encima y ms all de las contempladas en este captulo. Si bien es posible que tales contribuciones de terceros pueden agregar a la lista de idiomas soportados por la distribucin de Primavera principal, su mejor apuesta para ver si su lenguaje de script favorito se admite es el proyecto Spring Mdulos .

29. Cach de abstraccin 29.1 Introduccin


Desde la versin 3.1, Spring Framework proporciona compatibilidad para el almacenamiento en cach transparente agregando a una aplicacin Spring existente. Similar a la transaccin de apoyo, la abstraccin de almacenamiento en cach permite el uso constante de soluciones de almacenamiento en cach diversas con un impacto mnimo en el cdigo.

29.2 Entender la abstraccin cach


Cach vs Buffer Los trminos "tampn" y "cache" suelen utilizarse indistintamente, cuenta sin embargo que representan cosas diferentes. Un buffer es usado tradicionalmente como un almacn temporal intermedio para los datos entre un ayuno y una entidad lento. Como una de las partes tendra que esperar a que el rendimiento que afecte, el tampn alivia esto permitiendo que bloques enteros de datos para mover a la vez en lugar de en trozos pequeos. Los datos se escriben y se leen slo una vez de la memoria intermedia. Por otra parte, los tampones son visibles por lo menos a una de las partes, que es consciente de ello. Una memoria cach por otro lado, por definicin, est oculta y ninguna de las partes es consciente de que el almacenamiento en cach occurs.It as mejora el rendimiento pero que al permitir que los mismos datos que se deben leer varias veces de una manera rpida. Una explicacin ms detallada de las diferencias entre los dos se puede encontrar aqu . En su esencia, la abstraccin se aplica a los mtodos de almacenamiento en cach de Java, reduciendo as el nmero de ejecuciones basadas en la informacin disponible en la cach. Es decir, cada vez que se invoca un mtodo objetivo, la abstraccin se aplicar un comportamiento de la cach comprobar si el mtodo ha sido ya ejecutada por los argumentos dados. Si lo tiene, entonces el resultado almacenado en cach es devuelto

sin tener que ejecutar el mtodo actual, y si no es as, entonces se ejecuta el mtodo, el resultado almacenado en cach y se devuelve al usuario de modo que, la prxima vez que se invoca el mtodo, el resultado almacenado en cach se devuelve. De esta manera, los mtodos caros (si la CPU o IO unido) se puede ejecutar solamente una vez para un conjunto dado de parmetros y el resultado reutilizado sin tener que ejecutar realmente el mtodo de nuevo. La lgica de almacenamiento en cach se aplica de forma transparente sin ningn tipo de interferencia al invocador.
Importante

Obviamente, este enfoque slo funciona para los mtodos que estn garantizados para devolver la misma salida (resultado) para una entrada dada (o argumentos) no importa cuntas veces se ejecuta. Para utilizar la abstraccin cach, el desarrollador tiene que cuidar de dos aspectos:

almacenamiento en cach declaracin - identificar los mtodos que deben ser cacheados y su poltica configuracin cache - La cach de respaldo donde se almacenan los datos y leer

Tenga en cuenta que al igual que otros servicios en Spring Framework, el servicio de almacenamiento en cach es una abstraccin (no una implementacin de memoria cach) y requiere el uso de un almacenamiento real para almacenar los datos de la cach - es decir, la abstraccin libera al programador de tener que escribir el almacenamiento en cach lgica, pero no provee los almacenes reales. Hay dos integraciones disponibles fuera de la caja, para JDK java.util.concurrent.ConcurrentMap y Ehcache - vase la Seccin 29.6, "Conexin en diferentes cachs de back-end" para obtener ms informacin sobre la memoria cach almacena conectar otros / proveedores.

29,3 declarativa anotacin en cach basado en


Para el almacenamiento en cach declaracin, la abstraccin proporciona dos anotaciones Java: @Cacheable y @CacheEvict que permiten mtodos para activar poblacin cach o cach de desalojo. Echemos un vistazo a cada anotacin:
29.3.1 @Cacheable anotacin

Como el nombre implica, @Cacheable se utiliza para delimitar los mtodos que son cacheable - es decir, los mtodos para los que se almacena el resultado en la memoria cach as sucesivamente invocaciones posteriores (con los mismos argumentos), el valor en la memoria cach es devuelto sin tener que realmente ejecutar el mtodo. En su forma ms simple, la declaracin de anotacin requiere el nombre de la memoria cach asociada con el mtodo comentado:
@ Cacheable ("libros") pblico findBook Libro (ISBN isbn) {...}

En el cdigo anterior, el mtodo findBook est asociado con la memoria cach con nombre books . Cada vez que se llama el mtodo, la memoria cach se comprueba para

ver si la invocacin ha sido ejecutado y no tiene que ser repetido. Mientras que en la mayora de los casos, slo una memoria cach se declara, la anotacin permite mltiples nombres que se especifique de modo que ms de una cach estn siendo utilizados. En este caso, cada una de las memorias cach se comprueba antes de ejecutar el mtodo - si al menos una memoria cach es alcanzado, entonces el valor correspondiente se devolver:
Nota

Todas las otras cachs que no contienen el mtodo se actualizar as a pesar de que el mtodo de cach no se ha ejecutado realmente.
@ Cacheable ({"libros", "ISBN"}) pblico findBook Libro (ISBN isbn) {...}

Generacin de claves por defecto

Desde cachs son esencialmente de clave y valor almacenes, cada invocacin de un mtodo de cach debe traducirse en una llave adecuada para el acceso de cach. Fuera de la caja, la abstraccin de almacenamiento en cach utiliza una simple KeyGenerator basado en el algoritmo siguiente:

Si no se dan params, devuelve 0. Si slo hay un parmetro dado, regresa esa instancia. Si el parmetro ms uno se le da, regresa una clave calculada a partir de los valores hash de todos los parmetros.

Este enfoque funciona bien para objetos con claves naturales, siempre y cuando el hashCode() lo refleja. Si ese no es el caso, entonces para entornos distribuidos o persistente, la estrategia necesita ser cambiado, como la hashCode objetos no se conserva. De hecho, dependiendo de la implementacin JVM o condiciones de funcionamiento, el mismo cdigo hash puede ser reutilizada para diferentes objetos, en la instancia de VM mismo. Para proporcionar un generador de claves predeterminado diferente, hay que aplicar la org.springframework.cache.KeyGenerator interfaz. Una vez configurado, el generador se utiliza para cada declaracin que no especifica su propia estrategia de generacin de claves (ver ms abajo).
Declaracin de encargo de Generacin de Claves

Dado que el almacenamiento en cach es genrico, es bastante probable que los mtodos de destino tienen distintas firmas que no pueden ser simplemente mapeados en la parte superior de la estructura de cach. Esto tiende a ser evidente cuando el mtodo de destino tiene varios argumentos de los cuales slo algunos son adecuados para el almacenamiento en cach (mientras que el resto se utilizan slo por la lgica del mtodo). Por ejemplo:
@ Cacheable ("libros") pblico findBook Libro (ISBN isbn, booleano checkWarehouse, booleano includeUsed

A primera vista, mientras que los dos boolean argumentos influir en la forma en que se encuentra el libro, que no sirven para la cach. Ms lejos ms que si slo uno de los dos es importante, mientras que la otra no lo es? Para tales casos, la @Cacheable anotacin permite al usuario especificar cmo la clave se genera a travs de su key atributo. El desarrollador puede utilizar Spel para recoger los argumentos de inters (o sus propiedades anidadas), lleve a cabo las operaciones o incluso invocar mtodos arbitrarios sin tener que escribir ningn cdigo o implementacin de la interfaz. Este es el enfoque recomendado por el defecto generador ya que los mtodos tienden a ser muy diferentes en firmas como la base del cdigo crece, mientras que la estrategia por defecto podra funcionar para algunos mtodos, rara vez lo hace para todos los mtodos. A continuacin se presentan algunos ejemplos de declaraciones de diversos Spel - si usted no est familiarizado con l, hgase un favor y leer el captulo 8, Lenguaje Spring Expresin (SPEL) :
@ Cacheable (value = "libros", key = "# isbn" pblico findBook Libro (ISBN isbn, booleano checkWarehouse, booleano includeUsed) @ Cacheable (valor = "libros", key = "# isbn.rawNumber") pblico findBook Libro (ISBN isbn, booleano checkWarehouse, booleano includeUsed) @ Cacheable (value = "libros", key = "T (SomeType). Hash (# isbn)") pblico findBook Libro (ISBN isbn, booleano checkWarehouse, booleano includeUsed)

Los fragmentos anteriores, muestran lo fcil que es elegir un argumento cierto, una de sus propiedades o incluso un mtodo arbitrario (esttico).
Cache condicional

A veces, un mtodo puede no ser adecuado para el almacenamiento en cach todo el tiempo (por ejemplo, que podra depender de los argumentos dados). Las anotaciones de cach apoyar dicha funcionalidad a travs de la conditional parmetro que toma un SpEL expresin que se evala a cada true o false . Si true , el mtodo se almacena en cach - si no, se comporta como si el mtodo no se almacena en cach, que se ejecuta cada vez ya que no importa qu valores estn en el cach o los argumentos que se utilizan. Un ejemplo rpido - el mtodo siguiente se almacenan en cach, slo si el argumento de name tiene una longitud ms corta que 32:
@ Cacheable (value = "libro", la condicin = "# name.length <32") pblico findBook Libro (String nombre)

Disponible cach SpEL evaluacin de contexto

Cada SpEL expresin se evala de nuevo un dedicado context . Adems de la construccin de los parmetros, el marco proporciona dedicado almacenamiento en cach de metadatos relacionados, tales como los nombres de argumento. La tabla

siguiente muestra los elementos puestos a disposicin del contexto por lo que uno puede utilizar para los clculos clave y condicional (vase la seccin siguiente): Tabla 29,1. Cach Spel disponible metadatos
Nombre Ubicacin Descripcin Ejemplo
# Root.methodName # Root.method.name # Root.target # Root.targetClass # Root.args [0]

methodName raz objeto El nombre del mtodo que se invoca mtodo objetivo raz objeto El mtodo que se invoca raz objeto El objeto de destino que se invoque

targetClass raz objeto La clase de la meta que se invoque args raz objeto Los argumentos (como conjunto) que se utilizan para invocar el objetivo Coleccin de cachs contra las que se ejecuta el mtodo actual

caches

raz objeto

# Root.caches [0]. Nombre iban

Nombre de cualquiera de el argumento del mtodo. Si por alguna razn, los nombres no estn disponibles (por ejemplo: no hay argumento de evaluacin informacin de depuracin), los nombres nombre de contexto de los argumentos tambin estn disponibles en el marco del a<#arg> , donde # arg representa el ndice de argumentos (empezando por 0).

o
a0

(Tambin se puede usar


p0

o p<#arg> notacin como un alias).

29.3.2 @CachePut anotacin

Para los casos en que la memoria cach necesita ser actualizada sin interferir con la ejecucin del mtodo, se puede utilizar la @CachePut anotacin. Esto es, el mtodo se ejecutar siempre y su resultado se coloca en la memoria cach (de acuerdo con las @CachePut opciones). Es compatible con las mismas opciones que @Cacheable y debe ser usado para la poblacin de cache en vez de optimizacin del mtodo de flujo. Tenga en cuenta que el uso @CachePut y @Cacheable anotaciones en el mismo mtodo que generalmente se desaniman porque tienen comportamientos diferentes. Mientras que este ltimo provoca la ejecucin del mtodo se omiten mediante el uso de la memoria cach, las antiguas fuerzas de la ejecucin con el fin de ejecutar una actualizacin de memoria cach. Esto conduce a un comportamiento inesperado y con la excepcin de los casos especficos de esquina (tales como anotaciones que tienen condiciones que los excluyen entre s), estas declaraciones deben ser evitados.

29.3.3 @CacheEvict anotacin

La abstraccin cach permite no slo la poblacin de un almacn de cach pero tambin desalojo. Este proceso es til para eliminar los datos obsoletos o sin usar de la memoria cach. Opuesto a @Cacheable , anotacin @CacheEvict demarca mtodos que realizan desalojo cach, que son los mtodos que actan como disparadores para la eliminacin de datos de la cach. Al igual que su hermano, @CacheEvict requiere que se especifique una (o varias) caches que se ven afectados por la accin, permite que una llave o una condicin que se especifica, pero adems, cuenta con un parmetro adicional allEntries que indica si la cach todo el desalojo necesita ser realizada en lugar de slo una entrada de un (basada en la clave):
@ CacheEvict (valor = "libros", allEntries = true) loadBooks public void (InputStream lotes)

Esta opcin es muy til cuando una regin de cach completa necesita ser limpiado - en lugar de desalojar a cada entrada (que tomara mucho tiempo, ya que es ineficaz), todos los entires se eliminan en una sola operacin, como se muestra arriba. Tenga en cuenta que el marco ignorar cualquier clave especificada en este escenario, ya que no se aplica (toda la memoria cach se expulsa no slo una entrada). Tambin se puede indicar si el desalojo debe ocurrir despus (por defecto) o antes de que el mtodo se ejecuta a travs de la beforeInvocation atributo. El primero proporciona la misma semntica que el resto de las anotaciones - una vez que el mtodo se completa con xito, una accin (en este caso de desalojo) en la memoria cach se ejecuta. Si el mtodo no se ejecuta (como podra ser en cach) o se produce una excepcin, el desalojo no se produce. Este ltimo ( beforeInvocation=true ) provoca el desalojo que se produzca siempre, antes de que el mtodo se invoca - esto es til en los casos en que el desalojo no necesita estar atado a los resultados del mtodo. Es importante sealar que los mtodos de vaco se puede utilizar con @CacheEvict como los mtodos actan como desencadenantes, los valores de retorno se ignoran (ya que no interactan con la cach) - este no es el caso con @Cacheable que aade / actualizar los datos en la memoria cach y por tanto requiere un resultado.
29.3.4 @Caching anotacin

Hay casos en que varias anotaciones del mismo tipo, como @CacheEvict o @CachePut necesario especificar, por ejemplo, debido a la condicin o la expresin clave es diferente entre diferentes cachs. Desafortunadamente Java no es compatible con estas declaraciones sin embargo hay una solucin - con una anotacin circundante, en este caso, @Caching . @Caching permite que mltiples anidado @Cacheable , @CachePut y @CacheEvict para ser utilizado en el mismo mtodo:
@ Cach (evict = {@ CacheEvict ("principal"), @ CacheEvict (value = "secundaria", key = "# p0")}) importBooks pblicos libro (String depsito, fecha fecha)

29.3.5 Permitir anotaciones cach

Es importante sealar que a pesar de declarar las anotaciones cach no dispara automticamente sus acciones - como muchas cosas en la primavera, la funcin tiene que ser activada mediante declaracin (lo que significa que si alguna vez sospecha almacenamiento en cach es el culpable, puede desactivarlo mediante la eliminacin de slo una configuracin de lnea en lugar de todas las anotaciones en el cdigo). Para habilitar el almacenamiento en cach anotaciones aadir la anotacin @EnableCaching a uno de tus @Configuration clases:
@ Configuracin @ EnableCaching AppConfig clase pblica { }

Como alternativa para la configuracin de XML usar el cache:annotation-driven elemento:


xmlns: cache = "http://www.springframework.org/schema/cache" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd "> <cache:annotation-driven /> </ Beans>

Tanto la cache:annotation-driven elemento y @EnableCaching anotacin permitir diversas opciones para especificar que la influencia de la forma en que el comportamiento de la cach se aade a la aplicacin a travs de AOP. La configuracin es intencionalmente similar al de @Transactional : Tabla 29.2. Configuracin de cach de anotacin
Atributo XML Atributo anotacin Defecto Descripcin

cacheCachingConfigurer cacheManager manager

N / A (Ver Javadoc)

mode

mode

apoderado

Nombre del administrador de la cach para su uso. Slo es necesario si el nombre del gestor de memoria cach no es cacheManager , como en el ejemplo anterior. El modo predeterminado "sustitutivos" frijoles procesos anotados para ser proxy usando Spring AOP marco (siguiendo la semntica de proxy, como

Atributo XML

Atributo anotacin

Defecto

Descripcin

proxytarget- proxyTargetClass class

falso

se discuti anteriormente, aplicando el mtodo de las llamadas entrantes a travs del proxy solamente). La alternativa mode "AspectJ" en lugar teje las clases afectadas con aspecto de Spring cach AspectJ, modificando la clase de destino cdigo byte para aplicar a cualquier tipo de llamada al mtodo. Tejer AspectJ requiere primaveraaspects.jar en la ruta de clases, as como en tiempo de carga de tejer (o en tiempo de compilacin tejido) habilitado. (Consulte la seccin "Configuracin de primavera" para obtener detalles sobre cmo configurar el tiempo de carga de tejido.) Se aplica a modo de proxy solamente. Controla qu tipo de almacenamiento en cach de proxy se crean para las clases anotadas con la @Cacheable o @CacheEvict anotaciones. Si el proxy-targetclass atributo se establece en true , entonces las clases basadas en proxies se crean. Si proxy-targetclass es false o si el atributo se omite, entonces JDK estndar de interfaz basadas en proxies se crean. (Ver Seccin 9.6, "mecanismos" Uso de proxy para un examen detallado de los diferentes tipos de proxy).

Atributo XML

Atributo anotacin

Defecto

Descripcin

order

order

Define el orden del consejo de cach que se aplica a los frijoles anotado con @Cacheable o @CacheEvict . (Para obtener ms informacin acerca de las reglas relacionadas con la Ordered.LOWEST_PRECEDENCE ordenacin de asesoramiento AOP, consulte la seccin "Consejos de ordenamiento" .) No hay medios especficos pedido que el subsistema de AOP determina el orden del consejo.

Nota
<cache:annotation-driven/>

slo busca @Cacheable/@CacheEvict en frijol en el contexto de la aplicacin misma se define pulg Esto significa que, si se pone <cache:annotation-driven/> en un WebApplicationContext un DispatcherServlet , slo comprueba @Cacheable/@CacheEvict frijoles en sus controladores, y no sus servicios. Consulte Seccin 17.2, "El DispatcherServlet " para ms informacin. Mtodo visibilidad y @Cacheable/@CachePut/@CacheEvict Al usar proxies, debe aplicar las @Cache* anotaciones slo a los mtodos con visibilidad pblica. Si lo hace anotar protegida, mtodos privados o visible de paquetes con estas anotaciones, no hay ningn error, pero el mtodo anotado no presenta la configuracin de almacenamiento en cach configurados. Considere el uso de AspectJ (ver ms abajo), si usted necesita para anotar mtodos no pblicos, ya que cambia el propio cdigo de bytes.
Punta

Spring recomienda que slo anotar clases concretas (y los mtodos de las clases concretas) con la @Cache* anotacin, en oposicin a anotar interfaces. Por supuesto que puede colocar el @Cache* anotacin en una interfaz (o un mtodo de interfaz), pero esto slo funciona como es de esperar que si usted est utilizando la interfaz de base de proxies. El hecho de que las anotaciones de Java no se heredan de las interfaces significa que si usted est utilizando proxies basados en clases ( proxy-

target-class="true"

) o el aspecto de tejer-based ( mode="aspectj" ), la configuracin de almacenamiento en cach son no reconocido por el proxy infraestructura y el tejido, y el objeto no se ver envuelto en un proxy cach, lo que sera decididamente mala.
Nota

En el modo de proxy (que es el predeterminado), slo el mtodo externo las llamadas entrantes a travs del proxy son interceptados. Esto significa que la autoinvocacin, en efecto, un mtodo en el objeto de destino llamando a otro mtodo del objeto de destino, no dar lugar a un almacenamiento en cach en tiempo de ejecucin real, incluso si el mtodo invocado est marcado con @Cacheable considerando el uso del modo en AspectJ este caso.
29.3.6 Uso de anotaciones personalizados

La abstraccin de almacenamiento en cach permite utilizar sus propias anotaciones para identificar qu mtodo de activacin poblacin cach o desalojo. Esto es muy til como mecanismo de plantilla, ya que elimina la necesidad de duplicar las declaraciones de cach de anotacin (especialmente til si la clave o condicin que se especifiquen) o si las importaciones extranjeras ( org.springframework ) no estn permitidos en su base de cdigo. Similar al del resto de los estereotipos de anotaciones, tanto @Cacheable y @CacheEvict puede ser utilizado como meta-anotaciones, que es anotaciones que puede anotar otras anotaciones. A saber, vamos a sustituir un comn @Cacheable declaracin con nuestra anotacin propio, personalizado:
@ Retention (RetentionPolicy.RUNTIME) @ Target ({} ElementType.METHOD) @ Cacheable (valor = "libros", key = "# isbn") public @ interface SlowService { }

Anteriormente, hemos definido nuestro propio SlowService anotacin que a su vez est anotado con @Cacheable - ahora podemos reemplazar el siguiente cdigo:
@ Cacheable (valor = "libros", key = "# isbn") pblico findBook Libro (ISBN isbn, booleano checkWarehouse, booleano includeUsed)

con:
@ SlowService pblico findBook Libro (ISBN isbn, booleano checkWarehouse, booleano includeUsed)

A pesar de que @SlowService no es una anotacin de Spring, el contenedor capta automticamente su declaracin en tiempo de ejecucin y entiende su significado. Tenga en cuenta que como se ha mencionado anteriormente , el comportamiento anotacin impulsada debe ser activado.

29,4 declarativo basado en XML, el almacenamiento en cach

Si las anotaciones no son una opcin (no hay acceso a las fuentes o sin cdigo externo), se puede utilizar XML para el almacenamiento en cach declarativa. As que en lugar de anotar los mtodos para el almacenamiento en cach, se especifica el mtodo de destino y las directivas de cach externa (similar a la gestin de transacciones declarativa consejo ). El ejemplo anterior se puede traducir en:
<- El servicio que desea hacer cacheable -> <bean id = "bookService" class = "xyservice.DefaultBookService" /> <- Definiciones de cach -> <cache:advice id = cache-manager "cacheAdvice" "cacheManager" => <cache:caching cache = "books"> mtodo <cache:cacheable = "findBook" clave = "#isbn" /> <cache:cache-evict method = "loadBooks" all-entries = "true" /> </ Cache: cache> </ Cache: advice> <- Aplicar el comportamiento cacheable a todas las interfaces Bookservice -> <aop:config> <aop:advisor advice-ref = pointcut "cacheAdvice" = "execution(* xyBookService.*(..))" /> </ Aop: config> ... / / Definicin del gestor de cach omitido

En la configuracin anterior, el bookService se hace cacheable. La semntica de almacenamiento en cach para aplicar estn encapsulados en la cache:advice definicin que da instrucciones mtodo findBooks que se utilizar para poner los datos en la memoria cach mientras mtodo loadBooks para desalojar a los datos. Ambas definiciones estn trabajando en contra de la books cach. El aop:config definicin se aplica el consejo de cach para los puntos apropiados en el programa mediante el uso de la expresin AspectJ pointcut (ms informacin en el captulo 9, Programacin Orientada a Aspectos con Spring ). En el ejemplo anterior, todos los mtodos de la BookService son considerados y el consejo de cach que se les aplica. El almacenamiento en cach de XML declarativo compatible con todos los modelos de anotacin basado en lo que se mueve entre los dos debe ser bastante fcil - an ms ambos pueden ser utilizados dentro de la misma aplicacin. El enfoque basado en XML no tocar el cdigo de destino sin embargo, es inherentemente ms detallado, cuando se trata de clases con mtodos sobrecargados que estn dirigidos para el almacenamiento en cach, la identificacin de los mtodos adecuados se necesita un esfuerzo adicional ya que el method argumento no es un buen discriminador - en estos casos, el punto de corte AspectJ se puede utilizar para, optan por los mtodos de destino y aplicar la funcionalidad de cach apropiada. Sin embargo a travs de XML, es ms fcil aplicar un paquete / grupo / en toda la interfaz de almacenamiento en cach (de nuevo debido a la pointcut AspectJ) y para crear plantillas como definiciones (como lo hicimos en el ejemplo anterior mediante la definicin de la cach de destino a travs de la cache:definitions cache atributo).

29.5 Configurar el almacenamiento en cach


Fuera de la caja, la abstraccin cach proporciona integracin con dos almacenes - una en la parte superior del JDK ConcurrentMap y otro para ehcache biblioteca. Para usarlos, hay que declarar simplemente un adecuado CacheManager - una entidad que controla y gestiona la Cache s y se puede utilizar para recuperar estos para el almacenamiento.
29.5.1 JDK ConcurrentMap basada en Cache

El JDK basada en Cache la aplicacin reside bajo org.springframework.cache.concurrent paquete. Se permite usar ConcurrentHashMap como soporte Cache tienda.
<- Administrador de cach genrico -> <bean id = "cacheManager" class = "org.springframework.cache.support.SimpleCacheManager"> <propiedad nombre = "caches"> <set> <bean class = "org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name = "default" /> clase <bean = "org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name = "books" /> </ Set> </ Propiedad> </ Bean>

El fragmento anterior utiliza el SimpleCacheManager para crear un CacheManager para los dos, anidados Concurrent Cache con nombre implementaciones por defecto y los libros. Tenga en cuenta que los nombres se configuran directamente para cada cach. A medida que la memoria cach se crea por la aplicacin, que est unido a su ciclo de vida, lo que es adecuado para los casos de uso bsicos, ensayos o aplicaciones sencillas. Las escalas de cach bien y es muy rpido, pero no proporciona ninguna capacidad de gestin o persistencia ni contratos de desalojo.
29.5.2 Ehcache basada en Cache

La aplicacin Ehcache se encuentra bajo org.springframework.cache.ehcache paquete. Una vez ms, para usarlo, uno simplemente tiene que declarar el correspondiente CacheManager :
<- Ehcache configuracin de la biblioteca ->

Esta configuracin ayuda de nadie ehcache biblioteca dentro Spring COI (a travs de frijol ehcache ) que luego se conect a la dedicada CacheManager implementacin. Tenga en cuenta la totalidad ehcache especfico de configuracin se lee desde el recurso de ehcache.xml .

29.5.3 Hacer frente a las memorias cach sin almacn de respaldo

A veces, cuando se cambia de ambientes o hacer pruebas, uno puede tener declaraciones de cach sin un respaldo real cach configurado. Como se trata de una configuracin incorrecta, en tiempo de ejecucin una excepcin ya que ser a travs de la infraestructura de almacenamiento en cach es incapaz de encontrar un almacn adecuado. En situaciones como sta, en lugar de eliminar las declaraciones de cach (que puede resultar tedioso), se puede conectar en una memoria cach simple, ficticia que no realiza ningn almacenamiento en cach - es decir, obliga a los mtodos almacenados en cach que se ejecuta cada vez que:
<bean id = "cacheManager" class = "org.springframework.cache.support.CompositeCacheManager"> <propiedad nombre "cacheManagers" => <list> <ref frijol = "jdkCache" /> <ref frijol = "gemfireCache" /> </ List> </ propiedad> <propiedad nombre = valor = "fallbackToNoOpCache" "true" /> </ Bean>

El CompositeCacheManager encima mltiples cadenas CacheManager s y, adems, a travs de la fallbackToNoOpCache bandera, aade una cach no op que para todas las definiciones no manejados por los gerentes de cach configurado. Es decir, cada definicin cache no aparece en ninguna jdkCache o gemfireCache (configurado anteriormente) estar a cargo de la cach no op, que no almacenar ninguna informacin haciendo que el mtodo de destino que se ejecutar cada vez.

29,6 Plugging en diferentes cachs de back-end


Es evidente que hay un montn de almacenamiento en cach de productos por ah que puede ser utilizado como un almacn de respaldo. Para conectar, es necesario proporcionar un CacheManager y Cache la aplicacin ya que desafortunadamente no existe un estndar disponibles que podemos utilizar en su lugar. Esto puede sonar duro, entonces es que en la prctica, las clases tienden a ser simples adaptador s que asignar el marco abstraccin de almacenamiento en cach en la parte superior de la API de almacenamiento como los ehcache clases pueden mostrar. La mayora de CacheManager clases pueden utilizar las clases en org.springframework.cache.support paquete, como AbstractCacheManager que se encarga de que el cdigo de la caldera de la placa dejando slo la asignacin real para ser completado. Esperamos que con el tiempo, las bibliotecas que proporcionan integracin con Spring puede llenar este vaco pequea configuracin.

29.7 Cmo puedo establecer el TTL / TTI / Desalojo funcin poltica / XXX?
Directamente a travs de su proveedor de memoria cach. La abstraccin cach es ... as, una abstraccin no es una aplicacin de cach. La solucin que est utilizando podra apoyar las polticas de datos diversos y diferentes topologas que otras soluciones no (tomemos por ejemplo el JDK ConcurrentHashMap ) - exponiendo que en la abstraccin cach sera intil simplemente porque no habra ningn apoyo de respaldo.

Esta funcionalidad se debe controlar directamente a travs de la cach de respaldo, cuando la configuracin oa travs de su API nativa.

Apndice A. Uso de Spring Classic


Este apndice revisa algunos patrones clsicos de primavera de uso como referencia para los desarrolladores responsables de las aplicaciones heredadas de primavera. Estos patrones de uso ya no reflejan la forma recomendada de utilizar estas caractersticas y el uso actual recomendado se trata en las secciones respectivas del manual de referencia.

A.1 Classic uso ORM


En esta seccin se documentan los patrones de uso de clsicos que se pueden encontrar en una aplicacin Spring legado. Para los patrones de uso recomendadas actualmente, consulte el Captulo 15, Object Relational Mapping (ORM) Data Access captulo.
A.1.1 Hibernate

Para los patrones de uso recomendadas actualmente para Hibernate ver Seccin 15.3, "Hibernate"
El HibernateTemplate

El modelo de programacin bsica para plantillas es como sigue, para los mtodos que pueden formar parte de cualquier objeto de acceso a datos personalizado o servicio de negocio. No hay restricciones sobre la ejecucin del objeto que rodea a todos, slo tiene que proporcionar una Hibernate SessionFactory . Se puede obtener el ltimo desde cualquier lugar, pero preferiblemente como referencia de frijol de un contenedor Spring COI - a travs de un simple setSessionFactory(..) setter bean propiedad. Los siguientes fragmentos muestran una definicin DAO en un contenedor Spring, haciendo referencia a la anteriormente definida SessionFactory , y un ejemplo de una implementacin del mtodo DAO.
<beans> <bean id = "myProductDao" class = "product.ProductDaoImpl"> <propiedad nombre = "sessionFactory" ref = "mySessionFactory" /> </ Bean> </ Beans> pblico ProductDaoImpl clase implementa ProductDao { hibernateTemplate HibernateTemplate privado; public void setSessionFactory (SessionFactory sessionFactory) { . este hibernateTemplate = new HibernateTemplate (sessionFactory); } pblico loadProductsByCategory Collection (String categora) throws DataAccessException {

devuelva este hibernateTemplate.find ("de producto test.Product donde product.category =?", categora).; } }

El HibernateTemplate clase proporciona muchos mtodos que reflejan los mtodos expuestos en el Hibernate Session interfaz, adems de una serie de mtodos de conveniencia, como la que se muestra arriba. Si necesita acceso a la Session para invocar mtodos que no estn expuestos en la HibernateTemplate , siempre se puede bajar a un enfoque basado callback como tal.
pblico ProductDaoImpl clase implementa ProductDao { hibernateTemplate HibernateTemplate privado; public void setSessionFactory (SessionFactory sessionFactory) { . este hibernateTemplate = new HibernateTemplate (sessionFactory); } pblico loadProductsByCategory Collection (categora final String) throws DataAccessException { devuelva este hibernateTemplate.execute. (HibernateCallback nuevo () { pblico doInHibernate Object (Session session) { Criterios Criterios = session.createCriteria (clase Product.); criteria.add (Expression.eq ("categora", categora)); criteria.setMaxResults (6); volver criteria.list (); } }; } }

Una implementacin de devolucin de llamada puede ser utilizado eficazmente por cualquier acceso de datos Hibernate. HibernateTemplate se asegurar de que Session instancias se abre y se cierra correctamente, y automticamente participar en transacciones. Las instancias de la plantilla son thread-safe y reutilizables, por lo tanto se puede mantener como variables de instancia de la clase que lo rodea. Por simples acciones de un solo paso, como un solo encontrar, carga, saveOrUpdate, o llame al borrar, HibernateTemplate ofrece mtodos alternativos de conveniencia que pueden reemplazar dichas implementaciones de una devolucin de llamada de lnea. Adems, Spring proporciona un conveniente HibernateDaoSupport clase base que proporciona un setSessionFactory(..) mtodo para recibir una SessionFactory , y getSessionFactory() y getHibernateTemplate() para su uso por las subclases. En combinacin, esto permite implementaciones DAO muy simples para los requisitos tpicos:
public class extends ProductDaoImpl HibernateDaoSupport implementa ProductDao { pblico loadProductsByCategory Collection (String categora) throws DataAccessException {

devolver esto. getHibernateTemplate (). encontrar ( "Del producto test.Product donde product.category =?", Categora); } }

Implementacin basada en Spring DAO sin devoluciones de llamada

Como alternativa al uso de Spring HibernateTemplate para implementar DAOs, cdigo de acceso de datos tambin se puede escribir de una manera ms tradicional, sin envolver el cdigo de acceso Hibernate en una devolucin de llamada, sin dejar de respetar y participar en genrico Spring DataAccessException jerarqua. El HibernateDaoSupport clase base proporciona mtodos para acceder a la transaccin actual Session y para convertir las excepciones en este escenario; mtodos similares tambin estn disponibles como ayudantes estticos en el SessionFactoryUtils clase. Tenga en cuenta que tal cdigo generalmente se pasan ' false 'como el valor de la getSession(..) 'mtodos allowCreate argumento ', para hacer cumplir ejecuta dentro de una transaccin (lo que evita la necesidad de cerrar la devuelve Session , como su ciclo de vida es gestionado por el transaccin).
public class extends HibernateProductDao HibernateDaoSupport implementa ProductDao { pblico loadProductsByCategory Collection (String categora) throws DataAccessException, MyException { Session session = getSession (false); try { Query query = session.createQuery ("del producto test.Product donde product.category =?"); query.setString (0, categora); Resultado = Lista query.list (); if (resultado == null) { throw new MyException ("No hay resultados de bsqueda."); } return resultado; } catch (HibernateException ex) { tirar convertHibernateAccessException (ex); } } }

La ventaja de dicho cdigo de acceso directo Hibernate es que permite a cualquier excepcin de aplicacin revisadas para ser arrojados dentro del cdigo de acceso a datos; contraste esto con la HibernateTemplate clase que se limita a lanzar excepciones no chequeadas slo dentro de la devolucin de llamada. Tenga en cuenta que a menudo se pueden aplazar las verificaciones correspondientes y el lanzamiento de excepciones de aplicacin para despus de la devolucin de llamada, que todava permite trabajar con HibernateTemplate . En general, el HibernateTemplate mtodos de la clase 'de conveniencia son ms simples y ms conveniente para muchos escenarios.

A.1.2 JDO

Para los patrones de uso recomendadas actualmente para JDO ver Seccin 15.4, "JDO"
JdoTemplate y JdoDaoSupport

Cada DAO JDO basado continuacin, recibir el PersistenceManagerFactory a travs de la inyeccin de dependencia. Tal DAO podra codificarse contra llanura API JDO, trabajando con el dado PersistenceManagerFactory , pero por lo general ms bien ser utilizado con el marco de Spring JdoTemplate :
<beans> <bean id = "myProductDao" class = "product.ProductDaoImpl"> <propiedad nombre = "persistenceManagerFactory" ref = "myPmf" /> </ Bean> </ Beans> pblico ProductDaoImpl clase implementa ProductDao { jdoTemplate JdoTemplate privado; public void setPersistenceManagerFactory (PersistenceManagerFactory pmf) { . este jdoTemplate = new JdoTemplate (PMF); } pblico loadProductsByCategory Collection (categora final String) throws DataAccessException { return (Collection) esta jdoTemplate.execute. (JdoCallback nuevo () { pblico doInJdo Object (PersistenceManager pm) throws JDOException { Query query = pm.newQuery (Product. clase ", categora pCategory ="); query.declareParameters ("String pCategory"); Resultado = Lista query.execute (categora); / / Hacer algunas cosas ms con la lista de resultados return resultado; } }); } }

Una implementacin de devolucin de llamada puede ser utilizado eficazmente por cualquier acceso de datos JDO. JdoTemplate se asegurar de que PersistenceManager s se abre y se cierra correctamente, y automticamente participar en transacciones. Las instancias de la plantilla son thread-safe y reutilizables, por lo tanto se puede mantener como variables de instancia de la clase que lo rodea. Por simples de un solo paso las acciones como un solo find , load , makePersistent o delete llamadas, JdoTemplate ofrece mtodos alternativos de conveniencia que pueden reemplazar dichas implementaciones de una devolucin de llamada de lnea. Adems, Spring proporciona un conveniente JdoDaoSupport clase base que proporciona un setPersistenceManagerFactory(..) mtodo para recibir un PersistenceManagerFactory , y getPersistenceManagerFactory() y

getJdoTemplate()

para su uso por las subclases. En combinacin, esto permite implementaciones DAO muy simples para los requisitos tpicos:
public class extends ProductDaoImpl JdoDaoSupport implementa ProductDao { pblico loadProductsByCategory Collection (String categora) throws DataAccessException { volver getJdoTemplate (). encontrar ( Clase de producto ", categora = pCategory", "categora String", new Object [] {categora}).; } }

Como alternativa a trabajar con Spring JdoTemplate , tambin puede codificar Spring DAO basado en el nivel de JDO API, de manera explcita la apertura y cierre de una PersistenceManager . Como se explic en la seccin correspondiente de hibernacin, la principal ventaja de este enfoque es que el cdigo de acceso a datos es capaz de lanzar excepciones comprobadas. JdoDaoSupport ofrece una variedad de mtodos de apoyo a este escenario, para ir a buscar y liberar una transaccin PersistenceManager as como para la conversin de excepciones.
A.1.3 JPA

Para los patrones de uso recomendadas actualmente para JPA ver Seccin 15.5, "APP"
JpaTemplate y JpaDaoSupport

Cada DAO basado en JPA entonces recibir un EntityManagerFactory travs de la inyeccin de dependencias. Tal DAO puede ser codificado en contra de llanura JPA y trabajar con el dado EntityManagerFactory oa travs de Spring JpaTemplate :
<beans> <bean id = "myProductDao" class = "product.ProductDaoImpl"> <propiedad nombre = "entityManagerFactory" ref = "myEmf" /> </ Bean> </ Beans> pblico JpaProductDao clase implementa ProductDao { jpaTemplate JpaTemplate privado; public void setEntityManagerFactory (fem EntityManagerFactory) { . este jpaTemplate = new JpaTemplate (fem); } pblico loadProductsByCategory Collection (categora final String) throws DataAccessException { return (Collection) esta jpaTemplate.execute. (JpaCallback nuevo () { pblico doInJpa Object (EntityManager em) throws PersistenceException { Query query = em.createQuery ("de productos como p donde p.category =: categora"); query.setParameter ("categora", categora);

Resultado = Lista query.getResultList (); / / Hacer algo de procesamiento adicional con la lista de resultados return resultado; } }); } }

El JpaCallback aplicacin permite a cualquier tipo de APP acceso a datos. El JpaTemplate se asegurar de que EntityManager s se abre y se cierra correctamente y automticamente participar en transacciones. Por otra parte, el JpaTemplate maneja correctamente excepciones, por lo que los recursos estn limpiado y las operaciones que correspondan deshace. Las instancias de la plantilla son thread-safe y reutilizables y se pueden mantener como variable de instancia de la clase que lo contiene. Tenga en cuenta que JpaTemplate ofrece un solo paso acciones como buscar, cargar, fusionar, etc, junto con mtodos de conveniencia alternativos que pueden reemplazar una implementacin de devolucin de llamada de lnea. Adems, Spring proporciona un conveniente JpaDaoSupport clase base que proporciona la get/setEntityManagerFactory y getJpaTemplate() para ser utilizado por subclases:
public class extends ProductDaoImpl JpaDaoSupport implementa ProductDao { pblico loadProductsByCategory Collection (String categora) throws DataAccessException { Mapa <String, params = new HashMap String> <String, String> (); params.put ("categora", categora); volver getJpaTemplate () (findByNamedParams "de producto como p donde p.category =: categora", params). } }

Adems de trabajar con Spring JpaTemplate , tambin se puede codificar Spring basado DAOs contra la APP, haciendo explcito el propio EntityManager manipulacin. Como tambin se detalla en la seccin correspondiente de hibernacin, la principal ventaja de este enfoque es que el cdigo de acceso a datos es capaz de lanzar excepciones comprobadas. JpaDaoSupport ofrece una variedad de mtodos de apoyo a este escenario, para recuperar y liberar una transaccin EntityManager , as como para la conversin de excepciones. JpaTemplate existe principalmente como un hermano de JdoTemplate y HibernateTemplate, que ofrece el mismo estilo para gente acostumbrada a ella.

A.2 Classic Spring MVC


...

A.3 Uso de JMS

Uno de los beneficios del apoyo de Spring JMS es proteger al usuario de las diferencias entre la API de JMS 1.0.2 y 1.1. (Para una descripcin de las diferencias entre los dos APIs ver recuadro de la Unificacin de dominio). Ya que ahora es comn encontrar slo la API JMS 1.1 el uso de las clases que se basan en la API de JMS 1.0.2 ha quedado en desuso en la primavera de 3,0. En esta seccin se describe Spring soporte de JMS para las clases JMS 1.0.2 obsoletas. Domain Unificacin Hay dos versiones principales de la especificacin JMS, 1.0.2 y 1.1. JMS 1.0.2 definido dos tipos de mensajes de dominios punto-a-punto (colas) y publicacin / suscripcin (temas). La API 1.0.2 refleja estos dos dominios de mensajera, proporcionando una jerarqua de clases paralelas para cada dominio. Como resultado, una aplicacin de cliente se convirti en dominio especfico en su uso de la API de JMS. JMS 1.1 introdujo el concepto de unificacin de dominio que minimiza tanto las diferencias funcionales y diferencias cliente de la API entre los dos dominios. Como un ejemplo de una diferencia funcional que se ha retirado, si se utiliza un JMS 1,1 proveedor que transaccionalmente puede utilizar un mensaje de un dominio y producir un mensaje en la otra usando el mismo Session .
Nota

La especificacin JMS 1.1 fue lanzado en abril de 2002 e incorporada como parte de J2EE 1.4 en noviembre de 2003. Como resultado, comunes J2EE 1.3 servidores de aplicaciones que todava estn en uso generalizado (como BEA WebLogic 8.1 y IBM WebSphere 5.1) estn basados en JMS 1.0.2.
A.3.1 JmsTemplate

Situado en el paquete org.springframework.jms.core la clase JmsTemplate102 proporciona todas las caractersticas de la JmsTemplate describe el captulo JMS, pero se basa en las JMS 1.0.2 API en lugar de la 1,1 JMS API. En consecuencia, si usted est usando JmsTemplate102 es necesario configurar el pubSubDomain propiedad booleana para configurar el JmsTemplate con conocimiento de lo que JMS dominio se est utilizando. Por defecto, el valor de esta propiedad es falso, indicando que el dominio de punto-a-punto, colas, se utilizar.
A.3.2 recepcin de mensajes asncrono

MessageListenerAdapter de se utilizan junto con Spring contenedores escucha de mensajes para apoyar la recepcin de mensajes asncrono mediante la exposicin de casi cualquier clase POJO como por mensajes. Si est utilizando la API de JMS 1.0.2, tendr que utilizar las clases 1.0.2 especficas como MessageListenerAdapter102 , SimpleMessageListenerContainer102 y DefaultMessageListenerContainer102 . Estas clases proporcionan la misma funcionalidad que las contrapartes basados en JMS 1.1 sino que se basan nicamente en la API JMS 1.0.2.

A.3.3 Conexiones

El ConnectionFactory interfaz es parte de la especificacin JMS y sirve como punto de entrada para trabajar con JMS. Spring proporciona una implementacin de la ConnectionFactory interfaz, SingleConnectionFactory102 , basado en la API de JMS 1.0.2 que devolver la misma Connection en todo createConnection() las llamadas y hacer caso omiso de las llamadas a close() . Usted tendr que ajustar el pubSubDomain propiedad booleana para indicar el dominio de mensajera se utiliza como SingleConnectionFactory102 siempre explcitamente diferenciar entre un javax.jms.QueueConnection y un javax.jmsTopicConnection .
A.3.4 Gestin de transacciones

En un entorno JMS 1.0.2 la clase JmsTransactionManager102 proporciona soporte para la gestin de las transacciones JMS para una fbrica de conexin nica. Por favor, consulte la documentacin de referencia sobre Administracin de transacciones JMS para obtener ms informacin sobre esta funcionalidad.

Apndice B. Classic Spring AOP Uso


En este apndice se discute el nivel inferior Spring AOP API y el apoyo AOP utilizado en Spring 1.2 aplicaciones. Para nuevas aplicaciones, se recomienda el uso del soporte Spring 2.0 AOP se describe en el AOP captulo, pero cuando se trabaja con aplicaciones existentes, o cuando la lectura de libros y artculos, usted puede venir a travs de ejemplos de primavera estilo 1.2. Spring 2.0 es totalmente compatible con Spring 1.2 y todo lo descrito en este apndice es totalmente compatible en Spring 2.0.

B.1 pointcut API en la primavera


Echemos un vistazo a cmo se maneja el concepto de primavera pointcut crucial.
B.1.1 Conceptos

Modelo de Spring pointcut permite la reutilizacin pointcut independiente de los tipos de consejos. Es posible dirigir consejo diferente utilizando el mismo punto de corte. El org.springframework.aop.Pointcut interfaz es la interfaz central, utilizada para combatir consejos a las clases y mtodos particulares. La interfaz completa se muestra a continuacin:
pblico pointcut interfaz { ClassFilter getClassFilter (); GetMethodMatcher MethodMatcher (); }

La divisin de la Pointcut interfaz en dos partes permite la reutilizacin de las piezas de la clase y el mtodo de comparacin, y de grano fino operaciones de composicin (como la realizacin de una "unin" con otro mtodo matcher). El ClassFilter interfaz se utiliza para restringir el punto de corte para un determinado conjunto de clases objetivo. Si matches() mtodo devuelve siempre true, todas las clases de objetivos ser igualada:
pblico ClassFilter interfaz { partidos booleanos (Clase clazz); }

El MethodMatcher interfaz es normalmente ms importante. La interfaz completa se muestra a continuacin:


MethodMatcher interfaz pblica { partidos booleanos (Mtodo m, targetClass clase); booleano isRuntime (); partidos booleanos (Mtodo m, targetClass Class, Object [] args); }

Los matches(Method, Class) mtodo se utiliza para probar si este punto de corte siempre coincidir con un mtodo dado en una clase de destino. Esta evaluacin se puede realizar cuando un proxy AOP se crea, para evitar la necesidad de una prueba en cada llamada de mtodo. Si el mtodo de 2 partidos argumento devuelve true para un mtodo dado, y el isRuntime() mtodo para la MethodMatcher devuelve true, el mtodo 3-argumento partidos se invoca en cada invocacin del mtodo. Esto permite un punto de corte para mirar los argumentos pasados a la invocacin del mtodo inmediatamente antes del consejo objetivo es ejecutar. La mayora de MethodMatchers son estticos, lo que significa que su isRuntime() mtodo devuelve false. En este caso, el mtodo 3-argumento partidos nunca ser invocado.
Punta

Si es posible, trate de hacer puntos de corte esttico, permitiendo que el marco AOP para almacenar en cach los resultados de la evaluacin pointcut cuando un proxy AOP se crea.
B.1.2 Las operaciones en puntos de corte

Spring soporta operaciones en puntos de corte: en particular, la unin y la interseccin.


Unin: los mtodos que, o bien los partidos pointcut. Interseccin: los mtodos que los dos puntos de corte igualar. Unin es generalmente ms til.

Puntos de corte puede estar compuesto utilizando los mtodos estticos de la clase org.springframework.aop.support.Pointcuts, o mediante la clase ComposablePointcut en el mismo paquete. Sin embargo, usando AspectJ expresiones punto de corte es generalmente un mtodo ms sencillo.

B.1.3 AspectJ puntos de corte de expresin

Dado que 2.0, el tipo ms importante de punto de corte utilizado para la primavera es org.springframework.aop.aspectj.AspectJExpressionPointcut . Este es un punto de corte que utiliza una biblioteca de AspectJ suministrado para analizar una cadena AspectJ pointcut expresin. Consulte el captulo anterior para una discusin sobre apoyados por AspectJ primitivas punto de corte.
B.1.4 implementaciones de Conveniencia pointcut

Spring proporciona varias implementaciones pointcut convenientes. Algunos pueden ser utilizados fuera de la caja, mientras que otros estn destinados a ser una subclase de puntos de corte especficos de la aplicacin.
Puntos de corte esttico

Puntos de corte estticas se basa en el mtodo y la clase de destino, y no puede tener en cuenta los argumentos del mtodo. Puntos de corte estticas son suficientes - y mejor para la mayora de usos. Es posible que para la primavera para evaluar un punto de corte esttico slo una vez, cuando un mtodo se invoc por primera vez: despus de eso, no hay necesidad de evaluar el punto de corte de nuevo con cada invocacin del mtodo. Vamos a considerar algunas implementaciones de punto de corte estticos incluidos en primavera.
Puntos de corte de expresiones regulares

Una manera obvia de especificar puntos de corte estticas es expresiones regulares. Varios marcos AOP Spring adems de que esto sea posible. org.springframework.aop.support.Perl5RegexpMethodPointcut es un punto de corte genrico expresin regular, usando Perl 5 sintaxis de la expresin regular. El Perl5RegexpMethodPointcut clase depende de Yakarta ORO para la coincidencia de expresin regular. Spring tambin ofrece la JdkRegexpMethodPointcut clase que utiliza el soporte para expresiones regulares en el JDK 1.4 +. Usando el Perl5RegexpMethodPointcut clase, puede proporcionar una lista de cadenas de patrones. Si alguno de ellos es una coincidencia, el punto de corte se evaluar como true. (As, el resultado es efectivamente la unin de estos puntos de corte.) El uso se muestra a continuacin:
<Bean id = "settersAndAbsquatulatePointcut"

class = "org.springframework.aop.support.Perl5RegexpMethodPointcut"> <propiedad nombre = "patterns"> <list> <valor>. * juego *. </ value> <valor>. * absquatulate </ value> </ List> </ Propiedad> </ Bean>

Spring proporciona una clase de conveniencia, RegexpMethodPointcutAdvisor , que nos permite hacer referencia tambin un Consejo (recordemos que un consejo puede ser un interceptor, antes de asesoramiento, lanza consejos, etc.) Detrs de las escenas, la primavera va a utilizar un JdkRegexpMethodPointcut . Usando RegexpMethodPointcutAdvisor simplifica el cableado, como el grano de una encapsula pointcut y asesoramiento, como se muestra a continuacin:
<Bean id = "settersAndAbsquatulateAdvisor" class = "org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <propiedad nombre = "advice"> <ref local = "beanNameOfAopAllianceInterceptor" /> </ Propiedad> <propiedad nombre = "patterns"> <list> <valor>. * juego *. </ value> <valor>. * absquatulate </ value> </ List> </ Propiedad> </ Bean>

RegexpMethodPointcutAdvisor se puede utilizar con cualquier tipo de Consejos.


Impulsadas en atributos puntos de corte

Un tipo importante de punto de corte esttico es un punto de corte controlado por metadatos. Este sistema utiliza los valores de atributos de metadatos: por lo general, a nivel de fuente de metadatos.
Puntos de corte dinmico

Puntos de corte dinmicos son ms costosas de evaluar que los puntos de corte estticas. Toman en cuenta los argumentos del mtodo, as como informacin esttica. Esto significa que deben ser evaluados con cada llamada de mtodo, el resultado no puede ser almacenado en cach, como argumentos pueden variar. El principal ejemplo es el control flow punto de corte.
Puntos de corte de flujo de control

Spring puntos de corte de control de flujo son conceptualmente similares a AspectJ pointcuts cflow, aunque menos potente. (En este momento no hay forma de especificar que un punto de corte se ejecuta por debajo de un punto de unin igualada por otro punto de corte.) Un punto de corte de flujo de control coincide con la pila de llamadas

actual. Por ejemplo, podra disparar si el punto de unin se invoc mediante un mtodo en el com.mycompany.web paquete, o por el SomeCaller clase. Puntos de corte de flujo de control se especifican mediante la org.springframework.aop.support.ControlFlowPointcut clase.
Nota

Puntos de corte de control de flujo son mucho ms caros para evaluar en tiempo de ejecucin que incluso los puntos de corte dinmico. En Java 1.4, el costo es de aproximadamente 5 veces mayor que la de otros puntos de corte dinmico.
B.1.5 superclases pointcut

Spring proporciona tiles superclases punto de corte para ayudarle a poner en prctica sus propios puntos de corte. Debido puntos de corte estticos son ms tiles, es probable que StaticMethodMatcherPointcut subclase, como se muestra a continuacin. Para ello es necesario aplicar un solo mtodo abstracto (aunque es posible reemplazar otros mtodos para personalizar el comportamiento):
clase TestStaticPointcut extiende StaticMethodMatcherPointcut { pblicas partidos booleanos (Mtodo m, targetClass Class) { / / Devuelve verdadero si coincide con los criterios personalizados } }

Hay tambin superclases para puntos de corte dinmico. Puede utilizar puntos de corte a medida con cualquier tipo de asesoramiento en la primavera de 1.0 RC2 o ms.
B.1.6 puntos de corte personalizados

Debido puntos de corte en Spring AOP son clases Java, en lugar de caractersticas de lenguaje (como en AspectJ) es posible declarar puntos de corte personalizados, ya sea esttica o dinmica. Puntos de corte a medida en primavera puede ser arbitrariamente compleja. Sin embargo, utilizando el lenguaje AspectJ pointcut expresin se recomienda si es posible.
Nota

Las versiones posteriores de primavera pueden ofrecer apoyo a "puntos de corte" semnticos como los ofrecidos por JAC: ". Todos los mtodos que cambian las variables de instancia en el objeto de destino", por ejemplo,

B.2 Consejos de API en la primavera

Ahora vamos a ver cmo Spring AOP maneja consejo.


B.2.1 ciclos de vida de Asesoramiento

Cada consejo es un frijol de primavera. Una instancia de asesoramiento se pueden compartir entre todos los objetos asesorados, o nico a cada objeto se aconseja. Esto corresponde al consejo por clase o por instancia. Por consejo de clase se utiliza con mayor frecuencia. Es apropiado para el asesoramiento genrico como asesores de transaccin. Estos no dependen del estado del objeto proxy o aadir nuevo Estado, sino que simplemente actan sobre el mtodo y los argumentos. Por ejemplo consejo es adecuado para las presentaciones, para apoyar mixins. En este caso, el consejo estatal agrega al objeto proxy. Es posible utilizar una mezcla de consejo compartida y por ejemplo en el mismo servidor proxy AOP.
B.2.2 tipos Asesoramiento en Spring

Spring proporciona varios tipos de asesoramiento fuera de la caja, y es extensible para soportar tipos arbitrarios consejos. Echemos un vistazo a los conceptos bsicos y los tipos estndar consejos.
Interceptacin alrededor asesoramiento

El tipo de consejo ms fundamental en la primavera es la interceptacin alrededor consejo. La primavera es compatible con la interfaz de Alliance AOP por alrededor de asesoramiento mediante la interceptacin de mtodo. MethodInterceptors implementar alrededor consejo debe implementar la siguiente interfaz:
MethodInterceptor public interface extiende Interceptor { Object invoke (MethodInvocation invocacin) throws Throwable; }

El MethodInvocation argumento al invoke() mtodo expone el mtodo que se invoca, el objetivo de unir punto, el proxy AOP, y los argumentos del mtodo. El invoke() mtodo debe devolver el resultado de la invocacin: el valor de retorno del punto de unin. Un simple MethodInterceptor aplicacin es el siguiente:
DebugInterceptor clase pblica implementa MethodInterceptor { public Object invoke (MethodInvocation invocacin) throws Throwable { System.out.println ("Antes: invocacin = [" + invocacin + "]");

Objeto rval invocation.proceed = (); System.out.println ("Invocacin devuelto"); volver rval; } }

Tenga en cuenta la llamada a la MethodInvocation de proceed() mtodo. Esto procede en la cadena de interceptores hacia el punto de unin. La mayora de los interceptores se invoca este mtodo, y devolver su valor de retorno. Sin embargo, un MethodInterceptor, como cualquier otra en torno a consejos, puede devolver un valor diferente o una excepcin en lugar de invocar el mtodo de proceder. Sin embargo, no quiero hacer esto sin una buena razn!
Nota

MethodInterceptors oferta interoperabilidad con otros AOP Alliance compatibles con las implementaciones de AOP. Los tipos proporciona otros discutidos en el resto de esta seccin implementar conceptos comunes de AOP, pero de una manera especfica de primavera. Si bien existe una ventaja en el uso del tipo de asesoramiento ms especfico, se adhieren con MethodInterceptor alrededor consejo si es probable que desee ejecutar el aspecto en otro marco AOP. Tenga en cuenta que puntos de corte no son actualmente compatibles entre marcos, y la Alianza AOP no tiene actualmente definir interfaces de punto de corte.
Antes de asesoramiento

Un tipo ms simple consejo es un consejo antes. Esto no necesita un MethodInvocation objeto, ya que slo ser llamado antes de entrar en el mtodo. La principal ventaja de un consejo antes es que no hay necesidad de invocar el proceed() mtodo, y por lo tanto no hay posibilidad de inadvertidamente no acudi abajo de la cadena interceptor. El MethodBeforeAdvice interfaz se muestra a continuacin. (Diseo del resorte de la API permitira campo antes de consejo, aunque los objetos usuales se aplican a la interceptacin de campo y es poco probable que la primavera nunca lo incorpora).
MethodBeforeAdvice public interface extiende BeforeAdvice { vaco antes (Mtodo m, Object [] args, Object target) throws Throwable; }

Tenga en cuenta el tipo de retorno es void . Antes de asesoramiento puede insertar comportamiento personalizado antes de que el punto de unin se ejecuta, pero no puede cambiar el valor de retorno. Si un consejo antes de inicia una excepcin, esta voluntad abortar la ejecucin ulterior de la cadena de interceptor. La excepcin se propagar una copia de seguridad de la cadena de interceptor. Si no est marcada, o en la firma del mtodo invocado, se pasar directamente al cliente, de lo contrario se ver envuelto en una excepcin sin control por el proxy AOP.

Un ejemplo de un consejo antes de la primavera, que cuenta con todas las invocaciones de mtodo:
CountingBeforeAdvice clase pblica implementa MethodBeforeAdvice { int cuenta privada; public void antes (Mtodo m, Object [] args, Object target) throws Throwable { + + Cuenta; } getCount public int () { volver cuentan; } }

Punta

Antes de asesoramiento se puede utilizar con cualquier punto de corte.


Emite consejo

Emite consejo se invoca despus de la vuelta del punto de unin si el punto de unin produjo una excepcin. Spring ofrece escribi lanza consejo. Ntese que esto significa que la org.springframework.aop.ThrowsAdvice interfaz no contiene mtodos: Se trata de una interfaz de etiqueta de identificacin que el objeto dado implementa uno o ms mtodos de tipado lanza recomendaciones. Estos deben estar en la forma de:
afterThrowing ([Mtodo, args, objetivo], subclassOfThrowable)

Slo el ltimo argumento es necesario. Las firmas de mtodo podr disponer de una o cuatro argumentos, dependiendo de si el mtodo de asesoramiento est interesado en el mtodo y los argumentos. Las clases siguientes son ejemplos de consejos lanzamientos. Los consejos a continuacin se invoca si un RemoteException se lanza (incluyendo subclases):
RemoteThrowsAdvice clase pblica implementa ThrowsAdvice { public void afterThrowing (RemoteException ex) throws Throwable { / / Hacer algo con excepcin remoto } }

Los siguientes consejos se invoca si un ServletException es lanzada. A diferencia de los consejos anteriores, declara cuatro argumentos, por lo que no tiene acceso al mtodo invocado, el mtodo y los argumentos objeto de destino:
ServletThrowsAdviceWithArguments public class implementa ThrowsAdvice { public void afterThrowing (Mtodo m, Object [] args, blanco Objeto, ServletException ex) { / / Hacer algo con todos los argumentos }

El ltimo ejemplo ilustra cmo estos dos mtodos puede ser utilizado en una sola clase, que maneja tanto RemoteException y ServletException . Cualquier nmero de lanzamientos mtodos recomendaciones pueden combinarse en una sola clase.
CombinedThrowsAdvice pblico static class implementa ThrowsAdvice { public void afterThrowing (RemoteException ex) throws Throwable { / / Hacer algo con excepcin remoto } public void afterThrowing (Mtodo m, Object [] args, blanco Objeto, ServletException ex) { / / Hacer algo con todos los argumentos } }

Nota: Si un mtodo tiros de asesoramiento se produce una excepcin en s, prevalecer la excepcin original (es decir, cambiar la excepcin lanzada para el usuario). La excepcin principal ser tpicamente un RuntimeException, lo que es compatible con cualquier firma de mtodo. Sin embargo, si un mtodo tiros de asesoramiento lanza una excepcin comprobada, se tendr que adaptarse a las excepciones declaradas del mtodo objetivo y es por lo tanto, hasta cierto punto, junto a firmas especficas de destino mtodos. No arroje una excepcin no declarado comprobado que es incompatible con el firma del mtodo objetivo!
Punta

Tira asesoramiento se puede utilizar con cualquier punto de corte.


Despus de regresar asesoramiento

Un consejo despus de regresar en la primavera debe implementar la interfaz org.springframework.aop.AfterReturningAdvice, que se muestra a continuacin:
AfterReturningAdvice public interface extiende Consejos { vaco afterReturning (Object returnValue, Mtodo m, Object [] args, Object target) lanza Throwable; }

Un consejo a su regreso tiene acceso al valor de retorno (que no se puede modificar), mtodo invocado, los argumentos de los mtodos y de destino. El siguiente consejo despus de regresar cuenta todas las invocaciones de mtodos exitosos que no han arrojado excepciones:
CountingAfterReturningAdvice clase pblica implementa AfterReturningAdvice { int cuenta privada;

afterReturning public void (Object returnValue, Mtodo m, Object [] args, target Object) lanza Throwable { + + Cuenta; } getCount public int () { volver cuentan; } }

Este consejo no cambia la ruta de ejecucin. Si se produce una excepcin, este ser lanzado en la cadena de interceptores en lugar del valor de retorno.
Punta

Despus de volver asesoramiento se puede utilizar con cualquier punto de corte.


Introduccin consejo

Primavera trata consejo introduccin como un tipo especial de asesoramiento intercepcin. Introduccin requiere una IntroductionAdvisor , y un IntroductionInterceptor , implementar la siguiente interfaz:
IntroductionInterceptor public interface extiende MethodInterceptor { booleano implementsInterface (Clase intf); }

El invoke() mtodo heredado de la AOP Alliance MethodInterceptor interfaz debe implementar la introduccin: es decir, si el mtodo invocado es introducido en una interfaz, el interceptor de introduccin es responsable de manejar la llamada al mtodo no puede invocar proceed() . Asesoramiento introduccin no puede ser utilizado con cualquier punto de corte, tal como se aplica slo a la clase, en lugar del mtodo, el nivel. Slo se puede utilizar con el asesoramiento introduccin IntroductionAdvisor , que tiene los siguientes mtodos:
public interface extends IntroductionAdvisor Advisor, IntroductionInfo { ClassFilter getClassFilter (); validateInterfaces vaco () throws IllegalArgumentException; } pblico IntroductionInfo interfaz { Clase [] GetInterfaces (); }

No hay MethodMatcher , y por lo tanto no Pointcut , asociado con consejos introduccin. Slo el filtrado de clase es lgico. El getInterfaces() mtodo devuelve las interfaces introducidas por este asesor. El validateInterfaces() mtodo se utiliza internamente para ver si las interfaces introducidas pueden ser implementadas por el configurado IntroductionInterceptor . Veamos un ejemplo sencillo de la serie de pruebas de primavera. Supongamos que queremos introducir la siguiente interfaz a uno o ms objetos:
interfaz pblica con llave { bloqueo de vaco (); desbloqueo de vaco (); booleano bloqueado (); }

Esto ilustra un mixin. Queremos ser capaces de lanzar objetos aconseja cerradura, cualquiera que sea su tipo, y llamar a los mtodos de bloqueo y desbloqueo. Si llamamos al mtodo lock (), queremos que todos los mtodos de establecimiento de lanzar una LockedException . As, podemos aadir un aspecto que ofrece la posibilidad de hacer que los objetos inmutables, sin que tengan ningn conocimiento de ello: un buen ejemplo de AOP. En primer lugar, vamos a necesitar un IntroductionInterceptor que hace el trabajo pesado. En este caso, se ampla el org.springframework.aop.support.DelegatingIntroductionInterceptor clase de conveniencia. Podramos implementar IntroductionInterceptor directamente, pero utilizando DelegatingIntroductionInterceptor que es mejor para la mayora de los casos. El DelegatingIntroductionInterceptor est diseado para delegar una introduccin a una implementacin real de la interfaz introducido (s), ocultando el uso de la interceptacin de hacerlo. El delegado se puede ajustar a cualquier objeto utilizando un argumento del constructor; el delegado predeterminado (cuando el constructor no-arg se utiliza) es el siguiente. As, en el ejemplo siguiente, el delegado es el LockMixin subclase de DelegatingIntroductionInterceptor . Dado un delegado (por defecto en s mismo), un DelegatingIntroductionInterceptor ejemplo busca todas las interfaces implementadas por el delegado (que no sea IntroductionInterceptor), y apoyar la introduccin en contra de ninguno de ellos. Es posible para las subclases tales como LockMixin para llamar la suppressInterface(Class intf) mtodo para suprimir interfaces que no deben ser expuestos. Sin embargo, no importa cuntas interfaces una IntroductionInterceptor est dispuesta a apoyar el IntroductionAdvisor utilizado controlar que las interfaces estn realmente expuestos. Una interfaz se introdujo ocultar cualquier aplicacin de la misma interfaz por el objetivo. As LockMixin subclases DelegatingIntroductionInterceptor e implementos cerradura en s. La superclase captura automticamente con cerradura que puede ser

apoyado por la introduccin, por lo que no es necesario especificarlo. Se podra introducir cualquier nmero de interfaces de esta manera. Observe el uso de la locked variable de instancia. Esto efectivamente agrega estatal adicional a la realizada en el objeto de destino.
pblico LockMixin clase extiende DelegatingIntroductionInterceptor implementos cerradura { booleano privado cerrado; bloqueo public void () { esta bloqueado = true.; } desbloqueo public void () { esta bloqueado = false.; } public boolean bloqueado () { devolver esta bloqueado.; } public Object invoke (MethodInvocation invocacin) throws Throwable { if (bloqueado () && invocation.getMethod (). getName (). indexOf ("set") == 0) tirar LockedException nuevo (); volver sper invoke (invocacin).; } }

A menudo no es necesario reemplazar el invoke() mtodo: el DelegatingIntroductionInterceptor implementacin - que llama al mtodo delegado si el mtodo se introdujo, de lo contrario se camina hacia el punto de registrarse - es generalmente suficiente. En el presente caso, hay que aadir un cheque: no existe un mtodo setter se puede invocar si est en modo bloqueado. El asesor de introduccin requiere es simple. Todo lo que tiene que hacer es mantener una clara LockMixin ejemplo, y especificar las interfaces introducidas - en este caso, slo Lockable . Un ejemplo ms complejo podra tomar una referencia al interceptor introduccin (que se define como un prototipo): en este caso, no hay ninguna configuracin relevantes para un LockMixin , por lo que slo tiene que crear utilizando new .
public class extends LockMixinAdvisor DefaultIntroductionAdvisor { pblico LockMixinAdvisor () { super (nuevo LockMixin (), con cierre de clase.); } }

Podemos aplicar este asesor es muy simple: no requiere ninguna configuracin. (Sin embargo, es necesario: Es imposible utilizar un IntroductionInterceptor . sin IntroductionAdvisor) Como es habitual en las presentaciones, el asesor debe ser por

instancia, como lo es con estado. Necesitamos una instancia diferente de LockMixinAdvisor , y por lo tanto LockMixin , para cada objeto aconsejado. El asesor comprende parte del estado del objeto aconsejado a. Podemos aplicar este asesor mediante programacin, utilizando el Advised.addAdvisor() mtodo, o (la manera recomendada) en la configuracin XML, como cualquier otro asesor. Todas las opciones de creacin de proxy se discute ms adelante, incluidos los "creadores automtica del proxy", manejar correctamente las introducciones y mixins con estado.

B.3 Asesor API en la primavera


En la primavera, un Asesor es un aspecto que slo contiene un objeto nico consejo asociado con una expresin de punto de corte. Aparte del caso especial de introducciones, cualquier asesor puede ser utilizado con cualquier consejo. org.springframework.aop.support.DefaultPointcutAdvisor es la clase de asesor ms comnmente utilizado. Por ejemplo, se puede utilizar con un MethodInterceptor , BeforeAdvice o ThrowsAdvice . Es posible mezclar tipos de consejero y asesoramiento en primavera en el mismo servidor proxy AOP. Por ejemplo, podra utilizar una intercepcin alrededor consejo, lanza consejos y asesoramiento antes en una configuracin de proxy: Spring crear automticamente la cadena de interceptores necesarios.

B.4 Uso de la ProxyFactoryBean para crear proxies AOP


Si est utilizando la primavera COI contenedor (un ApplicationContext o BeanFactory) para los objetos de su negocio - y usted debe ser! - Usted tendr que usar uno de AOP Spring FactoryBeans. (Recuerde que un grano de fbrica introduce una capa de indireccin, lo que le permite crear objetos de un tipo diferente.)
Nota

El apoyo AOP Spring 2.0 tambin utiliza granos de fbrica bajo las sbanas. La forma bsica de crear un proxy en la primavera de AOP es utilizar el org.springframework.aop.framework.ProxyFactoryBean. Esto le da un control completo sobre los puntos de corte y consejos que se aplicarn, y ordenar. Sin embargo, hay opciones ms sencillas que son preferibles si no es necesario dicho control.
B.4.1 Conceptos bsicos

El ProxyFactoryBean , al igual que otros Primavera FactoryBean implementaciones, introduce un nivel de indireccin. Si se define una ProxyFactoryBean con el nombre foo , qu objetos referencia a foo ver no es la ProxyFactoryBean instancia s mismo,

sino un objeto creado por el ProxyFactoryBean aplicacin 's de la getObject() mtodo. Este mtodo crear un proxy AOP envolver un objeto de destino. Una de las ventajas ms importantes de usar un ProxyFactoryBean u otra clase de IoCaware para crear proxies AOP, es que significa que los consejos y puntos de corte tambin se pueden gestionar por la COI. Esta es una caracterstica de gran alcance, permitiendo que ciertos enfoques que son difciles de alcanzar con otros marcos de AOP. Por ejemplo, un mismo consejo puede hacer referencia a objetos de aplicaciones (adems de la de destino, que debe estar disponible en cualquier marco AOP), en beneficio de toda la enchufabilidad proporcionada por inyeccin de dependencias.
B.4.2 propiedades JavaBean

En comn con la mayora de FactoryBean implementaciones proporcionadas con la primavera, el ProxyFactoryBean clase en s es un JavaBean. Sus propiedades se utilizan para:

Especifique el destino que desea proxy. Especifique si desea utilizar CGLIB (ver ms abajo y tambin la Seccin 10.5.3, "jdk-y CGLIB basadas en proxies" ).

Algunas propiedades importantes son heredados de


org.springframework.aop.framework.ProxyConfig

(la superclase de todas las fbricas de proxy AOP en primavera). Estas propiedades fundamentales son:
proxyTargetClass : true

si la clase de destino es ser proxy, en lugar de las interfaces de la clase de destino. Si este valor de la propiedad se establece en true , entonces proxies CGLIB ser creado (pero vase tambin ms adelante la Seccin 10.5.3, "jdk-y CGLIB basadas en proxies" ). optimize : controla si las optimizaciones agresivas se aplican a los poderes creados por CGLIB. Uno no alegremente debera utilizar este ajuste a menos que uno entiende perfectamente cmo la correspondiente representacin AOP se encarga de la optimizacin. Esto se utiliza actualmente slo para proxies CGLIB; no tiene ningn efecto con los proxies de JDK dinmicos. frozen : si una configuracin de proxy se frozen , entonces los cambios en la configuracin ya no se permite. Esto es til tanto como una optimizacin ligera y, en los casos cuando no se desea que los llamantes ser capaz de manipular el proxy (a travs de la Advised interfaz) despus de la representacin se ha creado. El valor predeterminado de esta propiedad es false , por lo que cambios como la adicin de consejos adicionales son permitidos. exposeProxy : determina si o no el proxy actual debe ser expuesto en una ThreadLocal de modo que se puede acceder por el objetivo. Si un objetivo tiene que obtener el poder y la exposeProxy propiedad se establece en true , el objetivo puede utilizar el AopContext.currentProxy() mtodo. aopProxyFactory : la aplicacin de AopProxyFactory de usar. Ofrece una manera de personalizar si desea utilizar proxies dinmicos, CGLIB o cualquier otra estrategia proxy. La implementacin predeterminada elegir proxies dinmicos o CGLIB adecuadamente. No debera haber ninguna necesidad de utilizar esta propiedad, sino que est destinado a permitir la adicin de nuevos tipos de proxy en la primavera de 1,1.

Otras propiedades especficas para ProxyFactoryBean incluyen:


proxyInterfaces

: array de nombres de interfaz de cadena. Si no se suministra, un proxy CGLIB para la clase de destino se utilizar (pero vase ms adelante la Seccin 10.5.3, "jdk-y CGLIB basadas en proxies" ). interceptorNames : matriz de cadenas de Advisor nombres consejos, interceptores o de otro tipo a aplicar. Ordenar es importante, en un primer llegado, primer servido base. Es decir que el interceptor primero en la lista ser el primero en ser capaz de interceptar la invocacin. Los nombres son nombres de frijol en la fbrica actual, incluidos los nombres de las fbricas de frijol ancestrales. No se puede hablar de referencias de frijol aqu ya que hacerlo podra resultar en la ProxyFactoryBean ignorando el valor singleton del consejo. Se puede aadir un nombre de interceptor con un asterisco ( * ). Esto dar lugar a la aplicacin de todos los granos de asesor con nombres que comienzan con la parte antes del asterisco a aplicar. Un ejemplo del uso de esta caracterstica se puede encontrar en la Seccin 10.5.6, "Uso de" global "asesores" .

singleton: si la fbrica debe devolver un solo objeto, no importa cuntas veces la getObject() se llama al mtodo. Varios FactoryBean implementaciones ofrecer tal mtodo. El valor predeterminado es true . Si desea utilizar el asesoramiento de estado - por ejemplo, para mixins con estado - utilice consejos prototipo junto con un valor singleton de false .

B.4.3 JDK y proxies basados CGLIB

Esta seccin sirve como la documentacin definitiva sobre cmo el ProxyFactoryBean elige crear uno cualquiera de un JDK-y CGLIB basados proxy para un objeto de destino particular (es decir para ser aproximados).
Nota

El comportamiento de la ProxyFactoryBean con respecto a la creacin de JDK-o proxies CGLIB basados cambiado entre versiones 1.2.x y 2,0 de la primavera. El ProxyFactoryBean ahora exhibe una semntica similar con respecto a la deteccin automtica de interfaces como las de la TransactionProxyFactoryBean clase. Si la clase de un objeto de destino que se va a aplicar proxy (en adelante referido simplemente como la clase de objetivo) no implementa ninguna interfaz, a continuacin, un proxy basado CGLIB se crear. Este es el escenario ms fcil, porque proxies JDK interfaz basada, y no hay interfaces significa proxy JDK no es ni siquiera posible. Uno simplemente se enchufa en el frijol blanco, y especifica la lista de interceptores a travs de la interceptorNames propiedad. Tenga en cuenta que un proxy basado en CGLIB se crear incluso si el proxyTargetClass propiedad de la ProxyFactoryBean se ha establecido en false . (Obviamente esto no tiene sentido, y es mejor eliminar de la definicin de frijol, ya que es el mejor de los despedidos, y en el peor confuso.)

Si la clase de destino implementa uno (o ms) interfaces, entonces el tipo de proxy que se crea depende de la configuracin de la ProxyFactoryBean . Si el proxyTargetClass propiedad de la ProxyFactoryBean se ha establecido en true , entonces un proxy basado en CGLIB se crear. Esto tiene sentido, y est en consonancia con el principio de mnima sorpresa. Incluso si el proxyInterfaces propiedad de la ProxyFactoryBean se ha establecido uno o varios nombres de interfaz completos, el hecho de que la proxyTargetClass propiedad se establece en true causar CGLIB basada en proxy de estar en vigor. Si el proxyInterfaces caracterstica de la ProxyFactoryBean se ha establecido en uno o ms nombres de interfaz totalmente cualificados, a continuacin, un proxy JDK basado se crear. El proxy creado implementar todas las interfaces que se especificaron en el proxyInterfaces propiedad, si la clase de destino pasa a poner en prctica un conjunto mucho ms interfaces de los especificados en el proxyInterfaces propiedad, que est muy bien, pero esas interfaces adicionales no sern implementado por el proxy devuelto. Si el proxyInterfaces caracterstica de la ProxyFactoryBean no se ha establecido, pero la clase de objetivo hace aplicar una (o ms) interfaces, entonces el ProxyFactoryBean se auto-detectar el hecho de que la clase de objetivo es en realidad implementar al menos una interfaz, y un-JDK basados en proxy ser creado. Las interfaces que son realmente proxy ser todas las interfaces que implementa la clase de objetivo; en efecto, este es el mismo que el simple suministro de una lista de interfaz de todos y cada uno que implementa la clase objetivo a la proxyInterfaces propiedad. Sin embargo, es significativamente menos trabajo, y menos propenso a errores tipogrficos.
B.4.4 interfaces de conexiones proxy

Veamos un ejemplo sencillo de ProxyFactoryBean en accin. Este ejemplo se refiere a:


Un bean de destino que ser proxy. Este es el "personTarget" definicin de frijol en el siguiente ejemplo. Un asesor y un interceptor utiliza para proporcionar consejo. Una definicin de proxy AOP frijol especificar el objeto de destino (el frijol personTarget) y las interfaces de proxy, junto con los consejos para aplicar.

<bean id = "personTarget" class = "com.mycompany.PersonImpl"> <propiedad nombre "name" => <valor> Tony </ value> </ propiedad> <propiedad nombre "age" => <valor> 51 </ value> </ propiedad> </ Bean> <bean id = "myAdvisor" class = "com.mycompany.MyAdvisor"> <propiedad nombre "someProperty" => Custom <valor> valor de la propiedad string </ value> </ propiedad> </ Bean> <bean id = "debugInterceptor" class = "org.springframework.aop.interceptor.DebugInterceptor"> </ Bean>

<Bean id = "persona" class = "org.springframework.aop.framework.ProxyFactoryBean"> <propiedad nombre "proxyInterfaces" => <valor> com.mycompany.Person </ value> </ propiedad> <propiedad nombre "target" => <ref local = "personTarget" /> </ propiedad> <propiedad nombre = "interceptorNames"> <list> <valor> myAdvisor </ value> <valor> debugInterceptor </ value> </ List> </ Propiedad> </ Bean>

Tenga en cuenta que el interceptorNames propiedad tiene una lista de String: los nombres de frijol del interceptor o asesores en la fbrica actual. Asesores, interceptores, antes, los objetos que regresan despus y arroja consejos pueden ser utilizados. La clasificacin de los asesores es importante.
Nota

Usted podra preguntarse por qu la lista no tiene referencias de frijol. La razn de esto es que si la propiedad singleton ProxyFactoryBean se establece en false, debe ser capaz de devolver instancias independientes del poder. Si cualquiera de los asesores en s es un prototipo, una instancia independiente tendra que ser devueltos, por lo que es necesario ser capaz de obtener una instancia del prototipo de la fbrica, la celebracin de una referencia no es suficiente. La "persona" definicin de bean anterior se puede utilizar en lugar de una implementacin persona, de la siguiente manera:
Persona persona = (Persona) factory.getBean ("persona");

Las dems judas en el mismo contexto COI puede expresar una dependencia inflexible de tipos en l, como con un objeto normal Java:
<bean id = "personUser" class = "com.mycompany.PersonUser"> <propiedad nombre "person" => <ref local = "person" /> </ propiedad> </ Bean>

El PersonUser clase en este ejemplo sera exponer una propiedad de tipo Person. En cuanto a lo que est en cuestin, el proxy AOP puede usar de forma transparente en lugar de una aplicacin "real". Sin embargo, su clase sera una clase de proxy dinmico. Se podra echarlo a la Advised interfaz (vase ms adelante). Es posible ocultar la distincin entre el objetivo y proxy utilizando un bean interna annima, como sigue. Slo el ProxyFactoryBean definicin es diferente, el consejo se incluye slo para la integridad:
<bean id = "myAdvisor" class = "com.mycompany.MyAdvisor">

<propiedad nombre "someProperty" => Custom <valor> valor de la propiedad string </ value> </ propiedad> </ Bean> <bean id = "debugInterceptor" class = "org.springframework.aop.interceptor.DebugInterceptor" /> <bean id = "person" class = "org.springframework.aop.framework.ProxyFactoryBean"> <propiedad nombre "proxyInterfaces" => <valor> com.mycompany.Person </ value> </ propiedad> <- Usar bean interna, no referencia local a destino -> <propiedad nombre = "target"> <bean class = "com.mycompany.PersonImpl"> <propiedad nombre "name" => <valor> Tony </ value> </ propiedad> <propiedad nombre "age" => <valor> 51 </ value> </ propiedad> </ Bean> </ Propiedad> <propiedad nombre = "interceptorNames"> <list> <valor> myAdvisor </ value> <valor> debugInterceptor </ value> </ List> </ Propiedad> </ Bean>

Esto tiene la ventaja de que slo hay un objeto de tipo Person : til si queremos evitar que los usuarios del contexto de aplicacin de la obtencin de una referencia al objeto sin aconsejado, o la necesidad de evitar toda ambigedad con la primavera COI autowiring. Tambin hay sin duda una ventaja en que la definicin ProxyFactoryBean es autnomo. Sin embargo, hay veces en que ser capaz de obtener el objetivo de la ONU aconsejada de la fbrica en realidad podra ser una ventaja: por ejemplo, en ciertos escenarios de prueba.
B.4.5 clases Proxying

Qu pasa si usted necesita un proxy de clase, en lugar de una o ms interfaces? Imagina que en el ejemplo anterior, no haba Person interfaz: necesitbamos para asesorar a una clase llamada Person que no aplic ninguna interfaz de negocios. En este caso, puede configurar Spring para utilizar proxies CGLIB proxy, en lugar de dinmica. Basta con establecer la proxyTargetClass propiedad en la ProxyFactoryBean arriba en true. Aunque lo mejor es programar las interfaces, en lugar de clases, la capacidad para asesorar a las clases que no implementan interfaces puede ser til cuando se trabaja con cdigo heredado. (En general, la primavera no es preceptivo. Si bien hace que sea fcil de aplicar buenas prcticas, evita forzar un enfoque particular.) Si lo desea, puede forzar el uso de CGLIB en cualquier caso, incluso si usted tiene interfaces. CGLIB obras proxy mediante la generacin de una subclase de la clase de destino en tiempo de ejecucin. Primavera configura esta subclase generada a delegar las llamadas a mtodos con el objetivo original: la subclase se utiliza para implementar el patrn Decorator, tejiendo en el consejo.

CGLIB proxy debe ser generalmente transparente para los usuarios. Sin embargo, hay algunas cuestiones a tener en cuenta:
Final

mtodos no pueden ser advertidos, ya que no se puede anular. Desde la primavera 3.2, ya no se necesita aadir a su proyecto CGLIB classpath. CGLIB clases han vuelto a empaquetar bajo org.springframework y directamente en la primavera JAR-core. Esto es tanto para la comodidad del usuario, as como para evitar posibles conflictos con otros proyectos que tienen dependencia de una versin diferente de CGLIB.

Hay poca diferencia de rendimiento entre CGLIB proxies proxy y dinmica. A partir de primavera de 1,0, proxies dinmicos son un poco ms rpido. Sin embargo, esto puede cambiar en el futuro. El rendimiento no debe ser un factor decisivo en este caso.
B.4.6 Uso de "globales" asesores

Aadiendo un asterisco al nombre de un interceptor, todos los asesores con nombres que coinciden con la parte de frijol antes del asterisco, se aadir a la cadena de asesor. Esto puede ser til si tiene que agregar un conjunto estndar de "globales" asesores:
<bean id = "proxy" class = "org.springframework.aop.framework.ProxyFactoryBean"> <propiedad nombre = "target" ref = "service" /> <propiedad nombre = "interceptorNames"> <list> <valor> global * </ value> </ List> </ Propiedad> </ Bean> <bean id = "global_debug" class = "org.springframework.aop.interceptor.DebugInterceptor" />

B.5 definiciones concisas de proxy


Sobre todo en la definicin de proxies transaccionales, usted puede terminar con muchas definiciones de proxy similares. El uso de definiciones de frijol primarios y secundarios, junto con las definiciones de frijol interiores, puede dar lugar a definiciones de proxy mucho ms limpias y ms concisa. En primer lugar uno de los padres, plantilla, frijol definicin se crea para el proxy:
<Bean id = "txProxyTemplate" abstract = "true" class = "org.springframework.transaction.interceptor.TransactionProxyFactoryBe an"> <propiedad nombre = "transactionManager" ref = "transactionManager" /> <propiedad nombre = "transactionAttributes"> <props> <prop clave = "*"> PROPAGATION_REQUIRED </ prop> </ Accesorios> </ Propiedad>

</ Bean>

Esto nunca ser instanciada en s, por lo que en realidad puede ser incompleta. A continuacin, cada proxy que necesita ser creado es slo una definicin de frijol nio, que envuelve el objetivo del proxy como una definicin de bean interior, ya que el objetivo nunca se utiliza en monoterapia de todos modos.
<bean id = padres = "myService" "txProxyTemplate"> <propiedad nombre = "target"> <bean class = "org.springframework.samples.MyServiceImpl"> </ Bean> </ Propiedad> </ Bean>

Por supuesto, es posible reemplazar las propiedades de la plantilla padre, como en este caso, los valores de propagacin de transacciones:
<bean id = padres = "mySpecialService" "txProxyTemplate"> <propiedad nombre = "target"> <bean class = "org.springframework.samples.MySpecialServiceImpl"> </ Bean> </ Propiedad> <propiedad nombre = "transactionAttributes"> <props> <prop clave = "get*"> PROPAGATION_REQUIRED, readOnly </ prop> <prop clave = "find*"> PROPAGATION_REQUIRED, readOnly </ prop> <prop clave = "load*"> PROPAGATION_REQUIRED, readOnly </ prop> <prop clave = "store*"> PROPAGATION_REQUIRED </ prop> </ Accesorios> </ Propiedad> </ Bean>

Tenga en cuenta que en el ejemplo anterior, hemos marcado explcitamente la definicin de bean padre como abstracta mediante el atributo abstracto, como se describe anteriormente , de modo que en realidad no puede nunca ser instanciada. Contextos de aplicacin (pero no las fbricas de frijol simples) tendr por defecto preinstantiate todos nicos. Por eso es importante (al menos para los frijoles nico) que si usted tiene una definicin (padre) de frijol que se va a utilizar slo como una plantilla, y esta definicin especifica una clase, usted debe asegurarse de establecer el atributo abstracto en true, de lo contrario el contexto de la aplicacin en realidad se trate de preinstancia.

B.6 La creacin de proxies AOP mediante programacin con el ProxyFactory


Es fcil crear servidores proxy AOP mediante programacin utilizando la primavera. Esto le permite usar Spring AOP sin la dependencia de primavera COI. El siguiente listado muestra la creacin de un proxy para un objeto de destino, con un interceptor y un asesor. Las interfaces implementadas por el objeto de destino de forma automtica a travs del proxy:
ProxyFactory fbrica = new ProxyFactory (myBusinessInterfaceImpl);

factory.addInterceptor (myMethodInterceptor); factory.addAdvisor (myAdvisor); Tb MyBusinessInterface = (MyBusinessInterface) factory.getProxy ();

El primer paso es la construccin de un objeto de tipo


org.springframework.aop.framework.ProxyFactory

. Se puede crear este objeto con un objetivo, como en el ejemplo anterior, o especificar las interfaces para ser aproximados en un constructor alternativo. Usted puede agregar interceptores o asesores, y manipularlos para la vida de la ProxyFactory. Si agrega una IntroductionInterceptionAroundAdvisor usted puede hacer que el proxy para implementar interfaces adicionales. Tambin existen mtodos de conveniencia en ProxyFactory (heredado de AdvisedSupport ) que le permiten agregar otros tipos de asesoramiento como antes y lanza consejo. AdvisedSupport es la superclase de ambos ProxyFactory y ProxyFactoryBean.
Punta

La integracin de creacin AOP proxy con el marco de la COI es la mejor prctica en la mayora de las aplicaciones. Le recomendamos que exteriorizar configuracin de Java de cdigo con AOP, como en general.

B.7 Manipulacin de objetos aconsejables


Sin embargo, se crea proxies AOP, se pueden manipular usando el org.springframework.aop.framework.Advised interfaz. Toda carta poder AOP se puede convertir a esta interfaz, lo que otras interfaces que implementa. Esta interfaz incluye los mtodos siguientes:
Advisor [] getAdvisors (); vaco addAdvice (asesoramiento Asesoramiento) throws AopConfigException; addAdvice vaco (int pos, consejos Consejos) lanza AopConfigException; vaco addAdvisor (Asesor asesor) throws AopConfigException; addAdvisor vaco (int pos, Consejero asesor) throws AopConfigException; int indexOf (Consejero asesor); booleano removeAdvisor (Asesor asesor) throws AopConfigException; removeAdvisor vaco (int index) throws AopConfigException; booleano replaceAdvisor (Asesora a, b Advisor) throws AopConfigException; IsFrozen booleano ();

Los getAdvisors() mtodo devolver un consejero por cada consejero, interceptor o escribe el otro consejo que se ha aadido a la fbrica. Si ha aadido un asesor, el asesor regres a este ndice ser el objeto que ha agregado. Si ha aadido un interceptor o escribe el otro consejo, Spring se han envuelto en esto un asesor con un punto de corte que siempre devuelve true. As, si se ha aadido un MethodInterceptor , el asesor de este ndice devuelto ser un DefaultPointcutAdvisor devolver su MethodInterceptor y un punto de corte que corresponda a todas las clases y mtodos. El addAdvisor() mtodos se pueden utilizar para agregar cualquier Advisor. Por lo general, el punto de corte que sostiene asesor y consejo ser el genrico DefaultPointcutAdvisor , que se puede utilizar con cualquier consejo o punto de corte (pero no para la introduccin). De forma predeterminada, es posible aadir o quitar asesores o interceptores ni una sola vez de un proxy se ha creado. La nica restriccin es que es imposible agregar o quitar un asesor de introduccin, como indicadores existentes de la fbrica no mostrar el cambio de interfaz. (Usted puede obtener un nuevo proxy de la fbrica para evitar este problema.) Un ejemplo simple de lanzar un proxy AOP a la Advised interfaz y el examen y la manipulacin de su consejo:
Asesora aconseja = (recomendado) myObject; Advisor [] = advised.getAdvisors asesores (); int = oldAdvisorCount advisors.length; System.out.println (oldAdvisorCount + "asesores"); / / Aadir un consejo como un interceptor sin un punto de corte / / Se coincide con todos los mtodos de proxy / / Se puede usar para interceptores, antes, despus de regresar o lanza consejos advised.addAdvice (nuevo DebugInterceptor ()); / / Aadir consejos selectiva utilizando un punto de corte advised.addAdvisor (nuevo DefaultPointcutAdvisor (mySpecialPointcut, myAdvice)); assertEquals ("Se han aadido dos asesores", oldAdvisorCount + 2, advised.getAdvisors () de longitud).;

Nota

Es cuestionable si es conveniente (sin juego de palabras) para modificar consejo sobre un objeto de negocio en la produccin, aunque no hay casos de duda justificada uso. Sin embargo, puede ser muy til en el desarrollo: por ejemplo, en las pruebas. A veces me he encontrado muy til ser capaz de agregar cdigo de prueba en la forma de un interceptor o el otro consejo, conseguir dentro de una invocacin de mtodo que desea probar. (Por ejemplo, el consejo puede entrar en una transaccin creada para ese mtodo: por ejemplo, para ejecutar SQL para comprobar que una base de datos se actualiz correctamente, antes de marcar la transaccin para hacer retroceder). Dependiendo de cmo se cre el proxy, por lo general puede fijar un frozen bandera, en cuyo caso la Advised isFrozen() mtodo devolver true, y cualquier intento de

modificacin de asesoramiento a travs de la adicin o supresin dar lugar a un AopConfigException . La capacidad de congelar el estado de un objeto aconseja es til en algunos casos, por ejemplo, para evitar la eliminacin de un cdigo de llamada interceptor de seguridad. Tambin puede ser utilizado en la primavera de 1,1 para permitir la optimizacin agresiva si la modificacin de tiempo de ejecucin asesoramiento se sabe que no se requiere.

B.8 Uso de la "autoproxy" instalacin


Hasta ahora hemos considerado la creacin explcita de poderes AOP utilizando un ProxyFactoryBean o frijol fbrica similar. La primavera tambin nos permite utilizar "AutoProxy" definiciones de frijol, lo que puede automticamente proxy seleccionado definiciones de frijol. Esto se basa en la primavera "post procesador de frijol" infraestructura, lo que permite la modificacin de cualquier definicin de frijol como las cargas de contenedores. En este modelo, se configura algunas definiciones de frijol especiales en el archivo XML de definicin de bean para configurar la infraestructura de proxy automtico. Esto permite que usted acaba de declarar los objetivos elegibles para autoproxying: no es necesario utilizar ProxyFactoryBean . Hay dos maneras de hacerlo:

El uso de un creador autoproxy que se refiere a granos especficos en el contexto actual. Un caso especial de la creacin autoproxy que merece ser considerado por separado, la creacin autoproxy impulsado por los atributos de metadatos a nivel de cdigo fuente.

B.8.1 AutoProxy frijol definiciones

El org.springframework.aop.framework.autoproxy paquete proporciona los siguientes creadores estndar AutoProxy.


BeanNameAutoProxyCreator

El BeanNameAutoProxyCreator clase es un BeanPostProcessor que crea automticamente servidores proxy AOP para los granos con nombres que coincidan con los valores literales o comodines.
<bean class = "org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" > <propiedad nombre "beanNames" => <valor> jdk *, onlyJdk </ value> </ propiedad> <propiedad nombre = "interceptorNames"> <list> <valor> myInterceptor </ value> </ List> </ Propiedad>

</ Bean>

Como con ProxyFactoryBean , hay una interceptorNames propiedad en lugar de una lista de interceptores, para permitir un comportamiento correcto para asesores prototipo. Nombrado "interceptores" puede ser asesores o cualquier tipo de asesoramiento. Como con auto proxy en general, el punto principal de usar BeanNameAutoProxyCreator es aplicar la misma configuracin uniforme a mltiples objetos, con volumen mnimo de configuracin. Es una opcin popular para la aplicacin de transacciones declarativas a varios objetos. Definiciones de frijol cuyos nombres coinciden, como "jdkMyBean" y "onlyJdk" en el ejemplo anterior, son simples definiciones de frijol de edad con la clase de objetivo. Un proxy AOP se crear automticamente por el BeanNameAutoProxyCreator . El mismo consejo se aplica a todos los granos coincidentes. Tenga en cuenta que si se utilizan asesores (en lugar del interceptor en el ejemplo anterior), los puntos de corte pueden aplicarse de manera diferente a diferentes granos.
DefaultAdvisorAutoProxyCreator

Un creador automtica del proxy ms general y muy potente es DefaultAdvisorAutoProxyCreator . Esta automgicamente se aplicar asesores elegibles en el contexto actual, sin la necesidad de incluir nombres especficos de frijol en grano de la definicin de consejero autoproxy. Ofrece el mismo mrito de configuracin coherente y evitar la duplicacin como BeanNameAutoProxyCreator . El uso de este mecanismo consiste en:

Especificacin de un DefaultAdvisorAutoProxyCreator definicin de frijol. Especificar cualquier nmero de asesores en los contextos idnticos o similares. Tenga en cuenta que estos deben ser consejeros no slo interceptores o consejos de otros. Esto es necesario porque debe haber un punto de corte para evaluar, para comprobar la elegibilidad de cada consejo a las definiciones de frijol candidatos.

El DefaultAdvisorAutoProxyCreator evaluar automticamente el punto de corte que contiene cada consejero, para ver lo que (en su caso) el asesoramiento que debe aplicarse a cada objeto de negocio (por ejemplo, "businessObject1" y "businessObject2" en el ejemplo). Esto significa que cualquier nmero de asesores se pueden aplicar automticamente a cada objeto de negocio. Si no hay ningn punto de corte en cualquiera de los consejeros coincide con cualquier mtodo en un objeto de negocio, el objeto no ser proxy. Como las definiciones de frijol se agregan los objetos de negocio, automticamente por el proxy si es necesario. Autoproxying en general tiene la ventaja de hacer que sea imposible para las personas que llaman o dependencias para obtener un objeto des-aconsejable. Calling getBean ("businessObject1") en este ApplicationContext volver un proxy AOP, no el objeto de

negocio objetivo. (El "grano de interior" idioma mostrado anteriormente tambin ofrece este beneficio.)
<bean class = "org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCr eator" /> <bean class = "org.springframework.transaction.interceptor.TransactionAttributeSourc eAdvisor"> <propiedad nombre = "transactionInterceptor" ref = "transactionInterceptor" /> </ Bean> <bean id = "customAdvisor" class = "com.mycompany.MyAdvisor" /> <bean id = "businessObject1" class = "com.mycompany.BusinessObject1"> <- Propiedades omitido -> </ Bean> <bean id = "businessObject2" class = "com.mycompany.BusinessObject2" />

El DefaultAdvisorAutoProxyCreator es muy til si desea aplicar el mismo consejo constantemente a los objetos de muchos negocios. Una vez que las definiciones de infraestructura estn en su lugar, puede simplemente agregar nuevos objetos de negocio sin incluir configuracin de proxy especfico. Tambin puede dejar en aspectos adicionales muy fcilmente - por ejemplo, la localizacin o los aspectos de supervisin del rendimiento - con cambios mnimos en la configuracin. El DefaultAdvisorAutoProxyCreator ofrece soporte para el filtrado (utilizando una convencin de nomenclatura de modo que slo ciertos asesores se evalan, permitiendo el uso de mltiples, configuradas de forma diferente, AdvisorAutoProxyCreators en la misma fbrica) y el pedido. Los consejeros pueden implementar la org.springframework.core.Ordered interfaz para efectuar correctamente un pedido si esto es un problema. El TransactionAttributeSourceAdvisor utilizado en el ejemplo anterior tiene un valor de orden configurable, la configuracin por defecto no est ordenado.
AbstractAdvisorAutoProxyCreator

Esta es la superclase de DefaultAdvisorAutoProxyCreator. Usted puede crear sus propios creadores AutoProxy por medio de subclases esta clase, en el improbable caso de que las definiciones asesor ofrecemos la personalizacin insuficiente para el comportamiento de la estructura DefaultAdvisorAutoProxyCreator .
B.8.2 Uso de metadatos basada en auto-proxy

Un tipo particularmente importante de autoproxying es impulsado por los metadatos. Esto produce un modelo de programacin similar a NET. ServicedComponents . En lugar de utilizar descriptores de despliegue XML como en EJB, la configuracin para la gestin de transacciones y otros servicios de la empresa se lleva a cabo en los atributos de nivel de fuente.

En este caso, se utiliza el DefaultAdvisorAutoProxyCreator , en combinacin con los Asesores que entienden los atributos de metadatos. Los detalles especficos de metadatos se llevan a cabo en la parte de punto de corte de los asesores candidatos, en lugar de en la clase creacin autoproxy s mismo. Esto es realmente un caso especial de la DefaultAdvisorAutoProxyCreator , pero merece consideracin por s sola. (El cdigo de metadatos es consciente de los puntos de corte que figuran en los asesores, no en el marco AOP s mismo.) El /attributes directorio de la aplicacin de ejemplo JPetStore muestra el uso del atributo impulsada autoproxying. En este caso, no hay necesidad de utilizar el TransactionProxyFactoryBean . Basta con definir los atributos de transaccin en los objetos de negocio es suficiente, debido a la utilizacin de metadatos conscientes puntos de corte. Las definiciones de frijol incluir el siguiente cdigo en /WEBINF/declarativeServices.xml . Tenga en cuenta que este es genrico y puede ser utilizado fuera del JPetStore:
<bean class = "org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCr eator" /> <bean class = "org.springframework.transaction.interceptor.TransactionAttributeSourc eAdvisor"> <propiedad nombre = "transactionInterceptor" ref = "transactionInterceptor" /> </ Bean> <Bean id = "TransactionInterceptor" class = "org.springframework.transaction.interceptor.TransactionInterceptor"> <propiedad nombre = "transactionManager" ref = "transactionManager" /> <propiedad nombre = "transactionAttributeSource"> <bean class = "org.springframework.transaction.interceptor.AttributesTransactionAttr ibuteSource"> <propiedad nombre = "attributes" ref = "attributes" /> </ Bean> </ Propiedad> </ Bean> <bean id = "attributes" class = "org.springframework.metadata.commons.CommonsAttributes" />

El DefaultAdvisorAutoProxyCreator definicin de frijol (el nombre no es importante, por lo que incluso puede ser omitido) recoger todos los puntos de corte admisibles en el contexto de la aplicacin actual. En este caso, la "transactionAdvisor" grano de definicin, de tipo TransactionAttributeSourceAdvisor , se aplicarn a las clases o los mtodos que llevan un atributo de transaccin. El TransactionAttributeSourceAdvisor depende de una TransactionInterceptor, a travs de la dependencia constructor. El ejemplo resuelve esta va autowiring. El AttributesTransactionAttributeSource depende de una implementacin de la org.springframework.metadata.Attributes interfaz. En este fragmento, el "atributos" bean satisface este, usando el Jakarta Commons atributos API para obtener

la informacin de atributos. (El cdigo de la aplicacin debe haber sido compilado con la tarea Atributos Comunes de compilacin.) El /annotation del directorio de la aplicacin de ejemplo JPetStore contiene un ejemplo anlogo para auto-proxy impulsados por JDK 1.5 + anotaciones. La siguiente configuracin permite la deteccin automtica de Spring Transactional anotacin, lo que lleva a los poderes implcitos para los granos que contengan dicha anotacin:
<bean class = "org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCr eator" /> <bean class = "org.springframework.transaction.interceptor.TransactionAttributeSourc eAdvisor"> <propiedad nombre = "transactionInterceptor" ref = "transactionInterceptor" /> </ Bean> <Bean id = "TransactionInterceptor" class = "org.springframework.transaction.interceptor.TransactionInterceptor"> <propiedad nombre = "transactionManager" ref = "transactionManager" /> <propiedad nombre = "transactionAttributeSource"> <bean class = "org.springframework.transaction.annotation.AnnotationTransactionAttri buteSource" /> </ Propiedad> </ Bean>

El TransactionInterceptor define aqu depende de una PlatformTransactionManager definicin, que no se incluye en el archivo genrico (aunque podra ser), ya que ser especfica para requisitos de las transacciones de la aplicacin (tpicamente JTA, como en este ejemplo, o Hibernate, JDO o JDBC) :
<Bean id = "TransactionManager" class = "org.springframework.transaction.jta.JtaTransactionManager" />

Punta

Si requiere una administracin nica transaccin declarativa, utilizando estas definiciones XML genricos se traducir en la primavera de proxy automticamente todas las clases o los mtodos con los atributos de transaccin. Usted no tendr que trabajar directamente con AOP, y el modelo de programacin es similar a la de. ServicedComponents NET. Este mecanismo es extensible. Es posible hacer autoproxying basa en los atributos personalizados. Usted necesita:

Definir el atributo personalizado. Especifique un asesor con el asesoramiento necesario, incluyendo un punto de corte que se desencadena por la presencia del atributo personalizado en una clase o mtodo. Usted puede ser capaz de utilizar un consejo existente, simplemente la

implementacin de un punto de corte esttico que toma el atributo personalizado. Es posible que esos asesores que ser nico para cada clase aconseja (por ejemplo, mixins): simplemente tienen que ser definidos como prototipo, en lugar de singleton, las definiciones de frijol. Por ejemplo, la LockMixin interceptor introduccin del conjunto de pruebas de primavera, que se muestra ms arriba, podra ser usado en conjuncin con un punto de corte atributo orientado para dirigir un mixin, como se muestra aqu. Nosotros usamos el genrico DefaultPointcutAdvisor , configurado mediante las propiedades JavaBean:
<Bean id = "lockMixin" class = "org.springframework.aop.LockMixin" scope = "prototype" /> <Bean id = "lockableAdvisor" class = "org.springframework.aop.support.DefaultPointcutAdvisor" scope = "prototipo"> <propiedad nombre = "pointcut" ref = "myAttributeAwarePointcut" /> <propiedad nombre = "advice" ref = "lockMixin" /> </ Bean> <Bean id = "anyBean" class = "anyclass" ...

Si el punto de corte atributo consciente coincide cualquier mtodo en la anyBean definiciones de frijol o de otro tipo, el mixin se aplicar. Tenga en cuenta que ambos lockMixin y lockableAdvisor definiciones son prototipos. El myAttributeAwarePointcut pointcut puede ser una definicin singleton, ya que no se mantiene el estado para que los distintos objetos aconseja.

B.9 Utilizar TargetSources


Spring ofrece el concepto de un TargetSource, expresada en la org.springframework.aop.TargetSource interfaz. Esta interfaz es responsable de devolver el "objeto destino" de aplicacin el punto de unin. El TargetSource aplicacin se le pide una instancia de destino cada vez que el proxy AOP maneja una invocacin del mtodo. Los desarrolladores que utilizan Spring AOP normalmente no necesitan trabajar directamente con TargetSources, pero este es un medio poderoso de apoyar la puesta en comn, objetivos intercambiables en caliente sofisticados y otros. Por ejemplo, una agrupacin de TargetSource puede devolver una instancia de destino diferente para cada invocacin, utilizando una agrupacin para administrar instancias. Si no se especifica un TargetSource, una implementacin por defecto se usa que envuelve un objeto local. El mismo objetivo se devuelve para cada invocacin (como cabra esperar). Echemos un vistazo a las fuentes de destino estndar proporcionados con la primavera, y cmo puede utilizarlos.

Punta

Cuando se utiliza una fuente de destino personalizada, el objetivo general tendr que ser un prototipo y no una definicin singleton frijol. Esto permite que la primavera para crear una instancia nueva meta cuando sea necesario.
B.9.1 fuentes calientes objetivo intercambiable

El org.springframework.aop.target.HotSwappableTargetSource existe para permitir que el objetivo de un proxy AOP para activarse al mismo tiempo a las personas que llaman a mantener sus referencias a la misma. El cambio de destino de la fuente de destino tiene lugar inmediatamente. El HotSwappableTargetSource es multi-hilo. Se puede cambiar el destino por medio del swap() mtodo en HotSwappableTargetSource de la siguiente manera:
HotSwappableTargetSource swapper = (HotSwappableTargetSource) beanFactory.getBean ("intercambiador"); Objeto oldTarget = swapper.swap (newTarget);

Las definiciones XML requiere tener el siguiente aspecto:


<bean id = "initialTarget" class = "mycompany.OldTarget" /> <bean id = "swapper" class = "org.springframework.aop.target.HotSwappableTargetSource"> <constructor-arg ref = "initialTarget" /> </ Bean> <bean id = "swappable" class = "org.springframework.aop.framework.ProxyFactoryBean"> <propiedad nombre = "targetSource" ref = "swapper" /> </ Bean>

Lo anterior swap() llamada cambia el destino del grano de intercambio activo. Los clientes que posean una referencia a que el frijol no sern conscientes del cambio, pero inmediatamente se empieza a golpear el nuevo objetivo. Aunque en este ejemplo no aade ningn consejo - y no es necesario aadir consejo de usar un TargetSource - por supuesto cualquier TargetSource se puede utilizar en conjuncin con el asesoramiento arbitraria.
B.9.2 Puesta en comn de fuentes de destino

Uso de una fuente objetivo agrupacin proporciona un modelo de programacin similar a EJBs de sesin sin estado, en el que un grupo de instancias idnticas se mantiene, con invocaciones del mtodo va a objetos libres en la piscina.

Una diferencia crucial entre la primavera de puesta en comn y la puesta en comn SLSB es que la primavera la puesta en comn se puede aplicar a cualquier POJO. Como con el resorte en general, este servicio se puede aplicar de una manera no invasiva. Spring ofrece fuera de la caja de apoyo a Jakarta Commons piscina 1.3, que proporciona una implementacin de la agrupacin bastante eficiente. Usted necesitar el tarro commons-pool en classpath de la aplicacin para utilizar esta funcin. Tambin es posible crear subclases org.springframework.aop.target.AbstractPoolingTargetSource para apoyar cualquier otra agrupacin de API. Ejemplo de configuracin se muestra a continuacin:
<Bean id = "businessObjectTarget" class = "com.mycompany.MyBusinessObject" scope = "prototipo"> ... propiedades omitidas </ Bean> <bean id = "poolTargetSource" class = "org.springframework.aop.target.CommonsPoolTargetSource"> <propiedad nombre = valor = "targetBeanName" "businessObjectTarget" /> <propiedad nombre = valor = "maxSize" "25" /> </ Bean> <bean id = "businessObject" class = "org.springframework.aop.framework.ProxyFactoryBean"> <propiedad nombre = "targetSource" ref = "poolTargetSource" /> <propiedad nombre = valor = "interceptorNames" "myInterceptor" /> </ Bean>

Tenga en cuenta que el objeto de destino - "businessObjectTarget" en el ejemplo - debe ser un prototipo. Esto permite que el PoolingTargetSource aplicacin para crear nuevas instancias de la meta de hacer crecer la piscina si es necesario. Consulte el Javadoc para AbstractPoolingTargetSource y la subclase concreta que desee utilizar para obtener informacin sobre sus propiedades: "MAXSIZE" es el ms bsico, y siempre se garantiza para estar presentes. En este caso, "myInterceptor" es el nombre de un interceptor que sera necesario definir en el mismo contexto de IoC. Sin embargo, no es necesario especificar interceptores de usar la agrupacin. Si desea que slo la puesta en comn, y ningn otro consejo, no establezca la propiedad interceptorNames en absoluto. Es posible configurar Spring para que sea capaz de lanzar cualquier objeto agrupado a la org.springframework.aop.target.PoolingConfig interfaz, que expone informacin sobre el tamao y la configuracin actual de la piscina a travs de una introduccin. Tendr que definir un asesor de la siguiente manera:
<propiedad nombre = "targetObject" ref = "poolTargetSource" /> <propiedad nombre = valor = "targetMethod" "getPoolingConfigMixin" /> </ Bean>

Este asesor se obtiene llamando a un mtodo de conveniencia en el AbstractPoolingTargetSource clase, de ah el uso de MethodInvokingFactoryBean. El nombre de este asesor ("poolConfigAdvisor" aqu) debe estar en la lista de nombres de interceptores en el ProxyFactoryBean exponiendo el objeto agrupado. El reparto se ver de la siguiente manera:
PoolingConfig conf = (PoolingConfig) beanFactory.getBean ("BusinessObject"); System.out.println ("Tamao mximo de la piscina es" + conf.getMaxSize ());

Nota

Agrupacin de objetos sin estado de servicio no suele ser necesario. No creemos que debera ser la opcin por defecto, como la mayora de los objetos sin estado son, naturalmente, hilo de seguridad, y la instancia de puesta en comn es problemtico si los recursos se almacenan en cach. Simplificacin de la agrupacin est disponible utilizando autoproxying. Es posible ajustar el TargetSources utilizado por cualquier creador autoproxy.
B.9.3 fuentes prototipo de destino

La creacin de un "prototipo" fuente de destino es similar a una puesta en comn TargetSource. En este caso, una nueva instancia de la meta se crear en cada invocacin del mtodo. Aunque el costo de la creacin de un nuevo objeto no es muy alta en un moderno JVM, el costo de cableado hasta el nuevo objeto (la satisfaccin de sus dependencias COI) pueden ser ms caros. Por lo tanto usted no debe usar este mtodo sin razn muy buena. Para ello, se podra modificar el poolTargetSource definicin se muestra arriba de la siguiente manera. (Tambin he cambiado el nombre, para mayor claridad.)
<bean id = "prototypeTargetSource" class = "org.springframework.aop.target.PrototypeTargetSource"> <propiedad nombre = "targetBeanName" ref = "businessObjectTarget" /> </ Bean>

Slo hay una propiedad: el nombre del bean de destino. La herencia se utiliza en las implementaciones TargetSource para asegurar nomenclatura coherente. Al igual que con la fuente objetivo comn, la haba de destino debe ser una definicin de bean prototipo.
B.9.4 ThreadLocal fuentes de destino
ThreadLocal

fuentes destinatarios son tiles si usted necesita un objeto que se crea para cada solicitud entrante (por hilo que es). El concepto de un ThreadLocal proporcionar una instalacin de JDK-gama para almacenar de forma transparente recursos junto con un hilo. La creacin de un ThreadLocalTargetSource es ms o menos la misma que se explic para los otros tipos de fuente deseado:

<bean id = "threadlocalTargetSource" class = "org.springframework.aop.target.ThreadLocalTargetSource"> <propiedad nombre = valor = "targetBeanName" "businessObjectTarget" /> </ Bean>

Nota

ThreadLocals vienen con problemas graves (potencialmente resultando en prdidas de memoria) cuando no es correctamente utilizando en entornos multi-hilo y multicargador de clases. Siempre hay que considerar envolver un ThreadLocal de alguna otra clase y nunca directamente utilice el ThreadLocal s mismo (excepto, por supuesto, en la clase de contenedor). Tambin, uno debe recordar siempre para configurar correctamente y unset (cuando este ltimo slo afectaron a una llamada a ThreadLocal.set(null) ) el recurso local al hilo. La desconexin se debe hacer en cualquier caso, ya no desconexin que podra resultar en un comportamiento problemtico. Apoyo ThreadLocal primavera hace esto para usted y debe considerarse siempre en favor de la utilizacin de otro tipo de cdigo ThreadLocals sin manejo adecuado.

B.10 Definicin de nuevos Advice tipos


Spring AOP est diseado para ser extensible. Si bien la estrategia de implementacin intercepcin en la actualidad se usa internamente, es posible admitir tipos arbitrarios asesoramiento, adems de la interceptacin fuera de la caja alrededor de consejo, antes, arroja asesoramiento y consejo a su regreso. El org.springframework.aop.framework.adapter paquete es un paquete de SPI que permite soporte para nuevos tipos de consejos personalizados que aadir sin cambiar la estructura del ncleo. La nica limitacin en una costumbre Advice tipo es que se debe implementar el org.aopalliance.aop.Advice interfaz tag. Por favor refirase a la org.springframework.aop.framework.adapter Javadocs paquete para obtener ms informacin.

B.11 recursos adicionales


Por favor refirase a las aplicaciones de primavera de la muestra para otros ejemplos de Spring AOP:

La configuracin por defecto de JPetStore ilustra el uso de la TransactionProxyFactoryBean para la gestin de transacciones declarativa. El /attributes de directorio del JPetStore muestra el uso del atributo impulsado por la gestin de transacciones declarativa.

Apndice C. Migracin a Spring Framework 3.1


En este apndice se discute lo que los usuarios quieren saber cuando se actualiza a Spring Framework 3.1. Para una visin general de las funciones, consulte el Captulo 3, nuevas caractersticas y mejoras en Spring Framework 3.1

C.1 componente de exploracin contra el paquete "org" base


Spring Framework 3.1 introduce una serie de @Configuration dichas clases Debido a @Configuration es en ltima instancia meta-anotado con Spring @Component anotacin, estas clases inadvertidamente ser escaneado y procesado por el recipiente bajo ningn componente de exploracin de directiva contra la incondicional "org" paquete, por ejemplo:
<context:component-scan base-package = "org" />

Por lo tanto, con el fin de evitar errores como la reportada en SPR-9843 , las directrices que debe ser actualizado para al menos un nivel de ms de, por ejemplo cualificacin:
<context:component-scan base-package = "org.xyz" />

Alternativamente, un exclude-filter puede ser utilizado. Ver context:componentscan documentacin para ms detalles.

Apndice D. Migracin a Spring Framework 3.2


En este apndice se discute lo que los usuarios quieren saber cuando se actualiza a Spring Framework 3.2. Para una visin general de las funciones, consulte el Captulo 4, nuevas caractersticas y mejoras en Spring Framework 3.2

D.1 dependencias recin opcionales


Algunas dependencias entre mdulos son ahora optional en el nivel de Maven POM donde se requiere una vez. Por ejemplo, spring-tx y su dependencia de springcontext . Esto puede resultar en ClassNotFoundErrors u otros problemas similares para los usuarios que han confiado en la gestin de la dependencia transitiva para tirar en posteriores afectados spring-* . Para resolver este problema, slo tiene que aadir los frascos que falten a la configuracin de construir.

D.2 apoyo EHCache mud a resortes contexto de apoyo


Junto con el apoyo JCache nueva primavera, las clases de apoyo en el Ehcache org.springframework.cache.ehcache paquete trasladado desde el spring-context del mdulo para spring-context-support .

D.3 Inlining de primavera-asm tarro


En las versiones 3.0 y 3.1, publicamos un discreto spring-asm que contienen reenvasados org.objectweb.asm 3.x fuentes. A partir de Spring Framework 3.2, se ha actualizado a org.objectweb.asm 4,0 y acabado con la jarra mdulo separado,

favoreciendo procesos en lnea estas clases directamente en spring-core . Esto debera causar ningn problema de la migracin para la mayora de usuarios, pero en la remota posibilidad de que usted tenga spring-asm declarado directamente dentro del script de creacin de su proyecto, usted querr eliminar al actualizar a Spring Framework 3.2.

D.4 dependencia CGLIB explcita no es necesaria


En versiones anteriores, los usuarios de base de la subclase de Spring AOP proxies (por ejemplo, a travs proxy-target-class="true" ) y @Configuration soporte de clase estaban obligados a declarar una dependencia explcita en CGLIB 2,2. A partir de Spring Framework 3.2, ahora volver a empaquetar y en lnea el recientemente publicado CGLIB 3.0. Esto significa una mayor comodidad para los usuarios, as como la funcionalidad correcta para Java 7 usuarios que estn creando subclases de tipos de proxies que contienen invokedynamic instrucciones de cdigo de bytes. Reenvasado CGLIB internamente asegura no tener ningn conflicto classpath con otros marcos de terceras partes que pueden depender de otras versiones de CGLIB.

D.5 Para los usuarios de OSGi


Metadatos OSGi ya no est publicada en individuales Spring Framework jar archivos MANIFEST.MF. Por favor vea este anuncio para ms informacin acerca de cmo los usuarios pueden obtener OSGi listos para versiones de Spring Framework 3.2 frascos.

D.6 MVC Java Config y Namespace MVC


Como se explica en la Seccin 17.15.4, "Configuracin de Negociacin de contenido" , tanto el MVC config Java y las extensiones de espacio de nombres, tales como MVC registro .json y .xml si las dependencias correspondientes classpath estn presentes. Esto significa que los mtodos de controlador ahora puede devolver contenido JSON o XML formateado si dichas extensiones estn presentes en el URI de la solicitud, incluso si el encabezado "Accept" no pide ese tipo de medios. El soporte recin agregado para las variables de matriz se explica en la seccin "Variables Matrix" . Para mantener la compatibilidad con versiones anteriores, por defecto, el contenido de punto y coma se elimina de peticin de entrada URI y por lo tanto @MatrixVariable no se puede utilizar sin necesidad de configuracin adicional. Sin embargo, cuando se utiliza la MVC Java configuracin y el espacio de nombres MVC, punto y coma contenido se deja en el URI de modo que las variables de la matriz se admite automticamente. La retirada de contenidos de punto y coma es controlado a travs de la UrlPathHelper caracterstica de RequestMappingHandlerMapping .

D.7 Decodificacin de Valores URI variables


Valores URI variables ahora se decodifica cuando UrlPathHelper.setUrlDecode se establece en false . Ver SPR-9098 .

D.8 mtodo HTTP PARCHE


El DispatcherServlet ahora permite que el mtodo HTTP PARCHE donde antes no lo haca.

D.9 Azulejos 3
Adems del cambio de nmero de versin, el conjunto de baldosas dependencias tambin ha cambiado. Usted tendr que tener un subconjunto o la totalidad de tilesrequest-api , tiles-api , tiles-core , tiles-servlet , tiles-jsp , tiles-el .

D.10 Spring MVC prueba independiente del proyecto


Si est migrando desde la primavera-test-mvc proyecto independiente para la springtest mdulo en Spring Framework 3.2, tendr que ajustar el paquete root para org.springframework.test.web.servlet . Usted ya no ser capaz de utilizar el MockMvcBuilders annotationConfigSetup y xmlConfigSetup opciones. En su lugar, tendr que pasar a utilizar el @WebAppConfiguration apoyo de spring-test para la carga de configuracin de Spring, e inyectar un WebApplicationContext en la prueba y lo utilizan para crear un MockMvc . Consulte Seccin 11.3.6, "Spring Framework MVC Test" para ms detalles.

D.11 pruebas de la primavera Dependencias


La spring-test mdulo se ha actualizado a depender de JUnit 4,11 ( junit:junit ), TestNG 6.5.2 ( org.testng:testng ), y Hamcrest Core 1,3 ( org.hamcrest:hamcrest-core ). Cada una de estas dependencias se declara como una dependencia opcional en el POM Maven. Adems, es importante tener en cuenta que el equipo de JUnit ha dejado de procesos en lnea Core Hamcrest dentro de la junit:junit artefacto Maven como de JUnit 4,11. Por lo tanto, si sus actuales JUnit pruebas basadas en hacer uso de comparadores Hamcrest que anteriormente estaban disponibles directamente en el junit:junit JAR, ahora tendr que declarar explcitamente una dependencia de org.hamcrest:hamcrest-core , org.hamcrest:hamcrest-library , o org.hamcrest:hamcrest-all .

D.12 Pblicas cambios en el API


D.12.1 JDiff informes

Seleccione Informes JDiff estn siendo publicados para proporcionar a los usuarios un medio conveniente para la comprensin de lo que ha cambiado entre versiones. En el futuro estos sern publicados entre cada versin menor, por ejemplo de 3.1.3.RELEASE a 3.1.4.RELEASE, a partir de la ltima versin de mantenimiento para la ltima versin GA, por ejemplo 3.1.3.RELEASE a 3.2.0.RELEASE , y entre cada hito y / o RC para los usuarios que realizan un seguimiento de la prxima generacin de desarrollo, por ejemplo, a 3.2.0.RC2 3.2.0.RELEASE .

D.12.2 el desuso

Los paquetes y los modelos siguientes han sido total o parcialmente obsoleto en Spring Framework 3.2 y se eliminar en una versin futura. Haga clic a travs de la Javadoc vinculado para cada artculo para mayor informacin. Vase tambin la lista completa de el desuso en el marco.

org.springframework.orm.ibatis org.springframework.scheduling.backportconcurrent org.springframework.ejb.support org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter org.springframework.web.jsf.DelegatingVariableResolver org.springframework.web.jsf.SpringBeanVariableResolver org.springframework.ui.velocity.CommonsLoggingLogSystem org.springframework.ui.velocity.VelocityEngineUtils org.springframework.beans.factory.config.BeanReferenceFactoryBean org.springframework.beans.factory.config.CommonsLogFactoryBean org.springframework.beans.instrument.classloading.oc4j.OC4JLoadTimeWeave r org.springframework.transaction.jta.OC4JJtaTransactionManager org.springframework.web.util.ExpressionEvaluationUtils org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAd apter org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExc eptionResolver org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMa pping org.springframework.web.servlet.mvc.annotation.ServletAnnotationMappingUti ls org.springframework.jmx.support.MBeanRegistrationSupport org.springframework.test.context.ContextConfigurationAttributes org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringCont extTests : uso de la simpleJdbcTemplate variable de instancia ha quedado obsoleto en favor de la nueva jdbcTemplate variable de instancia. org.springframework.test.context.testng.AbstractTransactionalTestNGSpringCo ntextTests : uso de la simpleJdbcTemplate variable de instancia ha quedado obsoleto en favor de la nueva jdbcTemplate variable de instancia. org.springframework.test.jdbc.SimpleJdbcTestUtils ha quedado obsoleto en favor de JdbcTestUtils que ahora contiene toda la funcionalidad disponible anteriormente en SimpleJdbcTestUtils . org.springframework.web.servlet.view.ContentNegotiatingViewResolver org.springframework.transaction.interceptor.TransactionAspectUtils org.springframework.http.HttpStatus org.springframework.web.util.UriUtils org.springframework.orm.jpa.vendor.TopLinkJpaDialect org.springframework.orm.jpa.vendor.TopLinkJpaVendorAdapter org.springframework.orm.util.CachingMapDecorator

Apndice E. esquema XML de configuracin basada en

E.1 Introduccin
Este apndice detalles del esquema XML de configuracin basada introducido en la primavera de 2,0 y mejorado y ampliado en la primavera de 2,5 y 3,0. Apoyo DTD? Autora de archivos de configuracin de Spring utilizando el viejo estilo DTD est siendo totalmente compatible. Nada va a romper si renunciar a la utilizacin de la nueva definicin de esquema XML enfoque basado en la edicin de archivos de configuracin de Spring XML. Todo lo que es perder en la oportunidad de tener ms breve y ms claro configuracin. Independientemente de la configuracin XML es DTD o esquema-basado, al final todo se reduce al mismo modelo de objetos en el recipiente (es decir, uno o ms BeanDefinition casos). La motivacin central para mover los archivos de esquema XML de configuracin basadas en la primavera era hacer ms fcil la configuracin de XML. El 'clsico' <bean/> enfoque basado en que es bueno, pero su carcter genrico tiene un precio en trminos de trabajo de configuracin. A partir de la primavera de IoC contenedores de punto de vista, todo es un bean. Eso es una gran noticia para el contenedor Spring IoC, porque si todo es un grano entonces todo puede ser tratado de la misma manera exacta. El mismo, sin embargo, no es cierto a partir de un desarrollador de punto de vista. Los objetos definidos en un archivo de configuracin de Spring XML no son genricos, frijoles de vainilla. Por lo general, cada grano requiere algn tipo de configuracin especfica. Spring 2.0 's nuevo esquema XML de configuracin basada aborda esta cuestin. El <bean/> elemento sigue estando presente, y si quieres, puedes seguir escribiendo el mismo estilo exacto de la Primavera de configuracin XML utilizando slo <bean/> elementos. El nuevo esquema XML de configuracin basada, sin embargo, hacer Spring archivos XML de configuracin sustancialmente ms fciles de interpretar. Adems, le permite expresar la intencin de una definicin de frijol. El punto clave a recordar es que las nuevas etiquetas personalizadas funcionan mejor para los granos de infraestructura e integracin: por ejemplo, AOP, colecciones, transacciones, integracin con 3 de las estructuras, tales como la mula, etc, mientras que las etiquetas de frijol existentes son las ms adecuadas para especficos de la aplicacin, tales como frijoles, objetos DAO de servicios de capa, validadores, etc Los ejemplos que se incluyen a continuacin se espera que convencerte de que la inclusin de la ayuda de esquemas XML en Spring 2.0 fue una buena idea. La recepcin en la comunidad ha sido alentadora, adems, tenga en cuenta el hecho de que este mecanismo nueva configuracin es totalmente personalizable y extensible. Esto significa que usted puede escribir sus propias etiquetas de dominio especfico de configuracin que mejor representaran dominio de la aplicacin, el proceso para hacerlo es cubierto en el anexo titulado Apndice F, Extensible creacin de XML .

E.2 esquema XML de configuracin basada en


E.2.1 referencia a los esquemas

Para cambiar el DTD de estilo al nuevo esquema XML de estilo, tiene que hacer el siguiente cambio.
<? Xml version = "1.0" encoding = "UTF-8"> <! DOCTYPE beans PUBLIC "- / / PRIMAVERA / / DTD BEAN 2.0 / / EN" "Http://www.springframework.org/dtd/spring-beans-2.0.dtd"> <beans> <- Definiciones de frijol aqu -> </ Beans>

El equivalente en el archivo XML Schema-estilo sera ...


<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd "> <- Definiciones de frijol aqu -> </ Beans>

Nota

El 'xsi:schemaLocation' fragmento realmente no es necesario, pero se puede incluir para hacer referencia a una copia local de un esquema (que puede ser til durante el desarrollo). La primavera anterior fragmento de configuracin XML es repetitivo que se puede copiar y pegar (!) Y luego enchufe <bean/> definiciones en como lo ha hecho siempre. Sin embargo, todo el punto de conmutacin es tomar ventaja de las nuevas etiquetas XML Spring 2,0, ya que hacen ms fcil la configuracin. La seccin denominada Seccin E.2.2, "El util esquema " muestra cmo se puede comenzar inmediatamente usando algunas de las etiquetas ms comunes de servicios pblicos. El resto de este captulo est dedicada a mostrar ejemplos de la nueva configuracin de Spring esquema XML basado, con al menos un ejemplo de cada nueva etiqueta. El formato sigue un estilo de antes y despus, con un antes fragmento de XML que muestra el viejo (pero sigue siendo 100% legal y apoyado) estilo, seguido inmediatamente por un ejemplo despus de mostrar su equivalente en el nuevo esquema XML basado en estilo.

E.2.2 El util esquema

En primer lugar es la cobertura de las util etiquetas. Como su nombre lo indica, las util etiquetas lidiar con problemas comunes, la utilidad de configuracin, como la configuracin de las colecciones, las constantes referencias, y cosas por el estilo. Para utilizar las etiquetas en el util esquema, es necesario tener el siguiente prembulo en la parte superior de su archivo de configuracin XML Spring, el texto en el siguiente fragmento de cdigo hace referencia al esquema correcto para que las etiquetas en el util espacio de nombres estn disponibles para usted.
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: util = "http://www.springframework.org/schema/util" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd "> <- Definiciones de frijol aqu -> </ Beans> <util:constant/>

Antes ...
<bean id = "..." class = "..."> <propiedad nombre = "isolation"> <Bean id = "java.sql.Connection.TRANSACTION_SERIALIZABLE" class = "org.springframework.beans.factory.config.FieldRetrievingFactoryBean" /> </ Propiedad> </ Bean>

La configuracin anterior se utiliza un resorte FactoryBean implementacin, el FieldRetrievingFactoryBean , para establecer el valor del 'isolation' propiedad de un bean con el valor de la 'java.sql.Connection.TRANSACTION_SERIALIZABLE' constante. Todo esto est muy bien, pero es un poco prolijo y (innecesariamente) expone plomera interna de Spring para el usuario final. El siguiente esquema XML basado en la versin ms concisa y expresa claramente la intencin de los desarrolladores ('inyectar este valor constante "), y que slo se lee mejor.
<bean id = "..." class = "..."> <propiedad nombre = "isolation"> <util:constant static-field = "java.sql.Connection.TRANSACTION_SERIALIZABLE" /> </ Propiedad> </ Bean>

Si una propiedad de frijoles o arg constructor de un valor de campo FieldRetrievingFactoryBean

es un FactoryBean que recupera un static valor del campo o no estticos. Se suele utilizar para recuperar public static final constantes, que luego pueden ser utilizados para establecer un valor de propiedad o arg constructor de otro grano. Encuentra a continuacin un ejemplo que muestra cmo una static campo est expuesta, mediante el uso de la staticField propiedad:
<Bean id = "myField" class = "org.springframework.beans.factory.config.FieldRetrievingFactoryBean"> <propiedad nombre = valor = "staticField" "java.sql.Connection.TRANSACTION_SERIALIZABLE" /> </ Bean>

Hay tambin una forma de uso donde la conveniencia static se especifica como el nombre de campo de frijol:
<Bean id = "java.sql.Connection.TRANSACTION_SERIALIZABLE" class = "org.springframework.beans.factory.config.FieldRetrievingFactoryBean" />

Esto quiere decir que ya no hay ninguna opcin en lo que el id de frijol es (por lo que cualquier otro frijol que se refiere a ella tambin tendr que utilizar este nombre ms largo), pero esta forma es muy concisa de definir, y muy cmodo de usar como un bean interior desde el ello no tiene que ser especificado para la referencia bean:
<bean id = "..." class = "..."> <propiedad nombre = "isolation"> <Bean id = "java.sql.Connection.TRANSACTION_SERIALIZABLE" class = "org.springframework.beans.factory.config.FieldRetrievingFactoryBean" /> </ Propiedad> </ Bean>

Tambin es posible acceder a una no esttico (ejemplo) campo de otro bean, como se describe en la documentacin de la API para la FieldRetrievingFactoryBean clase. Inyectar valores de enumeracin en frijoles, ya sea como propiedad o argumentos de constructor es muy fcil de hacer en la primavera, ya que en realidad no tiene que hacer nada ni saber nada sobre los detalles de primavera (o incluso de clases como la FieldRetrievingFactoryBean ). Veamos un ejemplo para ver lo fcil inyectar un valor de enumeracin es, considerar este JDK 5 enumeracin:
paquete javax.persistence; public enum {PersistenceContextType TRANSACCIN, EXTENDIDO

Consideremos ahora un setter de tipo PersistenceContextType :


paquete de ejemplo; public class Cliente { PersistenceContextType persistenceContextType privado; setPersistenceContextType public void (tipo PersistenceContextType) { este tipo persistenceContextType =.; } }

.. y la definicin de bean correspondiente:


<bean class = "example.Client"> <propiedad nombre = valor = "persistenceContextType" "TRANSACTION" /> </ Bean>

Esto funciona para los clsicos con seguridad de tipos enumeraciones emulados (en JDK 1.4 y JDK 1.3), as, la primavera intentar automticamente para que coincida con el valor de la propiedad a una cadena constante de la clase de enumeracin.
<util:property-path/>

Antes ...
<- Frijol blanco que se hace referencia por su nombre -> <bean id = clase = "testBean" alcance "org.springframework.beans.TestBean" "prototype" => <propiedad nombre = valor = "age" "10" /> <propiedad nombre = "spouse"> <bean class = "org.springframework.beans.TestBean"> <propiedad nombre = valor = "age" "11" /> </ Bean> </ Propiedad> </ Bean> <- Se traducir en 10, que es el valor de la "edad" de propiedad "testBean 'bean -> <bean id = "testBean.age" class = "org.springframework.beans.factory.config.PropertyPathFactoryBean" />

La configuracin anterior se utiliza un resorte FactoryBean implementacin, el PropertyPathFactoryBean , para crear un bean (de tipo int ) llamado 'testBean.age' que tiene un valor igual a la 'age' de la propiedad 'testBean' bean. After ...
<- Frijol blanco que se hace referencia por su nombre -> <bean id = clase = "testBean" alcance "org.springframework.beans.TestBean" "prototype" =>

<propiedad nombre = valor = "age" "10" /> <propiedad nombre = "spouse"> <bean class = "org.springframework.beans.TestBean"> <propiedad nombre = valor = "age" "11" /> </ Bean> </ Propiedad> </ Bean> <- Se traducir en 10, que es el valor de la "edad" de propiedad "testBean 'bean -> <util:property-path id = "name" path = "testBean.age" />

El valor de la 'path' atributo del <property-path/> etiqueta sigue la forma 'beanName.beanProperty' .


Usando <util:property-path/> para establecer una propiedad de frijoles o constructor argumentoPropertyPathFactoryBean

es un FactoryBean que evala una ruta de propiedad sobre un objeto de destino determinado. El objeto de destino se puede especificar directamente o por medio de un nombre de frijol. Este valor puede ser entonces utilizado en otra definicin de bean como un valor de propiedad o argumento del constructor. He aqu un ejemplo en el que se utiliza un camino en contra de otro bean, por nombre:
/ / Target frijol que se hace referencia por su nombre <bean id = clase = "person" alcance "org.springframework.beans.TestBean" "prototype" => <propiedad nombre = valor = "age" "10" /> <propiedad nombre = "spouse"> <bean class = "org.springframework.beans.TestBean"> <propiedad nombre = valor = "age" "11" /> </ Bean> </ Propiedad> </ Bean> / / Genera 11, que es el valor de 'spouse.age "propiedad de" persona "bean <Bean id = "theAge" class = "org.springframework.beans.factory.config.PropertyPathFactoryBean"> <propiedad nombre = valor = "targetBeanName" "person" /> <propiedad nombre = valor = "propertyPath" "spouse.age" /> </ Bean>

En este ejemplo, una ruta se evala contra un bean de interior:


<- Resultar en 12, que es el valor de la "edad" caracterstica de la haba interna -> <Bean id = "theAge" class = "org.springframework.beans.factory.config.PropertyPathFactoryBean"> <propiedad nombre = "targetObject"> <bean class = "org.springframework.beans.TestBean"> <propiedad nombre = valor = "age" "12" /> </ Bean>

</ Propiedad> <propiedad nombre = valor = "propertyPath" "age" /> </ Bean>

Hay tambin una forma de acceso directo, donde el nombre del bean es la ruta de propiedad.
<- Se traducir en 10, que es el valor de la "edad" propiedad de "persona" bean -> <Bean id = "person.age" class = "org.springframework.beans.factory.config.PropertyPathFactoryBean" />

Esta forma significa que no hay otra opcin en el nombre del bean. Cualquier referencia a la misma tambin se tiene que utilizar el mismo ID, que es la ruta de acceso. Por supuesto, si se utiliza como un bean interior, no hay necesidad de hacer referencia a l en absoluto:
<bean id = "..." class = "..."> <propiedad nombre = "age"> <Bean id = "person.age" class = "org.springframework.beans.factory.config.PropertyPathFactoryBean" /> </ Propiedad> </ Bean>

El tipo de resultado puede ser configurado especficamente en la definicin real. Esto no es necesario para la mayora de los casos de uso, pero puede ser de utilidad para algunos. Por favor, consulte los Javadocs para obtener ms informacin sobre esta funcin.
<util:properties/>

Antes ...
<- Crea una instancia de java.util.Properties con los valores cargados desde la ubicacin suministrado -> <bean id = "jdbcConfiguration" class = "org.springframework.beans.factory.config.PropertiesFactoryBean"> <propiedad nombre = valor = "location" "classpath:com/foo/jdbcproduction.properties" /> </ Bean>

La configuracin anterior se utiliza un resorte FactoryBean implementacin, el PropertiesFactoryBean , a instancias de un java.util.Properties instancia con valores cargados desde el suministro Resource localizacin). After ...
<- Crea una instancia de java.util.Properties con los valores cargados desde la ubicacin suministrado -> <util:properties id = "jdbcConfiguration" ubicacin = "classpath:com/foo/jdbc-production.properties" />

<util:list/>

Antes ...
<- Se crea una instancia java.util.List con valores cargados desde el suministrado por 'SourceList' -> <bean id = "emails" class = "org.springframework.beans.factory.config.ListFactoryBean"> <propiedad nombre = "sourceList"> <list> <valor> pechorin@hero.org </ value> <valor> raskolnikov@slums.org </ value> <valor> stavrogin@gov.org </ value> <valor> porfiry@gov.org </ value> </ List> </ Propiedad> </ Bean>

La configuracin anterior utiliza un resorte FactoryBean aplicacin, la ListFactoryBean , para crear un java.util.List ejemplo inicializa con valores tomados de la suministrada 'sourceList' . After ...
<- Crea una instancia de java.util.List con los valores proporcionados -> <util:list id = "emails"> <valor> pechorin@hero.org </ value> <valor> raskolnikov@slums.org </ value> <valor> stavrogin@gov.org </ value> <valor> porfiry@gov.org </ value> </ Util: Lista>

Tambin puede controlar explcitamente el tipo exacto de List que se crear una instancia y se rellena a travs de la utilizacin de la 'list-class' atributo en el <util:list/> elemento. Por ejemplo, si necesitamos realmente un java.util.LinkedList crear una instancia, se podra utilizar la siguiente configuracin:
<util:list id = "emails" list-class "java.util.LinkedList" => <valor> jackshaftoe@vagabond.org </ value> <valor> eliza@thinkingmanscrumpet.org </ value> <valor> vanhoek@pirate.org </ value> <valor> d'Arcachon @ nemesis.org </ value> </ Util: Lista>

Si no hay 'list-class' atributo, se muestra una List ejecucin ser elegido por el contenedor.
<util:map/>

Antes ...
<- Se crea una instancia java.util.Map con valores cargados desde el servicio 'sourceMap' ->

<bean id = "emails" class = "org.springframework.beans.factory.config.MapFactoryBean"> <propiedad nombre = "sourceMap"> <map> <entry clave = valor = "pechorin" "pechorin@hero.org" /> <entry clave = valor = "raskolnikov" "raskolnikov@slums.org" /> <entry clave = valor = "stavrogin" "stavrogin@gov.org" /> <entry clave = valor = "porfiry" "porfiry@gov.org" /> </ Map> </ Propiedad> </ Bean>

La configuracin anterior utiliza un resorte FactoryBean aplicacin, la MapFactoryBean , para crear un java.util.Map ejemplo inicializa con pares de clave y valor tomado de la suministrada 'sourceMap' . After ...
<- Se crea una instancia java.util.Map con los suministrados pares clave-valor -> <util:map id = "emails"> <entry clave = valor = "pechorin" "pechorin@hero.org" /> <entry clave = valor = "raskolnikov" "raskolnikov@slums.org" /> <entry clave = valor = "stavrogin" "stavrogin@gov.org" /> <entry clave = valor = "porfiry" "porfiry@gov.org" /> </ Util: mapa>

Tambin puede controlar explcitamente el tipo exacto del Map que se crear una instancia y se rellena a travs de la utilizacin de la 'map-class' atributo en el <util:map/> elemento. Por ejemplo, si necesitamos realmente un java.util.TreeMap crear una instancia, se podra utilizar la siguiente configuracin:
<util:map id = "emails" <entry clave = valor <entry clave = valor <entry clave = valor <entry clave = valor </ Util: mapa> map-class "java.util.TreeMap" => = "pechorin" "pechorin@hero.org" /> = "raskolnikov" "raskolnikov@slums.org" /> = "stavrogin" "stavrogin@gov.org" /> = "porfiry" "porfiry@gov.org" />

Si no hay ningn 'map-class' atributo, se muestra una Map ejecucin ser elegido por el contenedor.
<util:set/>

Antes ...
<- Se crea una instancia java.util.Set con valores cargados desde el suministrado por 'sourceSet' -> <bean id = "emails" class = "org.springframework.beans.factory.config.SetFactoryBean"> <propiedad nombre = "sourceSet"> <set> <valor> pechorin@hero.org </ value> <valor> raskolnikov@slums.org </ value> <valor> stavrogin@gov.org </ value>

<valor> porfiry@gov.org </ value> </ Set> </ Propiedad> </ Bean>

La configuracin anterior utiliza un resorte FactoryBean aplicacin, la SetFactoryBean , para crear un java.util.Set ejemplo inicializa con valores tomados de la suministrada 'sourceSet' . After ...
<- Crea una instancia de java.util.Set con los valores proporcionados -> <util:set id = "emails"> <valor> pechorin@hero.org </ value> <valor> raskolnikov@slums.org </ value> <valor> stavrogin@gov.org </ value> <valor> porfiry@gov.org </ value> </ Util: set>

Tambin puede controlar explcitamente el tipo exacto de Set que se crear una instancia y se rellena a travs de la utilizacin del 'set-class' atributo en el <util:set/> elemento. Por ejemplo, si necesitamos realmente un java.util.TreeSet crear una instancia, se podra utilizar la siguiente configuracin:
id = <util:set "emails" set-class "java.util.TreeSet" => <valor> pechorin@hero.org </ value> <valor> raskolnikov@slums.org </ value> <valor> stavrogin@gov.org </ value> <valor> porfiry@gov.org </ value> </ Util: set>

Si no hay ningn 'set-class' atributo, se muestra una Set ejecucin ser elegido por el contenedor.
E.2.3 El jee esquema

Los jee etiquetas lidiar con Java EE (Java Enterprise Edition)-relacionados con los problemas de configuracin, tales como levantar un objeto JNDI y la definicin de las referencias EJB. Para utilizar las etiquetas en el jee esquema, es necesario tener el siguiente prembulo en la parte superior de su archivo de configuracin XML Spring, el texto en las referencias del esquema siguiente fragmento de cdigo correcto para que las etiquetas en el jee espacio de nombres estn disponibles para usted.
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: jee = "http://www.springframework.org/schema/jee" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd ">

<- Definiciones de frijol aqu -> </ Beans> <jee:jndi-lookup/> (simple)

Antes ...
<bean id = "origen de datos" class="org.springframework.jndi.JndiObjectFactoryBean"> <propiedad nombre = valor = "jndiName" "jdbc/MyDataSource" /> </ Bean> <bean id = "userDao" class = "com.foo.JdbcUserDao"> <- Primavera har el reparto de forma automtica (como de costumbre) -> <propiedad nombre = ref "dataSource" = "dataSource "/> </ Bean>

After ...
Identificacin del <jee:jndi-lookup = "origen de datos" jndiname="jdbc/MyDataSource"/> <bean id = "userDao" class = "com.foo.JdbcUserDao"> <- Primavera har el reparto de forma automtica (como de costumbre) -> <propiedad nombre = ref "dataSource" = "dataSource "/> </ Bean> <jee:jndi-lookup/> (con ajuste nico entorno JNDI)

Antes ...
<bean id = "simple" class = "org.springframework.jndi.JndiObjectFactoryBean"> <propiedad nombre = valor = "jndiName" "jdbc/MyDataSource" /> <propiedad nombre = "jndiEnvironment"> <props> <prop clave = "foo"> bar </ prop> </ Accesorios> </ Propiedad> </ Bean>

After ...
id = <jee:jndi-lookup "simple" jndi-name "jdbc/MyDataSource" => <jee:environment> foo = bar </ jee: medio ambiente> </ Jee: JNDI lookup> <jee:jndi-lookup/> (con mltiples configuraciones de entorno JNDI)

Antes ...
<bean id = "simple" class = "org.springframework.jndi.JndiObjectFactoryBean">

<propiedad nombre = <propiedad nombre = <props> <prop clave <prop clave </ Accesorios> </ Propiedad> </ Bean>

valor = "jndiName" "jdbc/MyDataSource" /> "jndiEnvironment"> = "foo"> bar </ prop> = "ping"> pong </ prop>

After ...
id = <jee:jndi-lookup "simple" jndi-name "jdbc/MyDataSource" => <- Salto de lnea, separados por pares clave-valor para el medio ambiente (formato estndar Propiedades) -> <jee:environment> foo = bar mesa de ping pong = </ Jee: medio ambiente> </ Jee: JNDI lookup> <jee:jndi-lookup/> (complejo)

Antes ...
<bean id = "simple" class = "org.springframework.jndi.JndiObjectFactoryBean"> <propiedad nombre = valor = "jndiName" "jdbc/MyDataSource" /> <propiedad nombre = valor = "cache" "true" /> <propiedad nombre = valor = "resourceRef" "true" /> <propiedad nombre = valor = "lookupOnStartup" "false" /> <propiedad nombre = valor = "expectedType" "com.myapp.DefaultFoo" /> <propiedad nombre = valor = "proxyInterface" "com.myapp.Foo" /> </ Bean>

After ...
<Jee: JNDI lookup id = "simple" JNDI name = "jdbc / MyDataSource" cache = "true" resource-ref = "true" lookup-on-startup = "false" espera-type = "com.myapp.DefaultFoo" proxy-interface = "com.myapp.Foo" /> <jee:local-slsb/> (simple)

El <jee:local-slsb/> etiqueta configura una referencia a un EJB sin estado SessionBean. Antes ...
<Bean id = "simple" class = "org.springframework.ejb.access.LocalStatelessSessionProxyFactoryBean" > <propiedad nombre = valor = "jndiName" "ejb/RentalServiceBean" />

<propiedad nombre = valor = "businessInterface" "com.foo.service.RentalService" /> </ Bean>

After ...
<Jee: local-SLSB id = "simpleSlsb" JNDI name = "ejb / RentalServiceBean" negocios interface = "com.foo.service.RentalService" /> <jee:local-slsb/> (complejo) <Bean id = "complexLocalEjb" class = "org.springframework.ejb.access.LocalStatelessSessionProxyFactoryBean" > <propiedad nombre = valor = "jndiName" "ejb/RentalServiceBean" /> <propiedad nombre = valor = "businessInterface" "com.foo.service.RentalService" /> <propiedad nombre = valor = "cacheHome" "true" /> <propiedad nombre = valor = "lookupHomeOnStartup" "true" /> <propiedad nombre = valor = "resourceRef" "true" /> </ Bean>

After ...
<Jee: local-SLSB id = "complexLocalEjb" JNDI name = "ejb / RentalServiceBean" negocios interface = "com.foo.service.RentalService" cache-home = "true" lookup-home-on-startup = "true" resource-ref = "true"> <jee:remote-slsb/>

El <jee:remote-slsb/> etiqueta configura una referencia a un remote SessionBean EJB sin estado. Antes ...
<Bean id = "complexRemoteEjb" class = "org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFacto ryBean"> <propiedad nombre = valor = "jndiName" "ejb/MyRemoteBean" /> <propiedad nombre = valor = "businessInterface" "com.foo.service.RentalService" /> <propiedad nombre = valor = "cacheHome" "true" /> <propiedad nombre = valor = "lookupHomeOnStartup" "true" /> <propiedad nombre = valor = "resourceRef" "true" /> <propiedad nombre = valor = "homeInterface" "com.foo.service.RentalService" /> <propiedad nombre = valor = "refreshHomeOnConnectFailure" "true" /> </ Bean>

After ...
<Jee: remote-SLSB id = "complexRemoteEjb" JNDI name = "ejb / MyRemoteBean"

negocios interface = "com.foo.service.RentalService" cache-home = "true" lookup-home-on-startup = "true" resource-ref = "true" casa-interface = "com.foo.service.RentalService" refresh-home-on-connect-fracaso = "true">

E.2.4 El lang esquema

Los lang etiquetas lidiar con la exposicin de los objetos que se han escrito en un lenguaje dinmico como JRuby o Groovy como granos en el contenedor Spring. Estas etiquetas (y el soporte de lenguajes dinmicos) estn ampliamente recogidos en el captulo Captulo 28, soporte de idioma dinmico . Por favor, consulte a ese captulo para ms detalles sobre este apoyo y las lang etiquetas propias. En aras de la exhaustividad, para utilizar las etiquetas en el lang del esquema, es necesario tener el siguiente prembulo en la parte superior de su archivo de configuracin XML Spring, el texto en las referencias del esquema siguiente fragmento de cdigo correcto para que las etiquetas en el lang de espacio de nombres estn disponibles para usted.
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: lang = "http://www.springframework.org/schema/lang" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd "> <- Definiciones de frijol aqu -> </ Beans>

E.2.5 El jms esquema

El jms etiquetas acuerdo con la configuracin de JMS relacionados con frijoles, como Spring MessageListenerContainers . Estas etiquetas se detallan en la seccin del captulo JMS titulado Seccin 23.6, "Apoyo Espacio de nombres JMS" . Por favor, consulte a ese captulo para ms detalles sobre este apoyo y los jms etiquetas propias. En aras de la exhaustividad, para utilizar las etiquetas en la jms esquema, es necesario tener el siguiente prembulo en la parte superior de su archivo de configuracin XML Spring, el texto en las referencias del esquema siguiente fragmento de cdigo correcto para que las etiquetas en el jms espacio de nombres estn disponibles para usted.
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: jms = "http://www.springframework.org/schema/jms" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd "> <- Definiciones de frijol aqu -> </ Beans>

E.2.6 La tx (transaccin) esquema

Los tx etiquetas tratar de configurar todas las habas en un amplio soporte de Spring para las transacciones. Estas etiquetas se tratan en el captulo Captulo 12, Gestin de Operaciones .
Punta

Se le recomienda mirar a la 'spring-tx.xsd' archivo que se incluye con la distribucin de primavera. Este archivo es (por supuesto), el esquema XML de configuracin de Spring transaccin, y cubre todas las etiquetas de varias en el tx espacio de nombres, incluyendo incumplimientos de atributos y cosas por el estilo. Este archivo se documenta en lnea, por lo que la informacin no se repite aqu en aras de la adhesin a la SECO (No Repeat Yourself) principio. En aras de la exhaustividad, para utilizar las etiquetas en el tx esquema, es necesario tener el siguiente prembulo en la parte superior de su archivo de configuracin XML Spring, el texto en las referencias del esquema siguiente fragmento de cdigo correcto para que las etiquetas en el tx espacio de nombres estn disponibles para usted.
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <- Definiciones de frijol aqu -> </ Beans>

Nota

A menudo, cuando se utilizan las etiquetas en el tx espacio de nombres que tambin va a utilizar las etiquetas de la aop espacio de nombres (ya que el soporte de transacciones declarativa en la primavera se implementa mediante AOP). El siguiente fragmento XML anterior contiene las lneas relevantes necesarios para hacer referencia a la aop esquema para que las etiquetas de la aop espacio de nombres estn disponibles para usted.

E.2.7 El aop esquema

El aop acuerdo con la configuracin de las etiquetas todas las cosas en la primavera de AOP: esto incluye la propia Spring basado en proxy AOP marco y la integracin de Spring con el marco AspectJ AOP. Estas etiquetas estn ampliamente recogidos en el captulo Captulo 9, Programacin Orientada a Aspectos con Spring . En aras de la exhaustividad, para utilizar las etiquetas en el aop esquema, es necesario tener el siguiente prembulo en la parte superior de su archivo de configuracin XML Spring, el texto en las referencias del esquema siguiente fragmento de cdigo correcto para que las etiquetas en el aop espacio de nombres estn disponibles para usted.
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <- Definiciones de frijol aqu -> </ Beans>

E.2.8 El context de esquema

El context etiquetas lidiar con ApplicationContext configuracin que se refiere a la plomera - que no es, por lo general los frijoles que son importantes para el usuario final, sino ms bien los frijoles que hacer un montn de trabajo duro en la primavera, como BeanfactoryPostProcessors . Las referencias al esquema siguiente fragmento de cdigo correcto para que las etiquetas en el context de espacio de nombres estn disponibles para usted.
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: context = "http://www.springframework.org/schema/context" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <- Definiciones de frijol aqu -> </ Beans>

Nota

El context de esquema slo se introdujo en la primavera de 2,5.

<property-placeholder/>

Este elemento activa el reemplazo de ${...} marcadores de posicin, resolvi contra el archivo de propiedades especificado (como una localizacin de recursos primavera ). Este elemento es un mecanismo de conveniencia que establece un PropertyPlaceholderConfigurer para usted, si usted necesita ms control sobre el PropertyPlaceholderConfigurer , define uno mismo de forma explcita.
<annotation-config/>

Activa la infraestructura Spring para varias anotaciones que se detectan en las clases de frijol: Spring @Required y @Autowired , as como JSR 250 de @PostConstruct , @PreDestroy y @Resource (si est disponible) y APP @PersistenceContext y @PersistenceUnit (si est disponible) . Alternativamente, usted puede optar por activar los distintos BeanPostProcessors de esas anotaciones explcitamente.
Nota

Este elemento no se activa el procesamiento de Primavera @Transactional anotacin. Utilice el <tx:annotation-driven/> elemento para ese propsito.
<component-scan/>

Este elemento se detalla en la Seccin 5.9, "Anotacin de configuracin basada en contenedor" .


<load-time-weaver/>

Este elemento se detalla en la Seccin 9.8.4, "en tiempo de carga de tejer con AspectJ en el marco de la Primavera" .
<spring-configured/>

Este elemento se detalla en la Seccin 9.8.1, "Uso de AspectJ a la dependencia inyectar objetos de dominio con la primavera" .
<mbean-export/>

Este elemento se detalla en la Seccin 24.4.3, "Configuracin de exportacin basada en anotacin MBean" .
E.2.9 La tool esquema

Las tool las etiquetas son para uso cuando se desea agregar herramientas especficas de metadatos a los elementos de configuracin personalizados. Estos metadatos pueden entonces ser consumidos por herramientas que estn al tanto de estos metadatos y las herramientas se puede hacer casi todo lo que quiera con l (validacin, etc.) Las tool las etiquetas no estn documentados en esta versin de la primavera, ya que actualmente estn en proceso de revisin. Si usted es un proveedor externo tercera

herramienta y desea contribuir a este proceso de revisin, y luego hacer la lista de correo electrnico de primavera. Los soportados actualmente tool etiquetas se pueden encontrar en el archivo 'spring-tool.xsd' en el 'src/org/springframework/beans/factory/xml' directorio de la distribucin fuente de primavera.
E.2.10 La jdbc esquema

Los jdbc te permiten configurar rpidamente una base de datos integrada o inicializar un origen de datos existente. Estas etiquetas estn documentados en la Seccin 14.8, "Embedded soporte de base de datos" y Seccin 14.9, "La inicializacin de un origen de datos" , respectivamente. Para utilizar las etiquetas en el jdbc esquema, es necesario tener el siguiente prembulo en la parte superior de su archivo de configuracin XML Spring, el texto en las referencias del esquema siguiente fragmento de cdigo correcto para que las etiquetas en el jdbc espacio de nombres estn disponibles para usted.
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: jdbc = "http://www.springframework.org/schema/jdbc" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd "> <- Definiciones de frijol aqu -> </ Beans>

E.2.11 La cache esquema

El cache las etiquetas se pueden utilizar para activar el soporte de Spring @CacheEvict , @CachePut y @Caching anotaciones. Es tambin soporta declarativo basado en XML, el almacenamiento en cach. Consulte Seccin 29.3.5, "Habilitar cach de anotaciones" y Seccin 29.4, "declarativo basado en XML, el almacenamiento en cach" para ms detalles. Para utilizar las etiquetas en la cache de esquema, debe tener el siguiente prembulo en la parte superior de su archivo de configuracin XML Spring, el texto en las referencias del esquema siguiente fragmento de cdigo correcto para que las etiquetas de la cache de espacio de nombres estn disponibles para usted.
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: jdbc = "http://www.springframework.org/schema/cache" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/jdbc/spring-cache.xsd ">

<- Definiciones de frijol aqu -> </ Beans>

E.2.12 Los beans esquema

Por ltimo, pero no menos importante tenemos las etiquetas en el beans esquema. Estas son las mismas etiquetas que han estado en Primavera desde los albores mismos de la estructura. Algunos ejemplos de las distintas etiquetas en los beans esquema no se muestran aqu porque estn muy ampliamente cubierto en la Seccin 5.4.2, "Dependencias y configuracin en detalle" (y de hecho en que todo el captulo ). Una cosa que es nueva para los frijoles propias etiquetas en Spring 2.0 es la idea de los metadatos de frijol arbitraria. En la primavera de 2,0 ahora es posible aadir cero o ms pares clave / valor a <bean/> definiciones XML. Cul es, en todo caso, se hace con estos metadatos adicional es totalmente de su propia lgica personalizada (por lo general slo es til si usted est escribiendo sus propias etiquetas personalizadas, como se describe en el anexo titulado Apndice F, Extensible creacin de XML ). A continuacin encontrar un ejemplo de la <meta/> etiqueta en el contexto de un entorno <bean/> (tenga en cuenta que sin ningn tipo de lgica para interpretar los metadatos son realmente intiles como est).
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd "> <bean id = "foo" class = "xyFoo"> <meta key="cacheName" value="foo"/> <propiedad nombre = valor = "name" "Rick" /> </ Bean> </ Beans>

En el caso del ejemplo anterior, se podra asumir que hay una cierta lgica que consumir la definicin de frijol y crear alguna infraestructura de almacenamiento en cach usando los metadatos suministrados.

Apndice F. extensible XML de autora F.1 Introduccin


Desde la versin 2.0, la primavera ha contado con un mecanismo de esquema a base de ampliaciones de la primavera bsico formato XML para definir y configurar beans. Esta seccin est dedicada a detallar cmo va a ir sobre cmo escribir tus propios analizadores XML de definicin de frijol y la integracin de tales analizadores en el contenedor de IoC primavera.

Para facilitar la creacin de archivos de configuracin usando un editor de esquemas XML-aware, extensible Spring mecanismo de configuracin XML se basa en XML Schema. Si usted no est familiarizado con las actuales Spring extensiones XML de configuracin que vienen con la distribucin estndar de Primavera, lea primero el anexo titulado Apndice E, esquema XML de configuracin basada en . La creacin de nuevas extensiones de configuracin XML se puede hacer siguiendo estos pasos (relativamente) sencillos: 1. Autora de un esquema XML para describir el elemento personalizado (s). 2. Codificacin de una costumbre NamespaceHandler ejecucin (esto es un paso fcil, no te preocupes). 3. Codificacin de una o ms BeanDefinitionParser implementaciones (aqu es donde el trabajo real que se hace). 4. Registro de los artefactos anteriores con Spring (esto tambin es un paso fcil). Lo que sigue es una descripcin de cada uno de estos pasos. Para el ejemplo, vamos a crear una extensin XML (un elemento XML personalizado) que nos permite configurar los objetos del tipo SimpleDateFormat (del java.text paquete) de una manera fcil. Cuando terminemos, vamos a ser capaces de definir las definiciones de frijol de tipo SimpleDateFormat as:
<MyNS: Dateformat id = "dateFormat" pattern = "aaaa-MM-dd HH: mm" indulgente = "true" />

(No te preocupes por el hecho de que este ejemplo es muy simple, mucho ms detallados ejemplos seguirs despus La intencin en este sencillo ejemplo primero es caminar a travs de los pasos bsicos.).

F.2 Creacin del esquema


Creacin de una ampliacin de configuracin XML para su uso con contenedor de Spring COI comienza con autora de un esquema XML para describir la extensin. Lo que sigue es el esquema que vamos a utilizar para configurar SimpleDateFormat objetos.
<- Myns.xsd (dentro del paquete org / springframework / samples / xml) -> <? Xml version = "1.0" encoding = "UTF-8"> <Xsd: schema xmlns = "http://www.mycompany.com/schema/myns" xmlns: xsd = "http://www.w3.org/2001/XMLSchema" xmlns: frijoles = "http://www.springframework.org/schema/beans" targetNamespace = "http://www.mycompany.com/schema/myns" elementFormDefault = "qualified" attributeFormDefault = "sin reservas"> <xsd:import espacio de nombres = "http://www.springframework.org/schema/beans" /> nombre = <xsd:element "dateformat"> <xsd:complexType>

<xsd:complexContent> <xsd:extension base="beans:identifiedType"> nombre = <xsd:attribute "lenient" type = "xsd:boolean" /> nombre = <xsd:attribute "pattern" type = "xsd:string" use = "required" /> </ Xsd: extension> </ Xsd: complexContent> </ Xsd: complexType> </ Xsd: element> </ Xsd: schema>

(La lnea enfatizado contiene una base de extensin de todas las etiquetas que sern identificables (es decir, tienen un id atributo que se utilizar como identificador de frijol en el recipiente). Podemos utilizar este atributo porque nos importa la temporada Primavera-siempre 'beans' espacio de nombres.) El esquema anterior se utiliza para configurar SimpleDateFormat objetos, directamente en un archivo de aplicacin contexto XML usando el <myns:dateformat/> elemento.
<MyNS: Dateformat id = "dateFormat" pattern = "aaaa-MM-dd HH: mm" indulgente = "true" />

Tenga en cuenta que despus de haber creado las clases de infraestructura, el fragmento anterior de XML esencialmente ser exactamente el mismo que el siguiente fragmento de cdigo XML. En otras palabras, estamos creando un grano en el contenedor, identificado por el nombre de 'dateFormat' de tipo SimpleDateFormat , con un par de propiedades establecidas.
<bean id = "dateFormat" class = "java.text.SimpleDateFormat"> <constructor-arg value = "yyyy-HH-dd HH:mm" /> <propiedad nombre = valor = "lenient" "true" /> </ Bean>

Nota

El enfoque basado en esquemas para la creacin de formato de configuracin permite una estrecha integracin con un IDE que tiene un editor de esquemas XML-aware. El uso de un esquema escrito correctamente, puede utilizar el autocompletado tener un usuario elegir entre varias opciones de configuracin definidos en la enumeracin.

F.3 Codificacin de una NamespaceHandler


Adems del esquema, necesitamos un NamespaceHandler que analizar todos los elementos del espacio de nombres especfico de esta primavera se encuentra al analizar archivos de configuracin. El NamespaceHandler debera, en nuestro caso, cuidar el anlisis de los myns:dateformat elemento. El NamespaceHandler interfaz es bastante simple ya que cuenta con apenas tres mtodos:

init()

- permite la inicializacin de la NamespaceHandler y ser llamado para la primavera antes de que el controlador se utiliza BeanDefinition parse(Element, ParserContext) - Spring llama cuando se encuentra con un elemento de nivel superior (no anidado dentro de una definicin de frijoles o un espacio de nombres diferente). Este mtodo puede registrar definiciones de frijol en s y / o devolucin de una definicin de frijol.
BeanDefinitionHolder decorate(Node, BeanDefinitionHolder, ParserContext) - Spring llama cuando encuentra un atributo o elemento

anidado de un espacio de nombres diferente. La decoracin de una o ms definiciones de frijol se utiliza, por ejemplo, con el fuera-de-the-box 2.0 mbitos Spring soporta . Vamos a empezar por destacar un ejemplo sencillo, sin necesidad de utilizar la decoracin, despus de lo cual vamos a mostrar la decoracin en un ejemplo algo ms avanzado. Aunque es perfectamente posible codificar su propio NamespaceHandler para el espacio de nombres completo (y por lo tanto proporcionar cdigo que analiza cada elemento del espacio de nombres), es a menudo el caso de que cada elemento XML de nivel superior en unos resultados de primavera de archivo XML de configuracin en una definicin nica de frijol (como en nuestro caso, en un nico <myns:dateformat/> resultados de elementos en un solo SimpleDateFormat definicin de bean). Spring ofrece una serie de clases de conveniencia que apoyan esta hiptesis. En este ejemplo, vamos a hacer uso de la NamespaceHandlerSupport clase:
paquete org.springframework.samples.xml; org.springframework.beans.factory.xml.NamespaceHandlerSupport importacin; public class extends MyNamespaceHandler NamespaceHandlerSupport { public void init () { registerBeanDefinitionParser ("Dateformat", SimpleDateFormatBeanDefinitionParser nuevo ()); } }

El lector atento se dar cuenta de que no hay realmente un montn de lgica de anlisis en esta clase. De hecho ... el NamespaceHandlerSupport clase tiene una construida en concepto de delegacin. Es compatible con el registro de cualquier nmero de BeanDefinitionParser casos, a la que se delegan a cuando se tiene que analizar un elemento en su espacio de nombres. Esta clara separacin de las preocupaciones permite una NamespaceHandler para manejar la orquestacin del anlisis de todos los elementos personalizados en su espacio de nombres, mientras que la delegacin de BeanDefinitionParsers que hacer el trabajo sucio del anlisis de XML, lo que significa que cada BeanDefinitionParser contendr slo la lgica para analizar un elemento personalizado nico, como podemos ver en el siguiente paso

F.4 Codificacin de una BeanDefinitionParser


Un BeanDefinitionParser se utilizar si la NamespaceHandler encuentra un elemento XML del tipo que se ha mapeado en el analizador bean definicin especfica

(que es 'dateformat' en este caso). En otras palabras, la BeanDefinitionParser es responsable de analizar uno distinto elemento de nivel superior XML definido en el esquema. En el programa de anlisis, tendremos acceso al elemento XML (y por lo tanto sus subelementos tambin) para que podamos analizar nuestra costumbre contenido XML, como se puede ver en el siguiente ejemplo:
paquete org.springframework.samples.xml; org.springframework.beans.factory.support.BeanDefinitionBuilder importacin; importar org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionPars er; org.springframework.util.StringUtils importacin; importar org.w3c.dom.Element; java.text.SimpleDateFormat importacin; SimpleDateFormatBeanDefinitionParser clase pblica se extiende AbstractSingleBeanDefinitionParser { Clase protegido getBeanClass (elemento Element) { volver SimpleDateFormat clase.; } protected void doParse (elemento Element, BeanDefinitionBuilder frijol) { / / Esto nunca va a ser nulo ya que el esquema exige explcitamente que un valor se suministra Patrn String = Element.getAttribute ("patrn"); bean.addConstructorArg (patrn); / / Esto sin embargo es una propiedad opcional Cadena indulgente Element.getAttribute = ("indulgente"); if (StringUtils.hasText (indulgente)) { bean.addPropertyValue ("indulgente", Boolean.valueOf (indulgente)); } } }

Usamos la Primavera-siempre AbstractSingleBeanDefinitionParser para manejar una gran parte del trabajo bsico gruido de crear un nico BeanDefinition . Suministramos la AbstractSingleBeanDefinitionParser superclase con el tipo que nuestro nico BeanDefinition va a representar. En este caso simple, esto es todo lo que tenemos que hacer. La creacin de nuestro nico BeanDefinition es manejado por el AbstractSingleBeanDefinitionParser superclase, como es la extraccin y ajuste de identificador nico de la definicin de Bean.

F.5 Registrar el manejador y el esquema


La codificacin es! Todo lo que queda por hacer es hacer que de alguna manera la infraestructura Spring XML parsing conscientes de nuestra elemento personalizado, lo

hacemos mediante el registro de nuestra costumbre namespaceHandler y el archivo XSD personalizado en dos propiedades de propsito especial archivos. Estos archivos de propiedades son colocados en un 'META-INF' del directorio de la aplicacin, y puede, por ejemplo, se distribuir junto con las clases de binarios en un archivo JAR. La infraestructura de Primavera de anlisis XML automticamente recoger la nueva extensin por el consumo de estos archivos de propiedades especiales, los formatos de los que se detallan a continuacin.
F.5.1 'META-INF/spring.handlers'

El archivo de propiedades llamado 'spring.handlers' contiene un mapeo de esquemas XML a clases de controlador URI de espacio de nombres. As que para nuestro ejemplo, tenemos que escribir lo siguiente:
http \ :/ / www.mycompany.com/schema/myns=org.springframework.samples.xml.MyNamesp aceHandler

(El ':' personaje es un delimitador vlido en el formato de propiedades Java, por lo que el ':' personaje de la URI necesita ser escapado con una barra invertida). La primera parte (la llave) del par clave-valor es el URI asociado con la extensin de espacio de nombres personalizado, y debe coincidir exactamente con el valor de la 'targetNamespace' atributo tal como se especifica en el esquema XSD personalizado.
F.5.2 'META-INF/spring.schemas'

El archivo de propiedades llamado 'spring.schemas' contiene una asignacin de ubicaciones de esquema XML (se refiere junto con la declaracin de esquema en archivos XML que utilizan el esquema como parte de la 'xsi:schemaLocation' atributo) a los recursos classpath. Este archivo es necesario para prevenir la primavera de absolutamente tener que utilizar un defecto EntityResolver que requiere acceso a Internet para recuperar el archivo de esquema. Si se especifica la asignacin en este archivo de propiedades, Spring buscar el esquema en la ruta de clase (en este caso 'myns.xsd' en el 'org.springframework.samples.xml' paquete):
http \ :/ / www.mycompany.com/schema/myns/myns.xsd=org/springframework/samples/xml /myns.xsd

El resultado de esto es que se le anima a desplegar el archivo XSD (s) justo al lado de los NamespaceHandler y BeanDefinitionParser clases en el classpath.

F.6 Con una extensin personalizada en la primavera de configuracin XML


Con una extensin personalizada que usted mismo ha implementado no es diferente de usar uno de los 'custom' extensiones que ofrece Spring directamente de la caja. Encontrar ms adelante un ejemplo del uso de la costumbre <dateformat/> elemento desarrollado en los pasos anteriores en un archivo de configuracin Spring XML.

<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: myNS = "http://www.mycompany.com/schema/myns" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.mycompany.com/schema/myns http://www.mycompany.com/schema/myns/myns.xsd "> <- Como un grano de alto nivel -> <myns:dateformat id = patrn "defaultDateFormat" = "yyyy-MM-dd HH:mm" indulgente = "true" /> <bean id = "jobDetailTemplate" abstract = "true"> <propiedad nombre = "dateFormat"> <- Como un bean de interior -> <myns:dateformat patrn = "HH:mm MM-dd-yyyy" /> </ Propiedad> </ Bean> </ Beans>

F.7 ms sustancioso ejemplos


A continuacin encontrar algunos ejemplos sustanciosos gran parte de las extensiones personalizadas XML.
F.7.1 etiquetas personalizadas de anidacin dentro de las etiquetas personalizadas

Este ejemplo ilustra cmo puede ir sobre la escritura de los diversos artefactos necesarios para satisfacer el objetivo de la siguiente configuracin:
<? Xml version = "1.0" encoding = "UTF-8"> <Granos xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: foo = "http://www.foo.com/schema/component" xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.foo.com/schema/component http://www.foo.com/schema/component/component.xsd "> <foo:component id="bionic-family" name="Bionic-1"> <foo:component name="Mother-1"> <foo:component name="Karate-1"/> <foo:component name="Sport-1"/> </ Foo: Componente> <foo:component name="Rock-1"/> </ Foo: Componente> </ Beans>

La configuracin anterior en realidad nidos extensiones personalizadas dentro de otros. La clase que est realmente configurado por encima de la <foo:component/> elemento es el Component clase (que se muestra directamente debajo). Observe cmo el Component de clase no expone un mtodo setter para los 'components' propiedad, lo

que hace que sea difcil (o ms bien imposible) para configurar una definicin de frijol para el Component de clase mediante la inyeccin de setter.
paquete com.foo; java.util.ArrayList importacin; importar java.util.List; Componente clase pblica { private String nombre; Lista privado <Componente> componentes = new ArrayList <Componente> (); / / Mmm, no existe un mtodo setter para los "componentes" pblico addComponent void (componente Componente) { este components.add (componente).; } pblicos getComponents Lista <Componente> () { volver componentes; } public String getName () { devolver el nombre; } setName public void (String nombre) { . este nombre = nombre; } }

La solucin tpica a este problema es crear una costumbre FactoryBean que expone una propiedad setter para los 'components' de propiedad.
paquete com.foo; org.springframework.beans.factory.FactoryBean importacin; importar java.util.List; pblico ComponentFactoryBean clase implementa FactoryBean <Componente> { padre componente privado; nios privados Marcar <Componente>; setParent public void (principal componente) { este padre parent =.; } setChildren public void (nios Lista <Componente>) { estos nios = nios.; } getObject componente pblico () throws Exception { if (esto. hijos! = && nulos esta children.size. ()> 0) { para (hijo de componentes: los nios) { este parent.addComponent (nio).; }

} volver a este padre.; } Clase pblica GetObjectType <Componente> () { Componente y vuelta en clase.; } public boolean isSingleton () { return true; } }

Todo esto est muy bien, y funciona muy bien, sino que expone una gran cantidad de tuberas de primavera para el usuario final. Lo que vamos a hacer es escribir una extensin personalizada que esconde todo esto fontanera primavera. Si nos atenemos a los pasos descritos anteriormente , vamos a empezar por crear el esquema XSD para definir la estructura de nuestra etiqueta personalizada.
<? Xml version = "1.0" encoding = "UTF-8" standalone = "no"> <Xsd: schema xmlns = "http://www.foo.com/schema/component" xmlns: xsd = "http://www.w3.org/2001/XMLSchema" targetNamespace = "http://www.foo.com/schema/component" elementFormDefault = "qualified" attributeFormDefault = "sin reservas"> nombre = <xsd:element "COMPONENTE">> <xsd:complexType> <xsd:choice minOccurs = "0" maxOccurs = "unbounded"> <xsd:element ref = "COMPONENTE"> /> </ Xsd: choice> nombre = <xsd:attribute "id" type = "xsd:ID" /> <xsd:attribute name = "name" use = "required" type = "xsd:string" /> </ Xsd: complexType> </ Xsd: element> </ Xsd: schema>

A continuacin, vamos a crear una costumbre NamespaceHandler .


paquete com.foo; org.springframework.beans.factory.xml.NamespaceHandlerSupport importacin; public class extends ComponentNamespaceHandler NamespaceHandlerSupport { public void init () { registerBeanDefinitionParser ("componente", ComponentBeanDefinitionParser nuevo ()); } }

El siguiente paso es la costumbre BeanDefinitionParser . Recuerde que lo que estamos creando es una BeanDefinition describir un ComponentFactoryBean .

paquete com.foo; importar org.springframework.beans.factory.config.BeanDefinition; importar org.springframework.beans.factory.support.AbstractBeanDefinition; org.springframework.beans.factory.support.BeanDefinitionBuilder importacin; importar org.springframework.beans.factory.support.ManagedList; importar org.springframework.beans.factory.xml.AbstractBeanDefinitionParser; importar org.springframework.beans.factory.xml.ParserContext; org.springframework.util.xml.DomUtils importacin; importar org.w3c.dom.Element; importar java.util.List; ComponentBeanDefinitionParser clase pblica se extiende AbstractBeanDefinitionParser { AbstractBeanDefinition protegido parseInternal (elemento Element, ParserContext ParserContext) { volver parseComponentElement (elemento); } parseComponentElement privado AbstractBeanDefinition esttico (elemento Element) { BeanDefinitionBuilder fbrica = BeanDefinitionBuilder.rootBeanDefinition (ComponentFactoryBean. clase); factory.addPropertyValue ("padre", parseComponent (elemento)); Lista <Elemento> childElements = DomUtils.getChildElementsByTagName (element, "componente"); if (childElements! = null && childElements.size ()> 0) { parseChildComponents (childElements, fbrica); } volver factory.getBeanDefinition (); } private static BeanDefinition parseComponent (elemento Element) { BeanDefinitionBuilder componente = BeanDefinitionBuilder.rootBeanDefinition (Component. clase); component.addPropertyValue ("name", Element.getAttribute ("nombre")); volver component.getBeanDefinition (); } privadas parseChildComponents static void (lista <Elemento> childElements, fbrica BeanDefinitionBuilder) { ManagedList <BeanDefinition> nios = new ManagedList <BeanDefinition> (childElements.size ()); para (elemento Elemento: childElements) { children.add (parseComponentElement (elemento)); } factory.addPropertyValue ("nios", los nios); } }

Por ltimo, los distintos artefactos deben estar registrados en la infraestructura Spring XML.
# En 'META-INF/spring.handlers' http \ :/ / www.foo.com/schema/component=com.foo.ComponentNamespaceHandler # En 'META-INF/spring.schemas' http \ :/ / www.foo.com/schema/component/component.xsd=com/foo/component.xsd

F.7.2 atributos personalizados en "normales" elementos

Escribir su propio analizador de encargo y los artefactos asociados no es difcil, pero a veces no es lo que hay que hacer. Tenga en cuenta la situacin en la que es necesario agregar metadatos a las definiciones de frijol ya existentes. En este caso, desde luego no quiero tener que ir y escribir su propio extensin personalizada entero, sino que lo que desea es aadir un atributo adicional para el elemento bean definicin existente. A modo de otro ejemplo, supongamos que la clase de servicio que se est definiendo una definicin de bean para un objeto de servicio que (desconocido para ella) se accede a un clster JCache , y usted querr asegurarse de que la instancia JCache llamado con impaciencia comenz a el clster de los alrededores:
<Bean id = "checkingAccountService" class = "com.foo.DefaultCheckingAccountService" jcache: cache-name = "checking.account"> <- Otras dependencias here ... -> </ Bean>

Lo que vamos a hacer es crear otra BeanDefinition cuando el 'jcache:cache-name' atributo se analiza, lo que BeanDefinition abrir la JCache nombrado por nosotros. Tambin vamos a modificar el actual BeanDefinition para la 'checkingAccountService' para que se tenga una dependencia de este nuevo JCache a inicializar BeanDefinition .
paquete com.foo; JCacheInitializer clase pblica { private String nombre; JCacheInitializer pblico (String nombre) { . este nombre = nombre; } public void initialize () { / / Un montn de JCache llamadas a la API para inicializar la cach con nombre ... } }

Ahora sobre la extensin personalizada. En primer lugar, la creacin del esquema XSD que describe el atributo personalizado (bastante fcil en este caso).
<? Xml version = "1.0" encoding = "UTF-8" standalone = "no">

<Xsd: schema xmlns = "http://www.foo.com/schema/jcache" xmlns: xsd = "http://www.w3.org/2001/XMLSchema" targetNamespace = "http://www.foo.com/schema/jcache" elementFormDefault = "qualified"> nombre = <xsd:attribute "cache-name" type = "xsd:string" /> </ Xsd: schema>

A continuacin, el asociado NamespaceHandler .


paquete com.foo; org.springframework.beans.factory.xml.NamespaceHandlerSupport importacin; public class extends JCacheNamespaceHandler NamespaceHandlerSupport { public void init () { super. registerBeanDefinitionDecoratorForAttribute ("cachename", JCacheInitializingBeanDefinitionDecorator nuevo ()); } }

A continuacin, el analizador. Tenga en cuenta que en este caso, ya que se van a analizar un atributo XML, se escribe un BeanDefinitionDecorator en lugar de un BeanDefinitionParser .
paquete com.foo; importar org.springframework.beans.factory.config.BeanDefinitionHolder; importar org.springframework.beans.factory.support.AbstractBeanDefinition; org.springframework.beans.factory.support.BeanDefinitionBuilder importacin; importar org.springframework.beans.factory.xml.BeanDefinitionDecorator; importar org.springframework.beans.factory.xml.ParserContext; importar org.w3c.dom.Attr; importar org.w3c.dom.Node; java.util.ArrayList importacin; java.util.Arrays importacin; importar java.util.List; JCacheInitializingBeanDefinitionDecorator clase pblica implementa BeanDefinitionDecorator { private String static final [] EMPTY_STRING_ARRAY = new String [0]; BeanDefinitionHolder pblico decorar ( Fuente de nodo, titular BeanDefinitionHolder, ParserContext ctx) { Cadena initializerBeanName = registerJCacheInitializer (fuente, ctx);

createDependencyOnJCacheInitializer (titular, initializerBeanName); volver titular; } createDependencyOnJCacheInitializer private void (titular BeanDefinitionHolder, String initializerBeanName) { AbstractBeanDefinition definicin = ((AbstractBeanDefinition) holder.getBeanDefinition ()); String [] = DependsOn definition.getDependsOn (); if (DependsOn == null) { DependsOn = new String [] {} initializerBeanName; } Else { Lista de las dependencias = new ArrayList (Arrays.asList (DependsOn)); dependencies.add (initializerBeanName); DependsOn = (String []) dependencies.toArray (EMPTY_STRING_ARRAY); } definition.setDependsOn (DependsOn); } registerJCacheInitializer private String (fuente Node, ParserContext ctx) { Cadena cacheName = ((attr) fuente) getValue ().; Cadena beanName = cacheName + "inicializador"; if (! ctx.getRegistry (). containsBeanDefinition (beanName)) { Inicializador BeanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition (JCacheInitializer. clase); initializer.addConstructorArg (cacheName); . ctx.getRegistry () registerBeanDefinition (beanName, initializer.getBeanDefinition ()); } volver beanName; } }

Por ltimo, los distintos artefactos deben estar registrados en la infraestructura Spring XML.
# En 'META-INF/spring.handlers' http \ :/ / www.foo.com/schema/jcache=com.foo.JCacheNamespaceHandler # En 'META-INF/spring.schemas' http \ :/ / www.foo.com/schema/jcache/jcache.xsd=com/foo/jcache.xsd

F.8 Recursos adicionales


A continuacin encontrar enlaces a recursos adicionales relativos a esquemas XML y el apoyo extensible XML se describe en este captulo.

El XML Schema Part 1: Structures Second Edition El XML Schema Part 2: Tipos de datos Second Edition

Apndice G. spring.tld G.1 Introduccin

Una de las tecnologas de vista que puede utilizar con Spring Framework es Java Server Pages (JSP). Para ayudarle a implementar puntos de vista utilizando Java Server Pages Spring Framework proporciona algunas etiquetas para la evaluacin de los errores, el establecimiento de temas y emitir mensajes internacionalizados. Por favor, tenga en cuenta que las distintas etiquetas que genera esta forma de biblioteca de etiquetas cumplen con la especificacin XHTML 1.0 estricto y asistente DTD . En este apndice se describe el spring.tld biblioteca de etiquetas.

Seccin G.2: "El bind etiqueta " Seccin G.3, "El escapeBody tag " Seccin G.4: "El hasBindErrors tag " Seccin G.5, "El htmlEscape tag " Seccin G.6: "El message etiqueta " La seccin G.7, "El nestedPath tag " Seccin G.8: "El theme tag " Seccin G.9, "La transform etiqueta " Seccin G.10, "La url tag " Seccin G.11, "El eval tag "

G.2 El bind etiqueta


Proporciona objeto BindStatus por el camino se unen dado. La bandera HTML escapar participa en una configuracin de la pgina o en toda la amplia aplicacin-(es decir, por HtmlEscapeTag o un "defaultHtmlEscape" context-param en web.xml). Tabla G.1. Atributos
Expresin Necesario? tiempo de Descripcin ejecucin?

Atributo

Establecer HTML escapar de esta etiqueta, como valor booleano. Reemplaza el HTML htmlEscape falso verdadero por defecto escapar configuracin de la pgina actual. Defina si desea ignorar un camino anidado, en ignoreNestedPath falso verdadero su caso. El valor predeterminado es no pasar por alto. La ruta de la haba o frijol propiedad para enlazar la informacin de estado. Por ejemplo empleado account.name, camino verdadero verdadero company.address.zipCode o justo. El objeto de estado se exportan al mbito de la pgina, especficamente para esta propiedad haba o frijol

G.3 El escapeBody etiqueta


Escapes su contenido cuerpo cerrado, la aplicacin de escape HTML y / o JavaScript escapar. La bandera HTML escapar participa en una configuracin de la pgina o en toda la amplia aplicacin-(es decir, por HtmlEscapeTag o un "defaultHtmlEscape" context-param en web.xml). Tabla G.2. Atributos
Expresin tiempo de ejecucin?

Atributo

Necesario?

Descripcin

htmlEscape

falso

verdadero

javaScriptEscape

falso

verdadero

Establecer HTML escapar de esta etiqueta, como valor booleano. Reemplaza el HTML por defecto escapar configuracin de la pgina actual. Establecer JavaScript para escapar de esta etiqueta, como valor booleano. El valor predeterminado es false.

G.4 El hasBindErrors etiqueta


Proporciona ejemplo errores en caso de errores de enlace. La bandera HTML escapar participa en una configuracin de la pgina o en toda la amplia aplicacin-(es decir, por HtmlEscapeTag o un "defaultHtmlEscape" context-param en web.xml). Tabla G.3. Atributos
Expresin tiempo de ejecucin?

Atributo Necesario?

Descripcin

htmlEscape

falso

verdadero

nombre

verdadero

verdadero

Establecer HTML escapar de esta etiqueta, como valor booleano. Reemplaza el HTML por defecto escapar configuracin de la pgina actual. El nombre del grano en la solicitud, que tiene que ser inspeccionado por errores. Si los errores estn disponibles para este grano, no se consideran obligados bajo llave los "errores".

G.5 El htmlEscape etiqueta


Establece el valor por defecto de escape HTML de la pgina actual. Anula una "defaultHtmlEscape" context-param en web.xml, si los hubiere.

Tabla G.4. Atributos


Expresin tiempo de ejecucin?

Atributo

Necesario?

Descripcin

defaultHtmlEscape verdadero

verdadero

Establecer el valor predeterminado para escapar, para ser puesto en el PageContext actual HTML.

G.6 El message etiqueta


Recupera el mensaje con el cdigo dado, o si el cdigo de texto no se puede resolver. La bandera HTML escapar participa en una configuracin de la pgina o en toda la amplia aplicacin-(es decir, por HtmlEscapeTag o un "defaultHtmlEscape" context-param en web.xml). Cuadro G.5. Atributos
Expresin Necesario? tiempo de Descripcin ejecucin?

Atributo

argumentos

falso

verdadero

argumentSeparator

falso

verdadero

cdigo

falso

verdadero

htmlEscape

falso

verdadero

javaScriptEscape

falso

verdadero

mensaje

falso

verdadero

Establecer argumentos opcionales de mensajes para este tag, como un (comas) String delimitada (cada argumento String puede contener JSP EL), un conjunto de objetos (utilizado como matriz de argumentos), o un objeto nico (utilizado como argumento nico). El carcter separador que se utiliza para dividir el valor de cadena de argumentos; por defecto es un 'coma' (','). El cdigo (tecla) para utilizar al buscar el mensaje. Si el cdigo no se proporciona, el atributo de texto se utilizar. Establecer HTML escapar de esta etiqueta, como valor booleano. Reemplaza el HTML por defecto escapar configuracin de la pgina actual. Establecer JavaScript para escapar de esta etiqueta, como valor booleano. El valor predeterminado es false. Un argumento MessageSourceResolvable (directa oa travs de JSP EL). Se adapta muy bien cuando se utiliza en conjuncin con los propios de Spring clases de error de

Atributo

Expresin Necesario? tiempo de Descripcin ejecucin?

alcance

falso

texto

falso

var

falso

validacin que todos implementan la interfaz MessageSourceResolvable. Por ejemplo, esto le permite iterar sobre todos los errores en un formulario, que pasa cada error (utilizando una expresin de tiempo de ejecucin) como el valor de este "mensaje" atributo, efectuando as la fcil visualizacin de los mensajes de error de este tipo. El mbito de aplicacin a usar al exportar el resultado a una variable. Este atributo slo se verdadero utiliza cuando var tambin se establece. Los valores posibles son la pgina, peticin, sesin y aplicacin. Texto predeterminado para la salida cuando hay un mensaje para el cdigo de cuenta no verdadero se pudo encontrar. Si tanto el texto como cdigo no se establecen, la etiqueta salida nula. La cadena a utilizar cuando se enlaza el resultado al mbito de la pgina, solicitud, verdadero sesin o aplicacin. Si no se especifica, el resultado se da salida al escritor (es decir, por lo general directamente a la JSP).

G.7 El nestedPath etiqueta


Establece una ruta anidada para ser utilizado por el camino de la etiqueta de BIND. Cuadro G.6. Atributos
Expresin tiempo de ejecucin?

Atributo Necesario?

Descripcin

camino verdadero

Establecer la ruta que esta etiqueta debe aplicarse. Por ejemplo, "cliente" para permitir que los caminos verdadero se unen como "address.street 'en lugar de' customer.address.street '.

G.8 El theme etiqueta

Recupera el mensaje con el cdigo de tema determinado, o el texto si el cdigo no se puede resolver. La bandera HTML escapar participa en una configuracin de la pgina o en toda la amplia aplicacin-(es decir, por HtmlEscapeTag o un "defaultHtmlEscape" context-param en web.xml). Cuadro G.7. Atributos
Expresin Necesario? tiempo de Descripcin ejecucin?

Atributo

argumentos

falso

verdadero

argumentSeparator

falso

verdadero

cdigo

falso

verdadero

htmlEscape

falso

verdadero

javaScriptEscape mensaje

falso falso

verdadero verdadero

alcance

falso

verdadero

texto

falso

verdadero

var

falso

verdadero

Establecer argumentos opcionales de mensajes para este tag, como un (comas) String delimitada (cada argumento String puede contener JSP EL), un conjunto de objetos (utilizado como matriz de argumentos), o un objeto nico (utilizado como argumento nico). El carcter separador que se utiliza para dividir el valor de cadena de argumentos; por defecto es un 'coma' (','). El cdigo (tecla) para utilizar al buscar el mensaje. Si el cdigo no se proporciona, el atributo de texto se utilizar. Establecer HTML escapar de esta etiqueta, como valor booleano. Reemplaza el HTML por defecto escapar configuracin de la pgina actual. Establecer JavaScript para escapar de esta etiqueta, como valor booleano. El valor predeterminado es false. Un argumento MessageSourceResolvable (directa oa travs de JSP EL). El mbito de aplicacin a usar al exportar el resultado a una variable. Este atributo slo se utiliza cuando var tambin se establece. Los valores posibles son la pgina, peticin, sesin y aplicacin. Texto predeterminado para la salida cuando hay un mensaje para el cdigo de cuenta no se pudo encontrar. Si tanto el texto como cdigo no se establecen, la etiqueta salida nula. La cadena a utilizar cuando se enlaza el resultado al mbito de la pgina, solicitud, sesin o aplicacin. Si no se especifica, el resultado se da salida al escritor (es decir, por lo general directamente a la JSP).

G.9 La transform etiqueta


Proporciona transformacin de variables a las cadenas mediante un adecuado PropertyEditor costumbre de BindTag (slo se puede utilizar dentro BindTag). La bandera HTML escapar participa en una configuracin de la pgina o en toda la amplia aplicacin-(es decir, por HtmlEscapeTag o un "defaultHtmlEscape 'context-param en web.xml). Tabla G.8. Atributos
Expresin Atributo Necesario? tiempo de Descripcin ejecucin?

htmlEscape

falso

verdadero

alcance

falso

verdadero

valor

verdadero

verdadero

var

falso

verdadero

Establecer HTML escapar de esta etiqueta, como valor booleano. Reemplaza el HTML por defecto escapar configuracin de la pgina actual. El margen para utilizar cuando se exporta el resultado a una variable. Este atributo slo se utiliza cuando var tambin se establece. Los valores posibles son la pgina, peticin, sesin y aplicacin. El valor de transformar. Este es el objeto real que se desea haber transformado (por ejemplo una fecha). Usando el PropertyEditor que est actualmente en uso por la 'primavera: bind' tag. La cadena a utilizar cuando se enlaza el resultado al mbito de la pgina, solicitud, sesin o aplicacin. Si no se especifica, el resultado se da salida al escritor (es decir, por lo general directamente a la JSP).

G.10 La url etiqueta


Crea URLs con soporte para variables de plantilla URI, HTML / XML escapar, y escapar Javascript. Siguiendo el modelo de la JSTL c: tag url de compatibilidad con versiones anteriores en mente. Tabla G.9. Atributos
Expresin Necesario? tiempo de Descripcin ejecucin?

Atributo

url

La direccin URL de construir. Este valor verdadero verdadero puede incluir marcadores de posicin de la plantilla {} que se reemplazan con el valor de

Atributo

Expresin Necesario? tiempo de Descripcin ejecucin?

contexto

falso

verdadero

var

falso

verdadero

alcance

falso

verdadero

htmlEscape

falso

verdadero

javaScriptEscape

falso

verdadero

URL codificada del parmetro con nombre. Los parmetros deben ser definidos usando la etiqueta param dentro del cuerpo de esta etiqueta. Especifica una ruta de contexto de aplicacin remota. El valor predeterminado es la ruta de la aplicacin actual contexto. El nombre de la variable a exportar el valor URL a. Si no se especifica el URL se escribe como salida. El alcance de la var. 'Aplicacin', 'sesin', 'peticin' y 'page' alcances son compatibles. El valor predeterminado mbito de la pgina. Este atributo no tiene ningn efecto a menos que el atributo var tambin se define. Establecer HTML escapar de esta etiqueta, como un valor booleano. Reemplaza el HTML por defecto escapar configuracin de la pgina actual. Establecer JavaScript para escapar de esta etiqueta, como un valor booleano. El valor predeterminado es false.

G.11 El eval etiqueta


Evala una expresin Spring (SPEL) y, o bien imprime el resultado o la asigna a una variable. Tabla G.10. Atributos
Expresin Necesario? tiempo de Descripcin ejecucin?

Atributo

expresin

verdadero

var

falso

alcance

falso

verdadero La expresin a evaluar. El nombre de la variable para exportar el resultado de la evaluacin a. Si no se verdadero especifica el resultado de la evaluacin se convierte en una cadena y escrita como salida. El alcance de la var. 'Aplicacin', 'sesin', verdadero 'peticin' y 'page' alcances son compatibles. El valor predeterminado mbito de la pgina.

Atributo

Expresin Necesario? tiempo de Descripcin ejecucin?

htmlEscape

falso

javaScriptEscape

falso

Este atributo no tiene ningn efecto a menos que el atributo var tambin se define. Establecer HTML escapar de esta etiqueta, como un valor booleano. Reemplaza el verdadero HTML por defecto escapar configuracin de la pgina actual. Establecer JavaScript para escapar de esta verdadero etiqueta, como un valor booleano. El valor predeterminado es false.

Apndice H. primavera-form.tld H.1 Introduccin


Una de las tecnologas de vista que puede utilizar con Spring Framework es Java Server Pages (JSP). Para ayudarle a implementar puntos de vista utilizando Java Server Pages Spring Framework proporciona algunas etiquetas para la evaluacin de los errores, el establecimiento de temas y emitir mensajes internacionalizados. Por favor, tenga en cuenta que las distintas etiquetas que genera esta forma de biblioteca de etiquetas cumplen con la especificacin XHTML 1.0 estricto y asistente DTD . En este apndice se describe la spring-form.tld biblioteca de etiquetas.

Seccin A.2, "La checkbox tag " Seccin H.3, "las checkboxes tag " Seccin A.4, "The errors tag " Seccin A.5, "La form etiqueta " Seccin A.6, "The hidden tag " Seccin A.7, "La input etiqueta " Seccin A.8, "La label tag " Seccin A.9, "La option etiqueta " Seccin A.10, "The options etiqueta " Seccin A.11, "La password tag " Seccin A.12, "El radiobutton tag " Seccin A.13, "El radiobuttons tag " Seccin A.14, "La select etiqueta " Seccin A.15, "El textarea etiqueta "

H.2 La checkbox etiqueta


Representa el tag 'input' un HTML con 'checkbox' tipo. Tabla H.1. Atributos

Atributo

Necesario?

Expresin tiempo de ejecucin?

Descripcin

accesskey cssClass cssErrorClass cssStyle dir discapacitado htmlEscape identificacin etiqueta lang onblur onchange onclick ondblclick onfocus onkeydown onkeypress onkeyup onmousedown onmousemove onmouseout onmouseover onmouseup camino tabindex ttulo valor

falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso verdadero falso falso falso

verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero

HTML estndar Atributo Equivalente a la "clase" - Atributo opcional de HTML Equivalente a la "clase" - Atributo opcional de HTML. Se utiliza cuando el campo dependiente tiene errores. Equivalente al "estilo" - Atributo opcional HTML HTML estndar Atributo Atributo opcional de HTML. Establecer el valor de este atributo en 'true' (sin las comillas) se desactivar el elemento HTML. Activar / desactivar HTML escapar de los valores prestados. HTML estndar Atributo Valor que se visualiza como parte de la etiqueta HTML estndar Atributo HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento Ruta de acceso a la propiedad para el enlace de datos HTML estndar Atributo HTML estndar Atributo Atributo opcional de HTML

H.3 El checkboxes etiqueta


Renders tags 'de entrada' multiple HTML con 'checkbox' tipo.

Tabla H.2. Atributos


Expresin tiempo de ejecucin?

Atributo

Necesario?

Descripcin

accesskey cssClass cssErrorClass cssStyle delimitador dir discapacitado

falso falso falso falso falso falso falso

verdadero verdadero verdadero verdadero verdadero verdadero verdadero

elemento

falso

verdadero

htmlEscape identificacin itemLabel artculos

falso falso falso verdadero

verdadero verdadero verdadero verdadero

ItemValue lang onblur onchange onclick ondblclick onfocus onkeydown onkeypress onkeyup onmousedown onmousemove

falso falso falso falso falso falso falso falso falso falso falso falso

verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero

HTML estndar Atributo Equivalente a la "clase" - Atributo opcional de HTML Equivalente a la "clase" - Atributo opcional de HTML. Se utiliza cuando el campo dependiente tiene errores. Equivalente al "estilo" - Atributo opcional HTML Delimitador a utilizar entre cada "entrada" con etiqueta 'checkbox' tipo. No hay ningn delimitador por defecto. HTML estndar Atributo Atributo opcional de HTML. Establecer el valor de este atributo en 'true' (sin las comillas) se desactivar el elemento HTML. Especifica el elemento HTML que se utiliza para encerrar cada "entrada" con etiqueta 'checkbox' tipo. El valor predeterminado es 'span'. Activar / desactivar HTML escapar de los valores prestados. HTML estndar Atributo Valor que se visualiza como parte de los "insumos" etiquetas con 'checkbox' tipo La coleccin, mapa o matriz de objetos que se utilizan para generar las etiquetas de 'entrada' con 'checkbox' tipo Nombre de la propiedad asignada a "valor" atributo de las etiquetas de la 'entrada' con 'checkbox' tipo HTML estndar Atributo HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento

Atributo

Necesario?

Expresin tiempo de ejecucin?

Descripcin

onmouseout onmouseover onmouseup camino tabindex ttulo

falso falso falso verdadero falso falso

verdadero verdadero verdadero verdadero verdadero verdadero

HTML atributo de evento HTML atributo de evento HTML atributo de evento Ruta de acceso a la propiedad para el enlace de datos HTML estndar Atributo HTML estndar Atributo

H.4 Los errors etiqueta


Representa los errores de campo en etiqueta 'span' an HTML. Tabla H.3. Atributos
Atributo Necesario? Expresin tiempo Descripcin de ejecucin?

cssClass cssStyle delimitador dir elemento htmlEscape identificacin lang onclick ondblclick onkeydown onkeypress onkeyup onmousedown onmousemove onmouseout onmouseover onmouseup

falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso

verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero

Equivalente a la "clase" - Atributo opcional de HTML Equivalente al "estilo" - Atributo opcional HTML Delimitador para la visualizacin de varios mensajes de error. El valor predeterminado es la etiqueta br. HTML estndar Atributo Especifica el elemento HTML que se utiliza para representar los errores que encierran. Activar / desactivar HTML escapar de los valores prestados. HTML estndar Atributo HTML estndar Atributo HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento

Atributo

Necesario?

Expresin tiempo Descripcin de ejecucin?

camino tabindex ttulo

falso falso falso

verdadero verdadero verdadero

Ruta al objeto errores de enlace de datos HTML estndar Atributo HTML estndar Atributo

A.5 La form de etiquetas


Renders etiqueta 'form' un HTML y expone una ruta de enlace para las etiquetas internas para la unin. Tabla H.4. Atributos
Expresin Necesario? tiempo de Descripcin ejecucin?

Atributo

acceptCharset

falso

verdadero

accin commandName cssClass cssStyle dir enctype htmlEscape identificacin lang mtodo modelAttribute nombre

falso falso falso falso falso falso falso falso falso falso falso falso

verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero

Especifica la lista de codificaciones de caracteres para los datos de entrada que es aceptado por el servidor que procesa este formulario. El valor es una lista de espacio y / o delimitado por comas de los valores charset. El cliente debe interpretar esta lista como una lista exclusiva-o, es decir, el servidor es capaz de aceptar cualquier codificacin de caracteres individual por entidad recibi. Atributo HTML Requerido Nombre del atributo modelo bajo el cual est expuesto el objeto de formulario. El valor predeterminado es 'comando'. Equivalente a la "clase" - Atributo opcional de HTML Equivalente al "estilo" - Atributo opcional HTML HTML estndar Atributo Atributo opcional de HTML Activar / desactivar HTML escapar de los valores prestados. HTML estndar Atributo HTML estndar Atributo Atributo opcional de HTML Nombre del atributo modelo bajo el cual est expuesto el objeto de formulario. El valor predeterminado es 'comando'. HTML estndar Atributo - agregado para los

Atributo

Expresin Necesario? tiempo de Descripcin ejecucin?

onclick ondblclick onkeydown onkeypress onkeyup onmousedown onmousemove onmouseout onmouseover onmouseup onreset onSubmit objetivo ttulo

falso falso falso falso falso falso falso falso falso falso falso falso falso falso

verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero

casos de compatibilidad hacia atrs HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento Atributo opcional de HTML HTML estndar Atributo

A.6 El hidden etiqueta


Representa el tag 'input' un archivo HTML con el tipo de "oculto" utilizando el valor enlazado. Tabla A.5. Atributos
Atributo Necesario? Expresin tiempo de Descripcin ejecucin?

htmlEscape identificacin camino

falso falso verdadero

verdadero verdadero verdadero

Activar / desactivar HTML escapar de los valores prestados. HTML estndar Atributo Ruta de acceso a la propiedad para el enlace de datos

A.7 La input etiqueta


Representa el tag 'input' un archivo HTML con "texto" tipo utilizando el valor enlazado. Tabla A.6. Atributos

Atributo

Necesario?

Expresin tiempo de ejecucin?

Descripcin

accesskey alt autocomplete cssClass cssErrorClass cssStyle dir discapacitado htmlEscape identificacin lang maxlength onblur onchange onclick ondblclick onfocus onkeydown onkeypress onkeyup onmousedown onmousemove onmouseout onmouseover onmouseup onselect camino

falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso verdadero

verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero

slo lectura tamao tabindex ttulo

falso falso falso falso

verdadero verdadero verdadero verdadero

HTML estndar Atributo Atributo opcional de HTML Atributo opcional Comn Equivalente a la "clase" - Atributo opcional de HTML Equivalente a la "clase" - Atributo opcional de HTML. Se utiliza cuando el campo dependiente tiene errores. Equivalente al "estilo" - Atributo opcional HTML HTML estndar Atributo Atributo opcional de HTML. Establecer el valor de este atributo en 'true' (sin las comillas) se desactivar el elemento HTML. Activar / desactivar HTML escapar de los valores prestados. HTML estndar Atributo HTML estndar Atributo Atributo opcional de HTML HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento Ruta de acceso a la propiedad para el enlace de datos Atributo opcional de HTML. Establecer el valor de este atributo en 'true' (sin las comillas) har que el elemento HTML de solo lectura. Atributo opcional de HTML HTML estndar Atributo HTML estndar Atributo

A.8 La label etiqueta


Representa una etiqueta de campo de formulario en la etiqueta de 'label' an HTML. Tabla A.7. Atributos
Atributo Necesario? Expresin tiempo Descripcin de ejecucin?

cssClass cssErrorClass cssStyle dir para htmlEscape

falso falso falso falso falso falso

verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero

identificacin falso lang falso onclick falso ondblclick falso onkeydown falso onkeypress falso onkeyup falso onmousedown falso onmousemove falso onmouseout falso onmouseover falso onmouseup falso camino verdadero tabindex falso ttulo falso

Equivalente a la "clase" - Atributo opcional de HTML. Equivalente a la "clase" - Atributo opcional de HTML. Se usa slo cuando hay errores presentes. Equivalente al "estilo" - Atributo opcional HTML HTML estndar Atributo HTML estndar Atributo Activar / desactivar HTML escapar de los valores prestados. HTML estndar Atributo HTML estndar Atributo HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento Ruta al objeto errores de enlace de datos HTML estndar Atributo HTML estndar Atributo

A.9 La option etiqueta


Representa un solo HTML 'opcin'. Sets 'seleccionado', segn proceda en funcin del valor lmite. Tabla A.8. Atributos

Atributo

Necesario?

Expresin tiempo de ejecucin?

Descripcin

cssClass cssErrorClass cssStyle dir discapacitado htmlEscape

falso falso falso falso falso falso

verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero

identificacin falso etiqueta falso lang falso onclick falso ondblclick falso onkeydown falso onkeypress falso onkeyup falso onmousedown falso onmousemove falso onmouseout falso onmouseover falso onmouseup falso tabindex falso ttulo falso valor verdadero

Equivalente a la "clase" - Atributo opcional de HTML Equivalente a la "clase" - Atributo opcional de HTML. Se utiliza cuando el campo dependiente tiene errores. Equivalente al "estilo" - Atributo opcional HTML HTML estndar Atributo Atributo opcional de HTML. Establecer el valor de este atributo en 'true' (sin las comillas) se desactivar el elemento HTML. Activar / desactivar HTML escapar de los valores prestados. HTML estndar Atributo Atributo opcional de HTML HTML estndar Atributo HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML estndar Atributo HTML estndar Atributo Atributo opcional de HTML

La H.10 options etiqueta


Presenta una lista de etiquetas 'opcin' HTML. Sets 'seleccionado', segn proceda en funcin del valor lmite. Cuadro A.9. Atributos
Expresin tiempo de ejecucin?

Atributo

Necesario?

Descripcin

cssClass

falso

verdadero

Equivalente a la "clase" - Atributo opcional

Atributo

Necesario?

Expresin tiempo de ejecucin?

Descripcin

cssErrorClass cssStyle dir discapacitado htmlEscape identificacin itemLabel artculos ItemValue lang onclick ondblclick onkeydown onkeypress onkeyup onmousedown onmousemove onmouseout onmouseover onmouseup tabindex ttulo

falso falso falso falso falso falso falso verdadero falso falso falso falso falso falso falso falso falso falso falso falso falso falso

verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero

de HTML Equivalente a la "clase" - Atributo opcional de HTML. Se utiliza cuando el campo dependiente tiene errores. Equivalente al "estilo" - Atributo opcional HTML HTML estndar Atributo Atributo opcional de HTML. Establecer el valor de este atributo en 'true' (sin las comillas) se desactivar el elemento HTML. Activar / desactivar HTML escapar de los valores prestados. HTML estndar Atributo Nombre de la propiedad asignada al texto interno de la 'opcin' tag La coleccin, mapa o matriz de objetos utilizados para generar las etiquetas del interior 'opcin' Nombre de la propiedad asignada a "valor" atributo de la 'opcin' tag HTML estndar Atributo HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML estndar Atributo HTML estndar Atributo

A.11 La password etiqueta


Representa el tag 'input' un HTML con 'password' tipo utilizando el valor enlazado. Tabla A.10. Atributos

Atributo

Necesario?

Expresin tiempo de ejecucin?

Descripcin

accesskey alt autocomplete cssClass cssErrorClass cssStyle dir discapacitado htmlEscape identificacin lang maxlength onblur onchange onclick ondblclick onfocus onkeydown onkeypress onkeyup onmousedown onmousemove onmouseout onmouseover onmouseup onselect camino

falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso verdadero

verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero

slo lectura

falso

verdadero

showPassword tamao tabindex

falso falso falso

verdadero verdadero verdadero

HTML estndar Atributo Atributo opcional de HTML Atributo opcional Comn Equivalente a la "clase" - Atributo opcional de HTML Equivalente a la "clase" - Atributo opcional de HTML. Se utiliza cuando el campo dependiente tiene errores. Equivalente al "estilo" - Atributo opcional HTML HTML estndar Atributo Atributo opcional de HTML. Establecer el valor de este atributo en 'true' (sin las comillas) se desactivar el elemento HTML. Activar / desactivar HTML escapar de los valores prestados. HTML estndar Atributo HTML estndar Atributo Atributo opcional de HTML HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento Ruta de acceso a la propiedad para el enlace de datos Atributo opcional de HTML. Establecer el valor de este atributo en 'true' (sin las comillas) har que el elemento HTML de solo lectura. El valor de la contrasea que se muestra? El valor predeterminado es false. Atributo opcional de HTML HTML estndar Atributo

Atributo

Necesario?

Expresin tiempo de ejecucin?

Descripcin

ttulo

falso

verdadero

HTML estndar Atributo

A.12 El radiobutton etiqueta


Representa el tag 'input' un archivo HTML con el tipo "radio". Tabla A.11. Atributos
Expresin tiempo de ejecucin?

Atributo

Necesario?

Descripcin

accesskey cssClass cssErrorClass cssStyle dir discapacitado htmlEscape identificacin etiqueta lang onblur onchange onclick ondblclick onfocus onkeydown onkeypress onkeyup onmousedown onmousemove onmouseout onmouseover

falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso

verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero

HTML estndar Atributo Equivalente a la "clase" - Atributo opcional de HTML Equivalente a la "clase" - Atributo opcional de HTML. Se utiliza cuando el campo dependiente tiene errores. Equivalente al "estilo" - Atributo opcional HTML HTML estndar Atributo Atributo opcional de HTML. Establecer el valor de este atributo en 'true' (sin las comillas) se desactivar el elemento HTML. Activar / desactivar HTML escapar de los valores prestados. HTML estndar Atributo Valor que se visualiza como parte de la etiqueta HTML estndar Atributo HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento

Atributo

Necesario?

Expresin tiempo de ejecucin?

Descripcin

onmouseup camino tabindex ttulo valor

falso verdadero falso falso falso

verdadero verdadero verdadero verdadero verdadero

HTML atributo de evento Ruta de acceso a la propiedad para el enlace de datos HTML estndar Atributo HTML estndar Atributo Atributo opcional de HTML

A.13 El radiobuttons etiqueta


Renders tags 'de entrada' multiple HTML del tipo "radio". Tabla A.12. Atributos
Expresin tiempo de ejecucin?

Atributo

Necesario?

Descripcin

accesskey cssClass cssErrorClass cssStyle delimitador dir discapacitado

falso falso falso falso falso falso falso

verdadero verdadero verdadero verdadero verdadero verdadero verdadero

elemento

falso

verdadero

htmlEscape identificacin itemLabel artculos

falso falso falso verdadero

verdadero verdadero verdadero verdadero

HTML estndar Atributo Equivalente a la "clase" - Atributo opcional de HTML Equivalente a la "clase" - Atributo opcional de HTML. Se utiliza cuando el campo dependiente tiene errores. Equivalente al "estilo" - Atributo opcional HTML Delimitador a utilizar entre cada "entrada" etiqueta con el tipo "radio". No hay ningn delimitador por defecto. HTML estndar Atributo Atributo opcional de HTML. Establecer el valor de este atributo en 'true' (sin las comillas) se desactivar el elemento HTML. Especifica el elemento HTML que se utiliza para encerrar cada "entrada" etiqueta con el tipo "radio". El valor predeterminado es 'span'. Activar / desactivar HTML escapar de los valores prestados. HTML estndar Atributo Valor que se visualiza como parte de los "insumos" etiquetas con 'radio' tipo La coleccin, mapa o matriz de objetos que se

Atributo

Necesario?

Expresin tiempo de ejecucin?

Descripcin

ItemValue lang onblur onchange onclick ondblclick onfocus onkeydown onkeypress onkeyup onmousedown onmousemove onmouseout onmouseover onmouseup camino tabindex ttulo

falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso verdadero falso falso

verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero

utilizan para generar las etiquetas de 'entrada' con 'radio' tipo Nombre de la propiedad asignada a "valor" atributo de las etiquetas de la 'entrada' con 'radio' tipo HTML estndar Atributo HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento Ruta de acceso a la propiedad para el enlace de datos HTML estndar Atributo HTML estndar Atributo

A.14 La select etiqueta


Representa un archivo HTML 'select' elemento. Soporta el enlace de datos para la opcin seleccionada. Tabla A.13. Atributos
Expresin tiempo de ejecucin?

Atributo

Necesario?

Descripcin

accesskey cssClass cssErrorClass cssStyle

falso falso falso falso

verdadero verdadero verdadero verdadero

HTML estndar Atributo Equivalente a la "clase" - Atributo opcional de HTML Equivalente a la "clase" - Atributo opcional de HTML. Se utiliza cuando el campo dependiente tiene errores. Equivalente al "estilo" - Atributo opcional

Atributo

Necesario?

Expresin tiempo de ejecucin?

Descripcin

dir discapacitado htmlEscape identificacin itemLabel artculos ItemValue lang mltiple onblur onchange onclick ondblclick onfocus onkeydown onkeypress onkeyup onmousedown onmousemove onmouseout onmouseover onmouseup camino tamao tabindex ttulo

falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso verdadero falso falso falso

verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero

HTML HTML estndar Atributo Atributo opcional de HTML. Establecer el valor de este atributo en 'true' (sin las comillas) se desactivar el elemento HTML. Activar / desactivar HTML escapar de los valores prestados. HTML estndar Atributo Nombre de la propiedad asignada al texto interno de la 'opcin' tag La coleccin, mapa o matriz de objetos utilizados para generar las etiquetas del interior 'opcin' Nombre de la propiedad asignada a "valor" atributo de la 'opcin' tag HTML estndar Atributo Atributo opcional de HTML HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento Ruta de acceso a la propiedad para el enlace de datos Atributo opcional de HTML HTML estndar Atributo HTML estndar Atributo

H.15 La textarea etiqueta


Representa un HTML 'textarea'. Tabla A.14. Atributos

Atributo

Necesario?

Expresin tiempo de ejecucin?

Descripcin

accesskey cols cssClass cssErrorClass cssStyle dir discapacitado htmlEscape identificacin lang onblur onchange onclick ondblclick onfocus onkeydown onkeypress onkeyup onmousedown onmousemove onmouseout onmouseover onmouseup onselect camino

falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso falso verdadero

verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero verdadero

slo lectura filas tabindex ttulo

falso falso falso falso

verdadero verdadero verdadero verdadero

HTML estndar Atributo Atributo HTML Requerido Equivalente a la "clase" - Atributo opcional de HTML Equivalente a la "clase" - Atributo opcional de HTML. Se utiliza cuando el campo dependiente tiene errores. Equivalente al "estilo" - Atributo opcional HTML HTML estndar Atributo Atributo opcional de HTML. Establecer el valor de este atributo en 'true' (sin las comillas) se desactivar el elemento HTML. Activar / desactivar HTML escapar de los valores prestados. HTML estndar Atributo HTML estndar Atributo HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento HTML atributo de evento Ruta de acceso a la propiedad para el enlace de datos Atributo opcional de HTML. Establecer el valor de este atributo en 'true' (sin las comillas) har que el elemento HTML de solo lectura. Atributo HTML Requerido HTML estndar Atributo HTML estndar Atributo

Potrebbero piacerti anche