如果你打算将一个Http request范围的bean注入到另一个bean中,那么需要注入一个AOP代理来替代被注入的作用域bean。也就是说,你需要注入一个代理对象,该对象具有与被代理对象一样的公共接口,而容器则可以足够智能的从相关作用域中(比如一个HTTP request)获取到真实的目标对象,并把方法调用委派给实际的对象。
1.如何做:
<!-- a HTTP Session-scoped bean exposed as a proxy -->
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session">
<!-- this next element effects the proxying of the surrounding bean -->
[u]<aop:scoped-proxy/>[/u]
</bean>
<!-- a singleton-scoped bean injected with a proxy to the above bean -->
<bean id="userService" class="com.foo.SimpleUserService">
<!-- a reference to the proxied 'userPreferences' bean -->
<property name="userPreferences" ref="userPreferences"/>
</bean>
注意
<aop:scoped-proxy/>不能和作用域为singleton或prototype的bean一起使用。为singleton bean创建一个scoped proxy将抛出BeanCreationException异常
2.为何做:
下面我们从去掉<aop:scoped-proxy/>元素的XML配置开始说起:
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
<bean id="userManager" class="com.foo.UserManager">
<property name="userPreferences" ref="userPreferences"/>
</bean>
从上述配置中可以很明显的看到singleton bean userManager被注入了一个指向HTTP Session作用域bean userPreferences的引用。singleton userManager bean会被容器仅实例化一次,并且其依赖(userPreferences bean)也仅被注入一次。这意味着,userManager在理论上只会操作同一个userPreferences对象,即原先被注入的那个bean。而注入一个HTTP Session作用域的bean作为依赖,有违我们的初衷。因为我们想要的只是一个userManager对象,在它进入一个HTTP Session生命周期时,我们希望去使用一个HTTP Session的userPreferences对象。
当注入某种类型对象时,该对象实现了和UserPreferences类一样的公共接口(即UserPreferences实例)。并且不论我们底层选择了何种作用域机制(HTTP request、Session等等),容器都会足够智能的获取到真正的UserPreferences对象,因此我们需要将该对象的代理注入到userManager bean中, 而userManager bean并不会意识到它所持有的是一个指向UserPreferences引用的代理。在本例中,当UserManager实例调用了一个使用UserPreferences对象的方法时,实际调用的是代理对象的方法。随后代理对象会从HTTP Session获取真正的UserPreferences对象,并将方法调用委派给获取到的实际的UserPreferences对象。
这就是为什么当你将request、session以及globalSession作用域bean注入到协作对象中时需要如下正确而完整的配置:
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session">
[u]<aop:scoped-proxy/>[/u]
</bean>
<bean id="userManager" class="com.foo.UserManager">
<property name="userPreferences" ref="userPreferences"/>
</bean>
分享到:
相关推荐
- **属性注入**:Spring会将依赖注入到Bean中,包括值注入(value,ref)和集合注入(list,map,props,set)。 - **初始化回调**:Spring支持两种类型的初始化回调方法,即`@PostConstruct`注解的方法和在XML中...
在Spring中,Bean通常代表应用程序中的一个对象,这些对象由Spring容器(ApplicationContext)管理,包括创建、初始化、装配和销毁。Bean可以通过XML配置文件、注解或者Java配置类进行定义。 1. **Bean的定义**:在...
这样,Spring会自动将配置文件中的值注入到bean中。 7. **Spring Boot测试**: 在测试场景下,可以使用`@SpringBootTest`注解启动整个Spring Boot应用,然后使用`@Autowired`注入需要的bean进行测试。 8. **Bean...
线程中的操作往往涉及到多线程环境下的资源共享和管理,因此,如何在线程中正确地获取并使用Spring通过注解注入的对象,是一个常见的问题。本文将详细探讨这个主题。 首先,Spring的注解主要分为三类:配置注解(如...
Spring框架是Java开发中的一个核心库,主要用于管理对象(通常称为bean)的生命周期和依赖关系。在本篇文章中,我们将深入探讨Spring的核心容器及其bean的概念,以帮助你更好地理解和使用这个强大的工具。 **Spring...
本篇文章将深入探讨Spring中与Bean相关的接口,以及它们如何帮助我们更好地理解和操作Bean。 首先,我们要了解`BeanFactory`接口。它是Spring中最基本的Bean容器,负责创建、配置和管理Bean。`BeanFactory`提供了一...
Spring是一个非常流行的Java应用程序框架,它提供了一个灵活的机制来管理Bean的生命周期和作用域。Bean的生命周期和作用域是Spring框架中两个非常重要的概念,它们决定了Bean的生命周期和作用域的管理方式。 一、...
Prototype 作用域是指每一次请求(将其注入到另一个 bean 中,或者以程序的方式调用容器的 getBean()方法)都会产生一个新的 bean 实例,相当于一个 new 的操作。对于 prototype 作用域的 bean,有一点非常重要,那...
- request:每个HTTP请求都会创建一个新的Bean实例,只适用于Web应用。 - session:在一个HTTP Session中只会创建一个Bean实例,同样只适用于Web应用。 4. Spring容器中Bean的生命周期: Spring通过一系列的回调...
4. **请求(Request)**:在Web应用中,每个HTTP请求都会创建一个Bean实例。同样,这也只适用于Web环境。 5. **全局会话(Global Session)**:在portlet应用中,全局会话作用域的Bean在整个portlet会话期间都是...
在Spring框架中,Bean的加载顺序是一个重要的概念,它涉及到Spring容器如何管理和初始化Bean的过程。在"spring的bean加载顺序样例项目"中,我们可以通过分析和实验来深入理解这一主题。下面将详细阐述Spring Bean的...
每当一个新的HTTP请求到达时,Spring容器会创建一个新的`HelloMessageGenerator`实例,并将其注入到需要的地方(例如`ScopesController`中的`requestScopedBean`)。请求完成后,这个实例会被销毁,不会被其他请求...
1. **Singleton**:这是Spring的默认范围,每个Spring容器只有一个Bean实例。当容器启动时,会创建一个Singleton Bean,并在后续请求中重用该实例。 2. **Prototype**:在每次请求时,都会创建一个新的Bean实例。这...
3. `scope`:定义Bean的作用范围,可以是`singleton`(单例)、`prototype`(原型)、`request`(Web应用中每个HTTP请求创建一个)、`session`(Web应用中每个HTTP session创建一个)等。默认是`singleton`,意味着...
自动装配是Spring的一个重要特性,`@Autowired`注解用于自动将依赖注入到bean中。Spring会根据类型或名称来匹配依赖并注入。 6. **@Qualifier** 当有多个相同类型的bean时,`@Qualifier`可以用来指定注入哪个特定...
这意味着,无论何时,只要Spring容器被初始化,它都会创建一个Bean实例,并将其缓存起来。后续对相同ID的Bean的所有请求都会返回同一个实例。这种方式类似于设计模式中的单例模式,但不同之处在于,这里的"单例"是指...
Bean定义是Spring框架中的一个关键概念,它描述了如何创建和管理一个特定的Bean。Bean定义包含了许多属性,如Bean的类名、初始化方法、依赖关系、作用域、生命周期回调方法等。这些属性使得我们可以对Bean的行为进行...
- 单例(Singleton):默认模式,Spring容器只为每个Bean定义一个实例,全局共享。 - 原型(Prototype):每次请求都会创建一个新的Bean实例。 - 作用域(Scope):还包括请求(Request)、会话(Session)、应用...
主要介绍了Spring实战之Bean的作用域request用法,结合实例形式分析了spring中Bean的request作用域相关使用技巧与操作注意事项,需要的朋友可以参考下
在Spring框架中,Bean的生命周期是指从创建到销毁的整个过程。这个过程包含了初始化、正常使用以及最终的销毁几个阶段。了解并掌握Spring Bean的生命周期对于优化应用性能和资源管理至关重要。接下来,我们将深入...