开发者

springboot如何获取applicationContext servletContext

开发者 https://www.devze.com 2023-01-13 10:34 出处:网络 作者: ypp91zr
目录springboot获取applicationContext servletContext网上的其他方式配置解决办法看源码总结springboot获取applicationContext sewww.devze.comrvletContext
目录
  • springboot获取applicationContext servletContext
    • 网上的其他方式配置
    • 解决办法
    • 看源码
  • 总结

    springboot获取applicationContext sewww.devze.comrvletContext

    今天在做一个quartz定时任务的时候,要获取servletContext。

    想的是获取到request也可以,但这个定时任务不会发起请求,是定时从数据库查数据,所以request不符合场景。

    然后就想到了servletContext。

    但是在过程中用了很多种方式都获取不到。因为是在普通类,没有controller这种request。

    网上的其他方式配置

    1.servletContext servletContext = ContextLoader.getCurrentWebApplicationContext().getServletContext();

    这种不行,不知道是不是版本问题,目前已失效。

    2.在web.XML里面配置

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener&l开发者_JAV培训t;/listener-class>
    </listener>

    然后获取,也不可行,不需要另行配置xml,因为使用的spring boot

    解决办法

    package com.pinyu.system.config;
     
    import Javax.servlet.ServletContext;
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.annotation.WebListener;
     
    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.spZqYpxringframework.stereotype.Component;
    import org.springframework.util.Assert;
     
    /**
     * @author ypp 创建时间:2018年10月17日 上午11:59:11
     * @Description: TODO(用一句话描述该文件做什么)
     */
    @Component
    @WebListener
    public class SpringBeanTool implements ApplicationContextAware, ServletContextListener {
     
    	/**
    	 * 上下文对象实例
    	 */
    	private ApplicationContext applicationContext;
     
    	private ServletContext servletContext;
     
    	@Override
    	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    		this.applicationContext = applicationContext;
    	}
     
    	/**
    	 * 获取applicationContext
    	 * 
    	 * @return
    	 */
    	public ApplicationContext getApplicationContext() {
    		return applicationContext;
    	}
     
    	/**
    	 * 获取servletContext
    	 * 
    	 * @return
    	 */
    	public ServletContext getServletContext() {
    		return servletContext;
    	}
     
    	/**
    	 * 通过name获取 Bean.
    	 * 
    	 * @param name
    	 * @return
    	 */
    	public Object getBean(String name) {
    		return getApplicationContext().getBean(name);
    	}
     
    	/**
    	 * 通过class获取Bean.
    	 * 
    	 * @param clazz
    	 * @param <T>
    	 * @return
    	 */
    	public <T> T getBean(Class<T> clazz) {
    		return getApplicationContext().getBean(clazz);
    	}
     
    	/**
    	 * 通过name,以及Clazz返回指定的Bean
    python	 * 
    	 * @param name
    	 * @param clazz
    	 * @param <T>
    	 * @return
    	 */
    	public <T> T getBean(String name, Class<T> clazz) {
    		Assert.hasText(name, "name为空编程客栈");
    		return getApplicationContext().getBean(name, clazz);
    	}
     
    	@Override
    	public void contextInitialized(ServletContextEvent sce) {
    		this.servletContext = sce.getServletContext();
    	}
     
    	@Override
    	public void contextDestroyed(ServletContphpextEvent sce) {
     
    	}
     
    }

    这样其他地方照样可以直接注入随时获取使用

    一个是实现了监听器在监听器初始化的时候获取ServletContext ,一个是spring初始化的时候获取ApplicationContext 

    当然也可以只实现监听器就可以的。也可以获取到ApplicationContext,spring早就为我们写好了,WebApplicationContextUtils.getRequiredwebApplicationContext();

    看源码

    springboot如何获取applicationContext servletContext

    获取到的是WebApplicationContext,WebApplicationContext继承ApplicationContext

    springboot如何获取applicationContext servletContext

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号