需要实现一个功能:web容器启动的时候需要加载一个listener,去把以前开启的调度重新启动起来。这个listener需要与数据库交互,但配置数据库连接和service的bean都在spring配置文件里配置,在context-param里加载。
listener加载先于context-param这个知道,但是context-param配的配置文件经测试是后加载于listener的。
最后综合各种资料,找到一种解决办法,如下。
web.xml里做如下配置:
<!-- 配置文件参数-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
<!-- 自己的listener -->
<listener>
<listener-class>futureemail.core.FixTimeListener</listener-class>
</listener>
FixTimeListener.java如下:
public class FixTimeListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
System.out.println("listener run...");
String relativePath = event.getServletContext().getInitParameter(
"contextConfigLocation");
String realPath = event.getServletContext().getRealPath(relativePath);
SpringBeanFactory.init(realPath);
futureEmailService = (FutureEmailService) SpringBeanFactory
.getBean("futureEmailService"); //即可取到bean
// ....下面逻辑省略
}
@Override
public void contextDestroyed(ServletContextEvent e) {
SpringBeanFactory.clear();
}
}
SpringBeanFactory.java如下:
public class SpringBeanFactory {
private static ApplicationContext context;
/**
* 在应用程序启动时配置spring框架
*
* @param filePath
*/
public static void init(String filePath) {
if (context == null) {
context = new FileSystemXmlApplicationContext(filePath);
}
}
public static ApplicationContext getContext() {
return context;
}
/**
* 方法用于获取bean
*
* @param name
* @return
*/
public static Object getBean(String name) {
return context.getBean(name);
}
/**
* 在应用程序关闭时,清空spring框架配置信息
*/
public static void clear() {
if (context != null) {
context = null;
}
}
}
就是这样。
PS:部署到linux后可能会有一个问题。就是context = new FileSystemXmlApplicationContext(filePath)这里,filePath与windows下不同,会被默认成相对路径。
解决方法是:在filePath前再加一个/。代码如下:
if (filePath != null && filePath.startsWith("/")) {
filePath = "/" + filePath;
}
分享到:
相关推荐
在Spring框架中,动态注册Bean是一项非常实用的功能,它允许我们在应用运行时向Spring容器添加新的Bean定义。这种能力在很多场景下都是极其有用的,比如根据不同的环境配置加载不同的服务实现,或者在运行时根据某些...
5. **销毁回调**:当Spring容器关闭时,或Bean定义中设置了`destroy-method`,Spring会调用Bean的销毁方法。同样,实现`DisposableBean`接口的Bean会调用`destroy()`方法。 接下来,我们看看ApplicationContext的...
如果你使用的是 Servlet 2.4 及以上的 web 容器,那么你仅需要在 web 应用的 XML 声明文件 web.xml 中增加下述 ContextListener 即可:<web-app>...<listener><listener-class>org.springframework.web.context....
首先,通过实现ApplicationListener接口,可以在Spring容器启动后获取所有的Bean中实现了一个特定接口的对象。ApplicationListener是一个事件监听器接口,用于监听Spring容器中的事件。ContextRefreshedEvent是一个...
在Spring框架中,Bean是核心概念,它代表了应用程序中的对象,这些对象由Spring容器管理其生命周期和依赖关系。特殊Bean用法主要涉及Spring提供的多种高级特性,包括但不限于工厂方法、 prototype scope、AOP代理、...
初始化和销毁方法在 Spring 容器中,我们可以通过配置来指定 Bean 在被创建后或销毁前需要执行的方法。这些方法可以用于执行初始化设置或者清理工作。 3.1. 初始化方法当我们想要在 Bean 创建完成后执行特定的初始...
当一个Bean被定义为Singleton时,Spring容器只会为这个Bean创建一个实例,并将其保存在单例缓存中。这意味着每当需要这个Bean时,Spring都会返回同一个实例。这有助于减少内存消耗和提高性能,尤其是在处理复杂的...
Spring技术详解 Spring技术详解是Java框架中的一种重要技术,主要用于解决Java应用程序...Spring容器和被管理的Bean是Spring技术的核心组成部分,ApplicationContext是BeanFactory的子接口,用于管理Spring中的Bean。
Spring通过ApplicationContext主动获取bean的...通过使用ApplicationContext,我们可以轻松地获取到Spring容器中的bean,并且可以根据需要来获取不同的bean。这个方法可以帮助我们更好地管理和使用Spring容器中的bean。
在Spring框架中,依赖注入(Dependency Injection,DI)是一种核心特性,它允许对象之间的依赖关系在运行时由Spring容器管理,而不是由代码直接创建。在SSH(Struts、Hibernate、Spring)整合的Web应用中,Spring的...
控制反转(IoC)是一种设计模式,它将对象的创建和管理权从代码中分离出来,交由Spring容器来处理。这样做的好处是提高了代码的可测试性、模块化和灵活性。依赖注入(DI)是IoC的一种实现方式,通过容器将对象需要的...
Spring框架是Java开发中不可或缺的一部分,它以其模块化、易用性和灵活性著称。这个压缩包文件中的"spring源码 中英文注释"为开发者提供了一个深入理解Spring框架内部工作原理的机会。通过阅读源码和注释,我们可以...
这个文件中定义了Spring容器的配置信息,包括Bean的定义、数据源的配置、事务管理等。 如果需要加载多个配置文件,可以使用逗号分隔的方式来指定多个文件。例如: <param-name>contextConfigLocation ...
4. **获取Bean**:使用`getBean()`方法从容器中获取Bean实例,进行业务操作。 5. **依赖注入**:容器自动处理Bean之间的依赖关系,无需在代码中显式创建或查找依赖对象。 ### 5. 进阶使用 - **AOP代理**:IoC容器...
在Spring Boot应用中,整合Listener主要是为了监听应用的生命周期事件,例如在应用启动或关闭时执行特定的操作。这里我们讨论两种整合Listener的方式。 ### 方式一:通过注解扫描完成Listener组件的注册 1. **创建...
该配置文件定义了一个名为 `ApplicationEventListener` 的 Bean,类型为 `ioc.test.ApplicationEventListener`,当 Spring 容器启动时会自动实例化这个 Bean。 #### 六、事件监听器实现 ```java package ioc.test;...
另外,还可以通过实现特定的aware接口,来让bean获取Spring容器的信息。 4.7 Bean定义的继承 Spring允许bean定义之间继承,这样子bean定义可以覆盖父定义的属性值。 4.8 容器扩展点 Spring IoC容器提供了许多扩展...
为了确保Web应用能够成功运行,并且能够将Spring中的Bean发布为WebService,我们需要做一些前期准备: 1. **安装Tomcat服务器**:作为部署应用的基本环境。 2. **下载并安装Spring框架**:Spring框架提供了一个强大...
在Spring框架中,当一个基于Servlet的Web应用启动时,Spring容器的初始化过程是至关重要的。这个过程涉及到多个组件和步骤,让我们详细探讨一下。 首先,我们在`web.xml`配置文件中看到了`<context-param>`和`...