我现在用spring开发项目来着,可是启动起来特别慢,然后我就把配置文件改了。让bean延迟加载,可是还是比较慢,后来发现,原来是我用了
ApplicationContext context = new ClassPathXmlApplicationContext(
"/springconfig/applicationContext*.xml");
这个方法在调用的时候会从新加载一遍配置文件,所以跑起来比较慢,我用ApplicationContext 对象是因为spring提供了对action的控制类,却没提供对actionfrom的控制类,我想在actionform的reset函数中调用数据库访问类就只能这样来获得了。我想请教大家一个问题就是spring在web.xml配置文件中加载一遍后有没有提供一个方法来调用已经加载了的bean而不需要我通过ApplicationContext 对象去获得呢?? 

解决方案 »

  1.   

    lz的"已经加载了的bean"也是需要创建的,这个在一般的应用中不会看出能影响速度来,尤其是你没有做大量的new操作,所以建议lz还是在用类的时候注入进去比较好。如果真的涉及到大量的类需要new出来,建议考虑使用对象池。
      

  2.   

    我的网站使用了许多的表格,对应着许多的配置文件和多个类。而且使用的是JPA所以加载速度基本就不指望能太快了。如果你的系统就是需要这些东西,你何必要在意那一点点的启动速度呢?

      

  3.   

    即便加载需要一定时间,那也只是加载一次啊。难道LZ是每次需要使用的时候就NEW一个?建一个static的context。
      

  4.   

    ApplicationContext只要加载一次就可以了啊,开销不大的
      

  5.   

    在web.xml中加入
    <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/applicationContext-*.xml,/WEB-INF/action-servlet.xml</param-value>
    </context-param>
    <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>在类中用get,set方法就行了
      

  6.   

    Spring有个工具类org.springframework.web.context.support.WebApplicationContextUtils
    可以通过这个工具类的getWebApplicationContext(ServletContext sc) 方法得到WebApplicationContext
    现在唯一要得到的就是ServletContext,这个对象没法直接得到,搞个比较恶心的办法,HttpServletRequest.getSession().getServletContext()
      

  7.   

    恩啊,刚开始我是每次都new 了一个后来改了。可是你不觉得那样做还是不完美吗?在web.xml文件中加载了一次,然后项目中没有在spring配置文件加载的类需要用到一些业务逻辑类,而这些业务逻辑类又是spring去管理的,所以就必须通过applicationcontext对象去获得业务逻辑类,就算是建立了一个静态的applicationcontext对象,只加载了一次,但是整个项目运行起来还是加载了两遍,我就觉得这样有点别扭,为什么要加载两遍呢,加载配置文件占用的时间挺多的。 
      

  8.   

    开销是不大,就是觉得不舒服,呵呵,感觉没表要去加载两遍,但愿spring提供一个工具类,可以从内存中获得所需要的业务逻辑类。
    刚开始我也觉得这样做没什么,可是经理说这样做不好,后来想想也是的,的确不完美。。呵呵,期待有更好的方法出现。。
      

  9.   

    我已经说了,spring有这样的工具类啊org.springframework.web.context.support.WebApplicationContextUtils