1.spring上下文管理的bean默认都是单例的(全局范围),也就是说一个bean无论被注入对少次,注入的实例都是一样的。这样操作效率很高,但是会有安全问题。
2.spring提供自定义作用域,bean的四大作用域为:
1)单例(application),整个应用上下文中只创建一个实例。然后到处注入。
2)原型(prototype),每次获取(注入)bean,spring都会创建一个新的bean。每次都是新的对象实例
3)会话(session),为每个会话创建单独的bean。当bean被注入和获取时。不同会话之前的bean是不一样的,不会互相影响。
4)请求(request),spring会为不同请求创建不同的bean,不同请求获取到的bean是不一样的。
3.如何定义bean的作用范围
通过@Scope注解可以定义bean的作用范围(通常是和其他组件注解一起使用),如:
定义原型和单例(默认)的作用域:
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)--原型域,每次获取bean都是获取到的新实例。
定义会话和请求的作用域
1.会话作用域(可以在定义购物车中得到应用):
@Scope(WebApplicationContext.SCOPE_SESSION)
2.请求作用域
@Scope(WebApplicationContext.SCOPE_REQUEST)
非单例模式的bean注入到单例模式的bean中,都是注入的代理类,不然会出现问题。