Ответ
Spring Boot предоставляет аннотации для быстрой разработки. Вот ключевые из них, сгруппированные по назначению.
1. Запуск и конфигурация приложения
@SpringBootApplication– Мета-аннотация, объединяющая:@SpringBootConfiguration(вариант@Configuration)@EnableAutoConfiguration– включает автоматическую настройку Spring на основе classpath.@ComponentScan– сканирует пакеты на наличие компонентов (@Component,@Serviceи т.д.). Ставится на главный класс приложения.
2. Создание REST-контроллера
@RestController=@Controller+@ResponseBody. Указывает, что класс обрабатывает HTTP-запросы, а возвращаемые значения методов записываются прямо в тело HTTP-ответа (обычно как JSON).@RequestMapping,@GetMapping,@PostMapping,@PutMapping,@DeleteMapping,@PatchMapping– маппинг HTTP-запросов на методы контроллера.
3. Внедрение зависимостей и объявление бинов
@Autowired– автоматическое внедрение зависимости (через конструктор, поле или сеттер). Лучшая практика: использовать внедрение через конструктор (без аннотации над полем, если в классе один конструктор).@Component,@Service,@Repository,@Controller– стереотипные аннотации для объявления Spring-бинов.@Repositoryдополнительно транслирует исключения БД вDataAccessException.@Bean– объявляет бин в классе, помеченном@Configuration. Используется для настройки сторонних компонентов.
4. Работа с конфигурацией
@Value– инъекция значений изapplication.properties/application.ymlв поле.@ConfigurationProperties– привязка и валидация группы свойств к POJO-классу (предпочтительнее@Valueдля сложных конфигураций).@Profile– условная регистрация бина или конфигурации только при активном профиле (например,"dev","prod").
Пример REST-контроллера:
@RestController
@RequestMapping("/api/users")
public class UserController {
private final UserService userService; // Внедрение через конструктор
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
return ResponseEntity.ok(userService.findById(id));
}
@PostMapping
public ResponseEntity<User> createUser(@RequestBody UserDto userDto) {
User created = userService.create(userDto);
return ResponseEntity.created(URI.create("/api/users/" + created.getId())).body(created);
}
} Ответ 18+ 🔞
А, ну вот, опять эти ваши спринг-буты, блядь! Слушай, я тебе сейчас так разложу эти аннотации, что ты, сука, сам как отлаженный микросервис заработаешь. Погнали, только не перебивай, а то в рот меня чих-пых!
1. Запуск и конфигурация — чтоб всё полетело
@SpringBootApplication– это, блядь, три в одном, как шампунь-кондиционер-гель для душа, ёпта! Внутри у неё:@SpringBootConfiguration(просто@Configuration, но в пафосной шляпе).@EnableAutoConfiguration– эта штука, сука, сама всё по класспафу находит и настраивает. Магия, блядь, чистой воды! Подкинул зависимость — она уже знает, что делать.@ComponentScan– сканирует пакеты, как маньяк, ищет все@Component,@Serviceи прочую хуйню. Вешаешь эту аннотацию на главный класс — и приложение, блядь, готово к запуску. Красота!
2. Делаем REST-контроллер — чтоб отдавал JSON как бог
@RestController– это@Controllerи@ResponseBodyв одном флаконе. Говорит: «Мужик, всё, что метод вернёт, пиши сразу в тело ответа, обычно в JSON, и не парься».@GetMapping,@PostMappingи прочие@...Mapping– это, блядь, указатели. Говорят: «Эй, запрос на/usersметодом GET? Заходи, дружок, вот этот метод тебя обслужит».
3. Внедрение зависимостей — чтоб всё само подключалось
@Autowired– автоматическое внедрение. Но слушай сюда, умник: лучшая практика — это внедрять через конструктор! Сделал один конструктор — Spring сам всё подсует. Никаких аннотаций над полями не нужно, выглядит чисто, как слеза младенца.@Component,@Service,@Repository,@Controller– это, типа, профессии для твоих классов.@Repositoryещё и исключения из SQL-говна в нормальные Spring'овские переводит — удобно, блядь!@Bean– когда нужно настроить какую-то стороннюю либу, которую ты не писал. Объявляешь в@Configuration-классе — и всё, бин готов.
4. Конфигурация — чтоб не хардкодить
@Value– берёт значение изapplication.propertiesи тыкает его прямо в поле. Типа@Value("${server.port}").@ConfigurationProperties– это, блядь, круче! Не тыкай по одному значению, а засунь сразу кучу свойств в один POJO-класс. Красиво и удобно.@Profile– условная хуйня. Бин будет создан только если активен нужный профиль (типа "dev" или "prod"). Чтоб в продакшене не светить отладочной фигнёй.
Ну и пример контроллера, чтоб ты понимал масштаб:
@RestController
@RequestMapping("/api/users")
public class UserController {
private final UserService userService; // Внедрили через конструктор — красота!
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
return ResponseEntity.ok(userService.findById(id));
}
@PostMapping
public ResponseEntity<User> createUser(@RequestBody UserDto userDto) {
User created = userService.create(userDto);
return ResponseEntity.created(URI.create("/api/users/" + created.getId())).body(created);
}
}
Вот и вся магия, ёпта! Ничего сложного. Главное — не начинай с @Autowired над каждым полем, как последний распиздяй. Через конструктор, блядь, через конструктор! И будет тебе счастье.