获取spring容器上下文(webApplicationContext)的几种方法

首先说明一下,我们在java web项目里面有这样一些需求,比如我饿么在项目启动的试试需要一些数据,加载配置通常我们会在监听器里面去实现我们的这些问题,然后配置在我们的listener里面去;

首先很感谢大佬的指导,在web SERver容器里面的server,filter都不是spring容器去管理的我们也不可能在spring的配置里面去获取到这个东西的,比如:

public class InitComponent implements ServletContextListener,ApplicationContextAware{


    private static ApplicationContext applicationContext;

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        // TODO Auto-generated method stub
        this.applicationContext=applicationContext;
    }

    public void contextInitialized(ServletContextEvent servletContextEvent) {
        ServletContext servletContext = servletContextEvent.getServletContext();


        BlogTypeService blogTypeService=(BlogTypeService) applicationContext.getBean("blogTypeService");
        List<BlogType> list = blogTypeService.find();
        servletContext.setAttribute("list", list);
    }

这样我们在获取的时候我们的ApplicationContext 是空值,上面的这种获取方式是从容器里面去拿,但是我们的容器并没有帮助我们去做这些事情,如下代码的获取方式:

@Component
public class InitComponent implements ServletContextListener,ApplicationContextAware{

    public void contextInitialized(ServletContextEvent servletContextEvent) {
        ServletContext servletContext = servletContextEvent.getServletContext();
         ApplicationContext applicationContext = WebApplicationContextUtils
                        .getWebApplicationContext(servletContext);

        BlogTypeService blogTypeService=(BlogTypeService) applicationContext.getBean("blogTypeService");
        List<BlogType> list = blogTypeService.find();
        servletContext.setAttribute("list", list);
    }

    public void contextDestroyed(ServletContextEvent sce) {
        // TODO Auto-generated method stub  
    }
}

请多多指导,或者这个application的方法还有很多的下面看看大佬的文章
转载的文章:http://www.cnblogs.com/roy-blog/p/6362411.html
 
在很多情况,我们需要先获取spring容器上下文,即webApplicationContext,然后通过webApplicationContext来获取其中的bean。典型的情况是,我想在一个并未委托给spring容器管理的对象里,去引用一个spring容器管理的对象,此时,@Resource注解是无法发挥作用的。此时必须使用webApplicationContext.getBean(“beanName”)才能从容器中取到这个java对象,不然我们就只能自己去new了。

  方法1::ApplicationContext context = new ClassPathXmlApplicationContext(“applicationContext.xml”);

  经验证是可行的,但是有个问题,就是执行这句代码的时候很耗时。本人猜测这句代码会重新new一个容器对象,相当于重新载入了一次applicationContext.xml里面配置的类,重新去create一个ApplicationContext,而不是去拿在项目启动之初生成的那个ApplicationContext。

  方法2.首先建立一个工具类

复制代码
package com.wonyen.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class MySpringContext implements ApplicationContextAware {
private static ApplicationContext context;//声明一个静态变量用于保存spring容器上下文

@Override
public void setApplicationContext(ApplicationContext context)
        throws BeansException {
    this.context=context;
}
public static ApplicationContext getContext(){
    return context;
}

}
复制代码
  1.可见该工具类实现了ApplicationContextAware接口,实现该接口的类会接收到spring容器传过来的ApplicationContext对象,从而可以实现操纵spring容器中的所有bean的效果。但是这里我们并不在这个工具类里面去获取bean,我们暂且把获取来的ApplicationContext对象存放起来,放在哪里呢,就是放在该类的一个静态变量中context中,然后我们再给它一个静态的get方法,供其他的类去调用。

  2.有了这个工具类还没用,spring容器不会无缘无故去执行setApplicationContext方法把ApplicationContext 对象传入给它,所以必须在ApplicationContext.xml文件里面去配置,如下所示。



  这样,当项目启动时,就会加载这个工具类,并把ApplicationContext 传入。当然你也可以采用注解的方式,即在该类上加上@Component注解。

  3.在其他类调用,只需要这样一行代码就可以了。

ApplicationContext context =MySpringContext.getContext();
  经验证,采用这种方式获取的ApplicationContext的速度明显比前面那种快很多。

  方法3:还有一种方法可以获取ApplicationContext,就是传入一个ServletContext对象。然后用WebApplicationContextUtils的getWebApplicationContext获取一个WebApplicationContext,WebApplicationContext是ApplicationContext的子类,他比ApplicationContext类多了一个获取ServletContext的方法。

ServletContext servletContext = event.getServletContext();
ApplicationContext application = WebApplicationContextUtils
.getWebApplicationContext(servletContext);
  其实上述方法能获取到WebApplicationContext时因为web项目在启动的时候,在启动spring容器的时候,把WebApplicationContext作为一个属性放入了ServletContext中,所以我们才可以采用spring提供的这个方法来获取到WebApplicationContext。

  方法4:因为WebApplicationContext是ApplicationContext的子类,所以获取到WebApplicationContext其实就是获取到了ApplicationContext。所以还有一种更为简单的方法,直接通过ContextLoader的静态方法getCurrentWebApplicationContext()就可以获取到当前的WebApplicationContext对象.

代码如下:

WebApplicationContext webApplicationContext = ContextLoader
.getCurrentWebApplicationContext();
  PSSS:关于第一种方法和后面三种方法,为了验证猜想,即采用new ClassPathXmlApplicationContext(“applicationContext.xml”);这种方法会重新生成一个ApplicationContext对象,做了如下代码的验证。

ApplicationContext context = MySpringContext.getContext();
ApplicationContext newContext = new ClassPathXmlApplicationContext(
“applicationContext.xml”);
System.out.println(“获取已有的ApplicationContext对象” + context);
System.out.println(“新建的ApplicationContext” + newContext);
  得到的结果是:

  可见这两个确实不是同一个对象。验证成功。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值