今日长缨在手,何时缚住苍龙。这篇文章主要讲述SpringBoot 获取上下文,获取bean的几种中方式相关的知识,希望能为你提供帮助。
传统Spring项目在写传统的spring项目中,一般通过初始化抽象类AbstractXmlApplicationContext 的实现类,并传入spring.xml,来获取应用上下文,最终通过getBean方法获取bean,如下:
ApplicationContext app1 = new FileSystemXmlApplicationContext("applicationContext.xml");
app1.getBean("beanName");
ApplicationContext app2 = new ClassPathXmlApplicationContext("applicationContext.xml");
app2.getBean("beanName");
SpringBoot项目获取bean的几种方式1. 通过启动类中返回的上下文获取
ConfigurableApplicationContext app = SpringApplication.run(BeanDemoApplication.class, args);
SpringUtil.setAppContext(app);
public class SpringUtil
private static ApplicationContext appContext;
public static void setAppContext(ApplicationContext appContext)
SpringUtil.appContext = appContext;
public static ApplicationContext getAppContext()
return appContext;
在第三方类中使用:
ApplicationContext appContext = SpringUtil.getAppContext();
appContext.getBean("beanName");
2. 通过工具类获取
?
?RequestContextUtils.findWebApplicationContext(HttpServletRequest request)?
?,??WebApplicationContextUtils.getWebApplicationContext(ServletContext sc)?
?a. 在controller中传入request,例如:
public String test(HttpServletRequest request,HttpServletRequest response)
WebApplicationContext wc = RequestContextUtils.findWebApplicationContext(request);
wc.getBean("beanName");
WebApplicationContext wc2 = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());
wc2.getBean("beanName");
b. 在service中或者其他后端服务中获取:
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
WebApplicationContext wc = RequestContextUtils.findWebApplicationContext(request);
WebApplicationContext wc2 = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());
wc.getBean("beanName");
wc2.getBean("beanName");
3. 通过实现接口ApplicationContextAware
@Component
public class TestApplicationContextAware implements ApplicationContextAware
privateApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
this.applicationContext = applicationContext;
public Object getBean(String beanName)
return applicationContext.getBean(beanName);
public ApplicationContext getApplicationContext()
return applicationContext;
在其他类中调用
@Autowired
private TestApplicationContextAware app;
public void testMethod()
app.getBean("beanName");
4. 通过继承抽象类:ApplicationObjectSupport,WebApplicationObjectSupport
原理参考第3点
5. 其他方式
在网上看,发现也可以直接调用:ContextLoader.getCurrentWebApplicationContext(),或者 ContextLoaderListener.getCurrentWebApplicationContext() 其实都是调用同一段代码,如下:
@Nullable
public static WebApplicationContext getCurrentWebApplicationContext()
ClassLoader ccl = Thread.currentThread().getContextClassLoader();
if (ccl != null)
WebApplicationContext ccpt = currentContextPerThread.get(ccl);
if (ccpt != null)
return ccpt;
return currentContext;
说明:目前通过这种方式获取上下文为null,从代码可以看出,上下文是通过?
?currentContextPerThread.get(ccl)?
?? 来获取的,而currentContextPerThread缓存是通过方法??contextInitialized(ServletContextEvent event)?
? 来初始化的,至于为何获取为空【SpringBoot 获取上下文,获取bean的几种中方式】
推荐阅读
- #yyds干货盘点# 彻底理解对象内存分配及Minor GC和Full GC全过程
- #yyds干货盘点# springcloud整合Sentinel使用Nacos存储规则
- #yyds干货盘点#Spring Data JPA入门使用
- WordPress滑块在Safari中加载错误
- WordPress显示PHP代码而不是菜单内容
- wordpress网站只能在本地工作,而不能在在线服务器上工作
- WordPress-在子类别上显示自定义分类父类别
- WordPress回复按钮()
- WordPress(从特定页面删除特色图像)