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

2016-02-01 浏览 (1544)

如果希望在我们的项目中任何位置都能拿到同一个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 &lt;T&gt; T getBeanByGeneric(Class&lt;T&gt; clazz) {
    WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
    T bean = wac.getBean(clazz);
    return bean;
}

}


^