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

Какую используешь аннотацию для передачи Bean в ApplicationContext на старте приложения в Spring?

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

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

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

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

Аннотации Spring для регистрации Bean в ApplicationContext

В Spring Framework существует несколько способов регистрации Bean компонентов при старте приложения, каждый с собственной семантикой и назначением.

@Component — Базовая аннотация

@Component — это универсальная аннотация для маркирования класса как управляемого компонента Spring. Она сообщает Spring контейнеру о необходимости автоматического создания и регистрации объекта в ApplicationContext.

@Component
public class UserRepository {
    public User findById(Long id) {
        // реализация
        return null;
    }
}

Spring автоматически создаст экземпляр UserRepository с именем по умолчанию (первое слово в lowercase: userRepository) и зарегистрирует его в контексте.

Специализированные аннотации

Для разных слоёв приложения есть специализированные варианты @Component:

@Service — для бизнес-логики:

@Service
public class OrderService {
    private final OrderRepository orderRepository;
    
    @Autowired
    public OrderService(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }
    
    public Order createOrder(OrderRequest request) {
        // бизнес-логика создания заказа
        return null;
    }
}

@Repository — для доступа к данным:

@Repository
public class ProductRepository {
    public List<Product> findAll() {
        // запрос к БД
        return null;
    }
}

@Controller — для обработки HTTP запросов (MVC):

@Controller
@RequestMapping("/api/users")
public class UserController {
    private final UserService userService;
    
    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        return ResponseEntity.ok(userService.findById(id));
    }
}

@RestController — комбинация @Controller + @ResponseBody:

@RestController
@RequestMapping("/api/products")
public class ProductController {
    @GetMapping
    public List<Product> getAllProducts() {
        return null;
    }
}

@Bean — Ручная регистрация в конфигурационных классах

Для более сложных сценариев используют метод @Bean в классе, помеченном @Configuration:

@Configuration
public class AppConfig {
    
    @Bean
    public DataSource dataSource() {
        return new DataSource();
    }
    
    @Bean
    public UserService userService(DataSource dataSource) {
        return new UserService(dataSource);
    }
}

Метод, помеченный @Bean, вызывается один раз (по умолчанию), и его возвращаемое значение регистрируется как Bean в контексте.

Порядок инициализации

При старте Spring приложения происходит следующее:

  1. Spring сканирует classpath в поисках классов с аннотациями (@Component, @Service, @Repository, @Controller)
  2. Для каждого найденного класса создаёт экземпляр
  3. Внедряет зависимости через @Autowired (конструктор, поле или setter)
  4. Регистрирует Bean в ApplicationContext
  5. Вызывает методы @PostConstruct (если есть)

Component Scanning

По умолчанию Spring сканирует пакет основного класса приложения и все подпакеты. Можно явно указать пакеты через @ComponentScan:

@SpringBootApplication
@ComponentScan(basePackages = {"com.example.service", "com.example.repository"})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Резюме

Основная аннотация — это @Component и её специализированные варианты для разных слоёв архитектуры. Для сложных объектов и интеграций используй @Bean в конфигурационных классах. Spring автоматически управляет жизненным циклом Bean компонентов и разрешает зависимости между ними.