8.2 prototype
如果一个 Bean 定义的作用域为 prototype,那么这个 Bean 就被称为 prototype bean。对于 prototype bean 来说,Spring 容器会在每次请求该 Bean 时,都创建一个新的 Bean 实例。
从某种意义上说,Spring IoC 容器对于 prototype bean 的作用就相当于 Java 的 new 操作符。它只负责 Bean 的创建,至于后续的生命周期管理则都是由客户端代码完成的。
在 Spring 配置文件中,可以使用 <bean>
元素的 scope
属性将 Bean 的作用域定义成 prototype,其配置方式如下所示:
<bean id="..." class="..." scope="prototype"/>
例 1
下面我们就通过一个简单的实例,对 Bean 的 prototype 作用域进行演示。
创建命名为 PrototypeBean 的类,代码如下:
package section2.demo1;
/**
* ClassName: PrototypeBean
* Description: TODO
*
* @author chuanlu
* @version 1.0.0
*/
public class PrototypeBean {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
修改 Spring 配置文件 spring-config.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.xsd">
<!-- 原型模式 prototype -->
<bean id="prototypeBean" class="section2.demo1.PrototypeBean" scope="prototype">
<property name="str" value="传陆编程"/>
</bean>
</beans>
创建命名为 MainApp 的类,代码如下:
package section2.demo1;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* ClassName: MainApp
* Description: TODO
*
* @author chuanlu
* @version 1.0.0
*/
public class MainApp {
private static final Log LOGGER = LogFactory.getLog(MainApp.class);
public static void main(String[] args) {
//获取 ApplicationContext 容器
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
PrototypeBean prototypeBean = context.getBean("prototypeBean", PrototypeBean.class);
PrototypeBean prototypeBean2 = context.getBean("prototypeBean", PrototypeBean.class);
LOGGER.info(prototypeBean);
LOGGER.info(prototypeBean2);
}
}
执行 MainApp 中的 main 方法,控制台输出如下:
4月 08, 2022 12:38:44 下午 section2.demo1.MainApp main
信息: section2.demo1.PrototypeBean@6631f5ca
4月 08, 2022 12:38:44 下午 section2.demo1.MainApp main
信息: section2.demo1.PrototypeBean@614ca7df
从运行结果可以看出,两次输出的内容并不相同,这说明在 prototype 作用域下,Spring 容器创建了两个不同的 prototypeBean 实例。