獲取Spring容器中Bean實例的工具類(Java泛型方法實現)


在使用Spring做IoC容器的時候,有的類不方便直接注入bean,需要手動獲得一個類型的bean。

因此,實現一個獲得bean實例的工具類,就很有必要。

以前,寫了一個根據bean的名稱和類型獲取bean實例的2個工具方法,發現每次調用后,都需要強制轉換成目標結果類型。

這樣很不方便,突然想到可以使用Java泛型方法,實現1個新的工具方法,避免了類型轉換。

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.stereotype.Service;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;

import cn.fansunion.webdemo.domain.User;

/**
 * 獲取Spring容器中Bean實例的工具類(Java泛型方法實現)。
 *
 * @author leiwen@FansUnion.cn
 */
@Service
public class SpringBeanUtils implements BeanFactoryAware {

    private static BeanFactory beanFactory;

    /**
     * 注入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的類型獲取相應類型的對象,沒有使用泛型,獲得結果后,需要強制轉換為相應的類型
     *
     * @param clazz
     *            bean的類型,沒有使用泛型
     * @return Object類型的對象
     */
    public static Object getBean(Class clazz) {
        WebApplicationContext wac = ContextLoader
                .getCurrentWebApplicationContext();
        Object bean = wac.getBean(clazz);
        return bean;
    }

    /**
     * 根據bean的名稱獲取相應類型的對象,使用泛型,獲得結果后,不需要強制轉換為相應的類型
     *
     * @param clazz
     *            bean的類型,使用泛型
     * @return T類型的對象
     */
    public static <T> T getBean2(Class<T> clazz) {
        WebApplicationContext wac = ContextLoader
                .getCurrentWebApplicationContext();
        T bean = wac.getBean(clazz);
        return bean;
    }

    // 用法演示
    public static void main() {
        // 需要強制轉換,不夠便捷
        Class o1 = (Class) SpringBeanUtils.getBean2(Class.class);

        // 需要強制轉換,不夠便捷
        User user = (User) SpringBeanUtils.getBean("user");

        // 不用強制轉換--推薦使用
        User user2 = SpringBeanUtils.getBean2(User.class);
    }
}


好處:避免強制轉換,比較方便,可讀性更好。調用次數越多,節省的開發時間也越多。

相關閱讀提高生產力

http://blog.csdn.net/fansunion/article/category/1572687

原文鏈接http://FansUnion.cn/articles/3313(小雷網-FansUnion.cn)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM