SpringUtil最佳实践
2019-08-03 本文已影响0人
千淘萬漉
我们知道在Spring工程中,由Spring托管的对象可以注入依赖,由Spring帮我们管理了所有声明了的Bean,但是在编码中也偶尔会遭遇到一个普通的Java类中,想直接使用Spring提供的Bean,这样往往就需要通过Spring的上下文对象从中拿到一个我们想要的bean对象,这样的需求还不少,除了获得Spring托管的Bean,可能还需要发布事件、获取环境信息等等,这样就需要一个Spring的工具类,提供这样一些静态方法,我这里总结了一个不错的满足上类需求的SpringUtil工具类:
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* Spring工具类
*/
@Slf4j
@Component
public class SpringUtil implements ApplicationContextAware {
/**
* spring全局配置项
*/
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
if (applicationContext == null) {
applicationContext = context;
log.info("ApplicationContext init success,you can invoke by SpringUtil.getApplicationContext() to get ApplicationContext,init bean count="
+ applicationContext.getBeanDefinitionCount() + ",bean=" + JSONObject.toJSONString(applicationContext.getBeanDefinitionNames()));
}
}
/**
* @return spring全局配置项
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 通过name获取 Bean.
*
* @param name
* @return
*/
public static <T> T getBean(String name) {
return (T) applicationContext.getBean(name);
}
/**
* 通过class获取Bean.
*
* @param clazz
* @return
*/
public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}
/**
* 通过name,以及Clazz返回指定的Bean
*
* @param name
* @param clazz
* @return
*/
public static <T> T getBean(String name, Class<T> clazz) {
return applicationContext.getBean(name, clazz);
}
/**
* 获取实现相关接口的类关系
*
* @param clazz
* @return
*/
public static <T> Map<String, T> getBeansOfType(Class<T> clazz) {
return applicationContext.getBeansOfType(clazz);
}
/**
* 发布事件
*
* @param event
*/
public static void publishEvent(ApplicationEvent event) {
applicationContext.publishEvent(event);
}
/**
* 获取环境信息
*/
public static Environment getEnvironment() {
return applicationContext.getEnvironment();
}
}
其中:@Slf4j是基于Lombok的插件。