Я использую ткачество во время загрузки на сервере Tomcat для управления транзакциями весной в режиме aspcetj, и мне трудно понять это концептуально.
Конфигурация моего менеджера транзакций выглядит следующим образом
<bean id="transactionManagerRW" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactoryReadWrite" />
</bean>
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManagerRW"/>
Чтобы время загрузки работало, я добавил в свой код следующие зависимости
compile (
'org.aspectj:aspectjrt:1.8.4',
'org.aspectj:aspectjweaver:1.8.4',
'org.springframework:spring-aspects:5.0.0.RELEASE',
)
Мой класс обслуживания следующий
package com.temp.request.service
class ServiceImpl {
@Transactional
public CreateRequest CreateRequest (){
// some business logic here
}
@Transactional
public void deleteRequests(){
// some business logic here
}
}
context.xml выглядит следующим образом
<Context path="/">
<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
</Context>
и aop.xml выглядит следующим образом
<aspectj>
<weaver options="-verbose -showWeaveInfo">
<include within="com.temp.request.service..*"/>
</weaver>
</aspectj>
Согласно документации Spring, AnnotationTransactionAspect создается и вплетается в целевой объект во время ткачества во время загрузки (в данном случае объект класса ServiceImpl), но как, хотя я не указал имя аспекта (AnnotationTransactionAspect в этом случае) в aop.xml, весна узнала что во время AnnotationTransactionAspect нужно вплетать мой класс ServiceImpl?
В весеннем туториале они указали ProfilingAspect в aop.xml по этой ссылке https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch08s08.html следующим образом
<aspectj>
<weaver>
<!-- only weave classes in our application-specific packages -->
<include within="foo.*"/>
</weaver>
<aspects>
<!-- weave in just this aspect -->
<aspect name="foo.ProfilingAspect"/>
</aspects>
</aspectj>
В документации Spring это указано как: (https://docs.spring.io/spring/docs/3.0.0.M4/spring-framework-reference/html/ch10s05.html)
Аннотируйте свои классы (и, возможно, методы ваших классов) с помощью аннотации @Transactional, а затем вы связываете (переплетаете) свое приложение с org.springframework.transaction.aspectj.AnnotationTransactionAspect, определенным в файле spring-sizes.jar. Аспект также должен быть настроен с помощью диспетчера транзакций. Конечно, вы можете использовать контейнер IoC Spring Framework, чтобы позаботиться о внедрении зависимостей в аспект. Самый простой способ настроить аспект управления транзакциями - использовать элемент и указать атрибут режима для asepctj
Здесь строка, выделенная жирным шрифтом, говорит о том, что вы связываете (переплетаете) свое приложение с org.springframework.transaction.aspectj.AnnotationTransactionAspect Edit: во время развертывания приложения я вижу следующую строку на консоли
weaveinfo Точка соединения 'метод-выполнение (com.temp.request.service.CreateRequest com.temp.request.service.ServiceImpl ()' в Типе 'com.temp.request.service.ServiceImpl' (ServiceImpl.java:5) рекомендовано по совету от 'org.springframework.transaction.aspectj.AnnotationTransactionAspect'
Итак, эта строка доказывает, что AnnotationTransactionAspect успешно вплетен в класс ServiceImpl.
Мои основные вопросы:
Как связать (сплести) мое приложение с AnnotationTransactionAspect Spring?
Как Spring узнал, что нужно вплести AnnotationTransactionAspect в класс ServiceImpl?
Нужен ли aop.xml для успешного плетения времени загрузки AnnotationTransactionAspect?
@Transactional
здесь. В данном случае аспект исходит отspring-aspects
. - person kriegaex   schedule 19.09.2019