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

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

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

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

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

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

最初

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

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

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