从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);
}
}