Spring Boot 3 patterns for configuration, DI, and web services. Trigger: When building or refactoring Spring Boot 3 applications.
63
74%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./community/spring-boot-3/SKILL.mdLoad this skill when:
Always use constructor injection; avoid field injection.
Use @ConfigurationProperties with validation, not scattered @Value.
Apply @Transactional on application services, not controllers.
package com.acme.config;
import jakarta.validation.constraints.NotBlank;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
@Validated
@ConfigurationProperties(prefix = "payment")
public record PaymentProperties(
@NotBlank String provider,
@NotBlank String apiKey
) { }package com.acme;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@ConfigurationPropertiesScan
public class Application { }package com.acme.order.application;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public final class OrderService {
private final OrderRepository repository;
public OrderService(OrderRepository repository) {
this.repository = repository;
}
@Transactional
public void placeOrder(OrderCommand command) {
repository.save(command.toEntity());
}
}package com.acme.order.api;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/orders")
public final class OrderController {
private final OrderService service;
public OrderController(OrderService service) {
this.service = service;
}
@PostMapping
public ResponseEntity<OrderResponse> place(@RequestBody OrderRequest request) {
service.placeOrder(request.toCommand());
return ResponseEntity.ok(new OrderResponse("ok"));
}
public record OrderRequest(String sku, int qty) {
public OrderCommand toCommand() { return new OrderCommand(sku, qty); }
}
public record OrderResponse(String status) { }
}// BAD: field injection
@Service
public class OrderService {
@org.springframework.beans.factory.annotation.Autowired
private OrderRepository repository;
}// BAD: hard to validate and test
@Service
public class PaymentService {
@org.springframework.beans.factory.annotation.Value("${payment.apiKey}")
private String apiKey;
}| Task | Pattern |
|---|---|
| Inject dependencies | Constructor injection only |
| Read config | @ConfigurationProperties + @Validated |
| Transactions | @Transactional on services |
c8036a3
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.