怎么获取webapplication和contextcontext

博客分类:
在web环境下,Spring的ApplicationContext是又容器管理的,通过ContextLoaderListener载入。要获取ApplicationContext需要先得到ServletContext,而得到ServletContext又要先获取session。而且每一个要使用ApplicationContext的地方都要这么做。
但是,通过扩展ContextLoaderListener,我们可以很方便得获取到ApplicationContext。
原理十分简单,ContextLoaderListener类里面有一个contextInitialized方法,这个方法用于初始化context。我们自己写一个ContextUtil工具类,里面有一个静态变量context,用来存放web环境下ApplicationContext的引用。
先写ContextUtil类:
public class ContextUtil {
private static ApplicationC
public static ApplicationContext getContext() {
public static void setContext(ApplicationContext aContext) {
context = aC
然后写ContextLoaderListener的扩展类MyContextLoaderListener:
public class MyContextLoaderListener extends ContextLoaderListener{
public void contextInitialized(ServletContextEvent event){
super.contextInitialized(event);
ServletContext context = event.getServletContext();
//获取web环境下的ApplicationContext
ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
//将ApplicationContext,set到ContextUtil的静态变量context
ContextUtil.setContext(ctx);
最后在web.xml里面配置spring监听器,用我们刚刚扩展好的MyContextLoaderListener替换以前的ContextLoaderListener:
&listener&
&listener-class&yourpackage.MyContextLoaderListener&/listener-class&
&/listener&
浏览: 168283 次
来自: 北京
http://jaywcjlove.github.io/hot ...
编译后的字节码放到缓存中
&maven.test.skip同时控制maven- ...
今天在myeclipse中出现了定义在META-INF在的co ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Spring Bean获取applicationcontext方法
在Spring Bean中获取上下文对象总结有如下方法:
1、Bean实现ApplicationContextAware接口
在容器启动的时候,会扫描所有实现ApplicationContextAware接口的Bean,并执行里面的setApplicationContext()方法。当然这个Bean首先要交给Spring管理(Bean的scope需要为单例)。在Spring MVC环境中,环境会初始化两个WebXmlApplicationContext容器(父子容器),因此如果此时你的配置扫描到该Bean两次的话,就会造成保存的applicationContext为后来初始化的context(DispatcherServlet启动的context)。因此如需获取父容器(监听器所启动的context),代码如下:
import org.springframework.beans.BeansE
import org.springframework.context.ApplicationC
import org.springframework.context.ApplicationContextA
import org.springframework.stereotype.C
* 获取Spring context对象
@Controller(&sonHelper&)
public class ApplicationHelper implements ApplicationContextAware {
private static ApplicationContext applicationC
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if(null == applicationContext.getParent()) {//父容器的parent为null
this.applicationContext = applicationC
public static ApplicationContext getApplicationContext() {
return ApplicationHelper.applicationC
如果要获取子容器的context的话,getParent() != null即可。
2、使用WebApplicationContextUtils工具类获取
WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext());
WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext(), WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
3、继承ApplicationObjectSupport
继承ApplicationObjectSupport类之后,就可以调用里面的getApplicationContext()方法,获取context对象。该类也是实现ApplicationContextAware接口,然后将context设置其中。
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?方法一:在初始化时保存ApplicationContext对象
ApplicationContext ac = new FileSystemXmlApplicationContext(&applicationContext.xml&);
ac.getBean(&beanId&);
说明:这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。
方法二:通过Spring提供的工具类获取ApplicationContext对象
import org.springframework.web.context.support.WebApplicationContextU
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
ac1.getBean(&beanId&);
ac2.getBean(&beanId&);
这种方式适合于采用Spring框架的B/S系统,通过ServletContext对象获取ApplicationContext对象,然后在通过它获取需要的类实例。
上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。
其中 servletContext sc 可以具体 换成 servlet.getServletContext()或者 this.getServletContext() 或者 request.getSession().getServletContext(); 另外,由于spring是注入的对象放在ServletContext中的,所以可以直接在ServletContext取出 WebApplicationContext 对象:
WebApplicationContext webApplicationContext = (WebApplicationContext) servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());&
& & ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(session.getServletContext());&
方法三:继承自抽象类ApplicationObjectSupport
说明:抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取到ApplicationContext。
Spring初始化时,会通过该抽象类的setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象注入。
方法四:继承自抽象类WebApplicationObjectSupport
说明:类似上面方法,调用getWebApplicationContext()获取WebApplicationContext
& &方法五:实现接口ApplicationContextAware
说明:实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。
Spring初始化时,会通过该方法将ApplicationContext对象注入。
import org.springframework.beans.BeansE
import org.springframework.context.ApplicationC
import org.springframework.context.ApplicationContextA
import org.
@Component
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationC // Spring应用上下文环境
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
SpringContextUtil.applicationContext = applicationC
public static ApplicationContext getApplicationContext() {
return applicationC
applicationcontext获取bean的几种用法:
(1)根据父类类型获取所有的子类map,以子类名为key:
Map&String, INotifyReq& param = context.getBeansOfType(INotifyReq.class);
(2)根据子类名字获取对应的子类,父类引用指向子类。
INotifyReq notifyReq=context.getBean(notifyReqName+&Req&, INotifyReq.class);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:43081次
排名:千里之外
原创:33篇
转载:29篇
(1)(3)(1)(11)(2)(4)(1)(3)(1)(1)(1)(2)(23)(8)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'Spring 中获取servletContext及WebApplicationContext
今天想在启动时,读并初始化一些参数到application中,一下子还没弄出来,查了一下api才知道。spring中获取servletcontext 代码如下,关键是要知道 contextLoader的强大!其它很简单
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
ServletContext servletContext = webApplicationContext.getServletContext();
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
ServletContext servletContext = webApplicationContext.getServletContext();
spring 中获取applicationContext其实也很简单只要类实现ApplicationContextAware 接口即可,这样你就可获取上下文中所有bean,很好使的。博客分类:
Jsp 中如何获取spring的bean呢?
方式一:通过上下文
&?xml version="1.0" encoding="UTF-8" ?&
&%@ page language="java" contentType="text/ charset=UTF-8"
pageEncoding="UTF-8"%&
&%@page import="org.springframework.web.context.support.WebApplicationContextUtils"%&
&%@page import="org.springframework.context.ApplicationContext"%&
&!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&
&html xmlns="http://www.w3.org/1999/xhtml"&
&meta http-equiv="Content-Type" content="text/ charset=UTF-8" /&
&title&Insert title here&/title&
ServletContext context = request.getSession().getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
Object supermarketDao= ctx.getBean("supermarketDao");
System.out.println("jsp:"+supermarketDao);
问题:JSP页面中获取的bean与spring 容器中的bean是同一个吗?
方式二:通过类路径加载bean文件,得到bean工厂
&?xml version="1.0" encoding="UTF-8" ?&
&%@page import="org.springframework.beans.factory.BeanFactory"%&
&%@page import="org.springframework.context.support.ClassPathXmlApplicationContext"%&
&%@ page language="java" contentType="text/ charset=UTF-8"
pageEncoding="UTF-8"%&
&%@page import="org.springframework.web.context.support.WebApplicationContextUtils"%&
&%@page import="org.springframework.context.ApplicationContext"%&
&!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&
&html xmlns="http://www.w3.org/1999/xhtml"&
&meta http-equiv="Content-Type" content="text/ charset=UTF-8" /&
&title&Insert title here&/title&
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml","user_beans.xml","goods_beans.xml","supermarket_beans.xml","aop.xml","upload_beans.xml");
BeanFactory factory = (BeanFactory) appC
Object obj=factory.getBean("supermarketDao");
System.out.println("jsp2:"+obj);
问题:JSP页面中获取的bean与spring 容器中的bean是同一个吗?
总结:(1)通过WebApplicationContextUtils 获取bean是直接从spring容器中拿的;
(2)通过ClassPathXmlApplicationContext,实际上又解析了一遍xml,即又创建了一个新的spring容器,所有获取的bean与web上下文中是不同的。
浏览: 2739478 次
来自: 北京
写的十分详细我反复看了好几遍很难得把知识讲的如此详尽 表结构都 ...
不错,推荐个直接能在线实战的 :http://xc.hubwi ...
分享2017年最新vue.js视频教程,共15套,从入门到精通 ...
指正一个错误:BigInteger bigInt = new
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 获取webcontext路径 的文章

 

随机推荐