2015-01-31 1 views
0

Возможно, я ошибаюсь, но я не могу понять, почему Spring создает 2 разных объекта из класса Singleton. Ниже приводится код:Почему Spring создаст 2 объекта из класса Singleton?

public class DbSingleTOn { 

    private static DbSingleTOn dbSingleTOn = new DbSingleTOn(); 
    private DbSingleTOn() { 
    } 
    public static DbSingleTOn getInstance() { 
     return dbSingleTOn; 
    } 
} 

public class MyApp { 

    public static void main(String[] args) { 
     AbstractApplicationContext context = new ClassPathXmlApplicationContext(
       "spring-singleton.xml"); 
     DbSingleTOn dbSingleTOn = context.getBean(DbSingleTOn.class); 
     System.out.println(dbSingleTOn.hashCode()); 

     DbSingleTOn dbSingleTOn1 = context.getBean(DbSingleTOn.class); 
     System.out.println(dbSingleTOn1.hashCode()); 

     context.registerShutdownHook(); 
    } 
} 

Output: 
18885489 
17045421 

Spring Config XML:

<bean id="bean1" class="com.singleton.DbSingleTOn" scope="prototype" > 
    </bean> 

Ожидается, чтобы получить другой объект для нормального класса с использованием «прототип» область применения, однако, почему бы «прототип» создать 2 объекта из класса Singleton?

ответ

2

Две вещи. Во-первых, Spring не имеет представления (и действительно не заботится) о том, как настроен ваш класс. Тот факт, что вы внедрили шаблон программирования, ничего не значит весной. Во-вторых, Spring использует рефлексию для создания типов компонентов, которые вы заявляете, и поэтому можете использовать ваши конструкторы private.

Каждый раз, когда вы запрашиваете фасонный объект из Spring, он создаст новый экземпляр компонента.

+0

@Scotirios У меня была догадка, что весна должна загружать классы через отражение, следовательно, ожидаемое поведение. Спасибо, что подтвердили. – bluelurker

3

Просто потому, что вы создаете синглтон в статическом поле, это не влияет на весну. Весна просто не осознает этого.

Область прототипа просто означает: вернуть новый экземпляр, когда вызывается getBean.

Singleton scope означает: создать экземпляр один раз и всегда возвращать этот.

1

Если вы не настроите непосредственно, как создать экземпляр компонента, используйте функцию Spring, чтобы вызвать конструктор для создания bean-компонентов. Кроме того, для использования одиночной области по умолчанию вы также можете установить factory-method в свой xml-конфигуратор на getInstance, чтобы рассказать Spring о том, как создать ваши бобы.

Смежные вопросы