2016-07-20 2 views
1

поэтому у меня есть этот класс пример:Как сохранить значение переменной статического класса весной?

public class Test { 

    private static int idCounter; 
    private int id; 

    Test() { 
     id=++idCounter; 
    } 

    public void getId() { 
     System.out.printf("This id is %s",this.id); 
    } 
} 

И в beans.xml конфигурации:

<beans> 
    <bean id="test" class="com.Test"/> 
</beans> 

Теперь, когда я пытаюсь сделать ArrayList, статические переменные сбрасывается каждый раз.

for (int i=0;i<9;i++) { 
    arrayList.add(context.getBean("test"); 
    arrayList.get(i).getId(); 
} 

Он напечатает, что «Это 1» для каждого объекта в списке массива. Как я могу сделать так, чтобы статическая переменная сохранила глобальную ценность?

+1

потому что по умолчанию scope Singleton, вы получаете тот же bean/object каждый раз, поэтому он отображает одно и то же значение. попробуйте установить область для прототипа – Sarief

+1

Мне интересно: почему вы используете 'getBean (" triangle ")' вместо 'getBean (" test ")'? – Andremoniy

ответ

1

По умолчанию весенние бобы имеют одинарный масштаб, что означает, что каждый запрос возвращает тот же экземпляр компонента. Что вам нужно - это прототип области:

<bean id="myBean" class="com.test.MyClass" scope="prototype"/> 
2

Что здесь происходит, это не то, что, по вашему мнению, происходит. Статическая переменная-член не сбрасывается; есть только один экземпляр вашего фаната Test, и в цикле вы просматриваете то же самое Test bean десять раз.

Весенние бобы по умолчанию имеют единичный объем, что означает, что Spring создаст только один экземпляр компонента, который используется каждый раз, когда он вводится или просматривается. Если вы хотите новый экземпляр, созданный каждый раз, дать боб прототип рамки вместо рамки одноэлементной по умолчанию:

@Scope("prototype") 
public class Test { 
    // ... 
} 

Если настроить Spring бобы с помощью XML, а затем сделать это, как показывает Эндрю Логвинов в своем ответе; добавить scope атрибут:

<bean id="test" class="com.Test" scope="prototype"/> 

Чтобы узнать больше, см Bean scopes в справочной документации Spring Framework.

+0

он использует xml, не могли бы вы также разместить его в xml? – Sarief

0

Вы объявили вам боб с test ID:

<beans> 
    <bean id="test" class="com.Test"/> 
</beans> 

Но после того, что вы получите экземпляр некоторых другой боб с использованием идентификатора triangle:

context.getBean("triangle") 

Итак, я полагаю, это просто опечатка -error: вы получаете экземпляр какого-либо другого компонента, в котором у вас нет счетчика статических идентификаторов. Проверьте код и обновите вопрос, если я не прав.

0

Jesper's answer является правильным; поскольку вы настроили это как singleton, есть только один экземпляр класса, конструктор получает один раз.

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

  • Оператору ++ не поточно- см Is the pre-increment operator thread-safe?.

  • Нет ничего, что заставило бы обновления вашего счетчика стать видимыми в потоках.

Вы должны использовать что-то вроде AtomicInteger для этого, это позволит поточно приращением и обеспечить видимость гарантии.

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