PS:Spring默认的bean是单例的!
// 创建一个session的bean
@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION)
public A a{ …… }
// 在单例bean中注入不同作用域的bean
@Component
public B b{
@Autowired
public void setA ( A a ) { …… }
}
上述代码会发生错误! 单例的bean在应用程序启动的时候就初始化,并在初始化时需要注入session作用域的B,但session作用域的bean只有当有用户的时候才创建,初始化的时候并没有该对象。 再者,不同的用户拥有不同的session,因此A对象将有成千上万,而B对象有且仅有一个。 此时需要在session作用域的bean对象上加上注解:
// 创建一个session的bean
@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION,
proxyMode=ScopeProxyMode.INTERFACES)
public A a{ …… }
该注解声明后,注入给单例的将是该bean的代理,代理维护着不同session下的bean,当单例对象调用的将是代理对象,代理对象根据当前的session将请求转发给制定的目标对象处理。
注意:若session作用域的对象无接口,则使用Cglib创建代理
// 创建一个session的bean
@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION,
proxyMode=ScopeProxyMode.TARGET_CLASS)
public A a{ …… }
在XML中开启对象代理
<!-- 开启java动态代理-->
<bean id="xxx" class="com.xxx.xxx" scope="session">
<aop:scoped-proxy />
</bean>
<!-- 开启Cglib代理-->
<bean id="xxx" class="com.xxx.xxx" scope="session">
<aop:scoped-proxy proxy-target-class="false" />
</bean>