В дополнение к аспекту, аннотированного @Configurable, spring-aspects.jar содержит аспект AspectJ, который можно использовать для управления транзакциями Spring для типов и методов, аннотированных аннотацией @Transactional. Он в первую очередь предназначен для пользователей, которые хотят использовать поддержку транзакций Spring Framework вне контейнера Spring.

Аспект, который интерпретирует аннотации @Transactional, – это AnnotationTransactionAspect. При использовании данного аспекта вам необходимо аннотировать класс реализации (или методы внутри этого класса, или и то, и другое), а не интерфейс (если таковой имеется), который реализуется этим классом. AspectJ следует правилу Java касательно того, что аннотации для интерфейсов не наследуются.

Аннотация @Transactional для класса определяет семантику транзакций по умолчанию для выполнения любой публичной операции в классе.

Аннотация @Transactional для метода в классе переопределяет семантику транзакций по умолчанию, заданную аннотацией класса (если она присутствует). Методы любой видимости могут быть аннотированы, включая приватные методы. Аннотирование непубличных методов напрямую - единственный способ получить разграничение транзакций для выполнения таких методов.

Начиная со Spring Framework 4.2, spring-aspects предоставляет аналогичный аспект, который предлагает точно такие же возможности для стандартной аннотации javax.transaction.Transactional. Для получения дополнительной информации ознакомьтесь с JtaAnnotationTransactionAspect.

Для программистов на AspectJ, которые желают использовать поддержку конфигурации и управления транзакциями из Spring, но не хотят (или не могут) использовать аннотации, spring-aspects.jar также содержит abstract аспекты, которые можно расширить, чтобы указывать свои собственные определения среза. Более подробную информацию см. в источниках по аспектам AbstractBeanConfigurerAspect и AbstractTransactionAspect. Например, в следующем фрагменте показано, как можно написать аспект для конфигурирования всех экземпляров объектов, определенных в модели предметной области, используя определения бинов-прототипов, которые соответствуют полностью уточненным именам классов:

public aspect DomainObjectConfiguration extends AbstractBeanConfigurerAspect {
    public DomainObjectConfiguration() {
        setBeanWiringInfoResolver(new ClassNameBeanWiringInfoResolver());
    }
    // создание нового бина (любого объекта в модели предметной области)
    protected pointcut beanCreation(Object beanInstance) :
        initialization(new(..)) &&
        CommonPointcuts.inDomainModel() &&
        this(beanInstance);
}

Конфигурирование аспектов AspectJ с помощью IoC в SpringC

При использовании аспектов из AspectJ в приложениях Spring вполне естественно хотеть и ожидать получить возможности конфигурировать такие аспекты с помощью Spring. За создание аспектов отвечает сама среда выполнения AspectJ, а средства конфигурирования созданных на AspectJ аспектов через Spring зависят от модели создания экземпляров AspectJ (выражение per-xxx), используемой аспектом.

Большинство аспектов AspectJ – это одиночные аспекты. Конфигурировать эти аспекты крайне просто. Вы можете в обычном порядке создать определение бина, которое ссылается на тип аспекта, и включить в него атрибут бина factory-method="aspectOf". Это обеспечит, что Spring получит экземпляр аспекта, запросив его у AspectJ, а не попытается создать экземпляр самостоятельно. В следующем примере показано, как использовать атрибут factory-method="aspectOf":

<bean id="profiler" class="com.xyz.profiler.Profiler"
        factory-method="aspectOf"> 
    <property name="profilingStrategy" ref="jamonProfilingStrategy"/>
</bean>
  1. Обратите внимание на атрибут factory-method="aspectOf" attribute

Аспекты, не являющиеся одиночными, сложнее конфигурировать. Однако это можно сделать, создав определения бинов-прототипов и используя поддержку аннотации @Configurable из spring-aspects.jar для конфигурирования экземпляров аспекта после того, как они будут созданы средой выполнения AspectJ.

Если имеется некоторое количество аспектов @AspectJ, которые вам необходимо связать с помощью AspectJ (например, используя связывание во время загрузки для типов модели предметной области), и другие аспекты @AspectJ, которые вам необходимо использовать в Spring AOP, и все эти аспекты сконфигурированы при этом в Spring, то нужно указать средству поддержки автопроксирования @AspectJ из Spring AOP, какое именно подмножество аспектов @AspectJ, определенных в конфигурации, должно использоваться для автопроксирования Сделать это можно, используя один или несколько элементов <include/> внутри объявления <aop:aspectj-autoproxy/>. Каждый элемент <include/> определяет шаблон имени, и только те бины, имена которых совпадают хотя бы с одним из шаблонов, используются для конфигурирования авто-прокси в Spring AOP. В следующем примере показано, как использовать элементы <include/>:

<aop:aspectj-autoproxy>
    <aop:include name="thisBean"/>
    <aop:include name="thatBean"/>
</aop:aspectj-autoproxy>
Пусть вас не вводит в заблуждение название элемента <aop:aspectj-autoproxy/>. Его использование приводит к созданию прокси в Spring AOP. В данном случае используется стиль @AspectJ для объявления аспектов, но среда выполнения AspectJ не задействована.