首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring AOP启动时间较慢

Spring AOP启动时间较慢
EN

Stack Overflow用户
提问于 2011-01-14 20:06:24
回答 6查看 7.2K关注 0票数 6

我们使用了带有@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秒,所以任何提示都会非常感谢。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-10-03 05:47:07

我也遇到了同样的问题,结果Spring AOP自动代理在启动时花费了大量时间使用bcel加载类(没有缓存,所以一次又一次地加载相同的类,比如java.lang.Object……)当试图找出哪些建议适用时。通过编写更细粒度的Point cuts (例如,在内部使用,@ if )可以在一定程度上改进它,但我已经找到了一个解决方案,如果所有的切入点都用@annotation编写,效果会更好。

1)关闭自动代理: spring.aop.auto=false

2)编写AnnotationAwareAspectJAutoProxyCreator的自定义子类,根据自己的条件过滤需要修饰的bean,例如这个基于包和注释:

代码语言:javascript
复制
@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秒。

我希望它能帮助一些人和北极熊

票数 5
EN

Stack Overflow用户

发布于 2011-01-20 01:01:31

从您发布的内容来看,您使用的是加载时编织,这会导致启动惩罚,因为系统必须在加载时编织所有的类。如果您最关心的是启动时间,那么我建议您切换到编译时织入。您可以在spring文档(第6章,第8节)或AspectJ站点(http://www.eclipse.org/aspectj/docs.php)中找到有关如何执行此操作的说明。

使用AspectJ编译器切换到编译时编织是相对直接的:

  1. 从上下文文件中删除<aop:aspectj-autoproxy/>符号。
  2. 将aspectJ编译步骤添加到构建文件中。在AspectJ站点上,你应该能够找到一个ant插件,codehaus有一个maven插件。这里有一些例子,告诉你我俩是如何做到的。

对于Maven:

代码语言:javascript
复制
<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

代码语言:javascript
复制
 <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" />
票数 5
EN

Stack Overflow用户

发布于 2011-01-14 20:26:25

显然,如果你有很多非单例bean,这是一个已知的问题。Spring3.1似乎有一个修复方法:https://jira.springsource.org/browse/SPR-7328

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4690860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档