【Spring Boot】Spring原理:Bean的作用域和生命周期
创始人
2024-11-05 22:40:50
0

目录

  • Spring原理
    • 一. 知识回顾
      • 1.1 回顾Spring IOC
      • 1.2 回顾Spring DI
      • 1.3 回顾如何获取对象
    • 二. Bean的作用域
    • 三. Bean的生命周期

Spring原理

一. 知识回顾

在之前IOC/DI的学习中我们也用到了Bean对象,现在先来回顾一下IOC/DI的知识吧!
首先Spring IOC,也叫控制反转,简单来说就是依赖添加5大注解把该对象交给Spring来管理,Spring会把该对象放入IOC容器中,在接下来的调用中直接注入即可,注入也就是Spring DI操作了。
回顾一下,一共有以下五大注解:

1.1 回顾Spring IOC

类注解

  1. @Controller(控制层注解)
  2. @Service(逻辑层注解)
  3. @Repository(数据层注解)
  4. @Component(总注解)
  5. @Configuration(插件注解)

然后就是有一点要注意的就是,@Component注解可以说是其他四个注解的父注解,就是其他注解底层都是依赖@Component来实现的,都可以使用@Component注解来代替使用,但是不能代替@Controller,因为别忘了Controller注解还有返回视图的作用,这是@Component注解所不具备的

方法注解

  1. @Bean(方法注解)

该注解用于把方法交给Spring进行管理,但是必须和类注解连用

1.2 回顾Spring DI

Spring DI就是把IOC容器里的东西拿出来进行使用,主要是@Autowired注解,主要有三种注入方式

  1. 属性注入(就是通过给成员变量进行注入)
  2. 构造注入(就是通过构造方法注入)
  3. Set方法注入

其实在实际运用中,使用属性注入基本上能满足90%的需求了.

Spring DI主要面试考的主要是拥有多个相同对象,注入时该如何保证?

主要提供了以下三大注解

  1. @Primary(默认注入的方法)
  2. @Qualifier(加入要注入对象的方法名称)
  3. @Resource(要注入对象的名称)

@Autowird与@Resource的区别

  1. @Autowired是spring框架提供的注解,⽽@Resource是JDK提供的注解
  2. @Autowired默认是按照类型注⼊,⽽@Resource是按照名称注⼊.相⽐于@Autowired来说,@Resource⽀持更多的参数设置,例如name设置,根据名称获取Bean。

1.3 回顾如何获取对象

Spring主要提供了两种方法获取Bean对象:

  1. ApplicationContext(上下文)
  2. @Autowired

第二种是注入方式就不一一叙述了,主要是ApplicationContext获取Bean对象,其实就是调用了分类BeanFactory工厂来获取对象。
两者主要有以下两点区别:

  1. 继承关系和功能方⾯来说:Spring容器有两个顶级的接口:BeanFactory和
    ApplicationContext。其中BeanFactory提供了基础的访问容器的能⼒,⽽
    ApplicationContext属于BeanFactory的⼦类,它除了继承了BeanFactory的所有功能之外,
    它还拥有独特的特性,还添加了对国际化⽀持、资源访问⽀持、以及事件传播等方⾯的⽀持.

  2. 从性能方⾯来说:ApplicationContext是⼀次性加载并初始化所有的Bean对象,也就是饿加载,⽽
    BeanFactory是需要那个才去加载那个,也就是懒加载,因此更加轻量.(空间换时间)

好了,回顾完了Spring IOC/DI的知识点了,就该进入正题了。

二. Bean的作用域

Bean的作用域是指Bean在Spring框架中的某种行为模式.

主要有以下6种作用域

  1. singleton:单例作用域
  2. prototype:原型作用域(多例作用域)
  3. request:请求作用域
  4. session:会话作用域
  5. Application:全局作用域
  6. websocket:HTTPWebSocket作用域
作用域说明
singleton每个SpringIoC容器内同名称的bean只有⼀个实例(单例)(默认)
prototype每次使用该bean时会创建新的实例(⾮单例)
request每个HTTP请求生命周期内,创建新的实例(web环境中)
session每个HTTPSession生命周期内,创建新的实例(web环境中)
application每个ServletContext生命周期内,创建新的实例(web环境中)
websocket每个WebSocket生命周期内,创建新的实例(web环境中)

单例作用域:多次访问,得到的都是同⼀个对象,并且 @Autowired 和 applicationContext.getBean()
也是同⼀个对象.

多例作用域:观察ContextDog,每次获取的对象都不⼀样(注⼊的对象在Spring容器启动时,就已经注⼊了,所以多次请求也不会发生变化)

请求作用域:在⼀次请求中, @Autowired 和 applicationContext.getBean() 也是同⼀个对象.
但是每次请求,都会重新创建对象

