--- name: spring-boot-idioms description: >- Spring Boot 3.x framework patterns: constructor-based DI, Spring Data JPA, REST controllers with RFC 7807 error handling, Actuator observability, and slice testing. Use when building or maintaining Spring Boot microservices. Pair with java-idioms. --- ## Spring Boot Idioms and Patterns Spring Boot (3.x) rewards auto-configuration, constructor injection, and actuator-driven observability. Idiomatic Spring = annotation-driven, testable, production-ready. > Scope: Spring Boot-specific patterns. For Java: `@.agents/skills/java-idioms/SKILL.md`. ### Dependency Injection 1. **Constructor injection only** — never field injection: ```java @Service public class TaskService { private final TaskRepository repository; private final TaskMapper mapper; public TaskService(TaskRepository repository, TaskMapper mapper) { this.repository = repository; this.mapper = mapper; } } ``` 2. **`@ConfigurationProperties`** over `@Value` for typed config. ### Spring Data JPA 1. **Query methods for simple queries:** ```java interface TaskRepository extends JpaRepository { List findByStatusOrderByCreatedAtDesc(TaskStatus status); @Query("SELECT t FROM Task t WHERE t.priority = :priority AND t.status = 'ACTIVE'") List findActivByPriority(@Param("priority") Priority priority); } ``` 2. **Projections** for read-only views — avoid loading full entities. 3. **`@Transactional`** on service methods, never on repositories. ### REST Controllers 1. **`@RestController` + DTOs** — never expose entities directly: ```java @RestController @RequestMapping("/api/v1/tasks") public class TaskController { @PostMapping @ResponseStatus(HttpStatus.CREATED) public TaskResponse create(@Valid @RequestBody CreateTaskRequest request) { return taskService.create(request); } } ``` 2. **`@ControllerAdvice`** for global exception handling. ### Actuator and Observability 1. **Actuator endpoints** enabled for health, metrics, info. 2. **Micrometer** for custom metrics. 3. **Structured logging** with MDC for correlation IDs. ### Testing > For universal testing principles, see `.agents/rules/testing-strategy.md`. Below: language-specific patterns only. 1. **`@SpringBootTest`** for integration, `@WebMvcTest` for controller slices: ```java @WebMvcTest(TaskController.class) class TaskControllerTest { @Autowired MockMvc mockMvc; @MockBean TaskService taskService; @Test void createTask_returns201() throws Exception { mockMvc.perform(post("/api/v1/tasks") .contentType(MediaType.APPLICATION_JSON) .content("{\"title\":\"Test\",\"priority\":\"HIGH\"}")) .andExpect(status().isCreated()); } } ``` 2. **TestContainers** for database integration tests. ### Related - Java Idioms @.agents/skills/java-idioms/SKILL.md - Database Design Principles @.agents/rules/database-design-principles.md - API Design Principles @.agents/rules/api-design-principles.md