- 0x00 前言
最近在做项目的项目, 有个功能是从数据库中读取一些参数, 项目用的是spring mvc + spring + mybatis, 也就是需要在java类中通过spring获取mapper.
- 0x01 思路
怎样在一个普通的类获取spring的applicationContext这个很关键. 我的思路是这样的:
① 实现接口ApplicationContextAware, 实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。
② 配置bean, Spring初始化时,通过该方法将ApplicationContext对象注入.
- 0x02 代码
SpringBeanFactoryUtils.java
package com.tooldin.portal.util;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
/**
* Created by William Suen on 2016/7/20.
*/
public class SpringBeanFactoryUtils implements ApplicationContextAware {
private static ApplicationContext appCtx;
/**
* 此方法可以把ApplicationContext对象inject到当前类中作为一个静态成员变量。
*
* @param applicationContext ApplicationContext 对象.
* @throws BeansException
* @author wangdf
*/
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringBeanFactoryUtils.appCtx = applicationContext;
}
/**
* 获取ApplicationContext
*
* @return
* @author wangdf
*/
public static ApplicationContext getApplicationContext() {
return appCtx;
}
/**
* 这是一个便利的方法,帮助我们快速得到一个BEAN
*
* @param beanName bean的名字
* @return 返回一个bean对象
* @author wangdf
*/
public static Object getBean(String beanName) {
return appCtx.getBean(beanName);
}
}
在applicationContext.xml文件中配置
<bean id="springBeanFactoryUtils" class="com.tooldin.portal.util.SpringBeanFactoryUtils"/>
好的, 上面两步都已经做好了, 那我们来试试吧.
用法
SpringBeanFactoryUtils.getApplicationContext().getBean(Mapper.class);
或者
SpringBeanFactoryUtils.getApplicationContext().getBean(“beanName”);
package com.tooldin.portal.util.wxpay;
import com.tooldin.mapper.SysWeixinMapper;
import com.tooldin.pojo.SysWeixin;
import com.tooldin.portal.util.SpringBeanFactoryUtils;
import org.springframework.beans.factory.annotation.Autowired;
/**
* <p>这里放置各种配置数据</p>
* Created by William Suen on 2016/7/20.
*/
public class Configure{
private static SysWeixin sysWeixin;
private static SysWeixin getSysWeixin() {
if (sysWeixin == null) {
SysWeixinMapper weixinMapper = SpringBeanFactoryUtils.getApplicationContext().getBean(SysWeixinMapper.class);
sysWeixin = weixinMapper.selectByPrimaryKey(1);
}
return sysWeixin;
}
public static String getAppId() {
return getSysWeixin().getWxAppid();
}
}
- 0x03 参考资料
参考资料 获取Spring容器中的Bean
参考资料 @Autowired bean is null in Test Listener class