Программно установить конкретный объект bean - Spring DI
В моей программе мне нужно программно настроить ApplicationContext. В частности, у меня есть ссылка на экземпляр MyClass, и я хочу определить его как новый bean, называемый "xxyy".
public void f(MyClass mc, ApplicationContext ac) {
// define mc as the "xxyy" bean on ac ???
...
...
// Now retrieve that bean
MyClass bean = (MyClass) ac.getBean("xxyy");
// It should be the exact same object as mc
Assert.assertSame(mc, bean);
}
API BeanDefinition позволяет мне указать класс нового bean, поэтому он не работает для меня, так как я хочу указать экземпляр.
Мне удалось найти решение, но потребовалось два дополнительных factory beans, которые кажутся слишком большим кодом для такой застенчивой цели.
Существует ли стандартный API, который удовлетворяет мои потребности?
Ответы
Ответ 1
вы можете использовать этот контекст:
GenericApplicationContext mockContext = new GenericApplicationContext();
который имеет
mockContext.getBeanFactory().registerSingleton("name", reference);
и подключите его в реальном контексте
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "real-context.xml" }, mockContext);
а классы:
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
Ответ 2
Вам нужно перепрыгнуть через несколько обручей, чтобы сделать это. Первый шаг - получить ссылку на контекст, лежащий в основе реализации BeanFactory. Это возможно только в том случае, если ваш контекст реализует ConfigurableApplicationContext, который используется большинством стандартных. Затем вы можете зарегистрировать свой экземпляр как синглтон в bean factory:
ConfigurableApplicationContext configContext = (ConfigurableApplicationContext)appContext;
SingletonBeanRegistry beanRegistry = configContext.getBeanFactory();
beanRegistry.registerSingleton("xxyy", bean);
Вы можете "вставить" любой объект в такой контекст.