SpringContextHolder 容器持有工具,有两个作用:

1、持有Spring的容器 ApplicationContext,可在任何地方取出ApplicaitonContext ,获取Service层、Dao层的bean对象实例。

2、获取Spring mvc的容器 WebApplicationContext (依赖于request),从容器中取出Controller的实例对象。

方法 说明 示例

public static ApplicationContext getApplicationContext()

获取Spring的容器 ApplicationContext

这是父容器,可以纯java项目环境(非web)下就可获取到ApplicationContext容器
ApplicationContext c= SpringContextHolder.getApplicationContext();

public static <T> T getBean(String name )

从ApplicationContext中取得Bean

public static <T> T getBean(Class<T> requiredType )

从ApplicationContext中取得Bean (最常使用的方法)

private SystemService systemService;
systemService = SpringContextHolder.getBean(SystemService.class);
systemService.xxx();

public static WebApplicationContext getWebApplicationContext(HttpServletRequest request )

获取Spring mvc的容器 WebApplicationContext

使用SpringContextHolder,如何从容器中取出Controller的实例对象?

先获取WebApplicationContext,再从中取Controller类型的bean

获取Spring mvc的容器 WebApplicationContext (依赖于request)
这是子容器,一定要有web项目环境下才会有WebApplicationContext容器,才能成功的获取
Spring mvc DispatcherServlet容器,允许有多个,是取“当前request”中的容器。
作用:可从WebApplicationContext容器中取Controller类型的bean
HttpServletRequest request;
public WebApplicationContext c= SpringContextHolder.getWebApplicationContext(request);
public static WebApplicationContext getCurrentWebApplicationContext()

获取Spring mvc容器的当前的 WebApplicationContext (不依赖于request)

public static ServletContext getServletContext() 获取ServletContext

补充,可直接注入

@Autowired
ServletContext context;

补充材料:

要Spring工程中,如何获取Spring的容器
有以下几种方法

方法一:
实现ApplicationContextAware接口,Spring初始化时,会通过该方法将ApplicationContext对象注入。

方法二:
实现ApplicationListener接口,Spring初始化完成时,会有事件通知,可取得一个ApplicationContext,多个WebApplicationContext

方法三:
WebApplicationContext web=RequestContextUtils.findWebApplicationContext(request);
WebApplicationContext web=RequestContextUtils.getWebApplicationContext(request);
WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());

方法四:
//下在的方法取的是ApplicationContext
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();