← Назад к вопросам

Какие аннотации проверяет @ComponentScan

2.0 Middle🔥 111 комментариев
#Spring Framework

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

@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 работает

  1. Сканирование пакетов (com.example.service, com.example.repository, и т.д.)
  2. Поиск аннотаций (@Service, @Repository, @RestController, @Configuration, @Component)
  3. Создание Bean'ов для найденных компонентов
  4. Инъекция зависимостей через @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 контексте. Это делает конфигурацию приложения минимальной и декларативной.