对于一个普通的Servlet,我猜你可以声明一个context listener,但是对于Spring MVC,Spring会让这更容易吗?
此外,如果我定义了一个上下文侦听器,然后需要访问在我的servlet.xml
或applicationContext.xml
中定义的bean,我将如何访问它们?
对于一个普通的Servlet,我猜你可以声明一个context listener,但是对于Spring MVC,Spring会让这更容易吗?
此外,如果我定义了一个上下文侦听器,然后需要访问在我的servlet.xml
或applicationContext.xml
中定义的bean,我将如何访问它们?
6条答案
按热度按时间xqkwcwgp1#
Spring有一些你可以处理的标准事件。
为此,您必须创建并注册一个实现
ApplicationListener
接口的bean,类似于以下内容:然后在
servlet.xml
或applicationContext.xml
文件中注册此bean:Spring会在application context初始化时通知它。
在Spring 3中(如果你使用的是这个版本),
ApplicationListener
class is generic和你可以声明你感兴趣的事件类型,事件将被相应地过滤。你可以像这样简化你的bean代码:wqlqzqxt2#
从Spring 4.2开始,您可以使用
@EventListener
(documentation)camsedfj3#
创建注解
创建类
通过@Component注解或在xml中注册该类
并在你想要的任何方法上使用注解,你想在上下文初始化后运行,比如:
8ftvxx2r4#
请按照下面的步骤做一些处理后,应用程序上下文得到加载,即应用程序准备服务。
1.创建以下注解,即
@Retention(RetentionPolicy.RUNTIME)@Target(value= {ElementType.METHOD,ElementType.TYPE})public @interface AfterApplicationReady {}
2.创建下面的类,这是一个监听器,它在应用程序就绪状态下获得调用。
最后,当你启动你的Spring应用程序,就在log声明应用程序启动之前,你的监听器将被调用。
tzxcd3kk5#
我有一个单页应用程序在输入URL时,它正在创建一个HashMap(由我的网页使用),其中包含来自多个数据库的数据。我在服务器启动时做了以下事情来加载所有内容-
1-已创建ContextListenerClass
2-在web.xml中添加以下条目
3-在我的控制器类中,更新了代码,以首先检查servletContext中的Map
有了这么多的变化,当我启动我的tomcat时,它在startTime期间加载dataMap,并将所有内容放入servletContext中,然后由Controller Class使用,以从已经填充的servletContext中获取结果。
uoifb46i6#
您的bean还可以实现SmartInitializingSingleton.afterSingletonsInstantiated()。这是Spring文档(v 6.0.12)中列出的可能性之一:https://docs.spring.io/spring-framework/reference/core/beans/factory-nature.html#beans-factory-lifecycle-initializingbean
请注意,@PostConstruct和初始化方法通常在容器的单例创建锁中执行。bean示例只有在从@PostConstruct方法返回后才被视为完全初始化并准备好发布给其他人。这些单独的初始化方法仅用于验证配置状态,并可能基于给定的配置准备一些数据结构,但不用于外部bean访问的进一步活动。否则,存在初始化死锁的风险。
对于要触发昂贵的初始化后活动的场景,例如异步数据库准备步骤,您的bean应该实现SmartInitializingSingleton.afterSingletonsInstantiated()或依赖于上下文刷新事件:实现ApplicationException或声明其注解等效项@ EventException(ContextRefreshedEvent.class)。这些变体在所有常规单例初始化之后出现,因此在任何单例创建锁之外。
或者,您可以实现(智能)生命周期接口并与容器的整体生命周期管理集成,包括自动启动机制,预销毁停止步骤和潜在的停止/重新启动回调(见下文)。