原创

Spring中bean的作用域

文章源码:https://github.com/Sniper2016/SpringStudy

Spring 中 getBean 得到的 bean 对象是同一个实例?

先来个例子

1.定义 bean


package cn.gameboys.scope;


public class User {
 private String id;

 private String name;

 public String getId() {
  return id;
 }

 public void setId(String id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

}

2.配置文件


 <bean id="zs" class="cn.gameboys.scope.User">
  <property name="id" value="66"></property>
  <property name="name" value="zhangsan"></property>
 </bean>



 <bean id="lisi"  class="cn.gameboys.scope.User" scope="prototype">
  <property name="id" value="555"></property>
  <property name="name" value="lisi"></property>
 </bean>

3.测试方法

package cn.gameboys.scope;

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

public abstract class Test {
 public static void main(String[] args) {
  ApplicationContext context = new ClassPathXmlApplicationContext("scope-test.xml");
  User user = context.getBean("zs",User.class);
  User user2 = context.getBean("zs",User.class);
  System.out.println("两个对象是否相等?:"+user.equals(user2));

  User user3 = context.getBean("lisi",User.class);
  User user4 = context.getBean("lisi",User.class);
  System.out.println("两个对象是否相等?:"+user3.equals(user4));

 }
}

4.结果:

两个对象是否相等?:true
两个对象是否相等?:false

介绍

从上面的例子中,我们可以看到,scope 标签可以定义 bean 的作用域,进而影响 getBean 得到的是单例还是每次获取都新 new 一个。

bean 的作用域一共有以下几种:

  • singleton:Spring 容器内只存在一个 Bean 实例 单例模式 是系统默认值
  • prototype:每次调用都会创建一个 Bean 也就是每次 getBean()就相当于是 new Bean()的操作,prototype 的作用域需要慎重考虑 因为每次创建和销毁都会造成很大的性能开销 WEB 环境下的作用域:
  • request:每次 HTTP 请求都会创建一个 Bean
  • session:HTTP Session 共享一个 Bean 实例
  • global-session:用于 portlet 容器,因为每个 portlet 有单独的 session,globalsession 提供一个全局性的 http session。
正文到此结束