irahardianto / spring-boot-idioms
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
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;
}
}`@ConfigurationPropertiesover@Valuefor typed config.
Spring Data JPA
Query methods for simple queries:
`java
interface TaskRepository extends JpaRepository<Task, UUID> {
List<Task> findByStatusOrderByCreatedAtDesc(TaskStatus status);
@Query("SELECT t FROM Task t WHERE t.priority = :priority AND t.status = 'ACTIVE'")
List<Task> findActivByPriority(@Param("priority") Priority priority);
}`- Projections for read-only views — avoid loading full entities.
@Transactionalon service methods, never on repositories.
REST Controllers
@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);
}
}`@ControllerAdvicefor global exception handling.
Actuator and Observability
- Actuator endpoints enabled for health, metrics, info.
- Micrometer for custom metrics.
- Structured logging with MDC for correlation IDs.
Testing
For universal testing principles, see
.agents/rules/testing-strategy.md. Below: language-specific patterns only.
@SpringBootTestfor integration,@WebMvcTestfor 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());
}
}`- 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