静态网站设计怎么做,seo外包公司多吗,北京注册公司流程,wordpress dux2.0在上文中#xff0c;我们了解了Spring中简单的获取Bean对象#xff08;对象装配#xff09;和Bean作用域#xff0c;那么本文主要来带领大家走进Bean的生命周期#xff01;
所谓的生命周期指的是一个对象从诞生到销毁的整个生命过程#xff0c;我们把这个过程叫做一个生…在上文中我们了解了Spring中简单的获取Bean对象对象装配和Bean作用域那么本文主要来带领大家走进Bean的生命周期
所谓的生命周期指的是一个对象从诞生到销毁的整个生命过程我们把这个过程叫做一个生命周期
Bean的生命周期分为以下5大类从诞生到销毁
实列化Bean为Bean分配内存空间【实列化不等于初始化】设置属性注入属性Bean注入和装配Bean初始化 1.各种通知如BeanNameAwareBeanFactoryAeareApplicationContextAware的接口方法 2.初始化前置方法如BeanPostProcessor 3.执行初始化方法设置了就会执行不设置就不会执行 a).注解方式PostConstruct b).XML方式init-method方法初始化方法 4.初始化后置方法如BeanPostProcessor 使用Bean销毁Bean 销毁容器的各种方法如PreDestroyDisposableBean接口方法destroy-method销毁方法
实列化和初始化的区别
实列化和属性设置是Java级别的系统“事件”其操作过程不可人工干预和修改而初始化是给开发者提供的可以在实列化之后类加载完成之前进行自定义“事件”处理 Bean的生命周期看是繁琐但咱们可以以生活中的场景来理解他 比如我们现在要买一座房子那么我们的流程为 先买房实列化从无到有装修设置属性买家电如洗衣机冰箱电视空调等各种初始化入住使用Bean卖出去Bean销毁 上述便是Bean生命周期大致流程其实说简单也是很简单的但是也希望大家能够理解 下面来扩展一下Bean的作用域Bean作用域-CSDN博客严格的说为了凑字而发布了本文
从笔者之前的博客我们可以看出 Spring 是⽤来读取和存储 Bean因此在 Spring 中 Bean 是最核⼼的操作 资源所以接下来我们深⼊学习⼀下 Bean 对象Bean作用域
限定程序中变量的可用范围叫做作用域或者说在源代码中定义变量的某个区域就叫做作用域
Bean的作用域是指Bean在整个Spring容器中的行为模式 比如Singleton单列模式作用域就是表示Bean在整个Spring中只有一份它是全局共享的那么当其他人修改了这个值之后那么另一个人读取到的就是被修改的值
使用Bean注入一个user对象对其起了一个名字user.setName(java)A用户使用时进行了修改操作A用户调用user之后创建了一个局部变量user1然后去改这个局部变量里的内容通过user.setName(悟空)将”java“改为”悟空“然后B用户再去使用Bean的时候去调用来看一下打印结果
创建被修改的类User类
package com.contrlooer;public class User {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {return name;}public void setName(String name) {this.name name;}Overridepublic String toString() {return User{ id id , name name \ };}
}
创建公共Bean将id1namejava的对象存储到Spring中
package com.contrlooer;import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;Component
public class Users {Bean public User user1(){User usernew User();user.setId(1);user.setName(java);//名称是javareturn user;}
}
A用户使用时进行了修改操作
package com.contrlooer;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;Controller
public class UserController {Autowiredprivate User user;public void printUser(){System.out.println(user);//java//修改UserUser myUseruser;myUser.setName(悟空);System.out.println(user- user);//悟空System.out.println(myUser- myUser);//悟空//两个变量指向了同一个对象引用}
}
用户B再去使用公共Bean的时候
package com.contrlooer;import org.springframework.stereotype.Controller;import javax.annotation.Resource;Controller
public class UserController2 {Resourceprivate User user;public void printUser2(){System.out.println(user-- user);//预期java但是实际的结果确实悟空}
}
在上述的运行结果中我们预期是java但实际的结果却是悟空
此Bean在整个框架中Spring容器中只有一份【Bean作用域默认为单列模式】只有一份意味着任何地方做出的修改当再次读到的都是修改后的值
打印A用户和B用户公共Bean的值
package com.contrlooer;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {ApplicationContext contextnew ClassPathXmlApplicationContext(spring-config.xml);UserController controllercontext.getBean(userController,UserController.class);UserController2 controller2context.getBean(userControlle2r,UserController2.class);controller.printUser();controller2.printUser2();}
}
原因分析
操作以上问题的原因是因为Bean默认情况下是单列模式Singleten也就是所有人的使用都是同一个对象之前我们学单列模式的时候都知道使用单列模式可以很大程度上提高性能所以在Spring中Bean的作用域默认也是Singleton单列模式
Spring Bean的作用域Scope有六种 单列模式Singleton默认模式——》性能考虑 描述该作用域下的Bean在IoC容器中只存在一个实列获取Bean即通过applicationContext.getBean等方法获取及装配Bean通过Autoeired注入都是同一个对象 场景通常无状态的Bean使用该作用域无状态表示Bean对象的属性不需要更新 备注Spring中默认选择该作用域 注意普通的Spring项目中只有前两种单列模式。原型模式后面的四种状态是Spring MVC中的值 原型模式多列模式prototype 描述每次对该作用域下的Bean的请求都会创建新的实例 获取Bean通过applicationContext.getBean等方法获取及装配Bean通过Autoeired注入都是新的对象 场景通常有状态的Bean使用该实例 请求作用域request 每次HTTP请求都会创建一个Bean对象适用于Spring MVC/Spring Web 描述每次http请求都会场景新的Bean实列类似于prototype多列模式 场景一次http请求和相应的共享Bean 备注限定Spring MVC中使用 会话作用域session 每次Session会话共享一个Bean【Spring MVC】 描述在一个http Session中定义一个Bean实例 场景用户回话的共享Bean比如记录一个用户的登录信息 备注限定Spring MVC中使用 全局作用域application了解 一个http servlet context中共享一个Bean【Spring MVC】 描述在一个http servlet Context中定义一个Bean实列 场景Web应用的上下文信息比如记录一个应用的共享信息 备注限定Spring MVC中使用 网络长连接webSocket只适用于Spring web Socket项目了解 描述在一个HTTP WebSocket的生命周期中定义一个Bean实列 场景WebSocket的每次会话中保存了一个Map结构的头信息用来包裹客户端的消息头第一次初始化后直到WebSocket结束都是同一个Bean 备注限定Spring WebSocket中使用
单例作用域singleton VS 全局作用域application singleton是Spring Core的作用域application是Spring Web中的作用域 singleton作用于IoC容器而application作用于Servlet容器
Bean作用域设置
使用Scope标签可以用来声明Bean的作用域
Component
public class Users {Bean//在存的时候设置作用域在创建的时候就决定类型了Scope(prototype)// Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)//二选一public User user1(){User usernew User();user.setId(1);user.setName(java);//名称是javareturn user;}
}
Bean执行流程Spring执行流程
启动Spring容器——》实例话Bean分配内存空间从无到有——》Bean注册到Spring容器中存操作——》将Bean装配到需要的类型取操作