環境
- jdk 7
- 4.3.24.RELEASE
工具類
說明
SpringContextHolder 可以方便地引用各種 bean 而不需要注入,通常用它來獲取延時加載的 bean 信息。
BeanFactoryPostProcessor 接口主要是為了使 SpringContextHolder 提前初始化,盡量在所有 bean 初始化之前。
ApplicationContextAware 接口主要是為了注入 ApplicationContext。
源碼
package jiangbo.springweb.context;
import java.util.Locale;
import javax.servlet.ServletContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.MessageSourceAccessor;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import org.springframework.web.context.WebApplicationContext;
@Component
public final class SpringContextHolder implements BeanFactoryPostProcessor, ApplicationContextAware {
/** 日志記錄器 */
private static final Logger LOGGER = LoggerFactory.getLogger(SpringContextHolder.class);
/** ApplicationContext */
private static ApplicationContext context;
/** ServletContext */
private static ServletContext servletContext;
/** Environment */
private static Environment environment;
/** MessageSourceAccessor */
private static MessageSourceAccessor messages;
/**
* Constructor<br>
* 私有化工具類的構造函數
*/
private SpringContextHolder() {
}
/**
* get ApplicationContext<br>
*
* @return ApplicationContext
*/
public static ApplicationContext getSpringContext() {
return context;
}
/**
* get {@link ServletContext}<br>
*
* @return {@link ServletContext}
*/
public static ServletContext getServletContext() {
return servletContext;
}
/**
* get Environment<br/>
*
* @return
*/
public static Environment getEnvironment() {
return environment;
}
/**
* 根據名字獲得spring context中的bean<br>
*
* @param name bean的名稱
* @return bean
*/
public static Object getBean(String name) {
return context.getBean(name);
}
/**
* 根據類型獲得spring context中的bean<br>
*
* @param requiredType bean的類型
* @return bean
*/
public static <T> T getBean(Class<T> requiredType) {
return context.getBean(requiredType);
}
/**
* 根據名稱和類型獲得spring context中的bean<br>
*
* @param name bean 的名稱
* @param requiredType bean的類型
* @return bean
*/
public static <T> T getBean(String name, Class<T> requiredType) {
return context.getBean(name, requiredType);
}
/**
* 獲取properties的值,沒有獲取到返回null<br>
*
* @return 該key對應的value值
*/
public static String getProperty(String key) {
return environment.getProperty(key);
}
/**
* 獲取properties的值,沒有獲取到拋出異常<br>
*
* @throws IllegalStateException if the key cannot be resolved
* @return 該key對應的value值
*/
public static String getRequiredProperty(String key) {
return environment.getRequiredProperty(key);
}
/**
* set Servlet Context<br>
*
* @param sc ServletContext
*/
public static void setServletContext(ServletContext sc) {
servletContext = sc;
}
/**
* 獲取國際化訪問工具<br>
*
* @return 國際化訪問工具
*/
public static MessageSourceAccessor getMessageSourceAccessor() {
return messages;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
init(applicationContext);
}
/**
* 對相關的屬性進行賦值<br/>
*
* @param applicationContext ApplicationContext
*/
private static void init(ApplicationContext applicationContext) {
context = applicationContext;
environment = context.getEnvironment();
if (context instanceof WebApplicationContext) {
servletContext = ((WebApplicationContext) context).getServletContext();
}
messages = new MessageSourceAccessor(context, Locale.SIMPLIFIED_CHINESE);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
LOGGER.info("Spring context holder initialized successful");
}
}