关于后端:Spring-中-Bean-的生命周期

37次阅读

共计 5740 个字符,预计需要花费 15 分钟才能阅读完成。

在您的应用程序中,由 Spring IoC 容器治理的造成其外围的对象被称为 ”bean”。一个 bean 是由 Spring IoC 容器实例化、组装和治理的对象。这些 bean 是通过您提供给容器的配置元数据创立的,例如,在后面章节中曾经看到的 XML <bean/> 定义。

Bean 定义蕴含了所谓的配置元数据,容器须要理解以下内容:

  • 如何创立一个 bean
  • Bean 的生命周期详细信息
  • Bean 的依赖关系

上述所有的配置元数据都转化为每个 bean 定义的以下属性汇合。

序号 属性和形容
1 class
这是必填属性,指定要用于创立 bean 的 bean 类。
2 name
此属性惟一地指定 bean 标识符。在基于 XML 的配置元数据中,您能够应用 id 和 / 或 name 属性来指定 bean 标识符。
3 scope
此属性指定从特定 bean 定义创立的对象的范畴,将在 bean 范畴章节中探讨。
4 constructor-arg
这用于注入依赖项,将在后续章节中探讨。
5 properties
这用于注入依赖项,将在后续章节中探讨。
6 autowiring mode
这用于注入依赖项,将在后续章节中探讨。
7 lazy-initialization mode
提早初始化的 bean 通知 IoC 容器在首次申请时创立 bean 实例,而不是在启动时创立。
8 initialization method
在容器设置了 bean 的所有必须属性之后,要调用的回调函数。将在 bean 生命周期章节中探讨。
9 destruction method
在蕴含 bean 的容器销毁时要应用的回调函数。将在 bean 生命周期章节中探讨。

Spring 配置元数据

Spring IoC 容器与理论编写配置元数据的格局齐全解耦。以下是向 Spring 容器提供配置元数据的三种重要办法:

  • 基于 XML 的配置文件。
  • 基于注解的配置。
  • 基于 Java 的配置。

您曾经看到了如何将基于 XML 的配置元数据提供给容器,但让咱们看一下蕴含不同 bean 定义的 XML 配置文件的另一个示例,包含提早初始化、初始化办法和销毁办法。

<?xml version = "1.0" encoding = "UTF-8"?>

<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <!-- 一个简略的 bean 定义 -->
   <bean id = "..." class = "...">
      <!-- 此处是该 bean 的协作者和配置 -->
   </bean>

   <!-- 启用提早初始化的 bean 定义 -->
   <bean id = "..." class = "..." lazy-init = "true">
      <!-- 此处是该 bean 的协作者和配置 -->
   </bean>

   <!-- 具备初始化办法的 bean 定义 -->
   <bean id = "..." class = "..." init-method = "...">
      <!-- 此处是该 bean 的协作者和配置 -->
   </bean>

   <!-- 具备销毁办法的 bean 定义 -->
   <bean id = "..." class = "..." destroy-method = "...">
      <!-- 此处是该 bean 的协作者和配置 -->
   </bean>

   <!-- 更多的 bean 定义在此处 -->

Spring 中的 Bean 作用域

在定义 <bean> 时,您能够抉择为该 bean 申明一个作用域。例如,要强制 Spring 每次须要时生成新的 bean 实例,您应该将 bean 的作用域属性申明为 prototype。相似地,如果您心愿 Spring 每次须要时返回雷同的 bean 实例,您应该将 bean 的作用域属性申明为 singleton。

Spring Framework 反对以下五种作用域,其中三种仅在应用与 Web 相干的 ApplicationContext 时才可用。

序号 作用域 & 形容
1 singleton
将 bean 定义的作用域限度为 Spring IoC 容器中的单个实例(默认)。
2 prototype
将单个 bean 定义的作用域限度为具备任意数量的对象实例。
3 request
将 bean 定义的作用域限度为 HTTP 申请。仅在具备与 Web 相干的 Spring ApplicationContext 的状况下无效。
4 session
将 bean 定义的作用域限度为 HTTP 会话。仅在具备与 Web 相干的 Spring ApplicationContext 的状况下无效。
5 global-session
将 bean 定义的作用域限度为全局 HTTP 会话。仅在具备与 Web 相干的 Spring ApplicationContext 的状况下无效。

在本章中,咱们将探讨前两种作用域,当探讨与 Web 相干的 Spring ApplicationContext 时,将探讨其余三种作用域。

单例作用域(singleton)

如果将作用域设置为 singleton,Spring IoC 容器将创立一个对象的确切实例,该实例由 bean 定义定义。此单个实例存储在此类单例 bean 的缓存中,对于该命名 bean 的所有后续申请和援用都会返回缓存的对象。

