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
Step 1: Set Up a 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: Spring Web
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 theMyService
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:
@SpringBootApplication
: A convenience annotation that combines@Configuration
,@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:
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = MyRepository.class)
: Excludes theMyRepository
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.
Comments
Post a Comment
Leave Comment