如果希望在我们的项目中任何位置都能拿到同一个ApplicationContext来获取IOC容器中的资源,就要让Spring将上下文环境填充到我们能获取的地方。
自定义一个工具类,实现自BeanFactoryAware接口,接口的方法是setBeanFactory,我们实现它,并让其为我们服务,因为Spring在load自己的时候会将上下文环境填充进来。
import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.stereotype.Service;/**
-
获取Spring容器中Bean实例的工具类 */ @Service public class SpringBeanUtils implements BeanFactoryAware {
private static BeanFactory beanFactory;
/**
- 注入sring的BeanFactory实例 */ @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { SpringBeanUtils.beanFactory = beanFactory; }
/**
- 根据bean的名称获取相应类型的对象
- @param beanName bean的名称
- @return Object类型的对象 */ public static Object getBean(String beanName) { return beanFactory.getBean(beanName); }
/**
- 根据bean的Class获取相应类型的对象
- @param beanName bean的名称
- @return Object类型的对象 */ public static <T> T getBean(Class<T> clazz) { return beanFactory.getBean(clazz); } }
在web开发中,还有一种更简单的方法:
/**
* 获取Spring容器中Bean实例的工具类
*/
public class SpringBeanUtils {
/**
* 根据bean的名称获取相应类型的对象,使用泛型,获得结果后,不需要强制转换为相应的类型
* 此方法适用在web开发中获取spring的bean
* @param clazz bean的类型,使用泛型
* @return T类型的对象
*/
public static <T> T getBeanByGeneric(Class<T> clazz) {
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
T bean = wac.getBean(clazz);
return bean;
}
}