工作需要做一个定时器,但无法实现spring bean的装载,总是报空指针。
写一个SpringContextUtils类实现ApplicationContextAware接口实现。Spring 提供了ApplicationContextAware类,通过它可以获取所有bean上下文。
import java.util.Map;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
/**
* 获取ApplicationContext和Object的工具类
* @author yzl
*
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public class SpringContextUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext arg0)
throws BeansException {
applicationContext = arg0;
}
/**
* 获取applicationContext对象
* @return
*/
public static ApplicationContext getApplicationContext(){
return applicationContext;
}
/**
* 根据bean的id来查找对象
* @param id
* @return
*/
public static Object getBeanById(String id){
return applicationContext.getBean(id);
}
/**
* 根据bean的class来查找对象
* @param c
* @return
*/
public static Object getBeanByClass(Class c){
return applicationContext.getBean(c);
}
/**
* 根据bean的class来查找所有的对象(包括子类)
* @param c
* @return
*/
public static Map getBeansByClass(Class c){
return applicationContext.getBeansOfType(c);
}
}
在spring的xml文件中配置
<!--Spring中bean获取的工具类-->
<bean id="springContextUtils" class="com.travelsky.szky.cts.task.SpringContextUtils" />
然后手动装载
CounterInfoDao counterInfoDao = (CounterInfoDao)SpringContextUtils.getBean("counterInfoDao");
非web项目可以用ClassPathXmlApplicationContext模拟xml文件的加载
new ClassPathXmlApplicationContext("spring-mybatis.xml");