关于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)
        ...
    }

    ...

    }

results matching ""

    No results matching ""