文章目录一、Bean的作用域1.1 概念1.2 Bean的作用域二、Bean的生命周期2.1 概念2.1 代码演示一、Bean的作用域1.1 概念在Spring IoCDISpring 是通过以下方式管理对象的。通过Controller , Service , Repository , Component , Configuration , Bean 来声明Bean对象。通过 ApplicationContext 或者 BeanFactory 来获取对象通过Autowired , Setter 方法或者构造方法等来为应用程序注入所依赖的Bean对象。通过Bean 声明bean , 把bean存在Spring容器中ComponentpublicclassDogBeanConfig{BeanpublicDogdog(){DogdognewDog();dog.setName(旺旺);returndog;}}从Spring容器中获取BeanSpringBootApplicationpublicclassSpringIocApplication{publicstaticvoidmain(String[]args){//获取Spring上下文对象ApplicationContextcontextSpringApplication.run(SpringIocApplication.class,args);//从Spring上下文中获取对象Dogdogcontext.getBean(Dog.class);System.out.println(dog);}}也可以通过在代码中直接注入ApplicationContext的方式来获取Spring容器SpringBootTestclassDemoApplicationTests{AutowiredprivateApplicationContextapplicationContext;//Spring 容器TestvoidcontextLoads(){DogBeandog1applicationContext.getBean(DogBean.class);System.out.println(dog1);}}观察运行结果发现输出的bean对象地址值是一样的说明每次从Spring容器中取出来的对象都是同一个。这也是单例模式单例模式确保一个类只有一个实例多次创建也不会创建出多个实例。默认情况下Spring容器中的bean都是单例的这种行为模式我们就称之为Bean的作用域。Bean 的作用域是指 Bean 在 Spring 框架中的某种行为模式。1.2 Bean的作用域在Spring中支持6种作用域后4种在Spring MVC环境才生效singleton:单例作用域prototype:原型作用域(多例作用域)request:请求作用域session:会话作用域Application: 全局作用域websocket:HTTP WebSocket 作用域作用域说明singleton每个Spring IoC容器内同名称的bean只有一个实例(单例)(默认)prototype每次使用该bean时会创建新的实例(非单例)request每个HTTP 请求生命周期内 创建新的实例(web环境中 了解)session每个HTTP Session生命周期内 创建新的实例(web环境中 了解)application每个ServletContext生命周期内 创建新的实例(web环境中 了解)websocket每个WebSocket生命周期内 创建新的实例(web环境中 了解)二、Bean的生命周期2.1 概念生命周期指的是一个对象从诞生到销毁的整个生命过程我们把这个过程就叫做一个对象的生命周期。 Bean 的生命周期分为以下5个部分实例化(为Bean分配内存空间)属性赋值(Bean注入和装配比如AutoWired )初始化a. 执行各种通知如 BeanNameAware , BeanFactoryAware ,ApplicationContextAware 的接口方法。b. 执行初始化方法▪ xml定义init-method▪ 使用注解的方式 PostConstruct▪ 执行初始化后置方法( BeanPostProcessor )使用Bean销毁Beana. 销毁容器的各种方法如 PreDestroy , DisposableBean 接口方法destroymethod。实例化和属性赋值对应构造方法和setter方法的注入。 初始化和销毁是用户能自定义扩展的两个阶段可以在实例化之后类加载完成之前进行自定义事件处理。执行流程如下图所示:2.1 代码演示ComponentpublicclassBeanLifeComponentimplementsBeanNameAware{privateUserComponentuserComponent;publicBeanLifeComponent(){System.out.println(执行构造函数);}AutowiredpublicvoidsetUserComponent(UserComponentuserComponent){System.out.println(设置属性userComponent);this.userComponentuserComponent;}OverridepublicvoidsetBeanName(Strings){System.out.println(执行了 setBeanName 方法:s);}PostConstructpublicvoidpostConstruct(){System.out.println(执行 PostConstruct());}publicvoiduse(){System.out.println(执行了use方法);}PreDestroypublicvoidpreDestroy(){System.out.println(执行:preDestroy());}}通过运行结果观察先执行构造函数设置属性Bean初始化使用Bean销毁Bean