Buenas prácticas en la construcción de la capa de negocio asociadas a Spring
- Área: Capa de Negocio de Aplicaciones Java
- Tipo de pauta: Directriz
- Carácter de la pauta: Obligatoria
Se deben tener en cuenta las siguientes pautas de construcción sobre los aspectos mas relevantes de la capa de negocio.
Estas recomendaciones son particulares a la tecnología de Spring.
Pautas
Título | Carácter |
---|---|
Modularizar los aspectos o servicios | Recomendada |
Inyección de dependencias basada en “setters” | Recomendada |
Declaración de beans | Recomendada |
Declarar el ámbito de cada bean | Recomendada |
Tratamiento de Excepciones | Recomendada |
Crear servicios que hereden de una clase común | Recomendada |
No introducir lógica de negocio en los aspectos | Recomendada |
Modularizar los aspectos o servicios
Algunos servicios son utilizados repetidas veces en diferentes componentes de un sistema cuya responsabilidad principal es otra. Un framework de AOP hace posible modularizar estos aspectos o servicios y aplicarlos declarativamente a los componentes que los precisen:
- Cada aspecto se implementa en un único punto.
- Declarativamente se especifican los métodos que el framework tiene que interceptar para aplicarles el o los aspectos que el desarrollador desea.
- Cada componente debe preocuparse únicamente de su funcionalidad principal sin preocuparse de los servicios del sistema que precise.
Para construirlo correctamente
- Definir un interfaz con los métodos a interceptar.
- Implementar la interfaz.
- Implementar un Consejo, que es una clase que interceptará la ejecución de los métodos. Hay tres formas de realizarla dependiendo de las necesidades:
- Se implementa MethodInterceptor para realizar la operación antes y después de la invocación al método.
- Se implementa MethodBeforeAdvice para realizar operaciones antes de la ejecución del método.
- Se implementa AfterReturningAdvice para realizar operaciones después de la ejecución del método.
- Configurar el archivo spring-config.xml correctamente
- Implementaciones de la interfaz.
- Implementación de la interceptación de método.
- Definición del Point Cut.
<bean id="nombre" class="org.springframework.aop.support.RegexpMethodPointCutAdvisor">
<!- Patron que utilizará para aplicar el consejo>
<property name="pattern">
<value>*.*</value>
</property>
<!- Referencia a un Bean que implementa un advice>
<property name="advice">
<ref bean="metobbdd"/>
</property>
</bean>
Inyección de dependencias basada en “setters”
Para crear inyecciones de dependencias se recomienda hacerlas mediante Setters.
Para ello se debe atender a las siguientes recomendaciones. Es posible especificarlas:
- A través de un elemento anidado property, que acepta los siguientes atributos
- name: Nombre de la propiedad donde se desea inyectar el valor.
- value: Para inyectar un valor constante.
- ref: Para inyectar otro bean a partir de su nombre.
- Con sintaxis abreviada (utilizando el espacio de nombres p) a través de los atributos
- p:nombrePropiedad: Para inyectar un valor constante en la propiedad indicada.
- p:nombrePropiedad-ref: Para inyectar otro bean a partir de su nombre en la propiedad indicada.
- El bean se crea a partir de su constructor vacío y a continuación se invocan los métodos set con los valores adecuados.
Declaración de beans
- Un bean para cada DAO.
- Un bean para la implementación de la fachada.
- Un bean para la SesionFactory(que usan los DAOs).
Declarar el ámbito de cada bean
El ámbito de un bean se especifica a través del atributo scope de la etiqueta bean. Los posibles valores son:
- singleton: El contenedor usa siempre la misma instancia (ya sea cuando se le pide a través de la API o cuando necesita inyectarlo).
- prototype: Indica que el contenedor debe crear una nueva instancia del bean cada vez que se precise una.
- request: Indica al contenedor que debe crear una instancia por cada petición http.
- session: Indica al contenedor que debe de crear una instancia asociada a la sesión http.
- Global session: Indica al contenedor que debe de crear una instancia asociada a la sesión global http.
Tratamiento de Excepciones
Spring proporciona una jerarquía de excepciones de acceso a datos (heredan de DataAccessException) que se caracteriza por:
- Cada excepción representa un error concreto.
- No son específicas del marco de persistencia de datos utilizado, por tanto se oculta a las capas superiores.
- Son excepciones unchecked.
Para que Spring realice la conversión entre las excepciones nativas y la jerarquía propia es necesario declarar el siguiente bean:
<bean class=
"org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
Crear servicios que hereden de una clase común
Se recomienda que todos los servicios hereden de una clase común, para así poder aplicar comportamientos genéricos sin impacto.
No introducir lógica de negocio en los aspectos
Se recomienda altamente no incluir negocio en los aspectos. AOP es una herramienta para Arquitectos, no para desarrolladores finales.