Bean加载
- 默认情况下:Bean在applicationContext容器启动的时候会进行创建并且进行预实例化,属性值设置为默认值,当bean被调用的时候,读取bean配置元数据,配置bean,如果beanA属性值为beanB,则先配置beanB,再配置beanA
- 对于单例的bean,会在ioc容器启动的时候,创建,读取配置元数据,完全实例化bean
- 可以配置bean懒加载,lazy-init =true,懒加载的bean会在初次被调用的时候被创建
- 对于lazy-bean是single-bean的属性时,lazy-bean不会执行懒加载,会在ioc被创建时,完全实例化配置给single-bean
Bean scope
- Single-ton scope:(default)
- 单例bean 默认状态是单例的
- 相比较设计模式中的单例模式,单例模式是每个classloader一个对象,单例bean是每个application container一个bean
- single bean在contanier初始化的时候加载一次,(创建-实例化-配置数据),之后存在spring container catch中,每次调用取同一个bean
- protoype scope(@Scope("protoype"))
- 原型bean , 每次请求,会根据bean定义 去创建新的bean ,一般用作status
- Spring contanier只管理prototyoe bean 的 创建 实例化 配置 生命周期,之后交给client client负责去销毁bean并释放资源
- 如果Single bean 属性是prototype bean 则 prototype bean 也是在container初始化的时候 配置完毕,并且保持单例,每次请求不会去创建新的prototype bean ,如果想要改变,可以使用方法注入(set方法)
- Request scope:(@RequestScope)
- 生命周期和http 请求同级,每次新的http请求会创建新的bean
- 在一个http请求内更改bean属性,其余http的bean不受影响
- Session scope:(@SessionScope)
- 生命周期和http session请求同级,每次不同的http session 会创建新的bean
- 在一个http session内更改bean属性,其余http session的bean不受影响
- Application scope:(@ApplicationScope)
- 生命周期和ServletContext请求同级,每次不同的ServletContext会创建新的bean,存储在ServletContext属性中
- 在一个ServletContext内更改bean属性,其余ServletContext的bean不受影响