Spring中如何将会话或请求作用域的bean注入单例bean

Spring中的单例bean,会在应用上下文加载的时候创建。如果单例bean中的属性需要注入会话作用域的bean时,此时并不存在会话作用域的bean。直到接收到某个请求创建会话之后才会创建。此时需要使用@Scope注解的proxyMode属性。

@Bean
@Scope(value=WebApplicationContext.SCOPE_SESSION,
	   proxyMode=ScopeedProxyMode.INTERFACES)
public ShoppingCart getCart(){......}

这样在单例bean创建的时候,Spring会注入一个ShoppingCart的代理。当调用ShoppingCart的方法时,代理会对其进行懒解析并将调用委托给会话作用域内真正的ShoppingCart bean.
如果ShoppingCart不是接口而是一个具体类的话,Spring就没法创建基于接口的代理了。此时必须使用CGLIB来生成基于类的代理,需设置proxyMode=ScopeedProxyMode.TARGET_CLASS,以此来表明要以生成目标类扩展的方式创建代理。

PS:Spring中两种生成代理对象的方法:
1、JDK动态代理
2、CGLIB动态代理

二者的区别:
JDK和CGLIB动态代理区别

你可能感兴趣的:(Spring)