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);
		}
	}

}

 

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