spring启动性能问题

我试图将Spring集成到具有数千个类的大型应用程序中,并且由于组件扫描,我在启动容器时遇到了巨大的延迟。

我已经将“基本软件包”中指定的目录数量缩小到最小,以减少扫描无关目录所浪费的时间,但是初始化的类路径扫描部分仍然需要大约1-2分钟。

因此,有没有一种方法可以优化扫描过程?我曾考虑过将候选类路径存储在文件中,然后使容器从文件中获取,而不是每次启动时都扫描类路径,但是我真的不知道从哪里开始,或者是否有可能。

任何建议深表感谢。提前致谢。


:从一个自动生成的xml文件加载bean定义,将Spring引导时间减少到

秒,这确认了Spring用于组件类路径扫描的反射API是启动延迟的主要来源。

至于生成xml文件,这里是代码,因为它可能对遇到相同问题的人有所帮助。

import java.io.File;

import java.io.FileNotFoundException;

import java.io.PrintWriter;

import java.util.ArrayList;

public class ConfigurationWriter {

public ArrayList<String> beanDefinitions = new ArrayList<String>();

public ConfigurationWriter() {

// the context loaded with old fashioned way (classpath scanning)

ApplicationContext context = SpringContainerServiceImpl.getInstance().getContext();

String[] tab = context.getBeanDefinitionNames();

for (int i = 0; i < tab.length - 6; i++) {

Class clazz = context.getType(tab[i]);

String scope = context.isPrototype(tab[i]) ? "prototype" : "singleton";

String s = "<bean id=\"" + tab[i] + "\" class=\"" + clazz.getName() + "\" scope=\"" + scope + "\"/>";

beanDefinitions.add(s);

}

// Collections.addAll(beanDefinitions, tab);

}

@SuppressWarnings("restriction")

public void generateConfiguration() throws FileNotFoundException {

File xmlConfig = new File("D:\\dev\\svn\\...\\...\\src\\test\\resources\\springBoost.xml");

PrintWriter printer = new PrintWriter(xmlConfig);

generateHeader(printer);

generateCorpse(printer);

generateTail(printer);

printer.checkError();

}

@SuppressWarnings("restriction")

private void generateCorpse(PrintWriter printer) {

for (String beanPath : beanDefinitions) {

printer.println(beanPath);

}

}

@SuppressWarnings("restriction")

private void generateHeader(PrintWriter printer) {

printer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");

printer.println("<beans xmlns=\"http://www.springframework.org/schema/beans\"");

printer.println("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"");

printer.println("xmlns:context=\"http://www.springframework.org/schema/context\"");

printer.println("xsi:schemaLocation=\"");

printer.println("http://www.springframework.org/schema/mvc");

printer.println("http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd");

printer.println("http://www.springframework.org/schema/beans");

printer.println("http://www.springframework.org/schema/beans/spring-beans-3.0.xsd");

printer.println("http://www.springframework.org/schema/context");

printer.println("http://www.springframework.org/schema/context/spring-context-3.0.xsd\"");

printer.println("default-lazy-init=\"true\">");

}

@SuppressWarnings("restriction")

private void generateTail(PrintWriter printer) {

// printer.println("<bean class=\"com.xxx.frmwrk.spring.processors.xxxBeanFactoryPostProcessor\"/>");

printer.println("<bean class=\"com.xxx.frmwrk.spring.processors.xxxPostProcessor\"/>");

printer.println("</beans>");

}

}


由于Spring

5包括一组重要的优化措施,用于加速上下文初始化,因此它还具有一个有趣且方便的功能,可以在编译时生成候选组件的索引:Spring Context

Indexer

回答:

问题:Spring Bean中的目录中有多少类(按百分比计)?

答:我不太确定(这是一个非常大的项目),但是据我所见,我相信它大约在90%到100%之间,因为xml和属性文件被隔离在不同的位置)

如果问题确实是组件扫描而不是bean初始化过程本身(我对此表示高度怀疑),那么我能想到的唯一解决方案是使用Spring

XML配置而不是组件扫描。-(可以自动创建XML文件)。

但是,如果您有很多类并且90%-其中100%是Bean,那么减少扫描文件的最大效率将是10%-0%。

您应该尝试其他方法来加快初始化速度,可以使用延迟加载或任何与延迟加载相关的技术,或者(并且这不是在开玩笑)使用速度更快的硬件(如果它不是独立的应用程序)。


生成Spring

XML的一种简单方法是编写一个简单的Spring应用程序,该应用程序像原始应用程序一样使用类路径扫描。在所有Bean初始化之后,将在Spring

Context中遍历Bean,检查该Bean是否属于重要包,并将该Bean的XML Config写入文件中。

以上是 spring启动性能问题 的全部内容, 来源链接: utcz.com/qa/405465.html

回到顶部