가정하자 나는 다음과 같은 스프링 MVC 컨트롤러봄 MVC - 경합 조건?
@RestController
@RequestMapping("/books")
public class BooksController {
@Autowired
private final BooksRepository booksRepository;
@RequestMapping(value="/search", method=RequestMethod.POST, consumes="application/json")
public Collection<Book> doSearch(@RequestBody final SearchCriteria criteria) {
return booksRepository.find(criteria);
}
}
내 문제는 다음과 같다 다음 SearchQueryBuilder
구현
@Component
public class SearchQueryBuilder {
private final List<String> keywords = new LinkedList<String>();
public SearchQueryBuilder clear() {
keywords.clear();
return this;
}
public SearchQueryBuilder addKeywords(final List<String> keywords) {
for (String keyword : keywords) {
add(keyword);
}
return this;
}
private SearchQueryBuilder add(final String keyword) {
keywords.add(keyword);
return this;
}
public String buildQuery() {
...
}
public Object[] buildParams() {
...
}
}
다음과 같은 저장소
@Service
public class BooksRepository {
@Autowired
private final JdbcTemplate jdbcTemplate;
@Autowired
private final SearchQueryBuilder searchQueryBuilder;
public Collection<BookLite> find(final SearchCriteria criteria) {
// TODO: will this cause race conditions?
searchQueryBuilder.clear().addKeywords(criteria.getKeywords());
final String query = searchQueryBuilder.buildQuery();
final Object[] params = searchQueryBuilder.buildParams();
return jdbcTemplate.query(query, params, new BookExtractor());
}
}
에게 있습니다. SearchQueryBuilder 클래스는 스레드로부터 안전하지 않으므로이 방법을 사용하면 경쟁 조건이 발생할 수 있습니다. 이것을 처리하는 좋은 방법은 무엇입니까? 빈 범위를 예를 들어로 변경하는 것만으로 충분합니다. 의뢰?
예, 경쟁 조건이 있습니다. 왜 손으로 쓰지 않고 생성 된 Spring 저장소를 사용하지 않는가? – chrylis
스프링 데이터 JPA를 의미합니까? 감사합니다. –
왜 빌더를 관리 Bean ('@ Component')으로 정의합니까? 왜 당신이 무언가를 만들 필요가있을 때마다'new'로 만들지 않는 것이 좋을까요? –