spring boot 获取applicationContext servletContext

本文介绍在Quartz定时任务中如何正确获取ServletContext的方法。通过实现ServletContextListener和ApplicationContextAware接口,可在Spring Boot环境中成功获取到上下文信息,为定时任务提供必要的环境支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在做一个quartz定时任务的时候,要获取servletContext。想的是获取到request也可以,但这个定时任务不会发起请求,是定时从数据库查数据,所以request不符合场景。然后就想到了servletContext。但是在过程中用了很多种方式都获取不到。因为是在普通类,没有controller这种request。

网上的其他方式配置:

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

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

2.在web.xml里面配置

<listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</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.springframework.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
	 * 
	 * @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(ServletContextEvent sce) {

	}

}

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

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

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

看源码:

获取到的是WebApplicationContext,WebApplicationContext继承ApplicationContext

<think>嗯,用户让我介绍一下Spring Boot的运行调用过程。首先,我需要确定用户对Spring Boot的了解程度。可能他们已经有Java和Spring的基础,但想深入了解启动机制。我需要从入口类开始讲起,因为这是Spring Boot应用的起点。 接下来,用户可能想知道@SpringBootApplication注解的作用,这里需要拆解成@Configuration、@EnableAutoConfiguration和@ComponentScan,分别解释它们的功能。特别是自动配置的原理,可能涉及spring.factories文件和条件注解,这部分需要简明扼要,别太复杂。 然后,ApplicationContext的创建过程是关键,得说明如何加载Bean定义和实例化。Bean的生命周期也是重点,包括初始化方法、PostProcessor这些概念,但要注意别让用户感到困惑。内嵌Servlet容器的启动可能用户不太熟悉,需要解释Tomcat或Jetty是如何被集成的,以及DispatcherServlet的注册过程。 最后,确保整个流程连贯,从启动类到自动配置,再到Bean的加载和Servlet容器的启动,每个步骤都要清晰。可能用户实际遇到启动问题,比如配置错误或Bean无法注入,所以强调自动配置的条件和组件扫描的路径也很重要。总之,用简单的中文,结构分明地解释整个过程,帮助用户建立整体的认识。</think>Spring Boot 的运行调用过程可以分为以下几个关键步骤(以下代码示例均为伪代码表示): $$main() \rightarrow @SpringBootApplication \rightarrow SpringApplication.run() \rightarrow ApplicationContext \rightarrow AutoConfiguration \rightarrow Bean\ Lifecycle \rightarrow Embedded\ Server$$ 一、入口类与注解解析 1. 启动入口 ```java // 所有Spring Boot应用的入口 public static void main(String[] args) { SpringApplication.run(Application.class, args); // 核心启动方法 } ``` 2. @SpringBootApplication 注解解析 包含三个核心注解: - `@Configuration`:标记为配置类 - `@EnableAutoConfiguration`:启用自动配置 - `@ComponentScan`:组件扫描(默认扫描启动类所在包及其子包) 二、SpringApplication.run() 执行流程 $$SpringApplication\ initialization \rightarrow Environment\ preparation \rightarrow Context\ creation \rightarrow Bean\ initialization \rightarrow Application\ startup$$ 1. 初始化阶段 ```java new SpringApplication(primarySources).run(args); ``` - 加载 `META-INF/spring.factories` 中的配置 - 确定应用程序类型(Servlet/Reactive) - 初始化 ApplicationContextInitializer 2. 环境准备 - 加载配置文件(application.properties/yml) - 激活 Profiles - 配置日志系统 三、ApplicationContext 创建 ```java ConfigurableApplicationContext context = createApplicationContext(); ``` 1. 根据应用类型创建对应的上下文: - `AnnotationConfigServletWebServerApplicationContext`(Servlet) - `AnnotationConfigReactiveWebServerApplicationContext`(Reactive) 2. 核心处理流程: - 加载启动类配置 - 执行 `BeanDefinitionLoader` - 注册自动配置类(来自 `spring-autoconfigure-metadata.properties`) 四、自动配置机制 $$Conditional\ Evaluation \rightarrow AutoConfiguration\ Import \rightarrow Bean\ Registration$$ 1. 条件评估流程: - 检查类路径是否存在指定类(如:`@ConditionalOnClass(DataSource.class)`) - 检查是否已存在相同类型的Bean - 检查配置文件设置 2. 自动配置示例(DataSource自动配置): ```java @Configuration @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) @EnableConfigurationProperties(DataSourceProperties.class) public class DataSourceAutoConfiguration { // 根据配置创建数据源 } ``` 五、Bean生命周期管理 ```java refreshContext(context); // 关键方法 ``` 1. BeanFactory准备 2. BeanPostProcessor注册 3. 初始化单例Bean 4. 发布ApplicationStartedEvent事件 六、内嵌Web服务器启动 $$WebServerFactoryCustomizer \rightarrow ServletWebServerFactory \rightarrow DispatcherServlet\ Registration$$ 1. Tomcat启动流程示例: ```java TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); TomcatWebServer server = (TomcatWebServer) factory.getWebServer(servletContext); server.start(); // 启动内嵌服务器 ``` 七、请求处理流程 $$HTTP\ Request \rightarrow DispatcherServlet \rightarrow HandlerMapping \rightarrow Controller\ Method \rightarrow Response\ Rendering$$ 典型调用链: ``` 客户端请求 → 服务器接收 → DispatcherServlet.doServletService() → HandlerAdapter.handle() → 执行Controller方法 → 处理返回值(JSON/视图等) → 返回响应 ``` 关键注意事项: 1. 启动类必须放在根包,确保组件扫描生效 2. 自动配置通过`spring.autoconfigure.exclude`可禁用特定配置 3. 使用`@SpringBootTest`进行集成测试时会完整模拟启动流程 4. 可通过`SpringApplicationBanner`自定义启动banner 理解Spring Boot的运行机制可以帮助开发者: - 更高效地进行性能调优 - 准确定位启动失败问题 - 自定义扩展点实现 - 合理设计应用结构
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值