加载Spring配置文件时,如果Spring配置文件中所定义的Bean类实现了ApplicationContextAware 接口,那么在加载Spring配置文件时,会自动调用ApplicationContextAware 接口中的
public void setApplicationContext(ApplicationContext context) throws BeansException
方法,获得ApplicationContext对象。
前提必须在Spring配置文件中指定该类。
public class SpringContextHolder implements ApplicationContextAware {
/**
* 以静态变量保存ApplicationContext,可在任意代码中取出ApplicaitonContext.
*/
private static ApplicationContext context;
/**
* 实现ApplicationContextAware接口的context注入函数, 将其存入静态变量.
*/
public void setApplicationContext(ApplicationContext context) {
SpringContextHolder.context =context;
}
public static ApplicationContext getApplicationContext() {
return context;
}
/**
* 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.
*/
public static <T> T getBean(String name) {
return (T) context.getBean(name);
}
}
bean中:
<bean id="springContextHolder" class="com.enation.framework.context.spring.SpringContextHolder" />
调用:
Java代码
ICartManager cartManager = SpringContextHolder.getBean("cartManager");
正常情况:
Java代码 public class AppManager extends ContextLoaderListener implements ServletContextListener {
private ServletContext context;
private WebApplicationContext webApplicationContext;
public void contextInitialized(ServletContextEvent sce) {
this.context = sce.getServletContext();
this.webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
this.context.setAttribute("WEBAPPLICATIONCONTEXT", webApplicationContext);
}
Java代码
HttpSession session = request.getSession();
WebApplicationContext webApplicationContext = (WebApplicationContext)session.getServletContext().getAttribute("WEBAPPLICATIONCONTEXT");
UnsubscribeEmailFacade unsubscribeEmailFacade = (UnsubscribeEmailFacade)webApplicationContext.getBean("unsubscribeEmailFacade");
法2:
org.springframework.web.context.ContextLoader
// 获取spring bean容器
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
ISysConfigDao sysconfigdao = (ISysConfigDao) wac.getBean("iSysConfigDao");