关于ServiceLoader注意事项
Bask的软件通常都是利用【SPI】实现相关接口的开放,在使用ServiceLoader的时候,如果项目整合了Spring,需要注意的是在SPI创建这个ServiceLoader的时候,Spring还未完成初始化,所以以下的用法并不是你想想的那样可以生效的:
public class TaskDataset extends BeanDataset {
//spring中的annotation标记不会起作用
@Value("smtp.user")
private String smtpUser;
//spring中的annotation标记不会起作用
@Autowired
private DataService dataservice;
//直接通过Spring的ApplicationContext获取Bean也是不行的
private UserService userService = SpringUtils.getBean(UserService.class);
...
}
正确的做法应该是在方法的内部去访问Spring的资源,例如:
public class TaskDataset extends BeanDataset {
@Override
public List<Field> getFields() {
FieldService fieldService = SpringUtils.getBean(FieldService.class)
...
}
...
}