类加载应用程序上下文 Spring

Posted

技术标签:

【中文标题】类加载应用程序上下文 Spring【英文标题】:Class Loading Application Context Spring 【发布时间】:2013-01-17 10:29:09 【问题描述】:

我有一个 Spring Web 项目,我需要在初始化应用程序上下文后加载一些类,因为这些类最终将在未来使用。因此,我尝试在使用前预加载它们以提高性能。

怎么做?

请帮忙。

谢谢。

【问题讨论】:

请大家帮忙。谢谢。 ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); GenericDAOImpl dao = (GenericDAOImpl) ctx.getBean("genericDaoImpl");类加载器 clsLoader = Thread.currentThread().getContextClassLoader(); clsLoader.loadClass(arg0);是这个还是有更好的方法? 请提供一些答案。 您的评论可能增加了混乱。您要预加载 bean 吗?使用 applicationContext 定义加载所有 bean - ApplicationContext 实现的默认行为是在启动时急切地预实例化所有单例 bean。 【参考方案1】:

要将类加载到 JVM 中,只需调用 Class.forName('com.foo.bar.MyClassToPreLoad') 方法即可。 你可以这样做,例如在你自己的javax.servlet.ServletContextListener 实现中,然后在 web.xml 中注册它

<listener>
    <listener-class>com.foo.bar.MyClassPreloadingContextListener</listener-class>
</listener>

或者您可以在任何实现org.springframework.beans.factory.InitializingBean 接口的Spring bean 中执行此操作。或者,如果您不想实现接口,您可以在任何不带参数的 bean 方法中执行此操作,并将其注册为该 bean 的 init-method

<bean class="com.foo.bar.MyClassPreloadingBean" init-method="preloadClasses"/>

详情请见http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-lifecycle-initializingbean。

或http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-postconstruct-and-predestroy-annotations,如果您更喜欢基于注释的配置。

希望对你有帮助。

【讨论】:

【参考方案2】:

我想你没有提到你的 bean 的范围。如果你没有在应用程序上下文中提到范围,那么默认容器使用单例范围。这意味着在整个 urs 系统中使用相同的 bean 实例,除非你关闭容器。 bean 的实例始终保持不变。如果您想覆盖默认行为,请使用可以在 urs applicationcontext 中为 bean 提供范围。您最好在此链接中看到我曾经问过有关相同问题的问题。 Pre-loading and lazy loading in spring with tomcat

【讨论】:

以上是关于类加载应用程序上下文 Spring的主要内容,如果未能解决你的问题,请参考以下文章

跨junit测试类重用spring应用程序上下文

Spring Boot 全局控制器建议未在 Spring 上下文中加载

动态加载spring xml配置

Spring boot加载REACTIVE程序过程

Spring Boot 扩展点应用之工厂加载机制

SpringApplication类