我有这个配置的 Spring 季启动应用程序:

@SpringBootApplication
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
@EnableLoadTimeWeaving
@EnableScheduling
@EnableConfigurationProperties({TelegramBotProperties.class, FreekassaProperties.class})
@EnableJpaRepositories(basePackages = {"com.birthright.telegrambot.repositories.postgres"}, enableDefaultTransactions = false)
public class Main {
    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.setProtocol("org.apache.coyote.http11.Http11Nio2Protocol");
        return tomcat;
    }
    public static void main(String[] args) {
        SpringApplication.run(Main.class);
    }
}

和aop.xml文件:

<?xml version="1.0"?>
<aspectj>
    <weaver options="-verbose -showWeaveInfo">
    </weaver>
</aspectj>

当我用javaagent spring-instrument启动我的应用程序时,我在日志中看到这个信息:

[AppClassLoader@18b4aac2] info using configuration /home/birthright/telegrambot/target/classes/META-INF/aop.xml
[AppClassLoader@18b4aac2] info using configuration file:/home/birthright/.m2/repository/org/springframework/spring-aspects/5.0.4.RELEASE/spring-aspects-5.0.4.RELEASE.jar!/META-INF/aop.xml
[AppClassLoader@18b4aac2] info register aspect org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect
[AppClassLoader@18b4aac2] info register aspect org.springframework.scheduling.aspectj.AnnotationAsyncExecutionAspect
[AppClassLoader@18b4aac2] info register aspect org.springframework.transaction.aspectj.AnnotationTransactionAspect
[AppClassLoader@18b4aac2] info register aspect org.springframework.transaction.aspectj.JtaAnnotationTransactionAspect
[AppClassLoader@18b4aac2] info register aspect org.springframework.cache.aspectj.AnnotationCacheAspect
[AppClassLoader@18b4aac2] info register aspect org.springframework.cache.aspectj.JCacheCacheAspect

和weaveinfo:

[AppClassLoader@18b4aac2] weaveinfo Join point 'method-execution(void org.springframework.data.jpa.repository.support.SimpleJpaRepository.setRepositoryMethodMetadata(org.springframework.data.jpa.repository.support.CrudMethodMetadata))' in Type 'org.springframework.data.jpa.repository.support.SimpleJpaRepository' (SimpleJpaRepository.java:119) advised by around advice from 'org.springframework.transaction.aspectj.AnnotationTransactionAspect' (AbstractTransactionAspect.aj:66)
[AppClassLoader@18b4aac2] weaveinfo Join point 'method-execution(void org.springframework.data.jpa.repository.support.SimpleJpaRepository.deleteById(java.lang.Object))' in Type 'org.springframework.data.jpa.repository.support.SimpleJpaRepository' (SimpleJpaRepository.java:148) advised by around advice from 'org.springframework.transaction.aspectj.AnnotationTransactionAspect' (AbstractTransactionAspect.aj:66)
...

所以我看到只有 SimpleJpaRepository 已被编织,但我在com.birthright.telegrambot.services . *包中的 @Transactional 方法不是 . 我将aop.xml配置更改为:

<weaver options="-verbose -showWeaveInfo">
        <include within="com.birthright.telegrambot.*"/>
    </weaver>

但现在甚至SimpleJpaRepository也没有被人们所关注 .

在我尝试指定javaagent aspectjweaver-1.8.13并禁用spring注释 @EnableLoadTimeWeaving 之后(否则,应用程序无法启动) . 这次我的包中的所有方法都是编织的,但在应用程序的开头,我看到以下消息:

[AppClassLoader@18b4aac2] info AspectJ Weaver Version 1.8.13 built on Wednesday Nov 15, 2017 at 19:26:44 GMT
[AppClassLoader@18b4aac2] info register classloader sun.misc.Launcher$AppClassLoader@18b4aac2

然后应用程序启动:

[MethodUtil@11d73f8] info AspectJ Weaver Version 1.8.13 built on Wednesday Nov 15, 2017 at 19:26:44 GMT
[MethodUtil@11d73f8] info register classloader sun.reflect.misc.MethodUtil@11d73f8

这值得担心吗?为什么使用aspectjweaver代理工作正常,但使用spring-instrument和 @EnableLoadTimeWeaving 不行?

另一个令人尴尬的时刻 . 在类路径中,找到了spring-aspects jar的aop.xml,并注册了所有方面,例如 AnnotationTransactionAspect . 如果我将模式更改为AdviceMode.PROXY这是否意味着Spring将创建一个代理方面J来将其方面拧到Transactional方法?在这种情况下该怎么做,在自己的aop.xml中排除方面?