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

摘要:
当使用Spring作为IoC容器时,有些类不方便直接注入bean,因此需要手动获取bean类型。之前,我编写了两个工具方法,根据bean的名称和类型获取bean实例。发现每次调用后,都需要将其强制转换为目标结果类型。这很不方便。我突然想到,我可以使用Java泛型方法来实现一个新的工具方法,并避免类型转换。importorg.springframework.beans。BeansException;进口。弹簧框架。清洁。工厂。BeanFactory;进口。弹簧框架。清洁。工厂。BeanFactory软件;进口。弹簧框架。立体造型。服务importorg.springframework.web.context。ContextLoader;importorg.springframework.web.context。WebApplicationContext;importcn.fansunion.webdemo.domain。用户;/***获取Spring容器中bean实例的工具类。

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

免责声明:文章转载自《获取Spring容器中Bean实例的工具类(Java泛型方法实现)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇P1006 传纸条(dp)Spring Boot整合Mybatis配置详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

VB.NET中LINQ TO List泛型查询语句(分组,聚合函数)

Public Class LinqToList 'LINQ在C#中使用比较方便,但是在VB中使用比较麻烦,复杂,和C#用法并不太一样 Dim listNew As List(Of Product) = New List(Of Product) '新商品 Dim listOld As List(Of Product) = New L...

【c#基础】泛型

1:减少代码的选项可以是用Object类,也可以使用泛型 但是Object类进行类型传递不是类型安全的。泛型类使用泛型类型保证了类型安全。 泛型类泛型方法泛型接口、结构、委托 泛型优点: 1:性能 装箱和拆箱很容易使用,但性能损失比较大。 泛型的话在编译的时候就会动态生成我们定义他的类型,这样就不用进行装箱和拆箱。 var list=new List<...

SpringBoot整合Shiro 二:Shiro配置类

  环境搭建见上篇:SpringBoot整合Shiro 一:搭建环境   Shiro配置类配置 shiro的配置主要集中在 ShiroFilterFactoryBean 中       关于权限:   anon:无需认证就可以访问 ​  authc:必须认证了才能访问​   user:必须用有了 记住我 功能才能用​   perms:拥有对某个资源的...

【jsp】jsp中的动作元素

一,动作元素(Action):预定义的java代码。目的在于代码的可重用性。  1,为请求阶段提供信息,允许在页面之间转移控制权。  2,JSP2.0规范定义了标准动作,标准动作是一些标签,影响JSP运行时的行为和对客户请求的响应。在页面被转换为Servlet时,JSP容器遇到这些标签,就使用预先定义的对应于该标签的java代码来代替它。  3,动作元素语...

关联查询报错org.apache.ibatis.builder.BuilderException: Ambiguous collection type for property 'episodeList'. You must specify 'javaType' or 'resultMap'.

三表关联查询报错, 单表不报错, 之前写过一遍没报错,后来查出问题所在了,原来是insert语句多写了半格括号"(" 这个问题查了很久很久... 报错信息如下 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vi...

Spring在代码中获取bean的方式(获取接口所有实现类)

方法一:在初始化时保存ApplicationContext对象 方法二:通过Spring提供的utils类获取ApplicationContext对象 方法三:继承自抽象类ApplicationObjectSupport 方法四:继承自抽象类WebApplicationObjectSupport 方法五:实现接口ApplicationContextAwar...