Spring的作用域与生命周期

这篇具有很好参考价值的文章主要介绍了Spring的作用域与生命周期。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring的作用域与生命周期

一、lombok的安装与使用

lombok插件可以提供给我们一些注释,这些注释可以很好的帮助我们消除Java代码中大量冗余的代码,可以使得我们的Java类可以看起来非常的干净整洁
1.安装lombok插件
Spring的作用域与生命周期
Spring的作用域与生命周期
2.pom.xml导入依赖
Spring的作用域与生命周期
Spring的作用域与生命周期

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
    <scope>provided</scope>
</dependency>

3.基本使用
我们创建一个简单的User实体类

public class User {
    private int id;
    private String name;
    private String password;
}

如果我们手动的在类中加入setter+getter,toString等等,如果属性比较多,代码看起来十分的冗余,我们可以使用lombok提供的注解来帮助我们自动生成
Spring的作用域与生命周期
以下就是我们lombok的注解了,我们在这里介绍一些常用的注解:

注解 作用
@Data 为所有属性提供getting、setting、hashCode、equals、toString等方法
@Value 除了将变量都设置为final
@Setter 自动生成setting方法
@Getter 自动生成getting方法
@ToString 自动重写toString方法
@EqualsAndHashCode 自动生成equals和hashCode方法
@NoArgsConstructor 生成无参构造器
@AllArgsConstructor 生成一个包含所有参数的构造器,不包含无参构造
@RequireArgsConstructor 生成特定参数的构造器,特定参数指的是final修饰的变量们

Spring的作用域与生命周期
Spring的作用域与生命周期
此时我们没有写setter方法,只是加入了相应注解,lombok帮我们补全,我们可以看到set方法右下角有个logo,以上就是lombok的功能演示

二、Spring作用域

Spring作用域:Spring的作用域是用来控制Bean实例创建的范围和生命周期的,可以根据具体情况选择不同的作用域来达到性能优化、资源利用最大化和可维护性等目的

Spring Bean作用域(Scope):
1.singleton:单例模式。Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象。Singleton作用域是Spring中的缺省作用域,也可以显示的将Bean定义为singleton模式
2.prototype:原型模式。每次通过Spring容器获取prototype定义的Bean时,容器都将创建一个新的Bean实例,每个Bean实例都有自己的属性和状态,而singleton全局只有一个对象
3.request:请求模式。在一次HTTP请求中,容器会返回该Bean的同一个实例,但在不同的请求中会创建新的实例。仅适用于WebApplicationContext环境
4.session:会话模式。在同一个HTTP Session中,每个Bean定义对应一个实例。仅适用于WebApplicationContext环境
5.global seesion:全局会话模式。仅在使用Portlet上下文时有效,表示整个Web应用中所有Portlet共享同一个Bean实例,仅适用于WebApplicationContext环境
6.websocket:网络长连接,只适用于Spring WebSocket项目

我们可以通过两种方式设置Spring Bean作用域:
1.xml配置文件手动设置作用域
Spring的作用域与生命周期
因为我们这里是普通的Spring项目所以只有两种作用域类型
2.使用注解进行设置作用域
Spring的作用域与生命周期
我们Scope注解还可以传入另一种参数形式
Spring的作用域与生命周期
Spring的作用域与生命周期
ConfigurableBeanFactory类为我们提供了静态属性,防止我们手动输错

我们来看一下singleton和prototype到底有什么区别:
singleton:

public static void main(String[] args) {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //singleton作用域下
        User user1 = context.getBean("user",User.class);
        User user2 = context.getBean("user",User.class);
        System.out.println(user1 == user2);
    }

Spring的作用域与生命周期
prototype:

public static void main(String[] args) {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //prototype作用域下
        User user1 = context.getBean("user",User.class);
        User user2 = context.getBean("user",User.class);
        System.out.println(user1 == user2);
    }

Spring的作用域与生命周期
我们可以发现我们singleton每次获取都是同一份对象,而prototype每次获取都会去创建一个新的对象

二、Bean原理分析

执行流程

1.首先启动容器,加载配置文件
Spring的作用域与生命周期
2.根据配置文件完成Bean的初始化
Spring的作用域与生命周期
配置文件中的Bean是按顺序初始化的
3.注册Bean对象到容器中
扫描com.zd.demo包下的注解进行初始化(@Controller,Service,@Component,@Repository),然后初始化我们手动写的Bean
Spring的作用域与生命周期
4.装配Bean的属性
如果Bean对象需要其他的Bean作为属性,可以使用注解的方式注入(@Autowired、Resource)
Spring的作用域与生命周期
Bean执行流程:启动容器 -> 实例化Bean(分配空间) -> Bean注册到Spring容器中(存对象) -> 将Bean装配到需要的类中(取对象)

Bean的生命周期

Spring Bean的生命周期是从Bean实例化之后,即通过反射创建出对象之后,到Bean成为一个完整的对象,最终存储到单例池中,这个过程称之为Spring Bean的生命周期,大致为分为5个阶段:
1.实例化阶段:Spring框架会取出BeanDefinition的信息进行判断,Bean作用域是否是singleton,是否延迟加载(lazy-init),是否是FactoryBean等,最终Bean通过反射进行实例化
2.设置属性:Bean的注入与装配
3.Bean的初始化阶段:
执行Aware接口方法,如BeanNameAware、BeanFactoryAware、ApplicationContextAware的接口方法
执行BeanPostProcessor方法(before)
执行@PostConstruct初始化方法
行InitializingBean接口的初始化方法
执行自定义指定的init-method方法
执行BeanPostProcessor初始化后置方法(after)
4.使用Bean
5.销毁Bean
执行PreDestroy、DisposableBean接口方法
执行destroy-method方法

