Bug记录---在线程的run方法中使用service层,报空指针异常

问题:

       在线程的run方法中使用@Autowired注解获得Service层实例,代码如下:

@Component
@EnableScheduling
public class SchedulerTask implements Runnable{
	
	
	@Autowired
	private UserService userService;

	
	
	@Override
	public void run() {
		List<User> list = userService.getAll();		//调用service层
		for (User user : list) {
			System.out.println(user);
		}
	}

}

       出现空指针异常:

原因:

       在线程的run方法中使用注解@autoware注入的bean,会报空指针异常,原因是因为线程中为了线程安全,防注入。

解决:

      在bean工厂中拿实例。

      编写获取bean实例的工具类组件。

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class GetBeanUtil implements ApplicationContextAware {

	private static ApplicationContext applicationContext;

	public void setApplicationContext(ApplicationContext context) {
		GetBeanUtil.applicationContext = context;
	}

	public static Object getBean(String name) {
		return applicationContext.getBean(name);
	}

	public static ApplicationContext getApplicationContext() {
		return applicationContext;
	}
}

      在Spring配置文件中配置ServiceImpl实例:

<!-- ServiceImpl -->
<bean id="userServiceImpl" class="com.ssm.service.impl.UserServiceImpl" />

       在run方法中使用工具类拿到Service层实例:

@Component
@EnableScheduling
public class SchedulerTask implements Runnable{
	
	
	@Override
	public void run() {
		UserService userService = (UserService) GetBeanUtil.getBean("userServiceImpl");
		List<User> list = userService.getAll();		//调用service层
		for (User user : list) {
			System.out.println(user);
		}
	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章