SPRING FRAMEWORK BEAN作用域和生命周期原理解析

标题: SPRING FRAMEWORK BEAN作用域和生命周期原理解析

1. BEAN的作用域

在Spring框架中,Bean的作用域是非常重要的概念。它决定了一个Bean对象在容器中的生命周期,也就是对象创建和销毁的时间。总的来说,Spring框架中Bean的作用域有以下4种:

1.1 单例模式(Singleton)

在Spring框架中,只要我们不进行任何配置,Bean的默认作用域都是Singleton单例模式。这意味着一个Bean对象在Spring容器中只会被创建一次,之后多次调用时只返回同一个对象实例。这种方式可以提高运行效率,但如果Bean中包含了一些需要动态加载的成员属性,可能会面临并发问题。

例如:

@Service
public class ExampleServiceImpl implements ExampleService {

    private List<String> dataList = new ArrayList<>();

    public void addData(String data) {
        dataList.add(data);
    }

    public void printData() {
        System.out.println(dataList);
    }
}

以上代码中的ExampleServiceImpl类是一个服务类,它中包括一个List类型的dataList属性,用于存储一些数据。如果我们在多个调用端同时调用了addData方法,由于默认是单例模式,可能会导致数据混乱。

1.2 原型模式(Prototype)

与Singleton不同,Prototype模式每次从Spring容器中注入时都会新创建一个Bean对象。因此每次调用都会返回一个新的Bean实例。这种方式消耗的内存可能会大于单例模式,但同时也可以避免并发问题。

例如:

@Service
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class ExampleServiceImpl implements ExampleService {

    private List<String> dataList = new ArrayList<>();

    public void addData(String data) {
        dataList.add(data);
    }

    public void printData() {
        System.out.println(dataList);
    }
}

以上代码的@Service注解中使用了@Scope注解,其中value参数指定了作用域为prototype类型。这样,每次注入ExampleServiceImpl对象时都会创建一个新的实例。

1.3 会话模式(Session)

Session模式创建的Bean对象在一个HTTP会话期间只存在一个实例。在Web应用中,当一个用户打开了浏览器访问某个网站时,创建的Bean对象在不同的请求中会保持相同。

例如:

@Service
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class ExampleServiceImpl implements ExampleService {

    private List<String> dataList = new ArrayList<>();

    public void addData(String data) {
        dataList.add(data);
    }

    public void printData() {
        System.out.println(dataList);
    }
}

以上代码的@Service注解中使用了@Scope注解,其中value参数指定了作用域为Session类型。这样,只要用户在一次会话期间内没有关闭浏览器,就可以一直使用同一个ExampleServiceImpl对象。

1.4 请求模式(Request)

Request模式创建的Bean对象在一个HTTP请求中只存在一个实例。当请求结束时,Bean对象也会随着销毁。

例如:

@Service
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class ExampleServiceImpl implements ExampleService {

    private List<String> dataList = new ArrayList<>();

    public void addData(String data) {
        dataList.add(data);
    }

    public void printData() {
        System.out.println(dataList);
    }
}

以上代码的@Service注解中使用了@Scope注解,其中value参数指定了作用域为Request类型。这样,每次HTTP请求都会创建新的ExampleServiceImpl对象,当请求结束后会销毁该对象。

2. BEAN的生命周期

Bean的生命周期指的是一个Bean对象从创建到销毁的整个过程。在Spring框架中,可以通过实现一些特定的接口或配置一些特定的方法,来控制Bean对象的生命周期。

Spring框架中Bean对象的生命周期主要涉及以下几个阶段:

2.1 实例化(Instantiation)

该阶段指Bean对象在内存中分配空间并由Spring容器读取配置文件进行实例化。该阶段的主要方法是构造器。

例如:

public class ExampleServiceImpl implements ExampleService {

    public ExampleServiceImpl() {
        System.out.println("实例化ExampleServiceImpl对象");
    }

    public void initMethod() {
        System.out.println("调用ExampleServiceImpl对象的initMethod方法");
    }

    @Override
    public void addData(String data) {
        System.out.println("调用ExampleServiceImpl对象的addData方法");
    }

    @Override
    public void printData() {
        System.out.println("调用ExampleServiceImpl对象的printData方法");
    }

    public void destroyMethod() {
        System.out.println("调用ExampleServiceImpl对象的destroyMethod方法");
    }
}

以上代码中定义了initMethod和destroyMethod两个方法,用于在Bean对象实例化和销毁时进行一些操作。

2.2 属性注入(Property injection)

该阶段指Bean对象在完成实例化后,Spring容器将会使用反射机制以及框架内部一些封装好的方法,将配置文件中定义的属性注入到Bean对象中。该阶段的主要方法是Setter方法。

例如:

public class ExampleServiceImpl implements ExampleService {

    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    @Override
    public void addData(String data) {
        System.out.println("调用ExampleServiceImpl对象的addData方法");
    }

    @Override
    public void printData() {
        System.out.println("调用ExampleServiceImpl对象的printData方法,message为:" + message);
    }
}

以上代码中定义了message属性以及Setter方法,用于在属性注入阶段将配置文件中的属性值注入到Bean对象中。

2.3 初始化(Initialization)

该阶段指当Bean对象完成属性注入后,Spring容器将会调用一些预定义的配置方法对对象进行初始化。该阶段的主要方法是实现InitializingBean接口或定义自定义的初始化方法。

例如:

