Spring中獲取application的方式

開發過程當中部分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)
	}
}
相關文章
相關標籤/搜索