(三)Spring 高级装配 bean的作用域@Scope

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,表明要以生成目标类的方式创建代理。

猜你喜欢

转载自www.cnblogs.com/lin-bunny/p/11581920.html