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

最新文章

  1. AndroidAnnotations(Code Diet)android快速开发框架
  2. Canvas绘图中的路径描边与填充
  3. 新玩具---Amazon Kindle PaperWhite 2
  4. TestNg线程池配置、执行次数配置、超时配置
  5. iframe自定义高度
  6. mysql字符串相关
  7. Qt之findChild
  8. bzoj2875: [Noi2012]随机数生成器
  9. NodeJS 框架 Express 从 3.0升级至4.0的新特性
  10. nyoj 756 重建二叉树
  11. 自制单片机之五……LCD12864的驱动
  12. 微信小程序 app.json 配置
  13. Jupyter-notebook 导出时不显示Input[]代码
  14. 前端面试题整理—Vue篇
  15. udp套接字及利用socketserver模块实现并发以及并发编程
  16. SQLSERVER case when 的学习
  17. 多项式相关&&生成函数相关&&一些题目(updating...)
  18. vue2.0学习笔记之组件
  19. 【模板】MST(Kruskal)
  20. 开源 java CMS - FreeCMS2.2 菜单管理

热门文章

  1. AOC 电视机T3212M 进入 工厂模式方法,修改开机启动方式
  2. git提交的规范
  3. MYSQL8.0的安装方法
  4. CF620E New Year Tree(线段树+二进制)
  5. cmd 操作命令
  6. Linux LVM(逻辑卷管理)
  7. oracle job有定时执行功能
  8. POJ 3276 枚举+差分?
  9. BZOJ 1103 DFS序+线段树
  10. ES6学习笔记(二)变量的解构与赋值