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日

相关文章

  • SpringBoot集成Shiro进行权限控制和管理的示例

    下面我来详细讲解“SpringBoot集成Shiro进行权限控制和管理的示例”的完整攻略。 什么是 Shiro Apache Shiro 是一个功能强大且易于使用的 Java 安全框架,提供身份验证、授权、加密等功能,可以轻松地保护应用程序的安全与隐私。 SpringBoot 集成 Shiro 下面是 SpringBoot 集成 Shiro 进行权限控制和管…

    Java 2023年6月15日
    00
  • Java并行执行任务的几种方案小结

    Java并行执行任务的几种方案小结 在Java领域,多线程是一种非常常见的处理并发任务的方式。但是,多线程在并发处理能力以及代码设计方式上存在一些限制和挑战。近年来,随着Java语言的发展和并发编程框架的增多,人们有了许多新的方法来在Java中并行执行任务。本文将讲述Java并行执行任务的几种方案,以及在实际使用中的注意事项。 传统的多线程 在Java中使用…

    Java 2023年5月18日
    00
  • Spring JDBC的使用方法详解

    Spring JDBC的使用方法详解 前言 Spring JDBC 是 Spring Framework 框架中提供的一种数据访问技术,它的基础是 JdbcTemplate,通过其封装了对 JDBC 的访问,大大减少了开发数据访问层的代码量,提高了开发效率和代码的可维护性。本文将详细讲解 Spring JDBC 的使用方法,同时提供两个示例,帮助理解。 框架…

    Java 2023年5月20日
    00
  • 常见的对象引用有哪些?

    关于“常见的对象引用有哪些”这个问题,下面我将为大家提供一份完整的使用攻略,具体步骤如下: 第一步:理解对象引用的含义 对象引用,是指在 Java 中,存储在变量中的引用,指向在内存中分配的实际的对象。变量只存储引用,而不存储实际的对象。因此,Java 中的对象引用是一种非常重要的概念。 第二步:了解常见的对象引用 Java 中常见的对象引用有以下四种: 强…

    Java 2023年5月11日
    00
  • java实现文件断点续传下载功能

    下面是详细讲解Java实现文件断点续传下载功能的完整攻略。 什么是文件断点续传下载 文件断点续传下载是指在文件下载过程中,如果因为网络问题或其他原因导致下载中断,下载程序可以在中断的地方恢复下载,避免了重头开始下载的情况。 实现文件断点续传下载的步骤 获取文件大小和已经下载的大小 在断点续传下载的过程中,需要获取要下载的文件的大小并记录已经下载的大小,以指示…

    Java 2023年6月16日
    00
  • 什么是动态字节码生成?

    动态字节码生成是指在程序运行过程中通过程序生成字节码并将其加载进JVM,从而实现运行时动态生成代码的一种技术。 使用动态字节码生成的主要场景是:在程序运行过程中,需要根据不同的输入或状态,动态生成代码以完成特定的逻辑。另一个应用场景是AOP框架,其中动态字节码生成技术被用于实现切面编程。 下面是两个示例说明,帮助你更好地理解动态字节码生成的具体使用方法。 示…

    Java 2023年5月11日
    00
  • Kylin对接JDBC集成Zepplin的实现方法

    Kylin是一个开源的大数据分析引擎,它可以快速处理PB级数据,并支持OLAP分析。Zepplin是一个强大的开源笔记本应用程序,用于数据分析和可视化。在本攻略中,我们将详细介绍如何将Kylin与JDBC集成Zepplin。 步骤一:安装Kylin和Zepplin 首先,需要安装Kylin和Zepplin。安装Kylin的过程可以参考Kylin的官方文档。安…

    Java 2023年5月20日
    00
  • Java Web中解决路径(绝对路径与相对路径)问题

    下面将详细讲解Java Web中如何解决路径问题。 什么是路径问题 Java Web开发中常常会出现路径问题,通常包括两种类型:绝对路径和相对路径。 绝对路径是指从根目录开始,一直到需要的文件或目录的路径,例如:C:\my_project\resources\file.txt。 相对路径是指相对于当前文件或项目的路径,例如:./resources/file.…

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