Проблемы с производительностью при запуске Spring

Я пытаюсь интегрировать Spring в довольно большое приложение с тысячами классов, и у меня огромные задержки при запуске моего контейнера из-за сканирования компонентов.

Я уже сузил количество каталогов, указанных в "базовом пакете", до минимума, чтобы сократить время, потраченное на сканирование нерелевантных каталогов, но часть инициализации, связанная со сканированием пути к классам, по-прежнему занимает около 1-2 минут.

Итак, есть ли способ оптимизировать процесс сканирования? Я' Я думал о том, чтобы сохранить путь к классам-кандидатам в файле и сделать так, чтобы контейнер затем получал их из файла, вместо того, чтобы сканировать путь к классам при каждом запуске, но я действительно не знаю, с чего начать и возможно ли это.

Мы очень ценим любой совет. Заранее спасибо.

Правка : загрузка определений bean-компонентов из автоматически сгенерированного xml-файла, уменьшила время начальной загрузки Spring до 9 ~ 10 секунд, что подтверждает, что API-интерфейс отражения, используемый Spring для сканирования путей к классам компонентов, является основным источником задержек при запуске. .
As for generating the xml file here is the code, since it might be helpful for someone with the same issues.

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>");
    }

}
36
задан Mehdi 12 May 2011 в 09:45
поделиться