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语言中,实现字符串反转操作非常简单。下面我将为你介绍一些常见的方法,以及示例代码。 方法一:使用StringBuilder的reverse()方法 StringBuilder是一个可变的字符串类,它提供了许多方便的方法,其中一个就是reverse()方法。其原理是将字符串中的所有字符进行反转操作。 publ…

    Java 2023年5月26日
    00
  • SpringBoot实现api加密的示例代码

    什么是API加密? API加密是指对API访问时的数据进行加密处理,确保API的安全性,确保数据在传输过程中不被恶意篡改。 实现API加密的原理 使用SpringBoot框架实现API加密,常用的加密算法有MD5和SHA1。 MD5加密算法可以用以下代码实现: import java.security.MessageDigest; import java.s…

    Java 2023年5月20日
    00
  • Java中的复合数据类型

    下面是Java中的复合数据类型的详细讲解: 什么是复合数据类型 在Java中,复合数据类型是由多个简单数据类型组合而成的数据类型,这些简单数据类型可以是Java内置的基本数据类型或是其他复合数据类型。复合数据类型也可以被称为复杂数据类型或组合数据类型。 在Java中,有以下几种复合数据类型:- 数组(Array)- 类(Class)- 接口(Interfac…

    Java 2023年5月26日
    00
  • 详解Spring mvc DispatchServlet 实现机制

    以下是关于“详解Spring MVC DispatchServlet 实现机制”的完整攻略,其中包含两个示例。 详解Spring MVC DispatchServlet 实现机制 Spring MVC是一个基于Java的Web框架,它可以帮助我们快速开发Web应用程序。DispatchServlet是Spring MVC的核心组件之一,它负责接收HTTP请求…

    Java 2023年5月17日
    00
  • Java中的封装是什么?

    Java中的封装(Encapsulation)是一种面向对象编程(OOP)中常见的原则之一,它是OOP中三大特征(封装、继承和多态)之一。 封装是指将一个对象的属性和方法进行私有化,使其不被外部直接访问和修改。目的在于隐藏对象的具体实现细节,增加代码的可读性、可维护性和安全性。在Java中,使用关键字private来实现封装。 下面以一个银行账户类Accou…

    Java 2023年4月27日
    00
  • 使用jdk1.8实现将list根据指定的值去分组的操作

    这里是使用JDK1.8实现将List根据指定的值进行分组的完整攻略。 1. 需求分析 我们要实现将List根据指定的值进行分组,要求在分组结果中,具有相同指定值的元素会被分到同一组中。例如,假设我们有如下的Student类: public class Student { private int id; private String name; private…

    Java 2023年5月26日
    00
  • springmvc 中dao层和service层的区别说明

    下面是详细讲解“springmvc 中dao层和service层的区别说明”的攻略。 1. DAO层和Service层的作用 DAO层 DAO层(Data Access Object 层)是Spring框架中负责与数据库交互,并对数据进行CRUD(增删改查)的持久化操作代码的一层。在实际开发中,DAO层通常与Hibernate、MyBatis等持久化框架联合…

    Java 2023年6月16日
    00
  • Java中Collection集合常用API之 Collection存储自定义类型对象的示例代码

    让我来详细讲解一下“Java中Collection集合常用API之 Collection存储自定义类型对象的示例代码”的完整攻略。 1. Collection集合常用API 在开始讲解如何存储自定义类型对象之前,我们先简要介绍一下Java中Collection集合常用的API。Collection接口是Java中的集合类中的基本接口,它提供了一系列操作集合的…

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