复用代码系列:Spring的ContextHolder

xiaoxiao2021-02-28  53

复用代码系列目录

从Spring的ApplicationContext上下文中获取指定的Bean,复用代码如下:

代码一:

package com.spring.context_holder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; /** * 以静态变量保存Spring Application, 可以在任何代码任何地方任何时候取出ApplicationContext * * */ public class SpringContextHolder implements ApplicationContextAware { private static ApplicationContext applicationContext; private static Logger logger = LoggerFactory.getLogger(SpringContextHolder.class); /** * 实现ApplicationContextAware接口的context注入函数,将其存入静态变量 */ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringContextHolder.applicationContext = applicationContext; logger.debug("SpringContextHolder注入ApplicationContext"); } /** * 获取存储在静态变量中的ApplicationContext * * @return */ public static ApplicationContext getApplicationContext() { checkApplicationContext(); return applicationContext; } /** * 从静态变量ApplicationContext中获取Bean,自动转型为所赋值对象的类型 * @param <T> * @param name * @return */ @SuppressWarnings("unchecked") public static <T> T getBean(String name){ checkApplicationContext(); return (T) applicationContext.getBean(name); } @SuppressWarnings("unchecked") public static <T> T getBean(Class<T> clazz){ checkApplicationContext(); return (T) applicationContext.getBeansOfType(clazz); } /** * 清除ApplicationContext静态变量. */ public static void cleanApplicationContext(){ applicationContext=null; } /** * 检查是否获取到了ApplicationContext */ private static void checkApplicationContext() { if (applicationContext == null) { throw new IllegalStateException( "applicationContext未注入,请在applicationContext.xml中定义SpringContextHolder"); } } }

代码二:

package com.spring.context_holder; import org.springframework.beans.BeansException; import org.springframework.beans.factory.DisposableBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @Service @Lazy(false) /** * 获取bean的工具类(通过注入applicationCotnext) * */ public class SpringUtils implements ApplicationContextAware,DisposableBean { public static ApplicationContext applicationContext = null; @SuppressWarnings("unchecked") public static <T> T getBean(String beanName){ isInjected(); return (T) applicationContext.getBean(beanName); } public static <T> T getBean(Class<T> requiredType){ isInjected(); return applicationContext.getBean(requiredType); } @Override public void destroy() throws Exception { System.out.println("springUtils工具类清除注入的applicationContext"); SpringUtils.applicationContext = null; } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { System.out.println("springUtils工具类注入的applicationContext"); SpringUtils.applicationContext = applicationContext; } /** * 判断是否注入 * @return */ public static void isInjected(){ if(SpringUtils.applicationContext == null){ throw new RuntimeException("springUtils applicationContext is not injected!"); } } public static void main(String[] args) { System.out.println(applicationContext); } }

代码三:

package com.spring.context_holder; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class SpringBeanFactoryUtils implements ApplicationContextAware { private static ApplicationContext appCtx; /** * 此方法可以把ApplicationContext对象inject到当前类中作为一个静态成员变量。 * @param applicationContext ApplicationContext 对象. * @throws BeansException * @author wangdf */ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { appCtx = applicationContext; } /** * 获取ApplicationContext * @return * @author wangdf */ public static ApplicationContext getApplicationContext(){ return appCtx; } /** * 这是一个便利的方法,帮助我们快速得到一个BEAN * @param beanName bean的名字 * @return 返回一个bean对象 * @author wangdf */ public static Object getBean(String beanName) { return appCtx.getBean(beanName); } }
转载请注明原文地址: https://www.6miu.com/read-2633062.html

最新回复(0)