bean的作用域

2017-08-17  本文已影响10人  熊熊要更努力

当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下4种作用域:

单例是默认的作用域.对于易变的作用域,这并不合适.如果选择其他的作用域,要使用@scope注解.
for example:
@Compenent
@Scope(ConfigurableBeanFactory.SCOPE_PROYOTYPE)
public class notpad
{}

基本作用域

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

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

Spring中的单例模式.png Spring的原型模式.png

Web应用中的作用域

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

自定义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;
 } 
}
上一篇下一篇

猜你喜欢

热点阅读