spring获取已实例化IOC容器中的bean

  • 2016-02-01
  • 浏览 (1414)

如果希望在我们的项目中任何位置都能拿到同一个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;
    }
}


0  赞