默认情况下,Spring中的Bean都是单例的。
4种范围
- Singleton 单例的,整个应用中仅仅存在一个实例
- Prototype 每一次注入或者从Spring应用上下文中获取都需要实例化Bean
- Session 在web应用中,每一个session会实例化一个Bean
- Request 在web应用中,每一个request会实例化一个Bean
变更Bean的范围:
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
// 或 @Scope("prototype")
public class Notepad { ... }
或
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
// 或 @Scope("prototype")
public Notepad notepad() {
return new Notepad();
}
或
<bean id="notepad"
class="com.myapp.Notepad"
scope="prototype" />
使用request和session范围
@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION, proxyMode=ScopedProxyMode.INTERFACES)
public ShoppingCart cart() {
...
}
@Component
public class StoreService {
@Autowired
public void setShoppingCart(ShoppingCart shoppingCart) {
this.shoppingCart = shoppingCart;
}
...
}
这里StoreService是一个单例,ShoppingCart的范围是session,那么Spring在这里会向StoreService注入一个ShoppingCart的代理,当调用ShoppingCart的方法时,这个代理会延迟解析这个ShoppingCart实例,并委托调用一个真正的在session范围内的ShoppingCart的Bean实例。
proxyMode:
- ScopedProxyMode.INTERFACES
- ScopedProxyMode.TARGET_CLASS 使用CGLib创建一个目标类代理
在xml中使用:
默认使用CGLib
<bean id="cart"
class="com.myapp.ShoppingCart"
scope="session">
<aop:scoped-proxy />
</bean>
<bean id="cart"
class="com.myapp.ShoppingCart"
scope="session">
<aop:scoped-proxy proxy-target-class="false" />
</bean>
网友评论