Posts Tagged ‘spring 2.5

30
Abr
08

Spring 2.5 y los filtros de contexto

El cambio a spring 2.5 conlleva una nueva forma de cargar tus clases como beans, lo que ellos llaman contexto. Este contexto es el responsable de añadir como beans las clases que tengas marcadas con las anotaciones que spring te da de serie(@Component, @Controller, @Service, @Repository). Si buceamos un poco en el código de spring podemos ver que la clase encargada de hacer esto es ClassPathBeanDefinitionScanner.java. Esta clase tiene implementada una pequeña jerarquía de filtros para añadir o quitar clases del contexto cuando arranca nuestra aplicación. Por defecto, añade todas las clases que estén marcadas con las anotaciones que hemos visto anteriormente:


  this.includeFilters.add(new AnnotationTypeFilter(Component.class));

Ahora vamos a ver las opciones que nos da el framework para añadir clases a ese contexto. En su documentación podemos ver un claro ejemplo de como añadir una nueva anotación:


  <context:component-scan>
    <context:include-filter type="annotation"
      expression="CustomAnnotation"/>
  </context:component-scan>

Lo que viene a decir el xml es que al contexto le vamos a añadir un filtro de tipo anotación y para todas las clases que estén marcadas con la anotación que va dentro del atributo expression.

Con lo que él internamente hará algo tal que así:


  this.includeFilters.add(new AnnotationTypeFilter(CustomAnnotation.class));

Lo que no se explica en la documentación es que por defecto, la clase que se encarga de parsear el contexto, ComponentScanBeanDefinitionParser.java, también soporta otros tipos de filtros además del de anotaciones.

El más sencillo sería el filtro de asignación, que simplemente añadiría una clase o un grupo de clases que extiendan o implementen algo común:


  <context:component-scan>
    <context:include-filter type="assignable"
      expression="org.myapp.IService"/>
  </context:component-scan>

Con este código se añadirían todas las clases que extendieran de la interfaz org.myapp.IService.

Otro de los filtros que soporta es por expresiones regulares, con este filtro spring cargará en el contexto las clases que coincidan con una expresión regular determinada:


  <context:component-scan>
    <context:include-filter type="regex"
      expression="(Service|Controller)\w+"/>
  </context:component-scan>

Con este código se cargarán todas clases que empiecen por Service o Coltroller.

Por último, tenemos un filtro un poco más complejo que se encarga de evaluar expresiones propias de Aspect Oriented Programming(AOP):


  <context:component-scan>
    <context:include-filter type="aspectj"
      expression="Service || Controller"/>
  </context:component-scan>

Con lo que cargaremos todas las clases que extiendan o implementen la clase Service o Controller.

La verdad es que con el grupo de anotaciones que spring trae de serie es más que suficiente para resolver la mayoría de los problemas pero nos podemos encontrar en escenarios donde no queremos tener como dependencia spring en una clase que puede ser utilizada tanto por spring como por otra aplicación o módulo que no use spring, con lo que acceder a los filtros del contexto nos vendrá muy bien.

Anuncios