The service layer helps organize your code by keeping business logic separate from other parts. It makes your app easier to understand and change.
Why service layer matters in Spring Boot
public interface UserService {
User findUserById(Long id);
void createUser(User user);
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public User findUserById(Long id) {
// business logic here
return userRepository.findById(id).orElse(null);
}
@Override
public void createUser(User user) {
// business logic here
userRepository.save(user);
}
}The service layer is usually an interface and a class implementing it.
Use @Service annotation to mark service classes in Spring Boot.
public interface OrderService {
void placeOrder(Order order);
}
@Service
public class OrderServiceImpl implements OrderService {
@Override
public void placeOrder(Order order) {
// business logic to place order
}
}@Service public class ProductService { public List<Product> getAvailableProducts() { // business logic to filter available products return List.of(); } }
This example shows a service that holds greeting messages and a controller that uses it. The service keeps the greeting logic separate from the controller, making the code cleaner and easier to maintain.
package com.example.demo.service; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.Map; @Service public class GreetingService { private final Map<String, String> greetings = new HashMap<>(); public GreetingService() { greetings.put("en", "Hello"); greetings.put("es", "Hola"); greetings.put("fr", "Bonjour"); } public String greet(String lang, String name) { String greetWord = greetings.getOrDefault(lang, "Hello"); return greetWord + ", " + name + "!"; } } // Usage in a controller package com.example.demo.controller; import com.example.demo.service.GreetingService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class GreetingController { private final GreetingService greetingService; public GreetingController(GreetingService greetingService) { this.greetingService = greetingService; } @GetMapping("/greet") public String greetUser(@RequestParam String lang, @RequestParam String name) { return greetingService.greet(lang, name); } }
Keeping business logic in the service layer helps when you want to change rules without touching controllers or repositories.
Service layer makes unit testing easier because you can test business logic separately.
Controllers should focus on handling web requests, not business rules.
The service layer separates business logic from other parts of the app.
It makes code easier to read, test, and maintain.
Use @Service classes in Spring Boot to create this layer.