Spring Boot Annotations (1)
Spring Boot Annotations (1)
Introduction
Spring Boot annotations are essential tools in simplifying configuration, reducing boilerplate
code, and providing powerful functionality in Java applications. This guide highlights the key
annotations across different categories, explaining their purpose, usage, and best practices.
@Service
@Service
public class UserService {
// Business logic implementation
}
@Repository
@Repository
public class UserRepository {
// Data access logic
}
● Purpose: Specializes @Component for data access
● Usage: Marks classes that handle database operations
● Best Practice: Enables Spring's exception translation mechanism
@Controller
@Controller
public class UserController {
// Web layer logic
}
@RestController
@RestController
public class UserController {
@GetMapping("/users")
public List<User> getAllUsers() {
// Return users
}
}
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
● Purpose: Enables automatic dependency injection
● Usage: Can be used on constructors, methods, or fields
● Best Practice: Prefer constructor injection for immutability
@Qualifier
@Autowired
@Qualifier("specificUserRepository")
private UserRepository userRepository;
@Primary
@Repository
@Primary
public class PrimaryUserRepository implements UserRepository {
// Primary implementation
}
Configuration Annotations
@Configuration
@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() {
// Configure and return DataSource
}
}
@ConfigurationProperties
@Configuration
@ConfigurationProperties(prefix = "app.database")
public class DatabaseProperties {
private String url;
private String username;
// Getters and setters
}
@PostMapping("/users")
public User createUser(@RequestBody User user) {}
}
@PathVariable
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
@RequestBody
@PostMapping("/users")
public User createUser(@RequestBody UserDTO userDTO) {
return userService.create(userDTO);
}
● Common Annotations:
○ @NotNull: Ensures the value is not null
○ @NotBlank: Ensures a string is neither null nor empty
○ @Size: Validates string length constraints
○ @Email: Validates email format
○ @Pattern: Validates with a regular expression
Transaction Management
@Transactional
@Service
public class UserService {
@Transactional
public void transferFunds(Account from, Account to, BigDecimal amount) {
// Transactional method
}
}
Exception Handling
@ControllerAdvice
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public ErrorResponse handleResourceNotFound(ResourceNotFoundException ex)
{
return new ErrorResponse(ex.getMessage());
}
}
@SpringBootConfiguration
@SpringBootConfiguration
public class AppConfig {
// Bean configurations
}
@EnableAutoConfiguration
@EnableAutoConfiguration
public class AutoConfig {
// Configuration for auto configurations
}
@ComponentScan
@ComponentScan(basePackages = "com.example")
public class AppConfig {
// Custom scanning logic
}
Auto-Configuration Annotations
@ConditionalOnClass
@Configuration
@ConditionalOnClass(DataSource.class)
public class DataSourceConfig {
// Beans are created if DataSource is on the classpath
}
@ConditionalOnMissingClass
@Configuration
@ConditionalOnMissingClass("org.springframework.jdbc.datasource.DataSource")
public class MyDataSourceConfig {
// Beans created if DataSource class is missing
}
@ConditionalOnBean
@Configuration
@ConditionalOnBean(DataSource.class)
public class DatabaseConfig {
// Bean created only if DataSource bean exists
}
@ConditionalOnMissingBean
@Configuration
@ConditionalOnMissingBean(DataSource.class)
public class MyDatabaseConfig {
// Bean created if DataSource bean is not available
}
● Purpose: Creates a bean only if a specified bean is not already defined in the
context.
● Usage: Useful for creating fallback or default beans.
@ConditionalOnProperty
@Configuration
@ConditionalOnProperty(name = "app.feature.enabled", havingValue = "true")
public class FeatureConfig {
// Beans are created if the property is true
}
@ConditionalOnResource
@Configuration
@ConditionalOnResource(resources = "classpath:/somefile.txt")
public class ResourceBasedConfig {
// Bean created if the specified resource exists
}
@ConditionalOnWebApplication and
@ConditionalOnNotWebApplication
@Configuration
@ConditionalOnWebApplication
public class WebConfig {
// Beans for web applications only
}
@ConditionalExpression
@Configuration
@ConditionalExpression("system.properties['env'] == 'prod'")
public class ProductionConfig {
// Beans only loaded in production
}
@Conditional
@Configuration
@Conditional(MyCustomCondition.class)
public class ConditionalConfig {
// Beans created based on custom condition logic
}
@RestController
@RestController
public class UserRestController {
@GetMapping("/users")
public List<User> getAllUsers() {
return userService.getAllUsers();
}
}
@RequestMapping
@RequestMapping("/users")
public class UserController {
// Maps HTTP requests to methods
}
● Purpose: General mapping for HTTP requests.
● Usage: Used to specify a route for a method or class, supports all HTTP
methods.
@RequestParam
@GetMapping("/users")
public User getUser(@RequestParam("id") Long userId) {
return userService.getUserById(userId);
}
@PathVariable
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
@RequestBody
@PostMapping("/users")
public User createUser(@RequestBody UserDTO userDTO) {
return userService.createUser(userDTO);
}
@ResponseBody
@RequestMapping("/users")
@ResponseBody
public List<User> getUsers() {
return userService.getAllUsers();
}
● Purpose: Tells Spring to write the method's return value directly to the HTTP
response body.
● Usage: Typically used in REST APIs for sending JSON or XML responses.
@ModelAttribute
@ModelAttribute("user")
public User getUserModel() {
return new User();
}
@PutMapping
@PutMapping("/users/{id}")
public User updateUser(@PathVariable Long id, @RequestBody UserDTO
userDTO) {
return userService.updateUser(id, userDTO);
}
@PostMapping
@PostMapping("/users")
public User createUser(@RequestBody UserDTO userDTO) {
return userService.createUser(userDTO);
}
@DeleteMapping
@DeleteMapping("/users/{id}")
public void deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
}