我们使用了带有@AspectJ样式注释和<aop:aspectj-autoproxy/>的Spring (3.0.5)面向方面编程。我们将它用于事务、审计、分析等。它工作得很好,除了应用程序的启动时间随着更多代码的增加而不断增长。
我做了一些分析,发现大部分时间是在Spring容器初始化期间花费的,更具体地说,org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(String, ObjectFactory) -大约需要35秒。org.springframework.aop.support.AopUtils.canApply(Pointcut, Class, boolean) -大约需要15秒。
我的目标是应用程序在5-10秒内启动,而不是现在的~45秒,所以任何提示都会非常感谢。
发布于 2017-10-03 05:47:07
我也遇到了同样的问题,结果Spring AOP自动代理在启动时花费了大量时间使用bcel加载类(没有缓存,所以一次又一次地加载相同的类,比如java.lang.Object……)当试图找出哪些建议适用时。通过编写更细粒度的Point cuts (例如,在内部使用,@ if )可以在一定程度上改进它,但我已经找到了一个解决方案,如果所有的切入点都用@annotation编写,效果会更好。
1)关闭自动代理: spring.aop.auto=false
2)编写AnnotationAwareAspectJAutoProxyCreator的自定义子类,根据自己的条件过滤需要修饰的bean,例如这个基于包和注释:
@Override
protected Object[] getAdvicesAndAdvisorsForBean(Class<?> beanClass, String beanName, TargetSource targetSource) {
if (beanClass != null && isInPackages(beansPackages, beanClass.getName()) && hasAspectAnnotation(beanClass)) {
return super.getAdvicesAndAdvisorsForBean(beanClass, beanName, targetSource);
} else {
return DO_NOT_PROXY;
}
}在我的例子中,启动时间从60秒减少到15秒。
我希望它能帮助一些人和北极熊
发布于 2011-01-20 01:01:31
从您发布的内容来看,您使用的是加载时编织,这会导致启动惩罚,因为系统必须在加载时编织所有的类。如果您最关心的是启动时间,那么我建议您切换到编译时织入。您可以在spring文档(第6章,第8节)或AspectJ站点(http://www.eclipse.org/aspectj/docs.php)中找到有关如何执行此操作的说明。
使用AspectJ编译器切换到编译时编织是相对直接的:
<aop:aspectj-autoproxy/>符号。对于Maven:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.3</version>
<configuration>
<verbose>true</verbose>
<source>1.6</source>
<target>1.6</target>
<complianceLevel>1.6</complianceLevel>
<showWeaveInfo>true</showWeaveInfo>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>对于Ant
<taskdef
resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties">
<classpath>
<pathelement location="${lib.dir}/AspectJ_1.6.8/aspectjtools.jar"/>
</classpath>
</taskdef>
<iajc aspectPath="${file.reference.spring-aspects.jar}; ${build.classes.dir}/path/to/custom/aspects"
classpath="${lib.dir}/AspectJ_1.6.8/aspectjrt.jar; ${javac.classpath}"
inpath="${build.classes.dir}"
destDir="${build.classes.dir}"
showWeaveInfo="true" />发布于 2011-01-14 20:26:25
显然,如果你有很多非单例bean,这是一个已知的问题。Spring3.1似乎有一个修复方法:https://jira.springsource.org/browse/SPR-7328
https://stackoverflow.com/questions/4690860
复制相似问题