我有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();
}
}
答案 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。