📖 Scenario: You are building a simple Spring Boot application that manages a greeting service. You want to create a reusable component that provides a greeting message.
🎯 Goal: Create a Spring Boot component using the @Component annotation and use it in the main application to display a greeting message.
📋 What You'll Learn
Create a class annotated with @Component
Define a method that returns a greeting string
Inject the component into the main application class
Call the greeting method and store the result in a variable
💡 Why This Matters
🌍 Real World
Spring Boot components are used to organize reusable parts of an application, like services or helpers, that can be injected where needed.
💼 Career
Understanding <code>@Component</code> and dependency injection is essential for building maintainable and testable Spring Boot applications, a common skill in Java backend development jobs.
Progress0 / 4 steps
1
Create a Greeting Component Class
Create a class called GreetingService and annotate it with @Component. Inside the class, create a method called getGreeting that returns the string "Hello, Spring!".
Spring Boot
Hint
Use @Component above the class declaration to make it a Spring component.
2
Add a Field to Inject GreetingService
In the main application class called Application, add a private field of type GreetingService annotated with @Autowired to inject the component.
Spring Boot
Hint
Use @Autowired to let Spring inject the GreetingService instance.
3
Call the Greeting Method
Inside the Application class, create a method called run that calls greetingService.getGreeting() and stores the result in a variable called message.
Spring Boot
Hint
Call the method on the injected greetingService and save the result in message.
4
Add @SpringBootApplication and Run Method Call
Annotate the Application class with @SpringBootApplication. Inside the main method, create an ApplicationContext and get the Application bean. Then call the run method on it.
Spring Boot
Hint
Use SpringApplication.run to start the app and get the Application bean from the context.
Practice
(1/5)
1. What is the main purpose of the @Component annotation in Spring Boot?
easy
A. To mark a class so Spring automatically creates and manages its instance
B. To define a database entity
C. To configure application properties
D. To handle HTTP requests
Solution
Step 1: Understand the role of @Component
The @Component annotation tells Spring to create an instance of the class and manage it automatically.
Step 2: Compare with other options
The other options relate to other Spring features like entities, properties, or controllers, not @Component.
Final Answer:
To mark a class so Spring automatically creates and manages its instance -> Option A
Quick Check:
@Component = automatic management [OK]
Hint: Remember: @Component means Spring manages the class [OK]
Common Mistakes:
Confusing @Component with @Entity
Thinking it handles HTTP requests
Assuming it configures properties
2. Which of the following is the correct way to declare a Spring component class?
easy
A. @Component public class MyService {}
B. @Service public void MyService() {}
C. public class MyService {}
D. @Component void MyService() {}
Solution
Step 1: Check annotation placement and class declaration
The @Component annotation must be placed above a class declaration, like @Component public class MyService {}.
Step 2: Identify incorrect syntax
A plain public class misses the annotation, annotating a method with @Service or @Component is invalid since components must be classes.
Final Answer:
@Component public class MyService {} -> Option A
Quick Check:
Annotation + class declaration = correct syntax [OK]
Hint: Always put @Component above a class, not a method [OK]
Common Mistakes:
Annotating methods instead of classes
Missing the annotation entirely
Using wrong annotations for components
3. Given the code below, what will be the output when app.run() is called?
@Component
public class App {
@Autowired
private ServiceA serviceA;
public void run() {
System.out.println(serviceA.getName());
}
}
@Component
public class ServiceA {
public String getName() {
return "ServiceA";
}
}
medium
A. Runtime NullPointerException
B. null
C. ServiceA
D. Compilation error
Solution
Step 1: Understand component scanning and injection
Both App and ServiceA are annotated with @Component, so Spring creates and manages their instances. The @Autowired injects ServiceA into App.
Step 2: Trace the method call
Calling app.run() prints the result of serviceA.getName(), which returns "ServiceA".
Final Answer:
ServiceA -> Option C
Quick Check:
Autowired injects component = output string [OK]
Hint: If both classes are @Component, autowired works and prints value [OK]
Common Mistakes:
Assuming serviceA is null without injection
Confusing compilation vs runtime errors
Forgetting to annotate both classes
4. What is the problem with the following code snippet?
@Component
public class MyComponent {
@Autowired
private ServiceB serviceB;
public void doWork() {
serviceB.perform();
}
}
Assuming ServiceB is not annotated with @Component or any stereotype, what will happen?
medium
A. Compilation error due to missing import
B. The code will compile and run fine
C. ServiceB will be automatically created by Spring
D. Spring will throw a runtime error due to missing bean
Solution
Step 1: Check bean creation requirements
Spring only manages classes annotated with @Component or similar. Since ServiceB lacks this, Spring won't create its bean.
Step 2: Understand autowiring consequences
When Spring tries to inject serviceB, it finds no bean and throws a runtime error (NoSuchBeanDefinitionException).
Final Answer:
Spring will throw a runtime error due to missing bean -> Option D
Quick Check:
Missing @Component = runtime injection error [OK]
Hint: All injected classes must be annotated for Spring to manage [OK]
Common Mistakes:
Assuming Spring creates beans without annotation
Confusing compile errors with runtime errors
Forgetting to annotate dependencies
5. You want to create two different implementations of an interface PaymentService and have Spring inject the correct one based on a custom qualifier. How should you use @Component to achieve this?
hard
A. Annotate only one implementation with @Component and inject by interface type
B. Annotate both implementations with @Component and use @Qualifier to specify which to inject
C. Use @Component only on the interface, not implementations
D. Create instances manually without @Component
Solution
Step 1: Annotate both implementations
Both classes implementing PaymentService must be annotated with @Component so Spring manages them.
Step 2: Use @Qualifier to distinguish
When injecting, use @Qualifier with the component name to tell Spring which implementation to use.
Final Answer:
Annotate both implementations with @Component and use @Qualifier to specify which to inject -> Option B