10

リクエスト スコープの Bean をアプリケーション スコープの Bean にオートワイヤすることは可能ですか。すなわち

私はクラス RequestScopedBean を持っています:

class RequestScopedBean {
   ....
   ....
   ....
}

そして、リクエストスコープのBeanが自動配線されているクラスApplicationスコープのBean。

class ApplicationScopedBean {
   @Autowire
   private RequestScopedBean requestScopedBean;
   ....
   ....
   ....
}

spring-config xml は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="
              http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/util  http://www.springframework.org/schema/util/spring-util-3.0.xsd
">
<bean id="applicationScopedBeans" class="ApplicationScopedBean" />
<bean id="requestScopedBean" class="RequestScopedBean" scope="request">  
</bean>
</beans>

このアプリケーションを実行しようとすると、applicationScopedBean の Bean 作成が次のエラーで失敗します。

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ApplicationScopedBean': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not       autowire field: private RequestScopedBean requestScopedBean; nested exception is java.lang.IllegalStateException: No Scope registered for scope 'request'
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:288)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1074)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:312)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1075)
    at com.amazon.coral.reflect.instantiate.SpringInstantiatorFactory$1.newInstance(SpringInstantiatorFactory.java:168)
    ... 19 more
4

3 に答える 3

15

また、スコープ付きプロキシとしてマークを付ける必要がありますrequestScopedBean。これにより、SpringはrequestScopedBeanのプロキシに挿入し、バックグラウンドでスコープを適切に管理します。

<bean id="requestScopedBean" class="RequestScopedBean" scope="request">  
    <aop:scoped-proxy/>
</bean>

詳細はこちら

于 2012-11-25T22:14:04.660 に答える
8

上記の例外は、リクエストスコープのBeanを提供するためにSpringを正しく構成していないことを示しています。

こちらのドキュメントで説明されているように、これをweb.xmlに追加する必要があります。

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  </listener>

ただし、質問には構成だけではありません。リクエストスコープのBeanをシングルトンスコープのBeanに注入しようとしています。Springは依存関係を解決し、DIコンテナの起動時にシングルトンをインスタンス化します。これは、ApplicationScopedBeanが1回だけ作成されることを意味します(この時点では、実行中の要求はないため、自動配線は失敗する可能性があります)。

リクエストスコープではなくプロトタイプスコープのBeanを使用している場合は、シングルトンスコープのBeanに、使用するたびに新しいインスタンスを提供する方法を検討する必要があります。このためのアプローチは、Springドキュメントのメソッドインジェクションの章で説明されています。

于 2012-11-25T22:10:58.127 に答える