默认作用域始终是 singleton。然而,当您须要一个且仅一个 bean 实例时,您能够在 bean 配置文件中将作用域属性设置为 singleton,如下所示:

<!-- 具备 singleton 作用域的 bean 定义 -->
<bean id="..." class="..." scope="singleton">
   <!-- 此处搁置此 bean 的协作者和配置 -->

示例

假如您曾经筹备好 Eclipse IDE,并采取以下步骤创立 Spring 应用程序:

步骤 形容 1 创立一个名为 SpringExample 的我的项目,在创立的我的项目中的 src 文件夹下创立一个名为 com.tutorialspoint 的包。2 应用 ”Add External JARs” 选项增加所需的 Spring 库,如 Spring Hello World 示例章节中所述。3 在 com.tutorialspoint 包下创立 Java 类 HelloWorld 和 MainApp。4 在 src 文件夹下创立 Beans 配置文件 Beans.xml。5 最初一步是创立所有 Java 文件和 Bean 配置文件的内容,并按以下阐明运行应用程序。

以下是 HelloWorld.java 文件的内容:

package com.tutorialspoint;

public class HelloWorld {
   private String message;

   public void setMessage(String message){this.message  = message;}
   public void getMessage(){System.out.println("Your Message :" + message);
   }
}

以下是 MainApp.java 文件的内容:

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      HelloWorld objA = (HelloWorld) context.getBean("helloWorld");

      objA.setMessage("I'm object A");
      objA.getMessage();

      HelloWorld objB = (HelloWorld) context.getBean("helloWorld");
      objB.getMessage();}
}

以下是 singleton 作用域所需的 Beans.xml 配置文件的内容:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id="helloWorld" class="com.tutorialspoint.HelloWorld" scope="singleton">
   </bean>

</beans>

当您实现创立源代码和 bean 配置文件后,让咱们运行应用程序。如果您的应用程序一切正常,它将打印以下音讯:

Your Message : I'm object A
Your Message : I'm object A

原型作用域(prototype)

如果将作用域设置为 prototype,Spring IoC 容器将在每次申请特定 bean 时创立该对象的新 bean 实例。通常,对于所有有状态的 bean,应用 prototype 作用域,对于无状态的 bean,应用 singleton 作用域。

要定义原型作用域,您能够在 bean 配置文件中将作用域属性设置为 prototype,如下所示:

<!-- 具备 prototype 作用域的 bean 定义 -->
<bean id="..." class="..." scope="prototype">
   <!-- 此处搁置此 bean 的协作者和配置 -->
</bean>

示例

假如您曾经筹备好 Eclipse IDE,并采取以下步骤创立 Spring 应用程序:

步骤 形容 1 创立一个名为 SpringExample 的我的项目,在创立的我的项目中的 src 文件夹下创立一个名为 com.tutorialspoint 的包。2 应用 ”Add External JARs” 选项增加所需的 Spring 库,如 Spring Hello World 示例章节中所述。3 在 com.tutorialspoint 包下创立 Java 类 HelloWorld 和 MainApp。4 在 src 文件夹下创立 Beans 配置文件 Beans.xml。5 最初一步是创立所有 Java 文件和 Bean 配置文件的内容,并按以下阐明运行应用程序。

以下是 HelloWorld.java 文件的内容:

package com.tutorialspoint;

public class HelloWorld {
   private String message;

   public void setMessage(String message){this.message  = message;}
   public void getMessage(){System.out.println("Your Message :" + message);
   }
}

以下是 MainApp.java 文件的内容

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      HelloWorld objA = (HelloWorld) context.getBean("helloWorld");

      objA.setMessage("I'm object A");
      objA.getMessage();

      HelloWorld objB = (HelloWorld) context.getBean("helloWorld");
      objB.getMessage();}
}

以下是 prototype 作用域所需的 Beans.xml 配置文件的内容:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id="helloWorld" class="com.tutorialspoint.HelloWorld" scope="prototype">
   </bean>

</beans>

当您实现创立源代码和 bean 配置文件后,让咱们运行应用程序。如果您的应用程序一切正常,它将打印以下音讯:

Your Message : I'm object A
Your Message : null

最初

为了不便其余设施和平台的小伙伴观看往期文章,链接奉上:

公众号搜寻 Let us Coding 知乎 开源中国 CSDN 思否 掘金 InfoQ 简书 博客园 慕课 51CTOhelloworld 腾讯开发者社区 阿里开发者社区

看完如果感觉有帮忙,欢送 点赞、珍藏 关注

正文完
 0