问题:
在线程的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);
}
}
}