spring Bean 的作用域

当在 Spring 中定义一个 bean 时,你必须声明该 bean 的作用域的选项。例如,为了强制 Spring 在每次需要时都产生一个新的 bean 实例,你应该声明 bean 的作用域的属性为 prototype。同理,如果你想让 Spring 在每次需要时都返回同一个bean实例,你应该声明 bean 的作用域的属性为 singleton。

Spring 框架支持以下五个作用域,分别为singleton、prototype、request、session和global session,5种作用域说明如下所示,

注意,如果你使用 web-aware ApplicationContext 时,其中三个是可用的。

作用域 描述
singleton

在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,默认值

prototype 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()
request 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境
session 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean,仅适用于WebApplicationContext环境
global-session 一般用于Portlet应用环境,该运用域仅适用于WebApplicationContext环境
  • Singleton

    singleton 是默认的作用域, 单例模式 ;

    对比 Java EE 单例写法

    public class Manager {
    
    	private interface MyInternal {
    		public Manager mgr = new Manager();
    	}
    	private Manager()
    	{
    	}
    	public Manager getInstance()
    	{
    		return MyInternal.mgr;
    	}
    }
    

    如果是自己写的话,单例代码虽然没有多少行代码,但是和 spring boot 单例 对比, spring boot 0 行代码实现单例 ! 是不是很6 !

    没错 spring boot 就是简单、快捷、方便!

  • prototype

    prototype 是多例,也就是调用一次就会创建一次,

    @Component
    @Scope("prototype")
    public class TestProtoType
    {
    }
    

    spring boot 多例的实现 只要通过

    @Scope("prototype")
    

    这个注解就可以了!