Аспект сущности (весной) - PullRequest
4 голосов
/ 26 мая 2010

У меня небольшая проблема с определением моих аспектов. У меня есть несколько сущностей, в которых я хотел бы профилировать get-методы, поэтому я написал следующий pointcut и метод

@Pointcut("execution(* tld.myproject.data.entities.*.get*()")
public void getEntityProperty() {}

@Around("getEntityProperty()")
public Object profileGetEntityProperty(ProceedingJoinPoint pjp) throws Throwable {
    long start = System.currentTimeMillis();
    String name = pjp.getSignature().getName();
    Object output = pjp.proceed();
    long elapsedTime = System.currentTimeMillis() - start;
    if(elapsedTime > 100)
        System.err.println("profileGetEntityProperty: Entity method " + name + " execution time: " + elapsedTime + " ms.");
    return output;
}

У меня включено переплетение в моей конфигурации, и аспекты, вплетающиеся в бизнес-уровень, работают просто отлично. Правильно ли написан мой pointcut? Или в сущностях есть что-то, что делает их непригодными для использования? (моя сущность имеет префикс @Entity перед определением класса)

Приветствия

Nik

Ответы [ 3 ]

6 голосов
/ 26 мая 2010

Вы на самом деле только скобки!

@ Pointcut ("выполнение (* tld.myproject.data.entities. .get () ) ")


Если вы используете Eclipse, я буду рекомендовать разработку с использованием AspectJ-ткачества во время компиляции. Это самый простой способ.

С плагином AJDT вы получите много помощи! Я просто вставил в ваш pointcut и получил ошибку компиляции. Добавил скобки и все заработало!

Снимок экрана визуальной поддержки с помощью плагина AJDT:

alt text

Оранжевая стрелка слева от метода getHello () указывает на то, что рекомендуется советом. См. здесь для большего примера.

2 голосов
/ 26 мая 2010

Да, есть. Сущности создаются вами с помощью оператора new, и, следовательно, они не являются частью контекста пружины.

Если вы хотите использовать это, вам нужно включить ткачество (я предпочитаю время загрузки через <context:load-time-weaver/>) и аннотировать ваши классы сущностей с помощью @Configurable.

Я, лично , не предпочел бы эту практику. Увы, нет никаких альтернатив, которые являются настолько общими. Если вашим провайдером персистентности является Hibernate, вы можете создать собственный прокси для ваших сущностей - см. Здесь , но это еще более неудобно.

0 голосов
/ 19 июня 2010

Просто обратите внимание, что @Configurable работает с ткачеством во время компиляции. Недостаток автоматического связывания сущностей через @Configurable заключается в том, что они «не работают» при извлечении указанных сущностей из базы данных через Hibernate. Через «новый» вызов, да. Но совсем недавно, с очень странным запросом сделать персистентность от сущности, модульный тест с использованием 'new' работал отлично, но загруженные сущности в спящем режиме (или ehcache) привели к NPE для свойства autowired. Было поздно ночью; так что, возможно, вы захотите провести тестирование самостоятельно. :) Просто передайте мой недавний опыт. Надеюсь, это поможет.

...