public class ExampleServiceImpl implements ExampleService, InitializingBean {

    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("调用ExampleServiceImpl对象的afterPropertiesSet方法");
    }

    @Override
    public void addData(String data) {
        System.out.println("调用ExampleServiceImpl对象的addData方法");
    }

    @Override
    public void printData() {
        System.out.println("调用ExampleServiceImpl对象的printData方法,message为:" + message);
    }
}

以上代码中实现了InitializingBean接口,并实现了接口中定义的afterPropertiesSet方法。该方法会在Bean对象完成属性注入后被调用。

2.4 销毁(Destruction)

该阶段指在Bean对象被容器销毁时,Spring容器调用了一些预定义的配置方法进行清理操作。该阶段的主要方法是实现DisposableBean接口或定义自定义的销毁方法。

例如:

public class ExampleServiceImpl implements ExampleService, InitializingBean, DisposableBean {

    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("调用ExampleServiceImpl对象的afterPropertiesSet方法");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("调用ExampleServiceImpl对象的destroy方法");
    }

    @Override
    public void addData(String data) {
        System.out.println("调用ExampleServiceImpl对象的addData方法");
    }

    @Override
    public void printData() {
        System.out.println("调用ExampleServiceImpl对象的printData方法,message为:" + message);
    }
}

以上代码中实现了DisposableBean接口,并实现了接口中定义的destroy方法。该方法会在Bean对象被容器销毁时被调用。

示例就是以上这些啦,如有疑问可以提出,我会尽快回复。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SPRING FRAMEWORK BEAN作用域和生命周期原理解析 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 用java实现冒泡排序算法

    以下是用Java实现冒泡排序算法的完整攻略: 冒泡排序算法简介 冒泡排序是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就交换位置。重复地进行直到没有任何一对数字需要比较,即所有的数字按照从小到大(或从大到小)排序完成。 冒泡排序算法步骤 首先,比较相邻的两个元素,如果前面的元素大于后面的元素,就交换这两个元素的位置; …

    Java 2023年5月19日
    00
  • Spring Boot Reactor 整合 Resilience4j详析

    一、Spring Boot Reactor 整合 Resilience4j Spring Boot是基于Spring框架的快速开发框架,是Spring中最受欢迎的子项目之一。而Reactor则是Spring家族中用于构建反应式应用程序的一个项目。Resilience4j是一个基于Java8和函数式编程设计理念构建的轻量级容错框架。可以在分布式系统中实现自我保…

    Java 2023年5月19日
    00
  • Java TreeSet 添加失败的解决

    以下是Java TreeSet 添加失败的解决攻略,包括解决方法及示例说明: 问题描述 在使用Java TreeSet时,当添加元素时可能会因为一些特殊情况(例如元素值重复)导致添加失败。 解决方法 Java TreeSet是一种有序集合,只能添加不重复的元素。如果要添加的元素已经存在,那么添加操作将会失败,TreeSet会直接忽略这个元素。因此,为了避免添…

    Java 2023年5月26日
    00
  • Java垃圾收集器的作用是什么?

    Java垃圾收集器的作用 Java是一种面向对象的编程语言,拥有自己的垃圾收集器,其主要作用是管理内存,并在运行时自动回收不再使用的对象和释放内存空间。Java垃圾收集器在运行时周期性地扫描堆内存,检查哪些对象不再被使用,并将这些对象从内存中删除,以释放空间,防止内存泄漏和内存溢出等问题。 Java垃圾收集器分类 Java垃圾收集器由不同的组件组成,可以根据…

    Java 2023年5月11日
    00
  • Java 9 中的模块Module系统

    关于Java 9中的模块(Module)系统,这里为您整理了完整的攻略。请您仔细阅读以下文章。 什么是Module系统 Java 9中引入了一种新的概念——Module系统,来管理和组织代码。作为Java9中最重要的新特性之一,模块化系统的引入为我们开发、维护和交付大规模的Java应用程序提供了更多的选择和优化。 为什么引入Module系统 随着时间的推移,…

    Java 2023年5月24日
    00
  • JSP中实现系统登录后的退出原理及代码

    一、JSP中实现系统登录后的退出原理 在JSP中实现系统登录后的退出,其原理其实非常简单,就是使用户的会话失效。当用户在浏览器中点击退出登录操作时,我们需要做的就是销毁当前用户的会话,这样在之后的会话中,用户就需要重新进行登录验证。 JSP中实现会话失效有两种方式: 1.使用Session.invalidate()方法 在JSP页面中,当用户点击退出登录时,…

    Java 2023年6月15日
    00
  • SpringBoot使用mybatis步骤总结

    下面是关于“SpringBoot使用MyBatis步骤总结”的完整攻略。 一、引言 MyBatis 是一个开源的优秀的持久层框架,而 SpringBoot 是一个非常流行的 Web 应用开发框架。本文将介绍在 SpringBoot 中使用 MyBatis 的完整步骤。 二、添加依赖 首先需要在 pom.xml 文件中添加 MyBatis 和 MyBatis-…

    Java 2023年5月19日
    00
  • Servlet中文乱码问题解决方案解析

    下面是Servlet中文乱码问题解决方案的详细攻略。 问题描述 在Servlet程序中,当表单提交包含中文字符时,会出现中文乱码的现象。比如表单中提交的文字为“中国”,但在Servlet程序中获取到的却是“中国”。 解决方案分析 原因分析 中文乱码的原因在于,不同的系统、不同的编程语言对中文字符的存储方式不同。当一个字符被从一个系统传递到另一个系统时…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部