среда, 24 июня 2009 г.

Java Interceptors

Вместе с появлением EJB3.0 в JavaEE появилась очень полезная штука - Interceptors - специальные классы, которые могут перехватывать вызов методов заданного класса.
Для чего это может быть полезно? Если у вас есть сложное приложение и изменение его кода - очень трудоемкий процесс, то для некоторого класса задач можно использовать Interceptor`ы

Например:
  • для изменения некоторых бизнес методов на лету (в т.ч. входных параметров, исключений)
  • для мониторинга производительности приложения
  • для аудита различных событий

Пример:



public class AuditInterceptor {

@AroundInvoke
public Object trace(InvocationContext invocationContext) throws Exception{
System.out.println("Object: " + invocationContext.getTarget().getClass().getName());
System.out.println("Method: " + invocationContext.getMethod());

System.out.println("Parameters:");
for (Object p : invocationContext.getParameters()) {
System.out.println("[" + p.getClass().getName() + "] " + p);
}

return invocationContext.proceed();
}
}


Этот класс может перехватывать события для следуюющего бина:


@Stateless
@Interceptors({AuditInterceptor.class})
public class ComplexBean implements ComplexRemote {

public String makeMeHappy(String param1) {
//some code
}
}


Т.е. при каждом вызове любого метода для этого бина выплонится метод AuditInterceptor.trace, который в свою очередь может запустить(а может и нет, как вам будет угодно) нужный метод данного бина


воскресенье, 7 июня 2009 г.

полезные аннотации JPA

Вот очень полезные аннотации, при помощи которых можно реализовать java trigger
  • @PostLoad
  • @PrePersist
  • @PostPersist
  • @PreUpdate
  • @PostUpdate
  • @PreRemove
  • @PostRemove
например:


@Entity
public class Human implements Serializable {
...
@Basic
@Column
private String hello;
...
public String getHello() {
return hello;
}
public void setHello(String hello) {
this.hello = hello;
}
...
@PrePersist
@PreUpdate
private void preModify () {
hello = hello.trim().toLowerCase();
}
...
}

Если в @Entity перед каким-либо полем установить аннотацию @Transient, то это поле не будет добавляться в хранилище при вызове em.persist(entity);
Бывает полезно если в entity есть какие то рабочие поля, которые не представляют ни какого поля в хранилище данных, но нужны для реализации бизнес логики приложения