Понимание ткачества во время загрузки с AspectJ в Spring Framework для приложения, развернутого на Tomcat

Я использую ткачество во время загрузки на сервере 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?


person Pawan Patil    schedule 13.09.2019    source источник
comment
У вас есть аннотации @Transcational в вашем сервисе, поэтому он знает, как это сделать.   -  person Krzysztof Cichocki    schedule 13.09.2019
comment
Ооо - комбинация Gradle, Spring XML config и даже JavaEE XML config. Это очень богемное сочетание очень-очень старого (нет, устаревшего) и довольно нового. Очаровательный   -  person Boris the Spider    schedule 13.09.2019
comment
@KrzysztofCichocki, что тогда за использование aop.xml? из aop.xml spring узнал, в каких классах следует вплетать AnnotationTransactionAspect.   -  person Pawan Patil    schedule 13.09.2019
comment
Вы найдете дополнительную информацию о @Transactional здесь. В данном случае аспект исходит от spring-aspects.   -  person kriegaex    schedule 19.09.2019


Ответы (1)


Spring имеет встроенную поддержку аннотации @Transactional, для получения дополнительной информации вы можете изучить исходный код:

https://github.com/spring-projects/spring-framework/blob/master/spring-tx/src/main/java/org/springframework/transaction/annotation/Transactional.java

и документация:

https://github.com/spring-projects/spring-framework/blob/master/spring-tx/src/main/java/org/springframework/transaction/annotation/Transactional.java

person Krzysztof Cichocki    schedule 13.09.2019
comment
Мой вопрос в том, как Spring угадывает расположение (имя пакета) методов класса, который содержит аннотацию Transactinal? Это из-за aop.xml? - person Pawan Patil; 13.09.2019
comment
Я не уверен, если он загружает его из aop.xml в вашем случае, у меня нет опыта в этом. Попробуйте переименовать этот файл или закомментировать его, затем проверьте, будет ли он решен или нет, это должно ответить на ваш вопрос. - person Krzysztof Cichocki; 13.09.2019
comment
@PawanPatil, в твоем вопросе нет смысла. Вы можете настроить загрузку времени плетения - тут нет никаких догадок. Когда загрузчик классов загружает класс, он проверяется и, если необходимо, возится с ним. - person Boris the Spider; 14.09.2019
comment
Вы сказали, что когда загрузчик классов загружает класс, он проверяется, значит ли это, что каждый класс проверяется на доступность в пути к классам? - person Pawan Patil; 14.09.2019
comment
@PawanPatil да. Каждый класс. Вот почему полезно настроить фильтры в aop.xml - решение может быть принято быстрее. Хотя вся эта обработка XML тоже не бесплатна ... - person Boris the Spider; 14.09.2019
comment
У вас есть ссылка на справочную документацию по этому поводу? Аннотации @Transactional проверяются на плетение при загрузке каждого отдельного класса? - person Pawan Patil; 14.09.2019
comment
Да, в документации по AspectJ это подробно описано. - person Boris the Spider; 14.09.2019
comment
Исправление, @KrzysztofCichocki: AspectJ никогда не основан на прокси, Spring AOP всегда. Вы не должны путать или смешивать эти два понятия, чтобы не путать OP. - person kriegaex; 19.09.2019