1.默认情况下,spring通过@Autowared注入的bean是单例的bean,但有些情况是不满足的,例如:购物车,每个会话,或每个用户登录使用的购物车都是独立的
spring的定义的作用域:
a:单例(Singleton)
b:原型(prototype):每次注入的都会创建一个新的bean实例。
c:会话(session):web应用中,每个会话创建一个bean。
d:请求(Rquest):web应用中,为每个请求创建一个bean。
例子1:
@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class Notepad{..........} //使用ConfigurableBeanFactory.SCOPE_PROTOTYPE的原因是,比较“prototype”更为安全。
例子2:使用会话和请求作用域。
在一个单例 的service里面注入一个会话作用域 的bean,spring注入service单例的时候,并不会创建会话作用域的bean。
而是当请求到来的时候创建。当会话到来时,spring注入的并不是实际的购物车bean,而是购物车bean的代理。那么创建的时机:
如图所示:
代码:
@Component @Scope(value=WebApplicationContext.SCOPE_SESSION, proxyMode=ScopedProxyMode.INTERFACES) public ShoppingCart cart(){.........}
proxyMode的作用是表明这个代理要实现ShoppingCart接口,并将调用委托给实现的bean。
如果ShoppingCart是接口,那么则使用以上的方式注入。如果ShoppingCart是实现类,spring则使用CGLIB的方式创建代理。
proxyMode的取值则是:ScopedProxyMode.TARGET_CLASS,表明要以生成目标类的方式创建代理。