在Spring应用中创建全局获取ApplicationContext对象
1、需要创建一个类,实现接口ApplicationContextAware的setApplicationContext方法。
2、在创建的这个类中保存一个静态的ApplicationContext对象,然后通过静态的方法返回。
如下,下面是SpringSide的实现,供参考:
/**
* Copyright (c) 2005-2012 springside.org.cn
*
* Licensed under the Apache License, Version 2.0 (the "License");
*/
package org.springside.modules.test.spring;
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
/**
* 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候取出ApplicaitonContext.
*
* @author calvin
*/
public class SpringContextHolder implements ApplicationContextAware, DisposableBean {
private static ApplicationContext applicationContext = null;
private static Logger logger = LoggerFactory.getLogger(SpringContextHolder.class);
/**
* 取得存储在静态变量中的ApplicationContext.
*/
public static ApplicationContext getApplicationContext() {
assertContextInjected();
return applicationContext;
}
/**
* 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
*/
public static <T> T getBean(String name) {
assertContextInjected();
return (T) applicationContext.getBean(name);
}
/**
* 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
*/
public static <T> T getBean(Class<T> requiredType) {
assertContextInjected();
return applicationContext.getBean(requiredType);
}
/**
* 清除SpringContextHolder中的ApplicationContext为Null.
*/
public static void clearHolder() {
logger.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext);
applicationContext = null;
}
/**
* 实现ApplicationContextAware接口, 注入Context到静态变量中.
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
logger.debug("注入ApplicationContext到SpringContextHolder:{}", applicationContext);
if (SpringContextHolder.applicationContext != null) {
logger.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:"
+ SpringContextHolder.applicationContext);
}
SpringContextHolder.applicationContext = applicationContext; //NOSONAR
}
/**
* 实现DisposableBean接口, 在Context关闭时清理静态变量.
*/
@Override
public void destroy() throws Exception {
SpringContextHolder.clearHolder();
}
/**
* 检查ApplicationContext不为空.
*/
private static void assertContextInjected() {
Validate.validState(applicationContext != null,
"applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.");
}
}
分享到:
相关推荐
3. **获取Bean**:在我们的应用程序中,我们可以使用`ApplicationContext`来获取之前定义的bean实例。例如: ```java ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml...
然而,在实际应用过程中,开发者会发现Spring Cloud Gateway默认的异常处理机制并不完善,尤其是对于RESTful API而言,默认情况下返回的是HTML格式的错误页面,这显然不符合前后端分离的应用场景。因此,本文将详细...
在Eclipse中创建一个基于Spring的Web应用涉及多个步骤,主要涵盖了Spring框架的Web模块、ApplicationContext的使用以及在Web容器中的配置。以下是详细的过程和相关知识点: 1. **Spring Web模块**: Spring框架...
这里我们将详细探讨如何在Java中通过Spring获取配置的bean。 1. **BeanFactory与ApplicationContext** - **BeanFactory** 是Spring中最基础的IoC容器,负责管理和实例化Bean。它允许开发者定义Bean的生命周期和...
这样,我们可以通过`WebApplicationContextUtils`工具类的静态方法`getWebApplicationContext(ServletContext)`在Web应用的任何地方获取ApplicationContext对象,无需每次都手动创建。 3. **导入Spring集成Web的...
Spring的ResourceBundleMessageSource类将ResourceBundle与Spring的IoC容器集成,使得我们可以方便地从ApplicationContext中获取不同语言的字符串。配置ResourceBundleMessageSource可以通过XML或注解两种方式。XML...
在Spring MVC和Spring框架的整合应用中,常常会遇到两套上下文的问题。Spring MVC是Spring框架的一个模块,主要用于处理Web请求,而Spring则提供了一个更广泛的IoC(Inversion of Control,控制反转)和AOP(Aspect ...
通过以上步骤,你就可以在Spring环境中创建一个等价于JNDI配置的数据源了。这种方式不仅适用于非Web环境,也适合那些希望在Web环境中避免使用JNDI的场景。记住,选择合适的数据源和配置策略对于应用性能和稳定性至关...
4. session:在Web应用中,每个HTTP session中创建一个bean。 5. global-session:在portlet应用中,全局session作用域。 了解并掌握这些基础知识点,可以帮助开发者更好地理解和使用Spring框架,从而构建高效、可...
2. **依赖注入(DI)**:DI是Spring的重要特性,它允许对象之间的依赖关系通过配置来决定,而不是硬编码在类中。这使得代码更易于测试和维护。 3. **AOP**:Spring的AOP支持允许开发者定义“切面”,即跨越多个对象...
2. 配置Spring:创建Spring的配置文件,如applicationContext.xml,配置Bean、DataSource、TransactionManager等。 3. 配置SpringMVC:创建SpringMVC的配置文件,如servlet-context.xml,配置DispatcherServlet、...
资源管理章节涵盖了资源的获取和抽象,包括Resource接口的介绍、内置的Resource实现、资源加载器以及如何在应用上下文中使用资源路径。 验证、数据绑定和类型转换部分讲解了如何使用Spring的验证器接口进行验证,...
在Spring框架中,Bean管理是核心功能之一,它允许开发者通过声明式的方式配置和管理对象。这个压缩包文件“spring管理bean应用实例代码”显然包含了关于如何在Spring中配置和使用Bean的示例代码。接下来,我们将深入...
3. **访问方式**:`<context-param>`可通过Spring容器直接访问,`<init-param>`则是在Servlet的`init`方法中通过`ServletConfig`对象获取。 了解这些差异后,开发者可以根据具体需求选择合适的配置方式,以实现更...
在Spring框架中,BeanFactory和ApplicationContext就是工厂模式的实现。它们负责创建和管理应用程序中的对象,允许开发者通过配置文件或注解来定义对象的创建逻辑。 2. **单例模式**: 单例模式确保一个类只有一个...
而ContextLoaderListener则是一个监听器,可以在Web应用启动时加载配置文件,创建ApplicationContext,并将上下文信息存储在ServletContext中,方便全局访问。 在Web应用的部署描述符web.xml中,我们可以通过`...
在Spring AOP中,代理是一种创建代理对象的技术,用于拦截方法调用,并根据定义的切面插入相应的行为。 47、什么是编织(Weaving)? 编织(Weaving)是AOP的一个术语,指的是将切面与其他应用程序类型或对象链接在...
在Spring框架中,工厂模式体现在Spring容器(BeanFactory或ApplicationContext)中,容器根据配置文件或编程方式来创建和管理bean。Spring容器不仅能创建bean,还能处理bean的生命周期,包括初始化、装配、管理和...
在传统的Java代码中,对象常常通过构造函数、setter方法或全局变量来获取依赖。而依赖注入则是由外部容器(如Spring IoC容器)负责创建对象并管理它们之间的依赖关系,而不是由对象自身负责。这样,对象只需要声明其...
这样,即使Controller在全局ApplicationContext中,`DispatcherServlet`也会自动发现并处理它们。 3. **自定义`WebApplicationInitializer`**:如果使用Java配置,可以通过实现`WebApplicationInitializer`接口来自...