Buenas prácticas en la construcción de la capa de negocio asociadas a Spring

LIBP-0039 (Libro de pautas)

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ítuloCarácter
Modularizar los aspectos o serviciosRecomendada
Inyección de dependencias basada en “setters”Recomendada
Declaración de beansRecomendada
Declarar el ámbito de cada beanRecomendada
Tratamiento de ExcepcionesRecomendada
Crear servicios que hereden de una clase comúnRecomendada
No introducir lógica de negocio en los aspectosRecomendada

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

Se recomienda declarar al menos:

  • 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"/>
MADEJA recomienda seguir la jerarquía de excepciones de Spring para su tratamiento en la capa de negocio

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.