1、什么是springbean的生命周期
springbean的生命周期,简单来说,就是springbean在spring容器中实例化的时机,以及springbean的实例化过程中的一些行为。
springbean的实例化时机,根很多原因有关,其中一个就是springbean的作用域。在spring中的bean默认是单例的,那么bean还有什么类型的作用域呢?
2、springbean的作用域 @Scope("")
那么我们先来看一下scope注解的类结构
从scope的注解的注释中我们可以看到其实scopeName有四种
–>Singleton,单例,是Spring默认的,在整个容器中创建唯一的一个Bean实例,多用于无状态Bean,平时开发应用最普遍。(1)
–>Prototype,针对每个context.getBean()的请求,容器都会创建一个单独的Bean。(多例),值得注意的是,在使用AutoWired等依靠注解注入的场景,Spring为没一个依赖方注入一个新的Bean,当注入以后,使用方依赖的这个Bean的实例也就不会变了。如果在运行时想注入新的PrototypeBean,需要使用getBean()函数获取,官方文档称之为Method Injection。(2)
配置方式
@Scope("prototype")
如果是在Web环境(SpringMVC),Spring中又有如下作用域:
Request,为每一个Http请求创建一个单独的Bean实例。(3)
Sesssion,在一个HTTP Session范围内共享一个Bean实例。(4)
Application,Spring为整个web上下文创建一个AppPreferences 的bean。也就是说,这个bean作用域是在ServletContext级别,它是作为ServletContext的一个属性存在的。(5)
以上三种SpringBean作用域。使用注解方式,配置方式如下,三个属性分别对应了三个Scope注解。
3、spring的加载时机
默认的单例SpringBean,在IOC容器初始化时就会被加载。但Spring有一个懒加载机制,当一个Bean配置了懒加载,当且仅当该Bean被第一次使用时才会触发加载。
配置懒加载的方式如下:
package com.enjoy.cap4;
import com.enjoy.cap1.Person;
import org.springframework.context.annotation.*;
@Configuration
public class MainConfig {
/**
* 针对于单实例bean :默认在容器中启动的时候创建对象
* 懒加载:容器启动的时候 不创建对象 ,仅当第一次使用(获取)bean的时候才创建被初始化
* @return
*/
@Lazy
@Bean
public Person person(){
System.out.println("给我们的容器中添加person");
return new Person("张三",22);
}
}
4、Springbean的生命周期