問題:
在線程的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);
}
}
}