Spring Boot Interview Questions
35 questions with detailed answers
Question:
What is Spring Boot and what are its advantages?
Answer:
Spring Boot is an extension of the Spring framework that simplifies the setup and development of Spring applications. Advantages: 1) Auto-configuration 2) Embedded servers 3) Production-ready features 4) Starter dependencies 5) Minimal configuration
Question:
Explain Spring Boot Auto Configuration with example.
Answer:
Auto-configuration automatically configures Spring application based on jar dependencies. Example: Adding spring-boot-starter-web automatically configures DispatcherServlet, embedded Tomcat, and default error pages without manual configuration.
Question:
What is @SpringBootApplication annotation? Explain its components.
Answer:
@SpringBootApplication combines three annotations: 1) @Configuration - marks class as configuration 2) @EnableAutoConfiguration - enables auto-configuration 3) @ComponentScan - enables component scanning in current package and sub-packages.
Question:
How do you create a REST API in Spring Boot? Provide example.
Answer:
Use @RestController annotation:\n\n@RestController\npublic class UserController {\n @GetMapping("/users")\n public List getUsers() {\n return userService.getAllUsers();\n }\n \n @PostMapping("/users")\n public User createUser(@RequestBody User user) {\n return userService.save(user);\n }\n}
Question:
Explain Spring Boot Starters with examples.
Answer:
Starters are dependency descriptors that include related dependencies. Examples: 1) spring-boot-starter-web (web apps) 2) spring-boot-starter-data-jpa (JPA) 3) spring-boot-starter-security (security) 4) spring-boot-starter-test (testing)
Question:
How do you configure database connection in Spring Boot?
Answer:
Configure in application.properties:\n\nspring.datasource.url=jdbc:mysql://localhost:3306/mydb\nspring.datasource.username=root\nspring.datasource.password=password\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\nspring.jpa.hibernate.ddl-auto=update
Question:
What is dependency injection in Spring Boot? Provide example.
Answer:
Dependency injection provides dependencies to a class rather than creating them. Example:\n\n@Service\npublic class UserService {\n @Autowired\n private UserRepository userRepository;\n \n public User findById(Long id) {\n return userRepository.findById(id);\n }\n}
Question:
Explain @RequestMapping vs @GetMapping, @PostMapping.
Answer:
@RequestMapping is generic for all HTTP methods. @GetMapping, @PostMapping are specialized:\n\n@RequestMapping(value="/users", method=RequestMethod.GET)\n// Same as:\n@GetMapping("/users")\n\n@PostMapping is shortcut for @RequestMapping with POST method.
Question:
How do you handle exceptions in Spring Boot?
Answer:
Use @ControllerAdvice for global exception handling:\n\n@ControllerAdvice\npublic class GlobalExceptionHandler {\n @ExceptionHandler(UserNotFoundException.class)\n public ResponseEntity handleUserNotFound(UserNotFoundException ex) {\n return ResponseEntity.status(404).body(ex.getMessage());\n }\n}
Question:
What is Spring Boot Actuator? List important endpoints.
Answer:
Actuator provides production-ready features like monitoring and management. Important endpoints: 1) /health - application health 2) /info - application info 3) /metrics - application metrics 4) /env - environment properties 5) /loggers - logging configuration
Question:
Explain Spring Boot Profiles with example.
Answer:
Profiles provide environment-specific configuration:\n\napplication-dev.properties:\nspring.datasource.url=jdbc:h2:mem:devdb\n\napplication-prod.properties:\nspring.datasource.url=jdbc:mysql://prod-server/db\n\nActivate: spring.profiles.active=dev\n\n@Profile("dev")\n@Component\npublic class DevDataLoader { }
Question:
How do you implement validation in Spring Boot?
Answer:
Use Bean Validation annotations:\n\npublic class User {\n @NotNull\n @Size(min=2, max=30)\n private String name;\n \n @Email\n private String email;\n}\n\n@PostMapping("/users")\npublic User createUser(@Valid @RequestBody User user) {\n return userService.save(user);\n}
Question:
What is @ConfigurationProperties? Provide example.
Answer:
@ConfigurationProperties binds external properties to POJO:\n\n@ConfigurationProperties(prefix="app")\npublic class AppProperties {\n private String name;\n private String version;\n // getters and setters\n}\n\napplication.properties:\napp.name=MyApp\napp.version=1.0
Question:
Explain Spring Boot Testing. What is @SpringBootTest?
Answer:
@SpringBootTest loads complete application context for integration testing:\n\n@SpringBootTest\nclass UserServiceTest {\n @Autowired\n private UserService userService;\n \n @Test\n void testFindUser() {\n User user = userService.findById(1L);\n assertThat(user.getName()).isEqualTo("John");\n }\n}
Question:
How do you implement caching in Spring Boot?
Answer:
Enable caching with @EnableCaching:\n\n@EnableCaching\n@SpringBootApplication\npublic class Application { }\n\n@Service\npublic class UserService {\n @Cacheable("users")\n public User findById(Long id) {\n return userRepository.findById(id);\n }\n \n @CacheEvict("users")\n public void deleteUser(Long id) {\n userRepository.deleteById(id);\n }\n}
Question:
What is @Transactional annotation? Explain with example.
Answer:
@Transactional manages database transactions:\n\n@Service\npublic class BankService {\n @Transactional\n public void transferMoney(Long fromId, Long toId, BigDecimal amount) {\n Account from = accountRepo.findById(fromId);\n Account to = accountRepo.findById(toId);\n from.debit(amount);\n to.credit(amount);\n accountRepo.save(from);\n accountRepo.save(to);\n }\n}
Question:
How do you implement security in Spring Boot?
Answer:
Add spring-boot-starter-security and configure:\n\n@Configuration\n@EnableWebSecurity\npublic class SecurityConfig {\n @Bean\n public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n http.authorizeHttpRequests(auth -> auth\n .requestMatchers("/public/**").permitAll()\n .anyRequest().authenticated()\n ).formLogin();\n return http.build();\n }\n}
Question:
Explain Spring Boot JPA Repository with example.
Answer:
JPA Repository provides CRUD operations:\n\n@Entity\npublic class User {\n @Id\n @GeneratedValue\n private Long id;\n private String name;\n}\n\npublic interface UserRepository extends JpaRepository {\n List findByName(String name);\n \n @Query("SELECT u FROM User u WHERE u.email = ?1")\n User findByEmail(String email);\n}
Question:
What is @Async annotation? How to enable async processing?
Answer:
@Async enables asynchronous method execution:\n\n@EnableAsync\n@SpringBootApplication\npublic class Application { }\n\n@Service\npublic class EmailService {\n @Async\n public CompletableFuture sendEmail(String to, String subject) {\n // Send email logic\n return CompletableFuture.completedFuture(null);\n }\n}
Question:
How do you implement scheduled tasks in Spring Boot?
Answer:
Use @Scheduled annotation:\n\n@EnableScheduling\n@SpringBootApplication\npublic class Application { }\n\n@Component\npublic class ScheduledTasks {\n @Scheduled(fixedRate = 5000)\n public void reportCurrentTime() {\n log.info("Current time: {}", new Date());\n }\n \n @Scheduled(cron = "0 0 12 * * ?")\n public void dailyReport() {\n // Daily report logic\n }\n}
Question:
Explain Spring Boot Conditional Configuration.
Answer:
Conditional configuration creates beans based on conditions:\n\n@Configuration\npublic class DatabaseConfig {\n @Bean\n @ConditionalOnProperty(name="database.type", havingValue="mysql")\n public DataSource mysqlDataSource() {\n return new HikariDataSource();\n }\n \n @Bean\n @ConditionalOnMissingBean\n public DataSource defaultDataSource() {\n return new H2DataSource();\n }\n}
Question:
How do you create custom Spring Boot Starter?
Answer:
Create custom starter:\n1) Create autoconfiguration class:\n@Configuration\n@ConditionalOnClass(MyService.class)\n@EnableConfigurationProperties(MyProperties.class)\npublic class MyAutoConfiguration {\n @Bean\n @ConditionalOnMissingBean\n public MyService myService(MyProperties properties) {\n return new MyService(properties);\n }\n}\n\n2) Create spring.factories:\norg.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.MyAutoConfiguration
Question:
Explain Spring Boot WebFlux and reactive programming.
Answer:
WebFlux is reactive web framework:\n\n@RestController\npublic class ReactiveController {\n @GetMapping("/users")\n public Flux getUsers() {\n return userRepository.findAll();\n }\n \n @GetMapping("/users/{id}")\n public Mono getUser(@PathVariable String id) {\n return userRepository.findById(id);\n }\n}\n\nFlux = 0..N elements, Mono = 0..1 element
Question:
How do you implement custom health indicators?
Answer:
Implement HealthIndicator interface:\n\n@Component\npublic class DatabaseHealthIndicator implements HealthIndicator {\n @Autowired\n private DataSource dataSource;\n \n @Override\n public Health health() {\n try {\n Connection connection = dataSource.getConnection();\n connection.close();\n return Health.up().withDetail("database", "Available").build();\n } catch (Exception e) {\n return Health.down().withDetail("database", "Unavailable").build();\n }\n }\n}
Question:
Explain Spring Boot Metrics and Micrometer.
Answer:
Micrometer provides metrics collection:\n\n@RestController\npublic class MetricsController {\n private final Counter requestCounter;\n private final Timer requestTimer;\n \n public MetricsController(MeterRegistry meterRegistry) {\n this.requestCounter = Counter.builder("api.requests")\n .description("API request count")\n .register(meterRegistry);\n this.requestTimer = Timer.builder("api.request.duration")\n .register(meterRegistry);\n }\n \n @GetMapping("/api/data")\n public String getData() {\n return Timer.Sample.start(requestTimer)\n .stop(requestTimer);\n }\n}
Question:
How do you implement custom configuration properties validation?
Answer:
Use validation annotations on configuration properties:\n\n@ConfigurationProperties(prefix="app")\n@Validated\npublic class AppProperties {\n @NotNull\n @Size(min=1, max=50)\n private String name;\n \n @Min(1)\n @Max(65535)\n private int port;\n \n @Pattern(regexp="^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$")\n private String adminEmail;\n}
Question:
Explain Spring Boot Docker integration and containerization.
Answer:
Spring Boot provides Docker support:\n\n1) Dockerfile:\nFROM openjdk:17-jre-slim\nCOPY target/app.jar app.jar\nEXPOSE 8080\nENTRYPOINT ["java", "-jar", "/app.jar"]\n\n2) Using Buildpacks:\n./mvnw spring-boot:build-image\n\n3) Docker Compose:\nversion: "3"\nservices:\n app:\n image: myapp:latest\n ports:\n - "8080:8080"\n environment:\n - SPRING_PROFILES_ACTIVE=docker
Question:
How do you implement distributed tracing in Spring Boot?
Answer:
Use Spring Cloud Sleuth or Micrometer Tracing:\n\n@RestController\npublic class TracingController {\n @Autowired\n private Tracer tracer;\n \n @GetMapping("/trace")\n public String traceEndpoint() {\n Span span = tracer.nextSpan().name("custom-operation").start();\n try {\n // Business logic\n span.tag("operation.type", "data-processing");\n return "Success";\n } finally {\n span.end();\n }\n }\n}
Question:
Explain Spring Boot Native Image with GraalVM.
Answer:
Native image compiles Spring Boot to native executable:\n\n1) Add native plugin:\n\n org.graalvm.buildtools \n native-maven-plugin \n \n\n2) Build native image:\n./mvnw -Pnative native:compile\n\n3) Register for reflection:\n@RegisterReflectionForBinding(User.class)\n@SpringBootApplication\npublic class Application {\n public static void main(String[] args) {\n SpringApplication.run(Application.class, args);\n }\n}
Question:
How do you implement custom auto-configuration?
Answer:
Create auto-configuration class:\n\n@Configuration\n@ConditionalOnClass(RedisTemplate.class)\n@EnableConfigurationProperties(RedisProperties.class)\npublic class RedisAutoConfiguration {\n \n @Bean\n @ConditionalOnMissingBean\n public RedisConnectionFactory redisConnectionFactory(RedisProperties properties) {\n LettuceConnectionFactory factory = new LettuceConnectionFactory(\n properties.getHost(), properties.getPort());\n return factory;\n }\n \n @Bean\n @ConditionalOnBean(RedisConnectionFactory.class)\n public RedisTemplate redisTemplate(RedisConnectionFactory factory) {\n RedisTemplate template = new RedisTemplate<>();\n template.setConnectionFactory(factory);\n return template;\n }\n}
Question:
Explain Spring Boot Virtual Threads support (Project Loom).
Answer:
Virtual threads provide lightweight concurrency:\n\n@Configuration\n@EnableAsync\npublic class VirtualThreadConfig {\n @Bean\n public Executor taskExecutor() {\n return Executors.newVirtualThreadPerTaskExecutor();\n }\n}\n\n@Service\npublic class VirtualThreadService {\n @Async\n public CompletableFuture processAsync() {\n // This runs on virtual thread\n Thread.sleep(1000); // Won't block OS thread\n return CompletableFuture.completedFuture("Processed");\n }\n}
Question:
How do you implement custom Spring Boot Actuator endpoints?
Answer:
Create custom actuator endpoint:\n\n@Component\n@Endpoint(id = "custom")\npublic class CustomEndpoint {\n \n @ReadOperation\n public Map customInfo() {\n Map info = new HashMap<>();\n info.put("status", "active");\n info.put("version", "1.0.0");\n info.put("timestamp", Instant.now());\n return info;\n }\n \n @WriteOperation\n public void updateConfig(@Selector String key, String value) {\n // Update configuration\n }\n \n @DeleteOperation\n public void resetConfig(@Selector String key) {\n // Reset configuration\n }\n}
Question:
Explain Spring Boot Observability and OpenTelemetry integration.
Answer:
Observability provides metrics, traces, and logs:\n\n@RestController\npublic class ObservableController {\n \n @GetMapping("/api/users")\n @Observed(name = "user.fetch", contextualName = "fetch-users")\n public List getUsers() {\n return userService.findAll();\n }\n}\n\n# application.properties\nmanagement.tracing.sampling.probability=1.0\nmanagement.otlp.tracing.endpoint=http://jaeger:14268/api/traces\nmanagement.metrics.export.prometheus.enabled=true
Question:
How do you optimize Spring Boot application performance?
Answer:
Performance optimization strategies:\n\n1) Lazy initialization:\nspring.main.lazy-initialization=true\n\n2) Connection pooling:\nspring.datasource.hikari.maximum-pool-size=20\n\n3) Caching:\n@Cacheable("users")\npublic User findById(Long id) { }\n\n4) Async processing:\n@Async\npublic void processAsync() { }\n\n5) Profile-specific configs:\nspring.jpa.hibernate.ddl-auto=validate # prod\nspring.jpa.show-sql=false # prod\n\n6) JVM tuning:\n-Xms512m -Xmx2g -XX:+UseG1GC
Question:
Explain Spring Boot 3.x major changes and migration considerations.
Answer:
Spring Boot 3.x major changes:\n\n1) Java 17+ requirement\n2) Jakarta EE migration (javax.* → jakarta.*)\n3) Spring Framework 6.x\n4) Native image improvements\n5) Observability enhancements\n6) Virtual threads support\n\nMigration steps:\n1) Update Java to 17+\n2) Replace javax imports with jakarta\n3) Update dependencies\n4) Test thoroughly\n5) Update configuration if needed\n\nExample migration:\n// Before\nimport javax.persistence.Entity;\n// After\nimport jakarta.persistence.Entity;