Spring的作用域与生命周期
Bean初始化过程设置以下几个过程:
1.Bean实例的属性填充
2.Aware接口属性注入
3.BeanPostProcessor的before()方法回调
4.执行@PostConstruct初始化方法
5.InitializingBean接口的初始化方法回调
6.自定义初始化方法init的回调
7.BeanPostProcessor的after()方法回调
Spring的作用域与生命周期文章来源地址https://www.toymoban.com/news/detail-423501.html

到了这里,关于Spring的作用域与生命周期的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring(Bean 作用域和生命周期)

    目录 1. 案例1: Bean作用域的问题 2. 作用域 3. 设置 Bean 的作用域 4. Spring 的执行流程 5. Bean 的生命周期 现在有一个公共的 Bean,通过给 A 用户 和 B 用户使用, 然后在使用的过程中 A 偷偷的修改了公共 Bean 的数据, 导致 B 在使用时发生了预期之外的逻辑错误 (1) 公共 Bean:   [名称是

    2024年02月19日
    浏览(100)
  • Spring | Bean 作用域和生命周期

    Spring 是用来读取和存储 Bean,因此在 Spring 中 Bean 是最核心的操作资源,所以接下来我们深入学习⼀下 Bean 对象 假设现在有⼀个公共的 Bean,提供给 A 用户和 B 用户使用,然而在使用的途中 A 用户却 “悄悄” 地修改了公共 Bean 的数据,导致 B 用户在使用时发生了预期之外的逻

    2024年02月14日
    浏览(41)
  • Spring中Bean的作用域和Spring生命周期

    从前面的文章中我们看出Spring是用来存储和读取Bean的,因此Spring中Bean是最核心的资源,所以我们将对Bean进行深入的理解。 现在有一个公共的Bean,提供给了两个用户去使用,但是在使用过程中,用户一修改了公共的Bean数据,当用户2在使用时,却发现产生了逻辑上的错误。

    2024年02月16日
    浏览(47)
  • Bean 作用域、生命周期和Spring执行流程

    假设现在有⼀个公共的 Bean,提供给 A ⽤户和 B ⽤户使⽤,然⽽在使⽤的途中 A ⽤户却“悄悄”地修改了公共 Bean 的数据,导致 B ⽤户在使⽤时发⽣了预期之外的逻辑错误。 我们可以看到,B 用户在使用这个Bean对象时,得到的Dog是被A 用户修改过的,这无疑会给 B 用户带来很

    2024年02月12日
    浏览(47)
  • Spring Bean的作用域及生命周期

    目录 前言: Bean的作用域(Scope) 单例模式 原型模式(多例作用域) 请求作用域(request) 会话作用域 全局作用域 网络长连接 Spring执行流程 Bean的生命周期 测试 小结:     使用Spring框架时,我们需要清楚Spring托管Bean的作用域和生命周期,这样使用框架才会更加得心应手。

    2024年02月03日
    浏览(38)
  • Spring Bean的作用域和生命周期

    Bean 的作用域指的是 Bean 在 Spring 容器中的行为(Bean 实例创建及生命周期),它的行为是由 Spring 来管理的,可以根据具体情况选择不同的作用域来达到性能优化、资源利用最大化和可维护性等目的。 Bean 作用域(Scope)类型主要有如下几种: 其中前两种是 Spring 核心作用域,

    2024年02月12日
    浏览(56)
  • 【Spring】Bean的作用域和生命周期

    目录 一、引入案例来探讨Bean的作用域 二、Bean的作用域 2.1、Bean的6种作用域 2.2、设置Bean的作用域 三、Spring的执行流程  四、Bean的声明周期 1、生命周期演示 首先我们创建一个User类,定义一个用户信息,在定义一个Users类,使用方法注解将user存入Spring中,然后两个用户A对这

    2024年02月14日
    浏览(44)
  • Spring系列4 -- Bean的作用域和生命周期

    目录 1. 案例 2. 作用域定义 2.1 Bean的6种作用域 2.2 设置作用域 3. Sring的执行流程 4. Bean的生命周期 思考: 为什么不是先进行初始化然后再进行设置属性呢?         假设现在有⼀个公共的 Bean,提供给 A ⽤户和 B ⽤户使⽤,然⽽在使⽤的途中 A ⽤户却“悄悄”地修改了公共

    2024年02月15日
    浏览(34)
  • 5、Spring之bean的作用域和生命周期

    5.1.1.1、配置bean 注意:当bean不配置scope属性时,默认是singleton(单例) 5.1.1.2、测试 由控制台日志可知,此时ioc获取到的两个bean本质上是同一个对象 5.1.2.1、配置bean 5.1.2.2、测试 由控制台日志可知,此时ioc获取到的两个bean本质上是不同的对象 如果是在WebApplicationContext环境下

    2024年02月14日
    浏览(46)
  • 【JAVA】变量的作用域与生存周期

    个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 变量 ,我们学习过程中逃不掉的知识,无论在哪种语言中我们都需要学会去合理的运用它,今天我们就来详细的讲讲变量的运用. 通常来说,一段程序代码中所用到的名字并不总是有效可用的,而限定这个名字的可用性

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包