整体思路:通过getBean,以静态变量引入。
代码:
import java.lang.annotation.Annotation; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import lombok.extern.slf4j.Slf4j; /** * 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候中取出ApplicaitonContext. */ @Slf4j @Component public class SpringContextHolder implements ApplicationContextAware, DisposableBean { private static ApplicationContext applicationContext = null; /** * 实现ApplicationContextAware接口, 注入Context到静态变量中. */ @Autowired public void setApplicationContext(ApplicationContext applicationContext) { log.debug("注入ApplicationContext到SpringContextHolder:" + applicationContext); if (SpringContextHolder.applicationContext != null) { log.warn( "SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + SpringContextHolder.applicationContext); } SpringContextHolder.applicationContext = applicationContext; // NOSONAR } /** * 实现DisposableBean接口,在Context关闭时清理静态变量. */ @Override public void destroy() throws Exception { SpringContextHolder.clear(); } /** * 取得存储在静态变量中的ApplicationContext. */ public static ApplicationContext getApplicationContext() { assertContextInjected(); return applicationContext; } /** * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. */ @SuppressWarnings("unchecked") public static <T> T getBean(String name) { assertContextInjected(); return (T) applicationContext.getBean(name); } /** * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. */ public static <T> T getBean(Class<T> requiredType) { assertContextInjected(); return applicationContext.getBean(requiredType); } /** * 清除SpringContextHolder中的ApplicationContext为Null. */ public static void clear() { log.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext); applicationContext = null; } /** * 检查ApplicationContext不为空. */ private static void assertContextInjected() { if (applicationContext == null) { throw new IllegalStateException( "applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder"); } } /** * @return HttpServletRequest */ public static HttpServletRequest getHttpServletRequest() { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder .getRequestAttributes()).getRequest(); return request; } /** * * @return HttpServletResponse */ public static HttpServletResponse getHttpServletResponse() { HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder .getRequestAttributes()).getResponse(); return response; } /** * @param calss * @return 获取某类型 */ public static <T> Map<String, T> getBeansOfType(Class<T> calss) { return applicationContext.getBeansOfType(calss); } /** * @param annotationType * @return 通过注解 */ public static Map<String, Object> getBeansWithAnnotation( Class<? extends Annotation> annotationType) { return applicationContext.getBeansWithAnnotation(annotationType); } public static String[] getBeanDefinitionNames() { return applicationContext.getBeanDefinitionNames(); } }
使用时:
SpringContextHolder.getBean(类名.class);