В дополнение к аспекту, аннотированного @Configurable
, spring-aspects.jar
содержит аспект AspectJ, который можно использовать для управления транзакциями Spring для типов и методов, аннотированных аннотацией @Transactional
. Он в первую очередь предназначен для пользователей, которые хотят использовать поддержку транзакций Spring Framework вне контейнера Spring.
Аспект, который интерпретирует аннотации @Transactional
, – это AnnotationTransactionAspect
. При использовании данного аспекта вам необходимо аннотировать класс реализации (или методы внутри этого класса, или и то, и другое), а не интерфейс (если таковой имеется), который реализуется этим классом. AspectJ следует правилу Java касательно того, что аннотации для интерфейсов не наследуются.
Аннотация @Transactional
для класса определяет семантику транзакций по умолчанию для выполнения любой публичной операции в классе.
Аннотация @Transactional
для метода в классе переопределяет семантику транзакций по умолчанию, заданную аннотацией класса (если она присутствует). Методы любой видимости могут быть аннотированы, включая приватные методы. Аннотирование непубличных методов напрямую - единственный способ получить разграничение транзакций для выполнения таких методов.
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>
- Обратите внимание на атрибут
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 не задействована.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