開發過程當中部分bean並不是交給spring來管理,可是這部分bean中又使用到了spring管理的bean,且生命週期還須要與spring管理的bean一致.因此就找到了如下方法.java
package com.weixin.common.util; import java.util.HashMap; import java.util.Map; import org.springframework.context.ApplicationContext; import org.springframework.web.context.ContextLoader; /** * SpringContext手動工具 * 此類只能夠在單例web項目中使用,若是該web項目有作集羣,請採用其餘方法獲取. * @author fong * @date 2016-11-10 上午10:56:04 */ public class SpringContextUtil { private static ApplicationContext context; private SpringContextUtil() { } private static ApplicationContext getContext() { if (context == null) { synchronized (SpringContextUtil.class) { if (context == null) { context = ContextLoader.getCurrentWebApplicationContext(); } } } return context; } /** * 從當前web實例的Application中獲取bean * @param clazz * @return */ public static <T> T getBean(Class<T> clazz) { return getContext().getBean(clazz); } /** * 獲取當前web實例的ApplicatinContext * @return */ public static ApplicationContext getApplicationContext() { return getContext(); } }
說明:web
在網上還有其餘幾種方式能夠獲取springContext,可是下面這幾種要麼是從新加載了一個spring容器要麼就是必需要容器使用的類被容器初始化.spring
1. 直接加載文件獲取 (這是一個新的容器,與當前web實例獲得的bean是不同的,能夠用單例作測試)app
ApplicationContext context = new FileSystemXmlApplicationContext("xxx.xml"); ApplicationContext context = new ClassPathXmlApplicationContext("resource/spring-beans.xml");
2.繼承抽象類或者實現接口(注意必須由Spring初始化SpringContextUtil,不然獲得的會是NULL)工具
// 繼承ApplicationObjectSupport或者WebApplicationObjectSupport public class SpringContextUtil extends ApplicationObjectSupport{ // 直接用就能夠了 public SpringContextUtil() { // 父類已經定義了 getApplicationContext/setApplicationContext, // 並且是final的方法 super.getApplicationContext(); } } // 接口 public class SpringContextUtil implements ApplicationContextAware{ private ApplicationContext applicationContext; public void setApplicationContext(ApplicationContext applicationContext)throws BeansException { this.applicationContext = applicationContext; } public ApplicationContext getApplicationContext(){ return this.applicationContext; } }
3.經過Spring提供的工具直接獲取(須要在Controller層來作)測試
@Controller @RequestMapping("/test") public class Test { @RequestMapping(value = "/hello") public @ResponseBody String helloPost(HttpServletRequest req) { ServletContext sc = req.getServletContext(); WebApplicationContextUtils.getRequiredWebApplicationContext(sc) } }