非托管类获取Spring托管Bean的两种方法

对于采用Spring MVC+MyBatis或其他数据库操作框架的应用而言,有时会遇到在普通类中获取被Spring托管的Bean的问题。对此,通常有两种方法可以解决。而无论哪种方法,其核心问题都是如何获取到定义Bean的上下文。

方法1:通过session

在可以获取到session的类中,可以直接通过它获取上下文。

Session session = request.getSession();
ApplicationContext ctx = WebApplicationContextUtils
                    .getRequiredWebApplicationContext(session.getServletContext());
YourBean bean = (YourBean)ctx.getBean("yourBean");

一般地,对于在声明时未显示声明bean ID的类,Spring会默认使用小驼峰法定义该类。可使用ctx.getBeanDefinitionNames()列出此上下文中定义的所有bean ID。

这种方式比较适合于那些B/S架构的web应用。

方法2:通过实现ApplicationContextAware接口

这种方法更加普适,无论那种场合,都能获取到上下文。具体操作如下:
首先,添加一个实现ApplicationContextAware接口的类;

package com.inspur.utils;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
 * spring工具类
 * 
 * @author jamie
 * @since 2016-1-27
 */
public class SpringUtil implements ApplicationContextAware {
    /**
     * 上下文
     */
    private static ApplicationContext applicationContext;

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        SpringUtil.applicationContext = applicationContext;
    }

    /**
     * 根据Bean ID获取Bean
     * 
     * @param beanId
     * @return
     */
    public static Object getBean(String beanId) {
        return applicationContext.getBean(beanId);
    }
}

然后,在Spring的配置文件中添加对此工具类的声明;

<bean id="springUtil" class="com.inspur.utils.SpringUtil"></bean> 

注意:springUtil只能获取到和它定义在同一个上下文里的bean,换句话说,如果想用springUtil获取某个bean,那么这个bean必须和springUtil同在一个上下文中,即声明放在同一个xml文件里。

假如使用的是注解方式如@Controller、@Component等声明的bean,那么把

<context:component-scan base-package="com.inspur.dao"/>

放到声明springUtil的xml中即可。

最后,在需要使用bean的类中,按如下方式获取。

YourBean bean = (YourBean)SpringUtil.getBean("yourBean");
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,803评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,118评论 6 342
  • 刚上大学时,有天晚上出去吃宵夜时,恰巧碰上一哥们,就坐到一块吃块起来。相谈甚欢时,他的导员突然经过。 他几乎是被吓...
    七秒药水阅读 4,704评论 0 0

友情链接更多精彩内容