对于采用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");