由于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 注入配置一下
<bean class="com.XXXXXX.SpringApplicationContextHolder" />
在线程业务中 就要通过getSpringBean(“名字”)获取需要的对象,
EduogDao eduDao = (EduogDao ) SpringApplicationContextHolder
.getSpringBean("eduCXXXgDao");这里的 “名字” 是要和你在 spring 中配置的要一致,配置如下(和上面的配置是两个配置):
<bean id="eduCouXXXXXogDao" class="com.XXXXXXXXX.EduCourXXXXXXXogDaoImpl"></bean>
注意这两个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<String, EduWatch> educList = new ConcurrentHashMap<String, EduWatch>();
boolean flag = true;
public ConcurrentHashMap<String, EduWatch> 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<EduAttendMunber> attmList = ew.getNumberlist();
try
{
Iterator<EduAttendMunber> 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 了。