非托管类获取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的配置文件中添加对此工具类的声明;

 

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

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


放到声明springUtil的xml中即可。

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

YourBean bean = (YourBean)SpringUtil.getBean("yourBean");

你可能感兴趣的:(非托管类获取Spring托管Bean的两种方法)