Какую используешь аннотацию для передачи Bean в ApplicationContext на старте приложения в Spring?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Аннотации 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 приложения происходит следующее:
- Spring сканирует classpath в поисках классов с аннотациями (@Component, @Service, @Repository, @Controller)
- Для каждого найденного класса создаёт экземпляр
- Внедряет зависимости через @Autowired (конструктор, поле или setter)
- Регистрирует Bean в ApplicationContext
- Вызывает методы @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 компонентов и разрешает зависимости между ними.