在使用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)
