由于spring 创建的bean默认都是单例的,在线程中不允许直接注入的,所以我们通过Spring的上下文去获取dao。
首先 实现这个接口ApplicationContextAware
package com.eimageglobal.edu.web.watchDog;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class SpringApplicationContextHolder implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
SpringApplicationContextHolder.context = context;
}
public static Object getSpringBean(String beanName) {
return context==null?null:context.getBean(beanName);
}
public static String[] getBeanDefinitionNames() {
return context.getBeanDefinitionNames();
}
}
写完后需要在spring 中用bean 注入配置一下
在线程业务中 就要通过getSpringBean(“名字”)获取需要的对象,
EduogDao eduDao = (EduogDao ) SpringApplicationContextHolder
.getSpringBean("eduCXXXgDao");
这里的 “名字” 是要和你在 spring 中配置的要一致,配置如下(和上面的配置是两个配置):
注意这两个spring 中的配置都是需要的
下面说是在线程业务中调用了
package com.eimageglobal.edu.web.watchDog;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import com.eimageglobal.edu.biz.dao.EduCourseCollectLogDao;
import com.eimageglobal.edu.biz.domain.model.EduAttendMunber;
import com.eimageglobal.edu.biz.domain.model.EduCourseCollectLogModel;
public class ConferenceTh implements Runnable
{
private static ConcurrentHashMap educList = new ConcurrentHashMap();
boolean flag = true;
public ConcurrentHashMap getEducList()
{
return this.educList;
}
public void run()
{
if (flag)
{
while (true)
{
try
{
synchronized (EduWatch.class) /* 使用了静态,锁就变了 */
{
System.out.println("---------------------心跳监听");
if (!educList.isEmpty())
{
for (String key : educList.keySet())
{
EduWatch ew = educList.get(key);
List attmList = ew.getNumberlist();
try
{
Iterator it = attmList.iterator();
while (it.hasNext())
{
EduogDao eduDao =
(EduogDao ) SpringApplicationContextHolder
.getSpringBean("eduCXXXgDao");
//这个地方的名称就是前面在spring 中配置的需要在线程中注入的dao
ecm.setId(eduAttendMunber.getId());
ecm.setUserId(eduAttendMunber.getDoctorId());
eduCourXXXXgDao.endLearnLog(ecm);
it.remove();
}
}catch (Exception e){
e.printStackTrace();
}
educList.remove(key);
}
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}
}
在线程业务中获取dao 的代码就这一句
EduogDao eduDao = (EduogDao ) SpringApplicationContextHolder
.getSpringBean("eduCXXXgDao");
这样就能在线程中使用spring 中dao 了。