Как проверить, какой режим транзакции используется (AspectJ / Proxy) - PullRequest
0 голосов
/ 11 июля 2019

В настоящее время мы создаем модуль в Spring Boot, который использует конфигурации из устаревшего, построенный поверх Spring MVC и имеет много конфигураций (XML и классы).

Через несколько недель мы смогли совместить Spring Boot с унаследованными конфигами, но мы не смогли проверить, действительно ли AspectJ работает должным образом.

И почему я так говорю?

Мы заметили, что во время конфигурации, внутри TransactionManagementConfigurationSelector (в приведенном ниже коде), мы получаем режимы PROXY и ASPECTJ:

/**
 * Returns {@link ProxyTransactionManagementConfiguration} or
 * {@code AspectJ(Jta)TransactionManagementConfiguration} for {@code PROXY}
 * and {@code ASPECTJ} values of {@link EnableTransactionManagement#mode()},
 * respectively.
 */
@Override
protected String[] selectImports(AdviceMode adviceMode) {
    switch (adviceMode) {
        case PROXY:
            return new String[] {AutoProxyRegistrar.class.getName(),
                    ProxyTransactionManagementConfiguration.class.getName()};
        case ASPECTJ:
            return new String[] {determineTransactionAspectClass()};
        default:
            return null;
    }
}

Этот случай, в частности, еще более любопытен, так как во время отладки мы получаем два раза ASPECTJ и один раз PROXY в конце конфигурации. Кажется, что наши конфигурации AspectJ из прежних версий применяются, но кое-что настраивает и совет Прокси.

После дальнейшего исследования мы обнаружили отправителя режима подсказок прокси, который является TransactionAutoConfiguration, точнее TransactionAutoConfiguration.EnableTransactionManagementConfiguration.CglibAutoProxyConfiguration.class.

Применение следующего исключения не позволило настроить режим подсказки PROXY на TransactionManagementConfigurationSelector, но мы не уверены на 100%, что это повлияет на приложение в какой-то момент:

@SpringBootApplication(exclude = TransactionAutoConfiguration.class)

Учитывая тот факт, что у нас в нашем приложении настроен только AspectJ, и эта конфигурация также использует Proxy, есть ли способ проверить, какой режим используется во время транзакции , и, если это возможно, какие классы используют Proxy, а какие используют AspectJ?

...