配置springmvc在其他类中(spring容器外)获取注入bean
学习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 }
关注我的公众号

分类:
spring
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)