gpt4 book ai didi

java - Spring AOP 启动慢

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:47:59 27 4
gpt4 key购买 nike

我们将 Spring (3.0.5) AOP 与 @AspectJ 结合使用样式注释和 <aop:aspectj-autoproxy/>
.我们将它用于交易、审计、分析等。除了随着添加更多代码,应用程序的启动时间不断增加外,它工作正常。

我做了一些分析,发现大部分时间花在 Spring 容器初始化期间,更具体地说 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(String, ObjectFactory) - 大约需要 35 秒。 org.springframework.aop.support.AopUtils.canApply(Pointcut, Class, boolean) - 大约需要 15 秒。

我的目标是让应用程序在 5-10 秒内启动,而不是像现在这样大约 45 秒,因此非常感谢任何提示。

最佳答案

我有同样的问题,事实证明 Spring AOP 自动代理在启动时花费大量时间使用 bcel 加载类(没有缓存,所以一次又一次地加载相同的类,如 java.lang.Object ...)试图弄清楚哪些建议适用。它可以通过编写更细粒度的切点(例如在内部使用,@within)来稍微改进,但我发现如果所有切点都使用 @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 秒。

希望对某人和北极熊有所帮助

关于java - Spring AOP 启动慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4690860/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com