因为spring 建立的bean默认都是单例的,在线程中不容许直接注入的,因此咱们经过Spring的上下文去获取dao。java
首先 实现这个接口ApplicationContextAware web
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 注入配置一下spring
<bean class="com.XXXXXX.SpringApplicationContextHolder" />
在线程业务中 就要经过getSpringBean(“名字”)获取须要的对象,dom
EduogDao eduDao = (EduogDao ) SpringApplicationContextHolder
.getSpringBean("eduCXXXgDao");ide这里的 “名字” 是要和你在 spring 中配置的要一致,配置以下(和上面的配置是两个配置):this
<bean id="eduCouXXXXXogDao" class="com.XXXXXXXXX.EduCourXXXXXXXogDaoImpl"></bean>
注意这两个spring 中的配置都是须要的线程
下面说是在线程业务中调用了code
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 的代码就这一句xml
EduogDao eduDao = (EduogDao ) SpringApplicationContextHolder
.getSpringBean("eduCXXXgDao");对象这样就能在线程中使用spring 中dao 了。