zoukankan      html  css  js  c++  java
  • 获取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)

  • 相关阅读:
    IO操作之BIO、NIO、AIO
    IO之Socket网络编程
    this.getClass()和super.getClass()得到的是同一个类
    经济增长的背后
    SVN分支创建与合并
    .net类库里ListView的一个BUG
    VS2010调试技巧
    用C#代码编写的SN快速输入工具
    请教如何改善C#中socket通信机客户端程序的健壮性
    利用WebClient实现对Http协议的Post和Get对网站进行模拟登陆和浏览
  • 原文地址:https://www.cnblogs.com/qitian1/p/6463411.html
Copyright © 2011-2022 走看看