Где вы храните постоянное значение памяти (не дБ) в течение всего времени жизни приложения? - PullRequest
0 голосов
/ 01 июня 2011

Допустим, я хочу установить переменную при создании экземпляра моего приложения Spring:

String timeUp = new Date().toString();

Я хочу иметь возможность доступа к этому значению из всех компонентов моего приложения, но я не хочу хранить его в базе данных. Я просто хочу сохранить его в компоненте приложения, который будет доступен для всех других компонентов приложения. Как это возможно?

Ответы [ 7 ]

2 голосов
/ 01 июня 2011

Если все живет на одной машине, вы можете использовать singleton .Это единственный экземпляр, к которому все могут легко получить доступ и вызвать.

Для длительного хранения, если база данных не является опцией, вы можете сериализовать ваш компонент в файл, илипросто напишите свой собственный формат файла и выведите в него.

2 голосов
/ 01 июня 2011

Spring Beans по умолчанию являются синглетонами. Так что просто создайте для этого боб.

@Component
public class TimeUp {
  private final String _timeUp = new Date().toString();
  public String getTimeUp() { _timeUp };
}

Затем введите этот боб в нужное вам место.

@Component
public class Whatever {
  @Autowired TimeUp timeUp;

  public void useTimeUp() {
     System.out.println(timeUp.getTimeUp());
  }
}
1 голос
/ 01 июня 2011

Синглтон, инициализированный в методе ContextListener contextInitialized, будет моей первой точкой вызова.

0 голосов
/ 01 июня 2011

Вы можете использовать Singleton:

public class Environment {

    private final long startTime = ManagementFactory.getRuntimeMXBean().getStartTime();

    public long getStartTime() {
        return this.startTime;
    }


    private static final Environment SINGLETON = new Environment();

    private Environment() {
        //nop
    }

    public static Environment getInstance() {
        return SINGLETON;
    }
}
0 голосов
/ 01 июня 2011

Если вы просто хотите, чтобы приложения работали без перерыва, вы можете использовать следующее

RuntimeMXBean mx = ManagementFactory.getRuntimeMXBean();
long uptimeInMillis = mx.getUptime();

Если вы ищете более абстрактный ответ, Крис дал хорошее решение.

0 голосов
/ 01 июня 2011

Один из способов сделать это - позволить одному из ваших классов сервлетов или классов фильтра иметь открытый статический конечный член типа Date, а в строке объявления установить для него новый объект даты.затем вы можете сделать «имя класса сервлета (точка) публичное имя члена» для доступа к этому значению.

если вы делаете это в сервлете, вы должны объявить этот сервлет внутри вашего web.xml как «load-on-стартуп "сервлет.в противном случае он не получит значение даты до первого использования сервлета, и это не совсем то, что вам нужно:)

0 голосов
/ 01 июня 2011

Это классическое использование синглтона.Если у вас есть только несколько из них, вы можете создать синглтон для каждого значения.Если у вас их много, вы можете написать «сервис», в котором вы устанавливаете и ищите значения.

Весной вы можете сделать это:

import org.springframework.beans.factory.FactoryBean;

public class TimeUp implements FactoryBean<String> {
  private final String _value = new Date().toString();

  public String getObject() {
    return _value;

  public Class<?> getObjectType() {
    return String.class;
  }

  public boolean isSingleton() {
    return true;
  }
}

Затем веснойбудет просто сделать:

<bean id="timeUp" class="example.TimeUp"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...