ApplicationContextAware中获取不到bean
获取 不到 bean
2023-09-11 14:16:49 时间
今天遇到一个非常奇怪的问题,写了一个工具类实现ApplicationContextAware接口来获取Spring上下文, 代码如下:
public class SpringContextHolder implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
/**
* 获取静态变量中的ApplicationContext.
*/
public static ApplicationContext getApplicationContext() {
assertContextInjected();
return applicationContext;
}
/**
* 从静态变量applicationContext中得到Bean, 自动转型为所赋值对象的类型.
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) {
assertContextInjected();
return (T) applicationContext.getBean(name);
}
/**
* 从静态变量applicationContext中得到Bean, 自动转型为所赋值对象的类型.
*/
public static <T> T getBean(Class<T> requiredType) {
assertContextInjected();
return applicationContext.getBean(requiredType);
}
/**
* 清除SpringContextHolder中的ApplicationContext为Null.
*/
public static void clearHolder() {
applicationContext = null;
}
/**
* 实现ApplicationContextAware接口, 注入Context到静态变量中.
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
SpringContextHolder.applicationContext = applicationContext;
}
/**
* 检查ApplicationContext不为空.
*/
private static void assertContextInjected() {
Validate.validState(applicationContext != null,
"applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.");
}
}
项目启动的时候,APPLICATION_CONTEXT是初始化了的,但是当定时任务调用的时候,获取到的就为null。 后来仔细排查,将Spring Boot Devtools依赖去了,就正常了。项目中用的是quartz,获取容器中的bean,获取不带。
查了下Spring Boot Devtools的热部署原理: 深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包), 另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候, 原来的restart ClassLoader被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
相关文章
- web后台获取不到session中的值(loading sessions from persistent storage),后改用JS传值
- dubbo 获取不到本地地址,返回 127.0.0.1
- 为何在新线程中使用注解获取不到Spring管理的Bean
- PHP使用APC获取上传文件进度
- MFC Windows 程序设计[174]之获取文件信息(附源码)
- Atitit spring单元测试 注解 获取服务名 Spring文件单独放在一个文件夹,去掉dubbo配置,方便测试 里面包含的mybatis 找不到,只好设置成相对于class绝对路径可以了
- iOS swift 位置 定位 获取海拔
- Android 如何从String路径获取Drawable?
- Android源码 在framework中加入一张图片资源,获取不到资源文件
- 个人博客中代码和数据集获取
- java 调用 ffmpeg 指令获取视频的第 n 帧图片-兼容【linux 和 win】
- 【Groovy】map 集合 ( 根据 Key 获取 map 集合中对应的值 | map.Key 方式 | map.‘Key’ 方式 | map[‘Key’] 方式 | 代码示例 )
- 139:vue+openlayers 单击某点,获取当前坐标-多层重叠下的所有features信息
- Android 10.0 设置静态ip重启后获取不到ip的修复
- 锐捷AP下电脑突然获取不到IP地址,不能正常上网