Spring中Bean的实例过程

2019-07-20  本文已影响0人  Huang98

Spring中Bean的实例过程

了解Bean的是实例化模式

 默认情况下,Spring中的所有bean都是单例的。这意味着Spring维护一个bean的实例,所有依赖对象都使用同一个实例,对ApplicationContext.getBean()的所有调用都会返回同一个实例。可以使用标识比较(==)而不是equals()比较来检查bean是否相同。

 术语单例(singleton)在Java中可互换使用,分别指不同的概念:应用程序中具有单个实例的对象以及Singleton设计模式。通常将第一个概念成为单例,而将Singleton设计模式简称为Singleton。如果把使用单例实例与使用Singleton设计模式的需求搞混淆,就会出现问题。以下代码片段显示了Java中Singleton设计模式的典型实现:

public class Singleton{
    private static Singleton instance;
    static {
        instance = new Singleton();
    }
    
    public static Singleton getInstance(){
        return instance;
    }
}

 虽然上述设计模式实现了自己的目标,即允许在整哥应用程序中维护和访问单个类的实例,但这样做的代价是增加了耦合。应用程序代码必须对Singleton类有明确的了解才能获的实例,从而完全清除了对接口进行编码的能力。

 实际上,Singleton设计模式是两种模式。第一种模式和预期的一样,主要用来维护对象的单个实例。第二种模式是一种用于查找对象的模式,该模式不太常用,因为它完全消除了使用接口的可能性。使用Singleton设计模式也使得任意替换的实现变得更困难,因为大多数需要Singleton实例的对象都直接访问Singleton对象。当试图对应用程序进行单元测试时,这可能会导致各种令人头疼的问题,因为无法用模拟替代Singleton以进行测试。

 幸运的是,如果使用Spring,则可以利用单例实例化模型,而无须使用Singleton设计模式。Spring种的所有bean默认情况下都创建Singleton实例,Spring使用相同的实例来完成对bean的所有请求。当然,Spring不仅限于使用Singleton实例:仍然可以创建新的bean的实例,以满足每个依赖项以及对getBean()的调用。Spring在完成这些工作的同时不会对应用程序代码产生任何影响,因此,通常将Spring称为实例化模式不可知的。这是一个强大的概念。如果正在使用一个单例对象,但发现它并不合适多线程访问,那么可以将它改为非单例(原型),同时不会影响任何应用程序代码。

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

选择实例化模式

 大多数情况下,很容易看出哪种实例化模式是合适的。通常单例是bean的默认模式。一般来说,单例应该在在下列情况下使用:

 在一下情况下,应该考虑使用非单例:

 从Spring的实例化管理中获得的主要好处是,只需要付出很少的努力,应用程序就可以与单例相关的较低内存使用率中受益。如果发现单例模式无法满足应用程序的需要,那么修改配置以使用非单例模式也是一项很容易完成的任务。

实现bean作用域

 除单例和原型作用域外,当需要为更特定的目的而定义Spring bean时,还可以使用其他作用域。也可以实现自己的自定义作用域,并在Spring和ApplicationContext中注册它。Spring从版本4起支持以下bean作用域:

上一篇 下一篇

猜你喜欢

热点阅读