Настройте каждое расширение в отдельном контексте приложения. В контексте каждого приложения определите BeanPostProcessor, который сохраняет каждый bean-компонент, определенный контекстом приложения, в реестр, который сопоставляет bean-компоненты с контекстами приложения.
Настройте контекст приложения, который будет родительским для каждого контекста приложения расширения. В этом файле конфигурации определите bean-компонент, который сопоставляет имена bean-компонентов с идентификаторами контекста приложения.
<!-- parent.xml -->
<beans>
<bean
id="beanNameToApplicationContextIdMap"
class="java.util.HashMap"/>
</beans>
Файл конфигурации контекста приложения расширения определяет экземпляр BeanNameToApplicationContextIdMapInserter
, который является пользовательским классом, реализующим интерфейс BeanPostProcessor
. Свойство applicationContextId
настроено на строку, идентифицирующую контекст приложения. Свойство map
настраивает экземпляр для обновления карты, определенной в контексте родительского приложения.
<!-- alpha.xml -->
<beans>
<bean class="com.example.BeanNameToApplicationContextIdMapInserter">
<property name="applicationContextId" value="alpha"/>
<property name="map" ref="beanNameToApplicationContextIdMap"/>
</bean>
<bean id="alphaService" class="...">
</bean>
</beans>
Исходный код BeanNameToApplicationContextIdMapInserter
:
public class BeanNameToApplicationContextIdMapInserter implements BeanPostProcessor {
private String applicationContextId;
private HashMap<String, String> map;
public void setApplicationContextId(String id) {
this.applicationContextId = id;
}
public void setMap(HashMap<String, String> map) {
this.map = map;
}
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException
{
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException
{
map.put(beanName, applicationContextId);
return bean;
}
}
Вы можете использовать SingletonBeanFactoryLocator для настройки контекста родительского приложения и контекста каждого дополнительного приложения.
<!-- beanRefFactory.xml -->
<beans>
<bean
id="parentApplicationContext"
class="org.springframework.context.support.ClassPathXmlApplicationContext">
<constructor-arg>
<value>parent.xml</value>
</constructor-arg>
</bean>
<bean
id="alphaApplicationContext"
class="org.springframework.context.support.ClassPathXmlApplicationContext">
<constructor-arg>
<value>alpha.xml</value>
</constructor-arg>
<constructor-arg>
<ref bean="parentApplicationContext"/>
</constructor-arg>
</bean>
<bean
id="bravoApplicationContext"
class="org.springframework.context.support.ClassPathXmlApplicationContext">
<constructor-arg>
<value>bravo.xml</value>
</constructor-arg>
<constructor-arg>
<ref bean="parentApplicationContext"/>
</constructor-arg>
</bean>
</beans>
Вот пример кода, который считывает карту контекста bean-компонента в приложение.
public class Main {
private static ApplicationContext getApplicationContext(String name) {
BeanFactoryLocator bfl = SingletonBeanFactoryLocator.getInstance();
BeanFactoryReference bfr = bfl.useBeanFactory(name);
return (ApplicationContext) bfr.getFactory();
}
public static void main(String[] args) {
ApplicationContext parentApplicationContext =
getApplicationContext("parentApplicationContext");
HashMap<String, String> map = (HashMap<String, String>)
parentApplicationContext.getBean("beanNameToApplicationContextIdMap");
System.out.println(map.get("alphaService"));
System.out.println(map.get("bravoService"));
}
}
person
Chin Huang
schedule
07.06.2009