# Spring Boot, Spring Data JPA & Annotations — Advanced Java

Source: https://www.geekswithgeeks.com/en/advanced-java/adv-spring-boot-deep

> Go beyond hello-world Spring Boot — starters and auto-configuration, repository interfaces from Spring Data JPA, and the core stereotype and wiring annotations.

## Starters and auto-configuration

A **starter** (`spring-boot-starter-web`, `spring-boot-starter-data-jpa`) is a curated dependency bundle. **Auto-configuration** inspects what's on the classpath and configures matching beans (a `DataSource` if a JDBC driver is present, an embedded Tomcat if `starter-web` is there) — you override only what you need in `application.properties`.

## Spring Data JPA: repositories for free

Extend `JpaRepository<Entity, IdType>` and get `save`, `findById`, `findAll`, `delete` implemented for you. Declare a method following the naming convention and Spring **derives the query** from the method name — no SQL, no implementation.

```java
interface OrderRepository extends JpaRepository<Order, Long> {
    List<Order> findByStatusAndCustomerId(Status status, Long customerId);
    Optional<Order> findFirstByCustomerIdOrderByCreatedAtDesc(Long customerId);
}
```

## The core annotations

`@Component` marks any Spring-managed bean; `@Service` and `@Repository` are semantic specialisations of it for business logic and data access. `@Autowired` requests injection (optional on a single constructor since Spring 4.3). `@RestController` = `@Controller` + `@ResponseBody`, so every method's return value is written straight into the HTTP response as JSON.
