Spring Autowired服务注释为null

时间:2017-04-21 00:09:00

标签: spring spring-boot spring-data

我有RestController类,它调用Presenter来获取一些数据。

@RestController
@RequestMapping(value="notes/api")
public class NotesRestController {

private GetAllNotesPresenter getAllNotesPresenter;

@RequestMapping(value="/all")
public List<Note> getAll(){
    getAllNotesPresenter = new GetAllNotesPresenterImpl();
    return getAllNotesPresenter.getAll();
}

}

在Presenter类中,我调用DataSource(不是Spring Repository,只是DAO类)。

public class GetAllNotesPresenterImpl implements GetAllNotesPresenter {

private NotesDataSource dataSource;
private NotesRepository repository;

public GetAllNotesPresenterImpl(){

    dataSource = new DatabaseDataSource();
}
@Override
public List<Note> getAll() {
    return dataSource.getAll();
}

}

在DataSource类里面我想做Spring服务的@Autowire,但是我得到空指针异常。服务总是为空。

@Component
public class DatabaseDataSource implements NotesDataSource {

@Autowired
private NotesService notesService;

public DatabaseDataSource(){
}

@Override
public List<Note> getAll() {
    return notesService.getAll();
}

}

1 个答案:

答案 0 :(得分:0)

您正在使用NotesDataSource而不是通过Spring创建new

dataSource = new DatabaseDataSource();

如果您希望Spring为您的对象提供依赖项,请将其设为bean并通过Spring创建它。然后只有Spring知道bean需要依赖。 Spring会创建一个对象图,当您使用new时,它就会破坏。如果您使用new创建对象,则您有责任提供所有依赖项而不是Spring。

@Component
public class AwesomeNotesService implements NotesService {
  ...
}

@Component
public class DatabaseDataSource implements NotesDataSource {
  private final NotesService service;

  @AutoWired
  public GetAllNotesPresenterImpl(NotesService service){
      this.service = service;
  }
}

@Component
public class GetAllNotesPresenterImpl implements GetAllNotesPresenter {
    private final NotesDataSource dataSource;

    @AutoWired
    public GetAllNotesPresenterImpl(NotesDataSource dataSource){
        this.dataSource = dataSource;
    }
}

如果您有多个实施,则可以使用@Qualifier