ITKeyword,专注技术干货聚合推荐

注册 | 登录

Spring学习笔记四: 从Spring容器中获取Bean

xunzaosiyecao 分享于 2016-07-14

推荐:Spring 一、 之Bean容器初始化以及bean实例的获取

转载请注明出处  Spring IOC容器初始化及其所代理的Bean实例的获取 IOC容器主要用到两个包(以Spring3.2为例): 1)spring-beans-3.2.0.RELEASE.jar:主要是BeanF

2020腾讯云共同战“疫”,助力复工(优惠前所未有!4核8G,5M带宽 1684元/3年),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1054

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
地址https://www.aliyun.com/minisite/goods

通过BeanFactory获取bean实例

package org.jiankunking.utils;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;

/** * Created by jiankunking on 2016/12/22. */
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 getBeanByName(String beanName) {
        return beanFactory.getBean(beanName);
    }

    /** * 根据bean的类型获取相应类型的对象 * * @param clazz bean的类型,没有使用泛型 * @return Object类型的对象 */
    public static Object getBeanByClass(Class clazz) {
        WebApplicationContext wac = ContextLoader
                .getCurrentWebApplicationContext();
        Object bean = wac.getBean(clazz);
        return bean;
    }

    /** * 根据bean的名称获取相应类型的对象 * * @param clazz bean的类型,使用泛型 * @return T类型的对象 */
    public static <T> T getGenericsBeanByClass(Class<T> clazz) {
        WebApplicationContext wac = ContextLoader
                .getCurrentWebApplicationContext();
        T bean = wac.getBean(clazz);
        return bean;
    }

}

在spring.xml中添加以下部分,已获取工具类bean实例:

<bean id="springBeanUtils" class="org.jiankunking.utils.SpringBeanUtils"/>

通过ApplicationContext获取bean实例

package org.jiankunking.utils;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.io.DefaultResourceLoader;

import java.io.IOException;

/** * Spring的工具类,用来获得Spring中的bean */
public class SpringBeanUtils implements ApplicationContextAware, DisposableBean {

    private static ApplicationContext applicationContext;

    /** * 实现ApplicationContextAware接口的context注入函数, 将其存入静态变量. */
    public void setApplicationContext(ApplicationContext applicationContext) {
        SpringBeanUtils.applicationContext = applicationContext; // NOSONAR
    }

    /** * 取得存储在静态变量中的ApplicationContext. */
    public static ApplicationContext getApplicationContext() {
        checkApplicationContext();
        return applicationContext;
    }

    /** * 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型. */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) {
        checkApplicationContext();
        return (T) applicationContext.getBean(name);
    }

    /** * 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型. */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(Class<T> clazz) {
        checkApplicationContext();
        return (T) applicationContext.getBean(clazz);
    }

    /*** * 类似于getBean(String name)只是在参数中提供了需要返回到的类型。 * * @param name * @param requiredType * @return * @throws BeansException */
    public static <T> T getBean(String name, Class<T> requiredType) throws BeansException {
        return applicationContext.getBean(name, requiredType);
    }

    /** * 如果给定的bean名字在bean定义中有别名,则返回这些别名 * * @param name * @return * @throws NoSuchBeanDefinitionException */
    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
        return applicationContext.getAliases(name);
    }

    /** * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) * * @param name * @return boolean * @throws NoSuchBeanDefinitionException */
    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
        return applicationContext.isSingleton(name);
    }

    /** * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true * * @param name * @return boolean */
    public static boolean containsBean(String name) {
        return applicationContext.containsBean(name);
    }

    /** * 清除applicationContext静态变量. */
    public static void cleanApplicationContext() {
        applicationContext = null;
    }

    private static void checkApplicationContext() {
        if (applicationContext == null) {
            throw new IllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义UtilsSpringContext");
        }
    }

    public static String getRootRealPath() {
        String rootRealPath = "";
        try {
            rootRealPath = getApplicationContext().getResource("").getFile().getAbsolutePath();
        } catch (IOException e) {
            //获取系统根目录失败
        }
        return rootRealPath;
    }

    public static String getResourceRootRealPath() {
        String rootRealPath = "";
        try {
            rootRealPath = new DefaultResourceLoader().getResource("").getFile().getAbsolutePath();
        } catch (IOException e) {
            //获取系统根目录失败
        }
        return rootRealPath;
    }

    @Override
    public void destroy() throws Exception {
        SpringBeanUtils.cleanApplicationContext();
    }

}

在spring.xml中添加以下部分,已获取工具类bean实例:

推荐:Spring框架学习【IoC容器载入Bean资源文件】

1.当Spring的IoC容器将Bean定义的资源文件封装为Spring的Resource之后,接下来要做的就是通过Spring的资源加载器(resourceLoader)读入Bean定义资源文件的过程。

<bean id="springBeanUtils" class="org.jiankunking.utils.SpringBeanUtils"/>

本文参考以下两篇文章:
http://penghuaiyi.iteye.com/blog/2042296
http://www.tuicool.com/articles/numyuq

作者:jiankunking 出处:http://blog.csdn.net/jiankunking

推荐:Java获取Tomcat启动中的spring管理的容器注入的实体,用来获取相应的bean

Java获取Tomcat启动中的spring管理的容器, 用来获取相应的bean:具体方法如下 1.创建一个类并让其实现org.springframework.context.ApplicationContextAware接

通过BeanFactory获取bean实例 package org.jiankunking.utils;import org.springframework.beans.BeansException;import org.springframework.beans.factory.BeanFactory;import org.spring

相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。