我们目前正在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
。
应用以下排除规则后,无法在TransactionManagementConfigurationSelector
上配置 PROXY 咨询模式,但是我们不确定100%会在某些时候不会影响该应用程序。
@SpringBootApplication(exclude = TransactionAutoConfiguration.class)
鉴于我们在应用程序上仅配置了AspectJ,并且此配置还应用了Proxy,是否有一种方法可以验证在交易过程中使用哪种模式,以及是否有可能,哪些类正在使用Proxy,哪些正在使用AspectJ?