我为我的应用程序激活了aspectj加载时间编织,并添加了定义我的方面的aop.xml文件。
我发现我的类路径上的 spring-aspects jar 也包含 aop.xml 文件,并且在我将应用程序配置为以spectjweaver.jar 作为 java 代理启动时加载。
看起来,当没有激活编织时,该文件未使用,但激活后确实增加了应用程序启动时间。这个文件有什么用?
您正在谈论此文件。引用其内容,稍微重新格式化:
<?xml version="1.0"?>
<!-- AspectJ load-time weaving config file to install common Spring aspects. -->
<aspectj>
<!--<weaver options="-showWeaveInfo"/>-->
<aspects>
<aspect name="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect"/>
<aspect name="org.springframework.scheduling.aspectj.AnnotationAsyncExecutionAspect"/>
<aspect name="org.springframework.transaction.aspectj.AnnotationTransactionAspect"/>
<aspect name="org.springframework.transaction.aspectj.JtaAnnotationTransactionAspect"/>
<aspect name="org.springframework.cache.aspectj.AnnotationCacheAspect"/>
<aspect name="org.springframework.cache.aspectj.JCacheCacheAspect"/>
</aspects>
</aspectj>
首先,说到
spring-aspects
,你需要明白它使用的是原生的AspectJ,而不是基于代理的Spring AOP。用于编织方面的技术称为加载时编织(LTW),即目标类字节代码在类加载期间由编织代理进行转换,该代理通常添加到 JVM 命令行,如下所示:
java ... -javaagent:/my/aspectjweaver.jar -javaagent:/my/spring-aspects.jar
你看,你可以同时使用单个甚至多个代理。这是一种通用的、标准化的 JVM 机制。 AspectJ 只是碰巧使用它,就像许多其他 Java 代理一样。
Spring手册中有一个章节,描述了如何在Spring中使用原生AspectJ。有一个简短的段落涉及
aop.xml
,进一步指向相应的 AspectJ 手册章节。
简而言之:
aop.xml
文件。spring-aspects
带有自己的 aop.xml
文件。它列出了库中当前包含的六 (6) 个方面。