Получение экземпляра бина явно во время выполнения - PullRequest
4 голосов
/ 25 ноября 2010

У меня есть случай, когда у меня есть бин (назовем его A), которому нужен какой-то другой бин (B).

Этот B извлекается из статического метода класса с использованием MethodInvokingFactoryBean.Этот статический метод зависит от состояния системы и будет работать после загрузки веб-приложения.

Мне нужен доступ к B только во время выполнения (нет взаимодействия в конструкторе).Как я могу настроить A для автоматической передачи bean-компонента B и инициализировать его только в первый раз, когда этого требует A?

Является ли использование getBean в контексте приложения единственным способом?

Спасибо!

* Редактировать - Добавлено несколько xmls :) *

Это определение компонента B.

<bean id="api" class="com.foo.API"/>
<bean id="B" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" lazy-init="true">
        <property name="targetObject" ref="api"/>
        <property name="targetMethod" value="getFactory"/>
        <qualifier value="myQualifer"/>
</bean>

Это определение компонента A.

<bean id="resources.someRESTResourceA" class="com.foo.MyRestResource"/>

Я не могу использовать Autowire для подключения B к A, потому что он инициализирует его (B) при построении A.

targetMethod B будет работать только после Интернетаприложение было инициализировано.Я могу использовать ApplicationContext.getBean ("B") внутри A, но это не элегантно и будет проблемой с модульным тестированием, если я не сделаю следующее (что также нежелательно):

public BInterface getB() {
 if  (b == null) {
 b = ApplicationContext.getBean("B");
}
return b;
}

1 Ответ

1 голос
/ 25 ноября 2010

Вы должны лениво инициализировать компонент A.

<bean id="A" class="demo.A" lazy-init="true">
  <property name="b" ref="B"/>
</bean>

Вам все еще нужно извлечь компонент A из контейнера Spring, когда вам это нужно, с помощью метода getBean().Он легко доступен с помощью интерфейса ApplicationContextAware .

Если вы автоматически подключаете компонент A к другому компоненту, и этот компонент извлекается до создания компонента B, контейнер Spring создаст компонент A во времяон вводится как свойство другому бину.

...