本文共 3101 字,大约阅读时间需要 10 分钟。
学习https://github.com/thinkgem/jeesite
今天在写JedisUtils的时候要注入JedisPool,而这个属性被设置为static,@Resource和@Autowired都不可以注入,因为spring不能为静态变量依赖注入。因此需要额外的方法获取spring管理的bean。本文即SpringContextHolder:
1 package com.demo.common.utils; 2 3 import org.apache.commons.lang3.Validate; 4 import org.slf4j.Logger; 5 import org.slf4j.LoggerFactory; 6 import org.springframework.beans.BeansException; 7 import org.springframework.beans.factory.DisposableBean; 8 import org.springframework.context.ApplicationContext; 9 import org.springframework.context.ApplicationContextAware;10 import org.springframework.context.annotation.Lazy;11 import org.springframework.stereotype.Service;12 13 /**14 * 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候取出ApplicaitonContext.15 * Created by Administrator on 2016/2/23.16 */17 @Service18 @Lazy(false)19 public class SpringContextHolder implements ApplicationContextAware ,DisposableBean {20 private static ApplicationContext applicationContext = null;21 private static Logger logger = LoggerFactory.getLogger(SpringContextHolder.class);22 23 /**24 * 去的存储在静态变量中的ApplicationContext25 * @return26 */27 public static ApplicationContext getApplicationContext(){28 assertContextInjected();29 return applicationContext;30 }31 32 /**33 * 从静态变量applicationContext中去的Bean,自动转型为所复制对象的类型34 * @param name35 * @param36 * @return37 */38 public static T getBean(String name){39 assertContextInjected();40 return (T)applicationContext.getBean(name);41 }42 43 /**44 * 从静态变量applicationContext中去的Bean,自动转型为所复制对象的类型45 * @param requiredType46 * @param 47 * @return48 */49 public static T getBean(Class requiredType){50 assertContextInjected();51 return (T)applicationContext.getBean(requiredType);52 }53 54 /**55 * 清楚SpringContextHolder中的ApplicationContext为Null56 */57 public static void clearHolder(){58 if(logger.isDebugEnabled()){59 logger.debug("清楚SpringContextHolder中的ApplicationContext:"+applicationContext);60 }61 applicationContext = null;62 }63 64 65 /**66 * 检查ApplicationContext不为空67 */68 private static void assertContextInjected() {69 Validate.validState(applicationContext!=null,"applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.");70 }71 72 /**73 * 实现ApplicationContextAware接口,注入Context到静态变量74 * @param applicationContext75 * @throws BeansException76 */77 @Override78 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {79 SpringContextHolder.applicationContext = applicationContext;80 }81 82 /**83 * 实现DisposableBean接口,在Context关闭时清理静态变量84 * @throws Exception85 */86 @Override87 public void destroy() throws Exception {88 SpringContextHolder.clearHolder();89 }90 }
唯有不断学习方能改变! -- Ryan Miao
转载地址:http://neykm.baihongyu.com/