×
文章路径: Java

SpringBoot获取ApplicationContext

发表于1年前(Feb 26, 2017 1:20:37 PM)  阅读 976  评论 0

分类: Java

标签: spring ApplicationContext WebApplicationContext ApplicationContextAware

首先来看一个工具类:

import org.springframework.context.ApplicationContext;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;

public class SpringUtil {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

	}
	
	private static WebApplicationContext ac = null;
	
	private static ApplicationContext getApplicationContext() {
		if(ac==null) {
			ac = ContextLoader.getCurrentWebApplicationContext();
		}
		return ac;
	}
	
	public static Object getBean(String beanName) {
		return getApplicationContext().getBean(beanName);
	}

}

这是笔者在很多项目中经常使用的一个工具类,主要是在一些没有在Spring容器管理下的bean中使用Spring容器管理的bean的场景下使用,有点拗口。大概意思就是,如果在一个地方,如果你不方便通过注入的方式使用spring管理的bean,就可以通过这个工具在任何地方获取spring容器管理的bean,而不是自己去new一个。

很简单的代码,主要就是根据ContextLoader.getCurrentWebApplicationContext()来获取Spring上下文,但是使用SpringBoot后,这下行不通了,ContextLoader.getCurrentWebApplicationContext()获取到的对象为null。SpringBoot和传统web容器还是有点差异,所幸,我们还是可以通过ApplicationContextAware的方式来获取ApplicationContext。

对上面的代码稍微做下修改,增加setApplicationContext方法,到时在ApplicationContextAware将ApplicationContext设置进来:

import org.springframework.context.ApplicationContext;
import org.springframework.web.context.WebApplicationContext;

public class SpringUtil {
	
	private static ApplicationContext ac = null;
	
	public static ApplicationContext getApplicationContext() {
		return ac;
	}
	
	public static void setApplicationContext(ApplicationContext ac) {
		SpringUtil.ac = ac;
	}
	
	public static Object getBean(String beanName) {
		return getApplicationContext().getBean(beanName);
	}

}
@Component
public class ApplicationContextRegister implements ApplicationContextAware {

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		SpringUtil.setApplicationContext(applicationContext);
	}

}

这样,我们又可以像往常一样使用SpringUtil这个工具了。

发表评论