Spring Boot Component Scanning: @ComponentScan
author : Sai K
Component scanning in Spring Boot is a powerful feature that automatically detects and registers
beans within
the Spring application context. This simplifies the configuration and development
process by eliminating the need
for manual bean registration.
Prerequisites
- JDK 17 or later
- Maven or Gradle
- IDE (IntelliJ IDEA, Eclipse, etc.)
What is Component Scanning?
Component scanning is the process of automatically discovering and registering beans in the Spring
application
context. It is typically enabled through annotations such as @Component, @Service,
@Repository, and
@Controller.
Step-by-Step Guide
1.1 Create a New Spring Boot Project
Use Spring Initializr to create a new project with the following configuration:
- Project: Maven Project
- Language: Java
- Spring Boot: 3.2.x
- Dependencies: None (we'll add necessary dependencies manually)
Download and unzip the project, then open it in your IDE.
Step 2: Create Components
Create different components in various packages to demonstrate component scanning.
2.1 Create a Service Component
Create a class named MyService in the com.example.demo.service package.
package com.example.demo.service;
import org.springframework.stereotype.Service;
@Service
public class MyService {
public String serve() {
return "Service is working";
}
}
Explanation:
- @Service: Marks the class as a service component, making it eligible for component scanning and
automatic registration.
2.2 Create a Repository Component
Create a class named MyRepository in the com.example.demo.repository package.
package com.example.demo.repository;
import org.springframework.stereotype.Repository;
@Repository
public class MyRepository {
public String fetch() {
return "Repository is working";
}
}
Explanation:
- @Repository: Marks the class as a repository component, making it eligible for component
scanning and automatic registration.
2.3 Create a Controller Component
Create a class named MyController in the com.example.demo.controller package.
package com.example.demo.controller;
import com.example.demo.service.MyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@Autowired
private MyService myService;
@GetMapping("/test")
public String test() {
return myService.serve();
}
}
Explanation:
- @RestController: Marks the class as a REST controller component, making it eligible for
component
scanning and automatic registration. - @Autowired: Automatically injects the MyService bean into the controller.
Step 3: Configure Component Scanning
3.1 Default Component Scanning
By default, Spring Boot scans for components in the package where the @SpringBootApplication
annotation is
located and all its sub-packages. Therefore, if your DemoApplication class is
located in the com.example.demo
package, it will automatically scan for components in the
com.example.demo package and its sub-packages.
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Explanation:
@EnableAutoConfiguration, and @ComponentScan.
3.2 Customizing Component Scanning
If your components are located outside the default package structure, you can customize the component scanning using the @ComponentScan annotation.
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan(basePackages = {"com.example.demo.service", "com.example.demo.repository", "com.example.demo.controller"})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Explanation:
- @ComponentScan(basePackages = {...}): Specifies the packages to scan for components.
Step 4: Running and Testing the Application
4.1 Run the Application
Run the Spring Boot application using your IDE or the command line:
./mvnw spring-boot:run
4.2 Test the Component Scanning
Open a web browser or use a tool like Postman to send a GET request to http://localhost:8080/test.
You should
see the message "Service is working" returned from the MyService component,
indicating that component
scanning and dependency injection are working correctly.
Additional Configurations
Excluding Specific Beans
You can exclude specific beans from being scanned and registered using the @ComponentScan.Filter
annotation.
@SpringBootApplication
@ComponentScan(basePackages = {"com.example.demo"},
excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = MyRepository.class))
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Explanation:
the MyRepository class from component scanning.
Using @Component for Custom Components
You can create custom components using the @Component annotation.
package com.example.demo.custom;
import org.springframework.stereotype.Component;
@Component
public class MyCustomComponent {
public String custom() {
return "Custom component is working";
}
}
Explanation:
@Component: Marks the class as a generic component, making it eligible for component scanning and
automatic registration.
Conclusion
In this comprehensive guide, you have learned how to use component scanning in Spring Boot. We covered:
- Setting up a Spring Boot project.
- Creating different components (@Service, @Repository, @RestController).
- Configuring default and customized component scanning.
- Running and testing the application.
By following these steps, you can effectively use component scanning to simplify the configuration
and
development process in your Spring Boot applications.