在您的应用程序中,由 Spring IoC 容器管理的形成其核心的对象被称为"bean"。一个 bean 是由 Spring IoC 容器实例化、组装和管理的对象。这些 bean 是通过您提供给容器的配置元数据创建的,例如,在前面章节中已经看到的 XML <bean/>
定义。
Bean 定义包含了所谓的配置元数据,容器需要了解以下内容:
如何创建一个 bean
Bean 的生命周期详细信息
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 时才可用。
在本章中,我们将讨论前两种作用域,当讨论与 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,简书,博客园,慕课,51CTO,helloworld,腾讯开发者社区,阿里开发者社区
看完如果觉得有帮助,欢迎点赞、收藏和关注
评论