Как связать свойство компонента с другим и наблюдать изменения в Платформе Spring

Есть некоторые тонкости в отношении путей, которые ни один из текущих ответов не рассматривает. Вы должны использовать правильный путь в зависимости от того, какую статистику вы интересуете. На основе глубокого погружения в DeviceStorageMonitorService.java, который генерирует предупреждения о недостаточном дисковом пространстве в области уведомлений и липкие широковещательные рассылки для ACTION_DEVICE_STORAGE_LOW, вот некоторые из путей которые вы можете использовать:

  1. Для проверки свободного внутреннего дискового пространства используйте каталог данных, полученный с помощью Environment.getDataDirectory (). Это даст вам свободное место на разделе данных. Раздел данных содержит все внутреннее хранилище для всех приложений на устройстве.

  2. Для проверки свободного внешнего (SDCARD) дискового пространства используйте каталог внешнего хранилища, полученный с помощью Environment.getExternalStorageDirectory (). Это даст вам свободное место на SDCARD.

  3. Чтобы проверить доступную память в системном разделе, содержащем файлы ОС, используйте Environment.getRootDirectory (). Поскольку ваше приложение не имеет доступа к системному разделу, эта статистика, вероятно, не очень полезна. DeviceStorageMonitorService использует в информационных целях и заносит его в журнал.

  4. Чтобы проверить наличие временных файлов / кэш-памяти, используйте Environment.getDownloadCacheDirectory (). DeviceStorageMonitorService пытается очистить некоторые временные файлы при нехватке памяти.

Пример кода для получения внутренней (/ data), внешней (/ sdcard) и OS (/ system) свободной памяти:

// Get internal (data partition) free space
// This will match what's shown in System Settings > Storage for 
// Internal Space, when you subtract Total - Used
public long getFreeInternalMemory()
{
    return getFreeMemory(Environment.getDataDirectory());
}

// Get external (SDCARD) free space
public long getFreeExternalMemory()
{
    return getFreeMemory(Environment.getExternalStorageDirectory());
}

// Get Android OS (system partition) free space
public long getFreeSystemMemory()
{
    return getFreeMemory(Environment.getRootDirectory());
}

// Get free space for provided path
// Note that this will throw IllegalArgumentException for invalid paths
public long getFreeMemory(File path)
{
    StatFs stats = new StatFs(path.getAbsolutePath());
    return stats.getAvailableBlocksLong() * stats.getBlockSizeLong();
}
7
задан 21 May 2009 в 09:11
поделиться

4 ответа

Я не думаю, что то, что вы делаете, возможно в Spring 2.5. Это может стать возможным в Spring 3 с использованием нового синтаксиса выражений, но я так не думаю.

Даже если бы это было так, я думаю, это сбило бы с толку. Лучше поместить ваше общее значение в отдельный класс и внедрить экземпляр этого класса в другие bean-компоненты, которым необходимо его совместно использовать.

0
ответ дан 7 December 2019 в 18:45
поделиться

Самый простой способ - сделать это свойство bean-компонентом, на который ссылаются два других bean-компонента, например, для значения String должен быть класс StringHolder:

public class StringHolder {
     private String value;

     // setter and getter elided due to author's lazyness

}
1
ответ дан 7 December 2019 в 18:45
поделиться

Согласно документации, вы можете установить его через hibernate.connection.isolation . Если вам нужен более точный контроль, изучите механизмы пессимистической блокировки NHibernate.

Я почти уверен, что это сработает после того, как вы проработаете несколько изломов

public class Contact {
    ...

    private String phone;
    private String name;
    private Integer id;

    public Contact(Integer id, String name, String phone) {
        this.phone = phone;
        this.name = name;
        this.id = id;
    }

    public void setPhone(String phone) {
        this.phone = phone.
    }

    //Other getters, setters, etc

    ...
}


@Aspect
public class ContactPhoneSynchronizer {
    //there is probably a more efficient way to keep track of contact objects
    //but right now i can't think of one, because for things like a tree, we need to 
    //be able to identify objects with the same name (John Smith), but that
    //have different unique ids, since we only want one of each Contact object
    //in this cache.

    private List<Contact> contacts = Collections.synchronizedList(new ArrayList<Contact>());

    /**
        This method will execute every time someone makes a new Contact object.
        If it already exists, return it from the cache in this.contacts.  Otherwise,
        proceed with the object construction and put that object in the cache.
    **/

    @Around("call(public Contact.new(Integer,String,String)) && args(id,name,phone)")
    public Object cacheNewContact(ProceedingJoinPoint joinPoint, Integer id, String name, String phone) {
        Contact contact = null;

        for (Contact c : contacts) {
            if (id.equals(c.getId()) {
                contact = c;
                break;
            }
        }

        if (contact == null) {
            contact = (Contact) joinPoint.proceed();
            this.contacts.add(contact);            
        }

        return contact;
    }

    /**This should execute every time a setPhone() method is executed on 
        a contact object.  The method looks for all Contacts of the same
        name in the cache and then sets their phone number to the one being passed
        into the original target class.

        Because objects are passed by reference until you do a reassociation, 
        calling c.setPhone on the object in the cache should update the actual
        instance of the object in memory, so whoever has that reference will
        get the updated information.
    **/

    @After("execution(example.Contact.setPhone(String) && args(phone)")
    public void syncContact(JoinPoint joinPoint, String phone) {
        Contact contact = joinPoint.getTarget();

        for (Contact c : this.contacts) {
            if (c.getName().equals(contact.getName()) {
                c.setPhone(phone);
            }
        }
    }
}

Опять же, есть, вероятно, 100 способов, которыми вы могли бы это оптимизировать, так как я набираю это в уме; то есть, если вы в первую очередь хотели пройти этот маршрут. Теоретически это должно сработать, но я вообще не тестировал.

В любом случае, счастливой весны!

0
ответ дан 7 December 2019 в 18:45
поделиться

Вся идея Spring заключается (была?) В том, чтобы сохранить чистый объектно-ориентированный дизайн, состоящий из простых старых объектов Java, и использовать структуру Spring для обработки утомительного создания объектов. Что касается АОП, это должно решать только общие проблемы. Я совсем не уверен, что это один из тех случаев, когда АОП - хорошая идея. Ваше приложение зависит от поведения этих телефонных номеров, синхронизируемых друг с другом, это одна из основных функций. Таким образом, ваш дизайн должен отражать это.

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

Если у вас есть объект PhoneNumber, который принимает число в качестве аргумента конструктора, сопоставление становится тривиальным:

1
ответ дан 7 December 2019 в 18:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: