1. What is Spring Framework & Spring Boot?
Spring Framework is a Java framework that provides infrastructure support for building enterprise-level applications. Its biggest feature is Inversion of Control (IoC): instead of you creating and wiring objects yourself (
new SomeClass()), Spring creates and manages objects (beans) for you, injecting them where needed.-
Spring Boot is a tool built on top of Spring Framework that makes development much faster by:
- Auto-configuring things (no XML configs anymore).
- Providing “starter” dependencies (just add one line in
pom.xmlinstead of 10). - Embedding Tomcat/Jetty so you can run apps with just
java -jar.
Without Spring Boot, you’d need to manually configure database connections, servlet containers, and beans. With Spring Boot, it’s mostly automatic.
2. Spring Core
- IoC Container: A box that creates and manages your objects (beans).
- ApplicationContext: The main Spring container that loads bean definitions and wires dependencies.
- Bean Lifecycle: How beans are created, initialized, and destroyed.
Example:
@Configuration
public class AppConfig {
@Bean
public MessageService messageService() {
return new MessageService();
}
}
public class MessageService {
public String getMessage() {
return "Hello, Spring!";
}
}
public class Main {
public static void main(String[] args) {
ApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
MessageService service = context.getBean(MessageService.class);
System.out.println(service.getMessage());
}
}
Explanation:
-
@Configurationtells Spring this class defines beans. -
@Beanregisters a bean (MessageService) inside the container. -
ApplicationContextloads the beans and manages them. - Instead of
new MessageService(), we ask Spring for it (getBean).
Bean Scopes:
- singleton (default) → one instance for the whole app.
- prototype → new instance each time you ask for it.
- request → one per HTTP request (web apps only).
- session → one per user session.
3. Interceptors & Filters
- Filters (Servlet level): Work before a request even reaches Spring. Good for logging, authentication, etc.
- Interceptors (Spring MVC level): Work before/after controllers. Good for cross-cutting concerns like measuring execution time.
Example: Filter
@Component
public class LoggingFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
System.out.println("Request received at: " + new Date());
chain.doFilter(req, res);
}
}
Explanation: Every request goes through this filter. It logs the time, then continues (chain.doFilter).
Example: Interceptor
@Component
public class RequestInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) {
System.out.println("Before Controller: " + req.getRequestURI());
return true; // continue request
}
}
Explanation: Before Spring MVC calls your controller method, this interceptor runs. You can stop the request by returning false.
4. Properties / YAML Files
Spring Boot uses application.properties or application.yml for configuration.
application.properties
server.port=8081
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
Explanation:
-
server.port=8081→ runs your app on port 8081. -
spring.datasource.url=...→ configures database connection.
Spring Boot reads this automatically — no manual parsing required.
5. Dependencies
Example pom.xml:
<dependencies>
<!-- Web Starter (REST APIs, Tomcat embedded) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- JPA + H2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
Explanation:
-
spring-boot-starter-webgives you Spring MVC + Tomcat. -
spring-boot-starter-data-jpagives you Hibernate + JPA. -
h2gives you an in-memory database (great for testing). -
spring-boot-starter-securityadds authentication & authorization.
6. H2 Database Configuration
application.properties:
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
Explanation:
-
spring.h2.console.enabled=truelets you open a web-based DB viewer. - Visit
http://localhost:8080/h2-consoleto see your in-memory DB.
7. Build a Todo REST API
Entity
@Entity
public class Todo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private boolean completed;
}
Explanation:
-
@Entitymaps this class to a DB table. -
@Idmarks the primary key. -
@GeneratedValuelets DB auto-generate IDs.
Repository
public interface TodoRepository extends JpaRepository<Todo, Long> { }
Explanation:
-
JpaRepositoryalready provides methods likesave(),findAll(),deleteById(). - No need to write SQL manually.
Controller
@RestController
@RequestMapping("/api/todos")
public class TodoController {
@Autowired
private TodoRepository repo;
@GetMapping
public List<Todo> getAll() {
return repo.findAll();
}
@PostMapping
public Todo create(@RequestBody Todo todo) {
return repo.save(todo);
}
@PutMapping("/{id}")
public Todo update(@PathVariable Long id, @RequestBody Todo todo) {
todo.setId(id);
return repo.save(todo);
}
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id) {
repo.deleteById(id);
}
}
Explanation:
-
@RestController→ class returns JSON. -
@RequestMapping("/api/todos")→ all endpoints start with/api/todos. -
@GetMapping→ returns all todos. -
@PostMapping→ creates a todo (data comes from request body). -
@PutMapping→ updates a todo. -
@DeleteMapping→ deletes a todo by ID.
8. Basic Auth Security
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/**").authenticated()
.anyRequest().permitAll()
)
.httpBasic();
return http.build();
}
@Bean
public UserDetailsService users() {
UserDetails user = User.builder()
.username("admin")
.password("{noop}password") // {noop} = plain text
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
Explanation:
-
csrf().disable()disables CSRF protection (simplifies APIs). -
.httpBasic()enables HTTP Basic Auth → browsers prompt for username/password. -
InMemoryUserDetailsManagerdefines a test user (admin/password). - Now,
GET /api/todosrequires authentication.
Top comments (0)