Además del aspecto anotado con @Configurable, spring-aspects.jar contiene un aspecto AspectJ que se puede utilizar para administrar transacciones Spring para tipos y métodos anotados con la @Transactional anotación. Está destinado principalmente a usuarios que desean utilizar el soporte de transacciones de Spring Framework fuera del contenedor Spring.

El Aspecto que interpreta las anotaciones @Transactional es el AnnotationTransactionAspect. Al utilizar este aspecto, es necesario anotar la clase de implementación (o los métodos dentro de esa clase, o ambos), no la interfaz (si la hay) que implementa la clase. AspectJ sigue la regla de Java de que las anotaciones de la interfaz no se heredan.

La anotación @Transactional para una clase define la semántica de transacción predeterminada para realizar cualquier operación pública en la clase.

La anotación @Transactional en un método de una clase anula la semántica de transacción predeterminada especificada por la anotación de clase (si está presente). Se pueden anotar métodos de cualquier visibilidad, incluidos los métodos privados. Anotar métodos no públicos directamente es la única forma de obtener la delimitación de transacciones para la ejecución de dichos métodos.

A partir de Spring Framework 4.2, spring-aspects proporciona un aspecto similar que ofrece exactamente las mismas capacidades que la anotación estándar javax.transaction.Transactional. Para obtener más información, consulte JtaAnnotationTransactionAspect.

Para los programadores de AspectJ que desean utilizar el soporte de configuración y gestión de transacciones de Spring pero no quieren (o no pueden) usar anotaciones, spring-aspects.jar también contiene abstract aspectos que se pueden ampliar para especificar sus propias definiciones de sectores. Para obtener más información, consulte las fuentes AbstractBeanConfigurerAspect y AbstractTransactionAspect. Por ejemplo, el siguiente fragmento muestra cómo se puede escribir un aspecto para configurar todas las instancias de objetos definidos en un modelo de dominio utilizando definiciones de beans prototipo que corresponden a nombres de clase completos:

public aspect DomainObjectConfiguration extends AbstractBeanConfigurerAspect {
    public DomainObjectConfiguration() {
        setBeanWiringInfoResolver(new ClassNameBeanWiringInfoResolver());
    }
    // creating a new bean (any object in the domain model)
    protected pointcut beanCreation(Object beanInstance) :
        initialization(new(..)) &&
        CommonPointcuts.inDomainModel() &&
        this(beanInstance);
}

Configuración de aspectos de AspectJ usando IoC en SpringC

Cuando se utilizan aspectos de AspectJ en aplicaciones Spring, es natural querer y esperar poder configurar dichos aspectos utilizando Spring. El tiempo de ejecución de AspectJ en sí es responsable de crear aspectos, y los medios para configurar los aspectos creados en AspectJ a través de Spring dependen del modelo de creación de instancias de AspectJ (expresión per-xxx) utilizado por el aspecto.

La mayoría de los aspectos de AspectJ son aspectos únicos. Configurar estos aspectos es sumamente sencillo. Normalmente puede crear una definición de bean que haga referencia a un tipo de aspecto e incluir el atributo de bean factory-method="aspectOf" en ella. Esto garantizará que Spring obtenga la instancia del aspecto solicitándola a AspectJ en lugar de intentar crear la instancia misma. El siguiente ejemplo muestra cómo utilizar el factory-method="aspectOf" atributo:

<bean id="profiler" class="com.xyz.profiler.Profiler"
        factory-method="aspectOf"> 
    <property name="profilingStrategy" ref="jamonProfilingStrategy"/>
</bean>
  1. Preste atención al atributo factory-method="aspectOf"

Los aspectos que no son únicos son más difíciles de configurar. Sin embargo, esto se puede hacer creando definiciones de beans prototipo y utilizando el soporte de anotación @Configurable de spring-aspects.jar para configurar instancias de aspectos después de que sean creadas por el tiempo de ejecución de AspectJ. .

Si hay varios aspectos de @AspectJ que necesita vincular usando AspectJ (por ejemplo, usando el enlace de tiempo de carga para tipos de modelo de dominio), y otros aspectos de @AspectJ que necesita usar en Spring AOP, y todo de estos aspectos están configurados en Spring, debe indicarle al soporte de autoproxy @AspectJ de Spring AOP qué subconjunto de los aspectos @AspectJ definidos en la configuración deben usarse para el autoproxy. Esto se puede hacer usando uno o más <include/> elementos dentro de la declaración <aop:aspectj-autoproxy/>. Cada elemento <include/> define un patrón de nombre, y solo aquellos beans cuyos nombres coinciden con al menos uno de los patrones se utilizan para configurar el proxy automático en Spring AOP. El siguiente ejemplo muestra cómo utilizar los elementos <include/>:

<aop:aspectj-autoproxy>
    <aop:include name="thisBean"/>
    <aop:include name="thatBean"/>
</aop:aspectj-autoproxy>>
No se deje engañar por el nombre del elemento <aop:aspectj-autoproxy/>. Su uso hace que se cree un proxy en Spring AOP. En este caso, se utiliza el estilo @AspectJ para declarar aspectos, pero no se utiliza el tiempo de ejecución de AspectJ.