{ // --- AnimalRepository.java --- /* By using the Farm package here, * we make the contents of * FarmApplication.java visible */ package com.example.Farm; import org.springframework.data.jpa.repository.JpaRepository; public interface AnimalRepository extends JpaRepository{} // --- FarmApplication.java --- /* By using the Farm package here, * we make the contents of * AnimalRepository.java visible */ package com.example.Farm; import java.util.List; import jakarta.persistence.*; import org.springframework.boot.*; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.*; import org.springframework.web.bind.annotation.*; /* Signals spring to perform component scanning. */ @SpringBootApplication public class FarmApplication { /* We mark Animal as and @Entity to signal to JTA that * we wish to abstarct this class as a database table. */ @Entity /* We declare Animal nested only for simplicity. */ public static class Animal { /* We mark id as the primary key for our table. * It could be further used by our program for querying, etc. */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; // - Public // will be visible by (API) queries public String name; // - Private // will NOT be visible by (API) queries private int weight; // - Private \w Getter // will be visible by (API) queries private int age; public int getAge(){ return this.age; } /* Constructor to be used only by US later on. */ Animal(String name, int age, int weight) { this.name = name; this.age = age; this.weight = weight; } /* Default constuctor required by @Entity * since we have another constuctor, * we have to specify it explicitly. */ Animal() { ; } } /* Marking cmdlr as @Bean makes it managed by spring. * In this case it means that it will be called on start up. */ @Bean public /* Spring expects a * CommandLineRunner Spring will pass the othetwise * instance for start private "global" repository * up configurations instance for us * | | * V V */ CommandLineRunner cmdlr(AnimalRepository repository) { return (args) -> { repository.save(new Animal("Bob", 3, 10)); }; } /* Marking this class as a @RestController makes spring scan it * for @*Mapping-s. * Otherwise they would be ignored. */ @RestController static class Controller { /* Internal copy of the global repository instance. */ private final AnimalRepository repository; Controller(AnimalRepository repository) { this.repository = repository; } /* Associate the calling of this function * with GET requests arriving to :URL:/hello */ @GetMapping("/hello") /* Making the return type List will * result in a JSON of N auto serialized * Animal instances */ List say_hello(){ return repository.findAll(); // findAll is inherited by AnimalRepository } } /* Finally, launch or spring application at once. * As we insstantiate SpringApplication and there by the spring eco-system, * we trigger its commandline, Inversion of Control, Database and web service * features in the process. */ public static void main(String[] args) { SpringApplication.run(FarmApplication.class, args); } } }