Можно ли привязать простой объект к контексту во время выполнения?
GenericApplicationContext.registerBean() спешит на помощь!
// Любым способом получаем ApplicationContext. Самый простой способ -
// за-autowire-ить его туда, откуда вы хотите зарегистрировать новый бин.
GenericApplicationContext applicationContext = ...
// Любым способом создаём объект, который хотим засунуть в контекст.
Service service = new Service();
// Регистрируем его как бин.
applicationContext.registerBean(Service.class, () -> service);
// Не забываем обновить контекст.
applicationContext.refresh();
// Теперь можно вытаскивать ваш объект из контекста!
Service serviceFromContext = applicationContext.getBean(Service.class);
Если в контексте уже есть AutowiredAnnotationBeanPostProcessor (а он, скорее всего, будет, если вы только не создавали контекст с нуля вручную), то у вашего бина даже будут работать свойства, помеченные аннотацией @Autowired.
Если вам нужно зарегистрировать бин, который будет создан Spring-ом (например, вы хотите, чтобы Spring за-autowire-ил аргументы конструктора), вам нужно регистрировать BeanDefinition:
public class Service {
private RandomProvider randomProvider;
@Autowired
public Service(RandomProvider randomProvider) {
this.randomProvider = randomProvider;
}
public int getNumber() {
return randomProvider.getRandom().nextInt();
}
}
public class RandomProvider {
public Random getRandom() {
return new SecureRandom();
}
}
GenericApplicationContext applicationContext = ...;
applicationContext.registerBean(RandomProvider.class, () -> randomProvider);
BeanDefinition definition = BeanDefinitionBuilder.rootBeanDefinition(Service.class).getBeanDefinition();
applicationContext.registerBeanDefinition("service", definition);
applicationContext.refresh();
Service serviceFromContext = applicationContext.getBean(Service.class);
System.out.println(serviceFromContext.getNumber());
Само собой, Spring сможет за-autowire-ить не только зарегистрированные вами бины, но и те, которые уже есть в контексте.
@Configuration
public class ApplicationConfig {
@Bean
public MyBean random() {
return new MyBean();
}
}
Насколько я понял, то Вам нужно, чтобы бин создавался не один раз во время старта приложения, а каждый раз во время вызова бина. Для этого нужно указать Scope для бина, в вашем случае - это prototype
@Bean
@Scope("prototype")
public Person getPerson() {
return new Person();
}
В таком случае, при каждом вызове будет создаваться новый экземпляр бина.
Ссылки на данную тему: https://www.baeldung.com/spring-bean-scopes https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости