Ну, время от времени я сталкиваюсь с одним и тем же вопросом. Насколько я знаю, этого нельзя делать, когда нужно добавить динамические параметры в конструктор. Однако заводской шаблон может помочь.
public interface MyBean {
// here be my fancy stuff
}
public interface MyBeanFactory {
public MyBean getMyBean(/* bean parameters */);
}
@Component
public class MyBeanFactoryImpl implements MyBeanFactory {
@Autowired
WhateverIWantToInject somethingInjected;
public MyBean getMyBean(/* params */) {
return new MyBeanImpl(/* params */);
}
private class MyBeanImpl implements MyBean {
public MyBeanImpl(/* params */) {
// let's do whatever one has to
}
}
}
@Component
public class MyConsumerClass {
@Autowired
private MyBeanFactory beanFactory;
public void myMethod() {
// here one has to prepare the parameters
MyBean bean = beanFactory.getMyBean(/* params */);
}
}
Теперь, MyBean
не является бобом как таковым, но он достаточно близок. Внедрение зависимостей работает, хотя я внедряю фабрику, а не сам бин - нужно внедрять новую фабрику поверх собственной новой реализации MyBean
, если кто-то хочет заменить ее.
Далее, MyBean
имеет доступ к другим bean-компонентам - потому что он может иметь доступ к фабрике с автопроводкой.
И, возможно, кто-то захочет добавить логику в функцию getMyBean
, что я допускаю излишние усилия, но, к сожалению, у меня нет лучшего решения. Поскольку проблема обычно заключается в том, что динамические параметры поступают из внешнего источника, такого как база данных или взаимодействие с пользователем, поэтому я должен создавать экземпляр этого компонента только в середине выполнения, только когда эта информация легко доступна, поэтому Factory
должен быть вполне адекватно.