Meh*_*hdi 36 java spring bootstrapping spring-mvc classpath
我正在尝试将Spring集成到一个包含数千个类的相当大的应用程序中,并且由于组件扫描,我在启动容器时遇到了巨大的延迟.
我已经收窄,以减少在扫描无关目录浪费的时间,在"基本包"规定,到最低目录的数量,但初始化的类路径扫描部分仍需要大约1-2分钟.
那么,有没有办法优化扫描过程?我曾想过将候选类路径存储在一个文件中,然后让容器从文件中获取它们,而不是每次启动都扫描类路径,但我真的不知道从哪里开始,或者甚至可能.
任何建议都非常感谢.提前致谢.
编辑:加载Bean定义形成自动生成XML文件,减少了弹簧引导时间9〜10秒这证实了各组分的类路径扫描使用由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>");
}
}
Run Code Online (Sandbox Code Playgroud)
问题:目录中有多少(%)的类是Spring Beans?
答:我不太确定(这是一个非常大的项目),但从我看到的情况来看,我认为它是90%到100%,因为xml和属性文件是在不同的位置隔离的)
如果问题实际上是组件扫描而不是bean初始化过程本身(我非常怀疑),那么我能想象的唯一解决方案是使用Spring XML配置而不是组件扫描. - (可以自动创建XML文件).
但是,如果你有很多课程,90% - 其中100%是豆类,那么,扫描文件的减少最大可以提高10%-0%.
您应该尝试其他方法来加速初始化,可能使用延迟加载或任何延迟加载相关技术,或(并且这不是一个笑话)使用更快的硬件(如果它不是一个独立的应用程序).
生成Spring XML的一种简单方法是编写一个简单的spring应用程序,它像原始应用程序一样使用类路径扫描.在所有Bean初始化之后,它在Spring上下文中遍历Bean,检查bean是否属于重要包,并在文件中为此bean编写XML Config.
归档时间: |
|
查看次数: |
25481 次 |
最近记录: |