На додаток до аспекту, анотованого @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 не задіяне.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