Какие аннотации проверяет @ComponentScan
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
@ComponentScan: какие аннотации проверяет
@ComponentScan — это аннотация Spring, которая сканирует указанные пакеты и регистрирует в контексте все компоненты. Она проверяет определённые аннотации и создаёт для них Bean'ы.
Основные аннотации, которые проверяет @ComponentScan
1. @Component
Базовая аннотация для любого Spring-управляемого компонента.
@Component
public class EmailService {
public void sendEmail(String message) {
System.out.println("Sending email: " + message);
}
}
В контексте Spring автоматически создастся Bean с именем emailService (первая буква в lowercase).
2. @Service
Специализированная аннотация для сервисного слоя (бизнес-логика).
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User getUserById(Long id) {
return userRepository.findById(id)
.orElseThrow(() -> new UserNotFoundException(id));
}
public User createUser(CreateUserRequest request) {
User user = new User(request.getName(), request.getEmail());
return userRepository.save(user);
}
}
@Service является подтипом @Component, но с семантикой слоя бизнес-логики.
3. @Repository
Для слоя доступа к данным (Data Access Layer).
@Repository
public class UserRepository {
@Autowired
private JdbcTemplate jdbcTemplate;
public User findById(Long id) {
String sql = "SELECT * FROM users WHERE id = ?";
return jdbcTemplate.queryForObject(sql,
new Object[]{id},
new UserRowMapper());
}
public User save(User user) {
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
jdbcTemplate.update(sql, user.getName(), user.getEmail());
return user;
}
}
Spring автоматически преобразует DataAccessException в общие Exception'ы.
4. @Controller
Для слоя представления (веб-контроллеры).
@Controller
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/users/{id}")
public String getUser(@PathVariable Long id, Model model) {
User user = userService.getUserById(id);
model.addAttribute("user", user);
return "user-detail";
}
}
5. @RestController
Для REST API контроллеров (комбинация @Controller + @ResponseBody).
@RestController
@RequestMapping("/api/v1/users")
public class UserRestController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public ResponseEntity<UserDTO> getUser(@PathVariable Long id) {
User user = userService.getUserById(id);
return ResponseEntity.ok(UserDTO.from(user));
}
@PostMapping
public ResponseEntity<UserDTO> createUser(@RequestBody CreateUserRequest request) {
User user = userService.createUser(request);
return ResponseEntity.status(HttpStatus.CREATED)
.body(UserDTO.from(user));
}
}
6. @Configuration
Для классов конфигурации, которые содержат определение Bean'ов через @Bean.
@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:postgresql://localhost/mydb");
config.setUsername("user");
config.setPassword("password");
return new HikariDataSource(config);
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
Иерархия аннотаций
Все эти аннотации являются подтипами @Component:
- @Service (сервисный слой)
- @Repository (слой доступа к данным)
- @Controller (веб-представление)
- @RestController (REST API)
- @Configuration (конфигурация Bean'ов)
Пример конфигурации с @ComponentScan
@SpringBootApplication
@ComponentScan(basePackages = {
"com.example.service",
"com.example.repository",
"com.example.controller"
})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Как @ComponentScan работает
- Сканирование пакетов (com.example.service, com.example.repository, и т.д.)
- Поиск аннотаций (@Service, @Repository, @RestController, @Configuration, @Component)
- Создание Bean'ов для найденных компонентов
- Инъекция зависимостей через @Autowired
Порядок создания Bean'ов
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(Application.class, args);
// 1. ComponentScan сканирует пакеты
// 2. Configuration классы обрабатываются
// 3. Bean методы вызываются
// 4. Инъекция зависимостей (@Autowired)
// 5. PostConstruct методы вызываются
}
}
Таблица: какие аннотации проверяет @ComponentScan
| Аннотация | Слой | Назначение |
|---|---|---|
| @Component | Общее | Базовый управляемый компонент |
| @Service | Бизнес-логика | Сервисы и use cases |
| @Repository | Доступ к данным | DAO, работа с БД |
| @Controller | Представление | MVC контроллеры |
| @RestController | Представление | REST API контроллеры |
| @Configuration | Конфигурация | Определение Bean'ов |
@ComponentScan — это основной механизм автоматического обнаружения и регистрации компонентов в Spring контексте. Это делает конфигурацию приложения минимальной и декларативной.