• ApplicationContextAware中获取不到bean


    今天遇到一个非常奇怪的问题,写了一个工具类实现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,由于需要加载的类相比较少,所以实现了较快的重启时间。

  • 相关阅读:
    Dijjer:给流媒体插上 P2P 的同党
    gnomecolorchooser:桌面颜色设置小对象
    LXPanel:轻巧疾速的桌面面板
    批量创立缩略图
    SPE IDE:跨平台的 Python IDE
    主管的信
    使用 TRegistry 类[2]: 读取 IE 浏览器的 Start Page
    用多媒体库 Bass.dll 播放 mp3 [15] 设置与获取播放速度
    用多媒体库 Bass.dll 播放 mp3 [14] 频率均衡器
    用多媒体库 Bass.dll 播放 mp3 [13] 混响(Reverb)效果
  • 原文地址:https://www.cnblogs.com/dalianpai/p/13482453.html
Copyright © 2020-2023  润新知