学习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 @Service
18 @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 * 去的存储在静态变量中的ApplicationContext
25 * @return
26 */
27 public static ApplicationContext getApplicationContext(){
28 assertContextInjected();
29 return applicationContext;
30 }
31
32 /**
33 * 从静态变量applicationContext中去的Bean,自动转型为所复制对象的类型
34 * @param name
35 * @param <T>
36 * @return
37 */
38 public static <T> T getBean(String name){
39 assertContextInjected();
40 return (T)applicationContext.getBean(name);
41 }
42
43 /**
44 * 从静态变量applicationContext中去的Bean,自动转型为所复制对象的类型
45 * @param requiredType
46 * @param <T>
47 * @return
48 */
49 public static <T> T getBean(Class<T> requiredType){
50 assertContextInjected();
51 return (T)applicationContext.getBean(requiredType);
52 }
53
54 /**
55 * 清楚SpringContextHolder中的ApplicationContext为Null
56 */
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 applicationContext
75 * @throws BeansException
76 */
77 @Override
78 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
79 SpringContextHolder.applicationContext = applicationContext;
80 }
81
82 /**
83 * 实现DisposableBean接口,在Context关闭时清理静态变量
84 * @throws Exception
85 */
86 @Override
87 public void destroy() throws Exception {
88 SpringContextHolder.clearHolder();
89 }
90 }