文档章节

获取Spring容器中Bean实例的工具类(Java泛型方法实现)

FansUnion
 FansUnion
发布于 2015/10/22 10:29
字数 537
阅读 27
收藏 1

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

© 著作权归作者所有

共有 人打赏支持
FansUnion
粉丝 57
博文 858
码字总数 825464
作品 0
丰台
高级程序员

暂无文章

ubuntu 18.04 desktop 截图快捷键

如图,点击下方的 add shortcut 为这个快捷键命名 输入截图 command gnome-screenshot -a 设置快捷键 常用为 Ctrl - Alt + a 参考 http://os.51cto.com/art/200903/113091_all.htm...

公孙衍
22分钟前
0
0
一个六年Java程序员的从业总结:比起掉发,我更怕掉队

恍然间,发现自己在这个行业里已经摸爬滚打了五、六年了,原以为自己就凭已有的项目经验和工作经历怎么着也应该算得上是一个业内比较资历的人士了,但是今年在换工作的过程中却遭到了重大的挫...

老道士
25分钟前
12
2
Spacemacs快捷键

由于Spacemacs快捷键太多,为方便使用,将常用的快捷键记录在此。 以下快捷键都是在emacs的evil模式下 Buffers操作 创建名称为<buffer-name>的buffer SPC b b <buffer-name> 从已打开的buf...

yxmsw2007
29分钟前
1
0
GO冒泡,二分查找

package mainimport("fmt")func main() {var arr [5]int = [5]int{11,13,9,2,25}maopao(&arr)fmt.Println("arr = ", arr) //[2 9 11 13 25]findIndex := binaryFind(&arr, 0......

汤汤圆圆
53分钟前
1
0
工作2年半跳槽面试阿里,成功拿到offer,凭什么?

2015年刚毕业的我,进入了一家小小的公司实习工作,在学校学了三年软件开发的我,还是想去寻找一份互联网行业的工作,这样更能学以致用发挥自己的特长。一直到18年三月份,我辞掉已有的工作,...

java知识分子
58分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部