当前位置: 代码网 > it编程>编程语言>Java > Spring原理详解之Bean的作用域和生命周期

Spring原理详解之Bean的作用域和生命周期

2026年09月02日 Java 我要评论
spring原理一. 知识回顾在之前ioc/di的学习中我们也用到了bean对象,现在先来回顾一下ioc/di的知识吧!首先spring ioc,也叫控制反转,简单来说就是依赖添加5大注解把该对象交给

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()");
	}
}

总结 

到此这篇关于spring原理详解之bean的作用域和生命周期的文章就介绍到这了,更多相关spring bean作用域和生命周期内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com