我多次阅读关于这个主题的春季文档,但有些事情对我来说仍然不清楚。 文档说明:
如果要将(例如)HTTP请求作用域bean注入另一个bean,则必须注入AOP代理来代替作用域bean。也就是说,您需要注入一个代理对象,该对象公开与范围对象相同的公共接口,但也可以从相关范围(例如,HTTP请求)检索真实的目标对象,并将方法调用委托给真实对象
配置示例如下:
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session">
<aop:scoped-proxy/>
</bean>
<bean id="userManager" class="com.foo.UserManager">
<property name="userPreferences" ref="userPreferences"/>
</bean>
此处, userManager bean的范围为singleton。所以,我想知道这个代理服务器是否只将 应用于单例范围的bean,也就是说,如果你想将web-scoped bean注入单例bean,或者它还适用于原型bean?例如,如果 userManager 的范围是原型?
我问这个是因为我看到了一些代码将会话范围的bean注入原型而没有使用aop-proxy,但我不确定这是否正确...特别是那些是某些网站中的DAO bean-应用程序,作为会话,它们被注入到原型范围的控制器中,用于多用户环境。这是正确的方法吗?一般来说,应该如何在web-app环境中使用DAO / Service bean?
任何想法都会受到赞赏。
答案 0 :(得分:22)
你总是可以将一个范围更广的bean(例如一个单例)注入一个范围更窄的bean(例如一个会话范围的bean),但反过来说,你需要一个范围代理。
因此,将会话范围的bean注入到原型范围的bean中的示例很好,因为会话范围比原型范围“更宽”。
如果你弄错了,那么Spring会告诉你的。如果它没有抱怨,那么你就不需要了。