美文网首页Java学习笔记
Spring中Bean的作用域

Spring中Bean的作用域

作者: MaxZing | 来源:发表于2017-02-23 15:46 被阅读389次

作用域通俗一点------>表示:有效范围。
Spring Bean的有效范围,在XML中用scope定义

<bean id="BeanScopeTest" class="com.zing.test.bean.BeanScopeTest" scope="singleton"/>

SpringMVC 中定义了singletonprototype基本作用域和三个web作用域
先解释基本作用域,并且允许用户自己定义作用域

基本作用域

  • singleton
    作用域的Bean只会在每个Spring IoC容器中存在一个实例,而且其完整生命周期完全由Spring容器管理。对于所有获取该Bean的操作Spring容器将只返回同一个Bean。

单例模式:就是私有化构造函数,通过唯一的方法获取对象,并且每次获取为同一对象

public class Singleton {
    /*1.私有化构造函数*/
    private Singleton() {}
    //2.单例缓存者,惰性初始化,第一次使用时初始化
    private static class InstanceHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    //3.提供全局访问点
    public static Singleton getInstance() {
        return InstanceHolder.INSTANCE;
    }
}

以上就实现了一个单例模型

Spring把模型通过注册表的方式,将Bean缓存起来,先将Bean通过唯一键注册到表中,再通过键来获取他们,Spring的单例模式是通过注册表实现的,而非代码式单例模式,所以是非侵入式的。
在Spring中,Bean在没有指定作用域的时候,默认是单例模式的。

Spring中的单例模式
  • prototype
    原型模式,每次都是获取新的对象,跟单例模式不一样,Spring不对prototype模式的Bean进行缓存
Spring的原型模式

Web应用中的作用域

Spring提供了3种在Web中的作用域,分别在requestsessionglobalSession。这些作用域的有效范围分别如下

  • request
    每一次HTTP请求都会产生一个新的bean,这个bean仅在当前request内有效

  • session
    每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前session内有效

  • global session
    全局session有效,这个是针对portlet的web应用的,具体可以看看Portlet是如何定义了全局Session的。这个有效范围是全局portlet Session的生命周期范围内,如果不是portlet的web应用,那么这个等同于session作用域。

利用注解定义作用域

很简单,例子如下

@Scope("prototype")
@Component("bean")
public class BeanAnnotation {
  public void say(String arg)  {
   System.out.println(arg);
  }
}

自定义bean装配作用域

在2.0之后,Spring支持自己定义作用域了(不能覆盖singleton和prototype这两个现有的作用域)只要实现Scope接口就可以。
我们建立一个线程的scope,该scope在表示一个线程中有效,代码如下:

import org.springframework.beans.factory.config.Scope;

public class MyScope implements Scope { 
     private final ThreadLocal threadScope = new ThreadLocal() {
          protected Object initialValue() {
             return new HashMap(); 
          } 
     }; 

     public Object get(String name, ObjectFactory objectFactory) { 
         Map scope = (Map) threadScope.get(); 
         Object object = scope.get(name); 
        if(object==null) { 
           object = objectFactory.getObject(); 
           scope.put(name, object); 
         } 
        return object; 
      } 

     public Object remove(String name) { 
        Map scope = (Map) threadScope.get(); 
        return scope.remove(name); 
      }

      publicvoid registerDestructionCallback(String name, Runnable callback) { 
      }

    public String getConversationId() {
       // TODO Auto-generated method stub
        return null;
     } 
}

相关文章

  • Spring

    Spring Bean 作用域 Spring 3 中为 Bean 定义了 5 中作用域分别为 singleton(...

  • Spring_04_Bean的作用域

    Bean的作用域  当在Spring中定义个bean时,你必须声明bean的作用域选项.例如,为了强制Spring...

  • Bean的作用域

    Bean的作用域: singleton 当一个bean的作用域为singleton,那么Spring IoC容器中...

  • Bean的作用域

    Bean的作用域: singleton 当一个bean的作用域为singleton,那么Spring IoC容器中...

  • SPRING BEAN的基础

    一、SPRING BEAN的定义: 二、SPRING BEAN的作用域: 作用域例子: your msg :p...

  • Spring的作用域和生命周期

    Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例)、prototyp...

  • Spring Bean 作用域

    原文 :一文读懂Spring Bean作用域 - RelaxHeart网 Spring Bean的几种作用域 Sp...

  • spring详解(二)

    ③容器中bean的作用域: |作用域|描述||---|---||singleton|单例模式,在整个Spring ...

  • Spring IOC原理(二)

    Spring作用域 Spring 3 中为Bean 定义了5 中作用域,分别为singleton(单例)、prot...

  • spring getBean源码解析03

    spring中bean的生命周期 spring bean的作用域 spring 如何解决循环依赖 上面的示例中,A...

网友评论

    本文标题:Spring中Bean的作用域

    本文链接:https://www.haomeiwen.com/subject/kvxelttx.html