会话作用域:在⼀个session中,多次请求,获取到的对象都是同⼀个,换⼀个浏览器访问,发现会重新创建对象.(另⼀个Session)

Application作用域:在⼀个应用中,多次访问都是同⼀个对象

注意:Applicationscope就是对于整个web容器来说,bean的作用域是ServletContext级别的.这个和
singleton有点类似,区别在于:Applicationscope是ServletContext的单例,singleton是⼀个
ApplicationContext的单例.在⼀个web容器中ApplicationContext可以有多个

三. Bean的生命周期

生命周期指的是⼀个对象从诞生到销毁的整个生命过程,我们把这个过程就叫做⼀个对象的生命周期.
Bean的生命周期分为以下5个部分:

  1. 实例化(为Bean分配内存空间)

  2. 属性赋值(Bean注⼊和装配,⽐如 @AutoWired )

  3. 初始化
    执行各种通知,如 BeanNameAware , BeanFactoryAware ,ApplicationContextAware 的接口方法.

  4. 使用Bean

  5. 销毁Bean
    销毁容器的各种方法,如 @PreDestroy , DisposableBean 接口方法, destroymethod.

在这里插入图片描述
实现的代码如下:

@Component public class BeanLifeComponent implements BeanNameAware {  	private UserComponent userComponent; 	 	public BeanLifeComponent() { 		System.out.println("执行构造函数"); 	} 	 	@Autowired 	public void setUserComponent(UserComponent userComponent) { 		System.out.println("设置属性userComponent"); 		this.userComponent = userComponent; 	} 	 	@Override 	public void setBeanName(String s) { 		System.out.println("执行了 setBeanName 方法:" + s); 	} 	 	/** 	* 初始化 	*/ 	@PostConstruct 	public void postConstruct() { 		System.out.println("执行 PostConstruct()"); 	} 	 	public void use() { 		System.out.println("执行了use方法"); 	} 	 	/** 	* 销毁前执行方法 	*/ 	@PreDestroy 	public void preDestroy() { 		System.out.println("执行:preDestroy()"); 	} } 

相关内容

热门资讯

我来教你/游戏推荐牛牛房卡出售... 复仇者联盟是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:【3329006910】或QQ:33290...
微信炸金花链接怎么买房卡/牛牛... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:8488009许多玩家在游戏中会购买房卡来享受...
科技实测!牛牛房卡怎么购买先锋... 科技实测!牛牛房卡怎么购买先锋大厅/新道游/正规房卡链接在哪购买Sa9Ix苹果iPhone 17手机...
推荐一款!金花房卡是正规的青鸟... 您好!微信青鸟大厅大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(青鸟大厅)大厅介绍:...
正规平台有哪些,斗牛房间怎么创... 今 日消息,海贝之城房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单...
安卓系统不升级的坏处,安卓系统... 亲爱的手机用户们,你是不是也遇到了这样的烦恼:安卓系统的更新通知总是跳出来,但你却总是犹豫不决,担心...
正规平台有哪些,金花房卡专卖店... 正规平台有哪些,金花房卡专卖店乐游联盟/正规房卡平台有哪些乐游联盟是一款非常受欢迎的游戏,咨询房/卡...
微信群上炸金花房间链接怎么开/... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:33903369许多玩家在游戏中会购买房卡来享...
科技实测!游戏微信牛牛房卡龙马... 微信游戏中心:龙马大厅房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程...
重大通报,牛牛房卡代理天龙大厅... 重大通报,牛牛房卡代理天龙大厅/房卡在哪里购买Sa9Ix苹果iPhone 17手机即将进入量产阶段。...
微信金花房卡链接使用方法/微信... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡来享受...
微信群炸金花房间怎么开/神牛大... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:55051770许多玩家在游戏中会购买房卡来享...
我来教你/金花房卡专卖店豌豆互... 今 日消息,豌豆互娱房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单...
玩家攻略,牛牛充值房卡九游联盟... 九游联盟房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根...
IA解析/游戏推荐牛牛房卡出售... IA解析/游戏推荐牛牛房卡出售新全游/飞鹰互娱/微信链接房卡批发价新全游/飞鹰互娱是一款非常受欢迎的...
微信链接炸金花房卡怎么买/新海... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:8488009许多玩家在游戏中会购买房卡来享受...
在哪里买炸金花房卡便宜又好玩/... 金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房卡来享...
科技实测!金花房卡是正规的九哥... 微信游戏中心:九哥联盟房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程...
推荐一款!金花微信链接市场价格... 推荐一款!金花微信链接市场价格表乐乐大厅/微信链接房卡充值购买Sa9Ix苹果iPhone 17手机即...
推荐一款!金花房间怎么创建新超... 您好!微信新超圣/樱花大厅大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(新超圣/樱花...