Реализация на HTTP комуникация
В Spring инстанциите на класовете се създават и управляват от Spring контейнера, който използва т.нар. инверсия на контрола (IoC – Inversion of Control). Вместо ние сами да създаваме обекти чрез new, Spring го прави вместо нас и ни ги предоставя при нужда – това е известно като dependency injection (внедряване на зависимости).
Създаването на инстанции в Spring става като се сканира за компоненти (класове), които са отбелязани със специални анотации. Създава се инстанции на класовете отбелязани с анотации (по подразбиране те са singleton). Инжектира ги в други класове, когато те ги заявят чрез анотации.
Компоненти са Java Bean класове, който е е обикновен Java обект (POJO – Plain Old Java Object), който отговаря на няколко специфични правила, за да може да се използва от други технологии като Java EE, JSP, JSF, Spring и др.
Изисквания за Java Bean:
- Празен (no-args) конструктор – нужен е за да може обектът да се създаде динамично.
- Приватни полета (fields) – достъпни чрез getter и setter методи.
- Сетъри и гетъри (accessor и mutator methods) – следват стандартен шаблон: getX(), setX(value).
Да е сериализуем (по желание) – понякога се изисква да имплементира Serializable, за да може да се записва в поток.
Анотация | За какво служи |
---|---|
@Component | Отбелязва обикновен Spring bean. |
@Service | Специализиран @Component за бизнес логика. |
@Repository | Също @Component , но за достъп до база данни. |
@Controller | За контролери в MVC приложения. |
@RestController | Комбинация от @Controller и @ResponseBody . |
@Autowired | Инжектира зависимост (обект). |
@Bean | Създава ръчно bean, обикновено в @Configuration клас. |
@Configuration | Клас, съдържащ дефиниции на bean-ове. |
@Qualifier | Използва се, когато има повече от една възможна зависимост. |
@RestController
Класическите контролери в Spring се обозначават с анотацията @Controller. Това е специализация на класа @Component, която позволява автоматично да откриване на кляасове за внедряване чрез сканиране на classpath-a.
@RestController е специализиран контролер, който включва освен @Controller и анотацията @ResponseBody, която позволява автоматично сериализиране на върнатия обект в HttpResponse.
@RestController
public class ProductServiceController {
}
@RequestMapping
Анотацията @RequestMapping се използва за дефиниране на URI на заявката за достъп до крайните точки на REST. В него можем да дефинираме и метод на заявката. Методът за заявка по подразбиране е GET.
@RequestMapping(value = "/ex/foos", method = RequestMethod.GET)
public ResponseEntity<Object> getProducts() { }
@GetMapping (@PostMapping, @PutMapping…)
Анотация за съотнасяне на HTTP GET заявки към специфични методи за обработка. По-конкретно, @GetMapping е съставна анотация, която действа като пряк път за @RequestMapping(method = RequestMethod.GET)
@GetMapping("/{id}")
public ResponseEntity<Object> getProducts() { }
@RequestBody
Анотацията @RequestBody се използва за определяне на типа на съдържанието на тялото на заявката.
public ResponseEntity<Object> createProduct(@RequestBody Product product) {
}
@PathVariable
Анотацията @PathVariable се използва за дефиниране на персонализиран или динамичен URI на заявката. Променливата id в URI на заявката се дефинира във фигурни скоби {}, както е показано по-долу.
@GetMapping("/{id}/view")
public ResponseEntity<Object> updateProduct(@PathVariable("id") String id) {
}
@RequestParam
Анотацията @RequestParam се използва за четене на параметри от URL адреса на заявката. Можем да зададем стойност по подразбиране за параметрите на заявката, както е показано тук.
@GetMapping("/api/foos")
public ResponseEntity<Object> getProduct(
@RequestParam(value = "name", required = false, defaultValue = "honey") String name) {
}