2010-09-30 2 views
4

Я разоблачаю bean-компонент, который не является потокобезопасным через http-invoker Spring. Я хочу, чтобы каждый удаленный вызов получал новый экземпляр компонента. Я начал с установки рамки для прототипа для компонента, который я размещаю в XML-сервлет диспетчера. Но, похоже, он создал только один экземпляр. Таким образом, все клиентские потоки одновременно обращались к одному экземпляру компонента.Spring http invoker, bean scope не почитается?

Далее я также установил scopr для прототипа для HttpInvokerProxyFactoryBean в client spring-config.xml. Но даже тогда я вижу один экземпляр возвращаемого компонента.

Любые идеи о том, что я делаю неправильно? Или кто-то еще столкнулся с этой проблемой.

Заранее благодарен.

Вот соответствующие фрагменты

DispatcherServlet-servlet.xml

<bean id="fuBeanImpl" class="com.fubar.FuBeanImpl" scope="prototype"> 
</bean> 

<bean id="fuBeanService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter"> 
    <property name="service" ref="fuBeanImpl"/> 
    <property name="serviceInterface" value="com.fubar.FuBean"/> 

</bean> 

весна-config.xml

<bean id="fuBeanService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean" scope="prototype"> 
    <property name="serviceUrl"> 
     <value>http://fubar/fuBeanService</value> 
    </property> 
    <property name="serviceInterface"> 
     <value>com.fubar.FuBean</value> 
    </property> 
    <property name="httpInvokerRequestExecutor"> 
     <bean class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor"/> 
    </property> 
</bean> 

ответ

1

Это потому, что ваш HttpInvokerServiceExporter боб еще singleton, и он имеет ссылку на прототип-область fuBeanImpl фасоль. Таким образом, экспортер получает один экземпляр FuBeanImpl и никогда не просит нового. Это проблема с однобортными компонентами, относящимися к компонентам, находящимся на одном синглетоне, - ссылка «эффективно разрушает» прототип.

Вам также необходимо сделать HttpInvokerServiceExporter фасоль с прототипом, хотя это может иметь побочные эффекты. Например, вы не сказали нам, что означает HttpInvokerServiceExporter - возможно, определение URL-адреса?


редактировать: Так как вы уточнили, что вы используете SimpleUrlhandlerMapping, то, что вы можете сделать, это инъекционный, что с именем из обработчика боба, а не прямая ссылки на боб Это. Это означает, что обработчик (например, fuBeanService) может быть прототипом, хотя SimpleUrlhandlerMapping является одиночным.

+0

Спасибо skaffman. Да, HttpInvokerServiceExporter ссылается на org.springframework.web.servlet.handler.SimpleUrlHandlerMapping для сопоставления пути контекста сервлета диспетчера. Это означает, что все бобы в цепочке должны быть прототипами. – golfradio

+0

@golfradio: Неправда. См. Отредактированный ответ. – skaffman

1

Существует еще один актуальный вопрос Prototype Scope not working о почти идентичной проблеме.

Оба эти решения должны работать здесь также:

+0

Спасибо, seanizer. В моем случае жесткая связь не поможет, если я фактически не изменю класс HttpInvokerServiceExporter. – golfradio

Смежные вопросы