Ответ
Пометка метода экземпляра (нестатического) аннотацией @Bean вне класса, отмеченного @Configuration, приведёт к некорректной работе Spring и является антипаттерном.
Проблемы:
- Нарушение контракта Spring —
@Beanметоды предназначены для классов@Configuration. Spring создаёт CGLIB-прокси для таких классов, чтобы обеспечить семантику синглтона (вызов метода всегда возвращает один и тот же бин). - Отсутствие управления жизненным циклом — экземпляр класса, содержащий метод, сам не управляется Spring (не является бином).
- Возможное создание множества экземпляров — без проксирования каждый вызов метода может создавать новый объект, нарушая ожидаемую семантику бина.
Пример проблемного кода:
@Component // Или обычный класс
public class MyComponent {
@Bean // НЕПРАВИЛЬНО! Метод в экземпляре компонента.
public MyService myService() {
return new MyService();
}
}
Правильный подход:
Выносите @Bean методы в отдельные классы, помеченные @Configuration.
@Configuration
public class AppConfig {
@Bean // ПРАВИЛЬНО. Spring будет управлять вызовами этого метода.
public MyService myService() {
return new MyService();
}
}