На додаток до аспекту, анотованого @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 не задіяне.