對(duì)于采用Spring MVC+MyBatis或其他數(shù)據(jù)庫(kù)操作框架的應(yīng)用而言,有時(shí)會(huì)遇到在普通類中獲取被Spring托管的Bean的問(wèn)題扁凛。對(duì)此,通常有兩種方法可以解決。而無(wú)論哪種方法冤今,其核心問(wèn)題都是如何獲取到定義Bean的上下文。
方法1:通過(guò)session
在可以獲取到session的類中茂缚,可以直接通過(guò)它獲取上下文戏罢。
Session session = request.getSession();
ApplicationContext ctx = WebApplicationContextUtils
.getRequiredWebApplicationContext(session.getServletContext());
YourBean bean = (YourBean)ctx.getBean("yourBean");
一般地屋谭,對(duì)于在聲明時(shí)未顯示聲明bean ID的類,Spring會(huì)默認(rèn)使用小駝峰法定義該類龟糕⊥┐牛可使用ctx.getBeanDefinitionNames()列出此上下文中定義的所有bean ID。
這種方式比較適合于那些B/S架構(gòu)的web應(yīng)用讲岁。
方法2:通過(guò)實(shí)現(xiàn)ApplicationContextAware接口
這種方法更加普適我擂,無(wú)論那種場(chǎng)合,都能獲取到上下文催首。具體操作如下:
首先扶踊,添加一個(gè)實(shí)現(xiàn)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;
}
/**
* 根據(jù)Bean ID獲取Bean
*
* @param beanId
* @return
*/
public static Object getBean(String beanId) {
return applicationContext.getBean(beanId);
}
}
然后郎任,在Spring的配置文件中添加對(duì)此工具類的聲明秧耗;
<bean id="springUtil" class="com.inspur.utils.SpringUtil"></bean>
注意:springUtil只能獲取到和它定義在同一個(gè)上下文里的bean,換句話說(shuō)舶治,如果想用springUtil獲取某個(gè)bean分井,那么這個(gè)bean必須和springUtil同在一個(gè)上下文中,即聲明放在同一個(gè)xml文件里霉猛。
假如使用的是注解方式如@Controller尺锚、@Component等聲明的bean,那么把
<context:component-scan base-package="com.inspur.dao"/>
放到聲明springUtil的xml中即可惜浅。
最后瘫辩,在需要使用bean的類中,按如下方式獲取坛悉。
YourBean bean = (YourBean)SpringUtil.getBean("yourBean");