Archive for Oktober 18th, 2005

DB4O ein kleiner Lichtblick am OOP-Himmel?

Dienstag, Oktober 18th, 2005

Hibernate und MySQL sind ja definitiv ein nettes Gespann für Open-Source-Entwickler.
Das Ganze noch mit Spring kombiniert und man hat die Persistenz im Griff!
Doch irgendwann kommt man zwischen der Erstellung von tausenden von DAOs und Mapping-Files (auch wenn diese XDoclet fast automatisch erstellt) an einen Punkt, wo man sich gerne ein paar Komplexitätsstufen ersparen möchte.
Als Java-Magazin-Leser kam mir dann ein kleiner Artikel über DB4O sehr entgegen.
Keine Mappings, keine DAOs, kein Garnichts!!! Objekte abspeichern und gut. So wünscht man sich das. Und das Ganze ist Opensource und performant.
Jetzt setzte ich mal ein kleines Projekt damit um und werde später über den Einsatz von DB4O berichten.

SpringAOP und Java5 Annotations

Dienstag, Oktober 18th, 2005

Bisher habe ich für Spring (und speziell für SpringAOP) Commons Attributes als Annotationen (z.B. für Transaktionen) verwendet. Ein neues Projekt zwang mich nun erneut über Annotations nachzudenken. Der genaue Sachverhalt sei dahingestellt, auf jeden Fall wollte ich mit Java5 Annotations Methoden annotieren, die durch AOP eine „Sonderbehandlung“ erfahren sollten.
Nach einer kleinen Weile, die ich mit Internetrecherche verbrachte, wurde mir klar, dass dies wirklich einfach mit Spring-Bordmitteln umzusetzen war. Deshalb hier etwas Beispielcode für einen einfachen Trace-Advice…

Der Trace-Advice soll für annotierte Methoden die Ausführungszeit ausgeben (mittels Commons Logging).
Dazu benötigen wir natürlich den Advice, einen PointCut, die Annotation und einen Advisor, der aus Bequemlichkeitsgründen den Advice und den Pointcut zusammenfasst. Damit nun eine Methode getraced werden kann, muss deren beherbergende Klasse mittels eines Proxies an den Advisor gebunden werden. Das übernimmt jedoch bereits der DefaultAdvisorAutoProxyCreator, der alle definierten Beans automatisch mit definierten Advisors verbindet. Dies alles führt zu folgendem Spring-Konfigurations-Ausschnitt:


<!-- gibt für alle mit @Trace annotierten Methoden die Ausführungszeit an -->
<bean id="traceAdvisor" class="com.quimron.omecs_db4o.util.TraceAdvisor"/>
<!-- der autoProxyCreator verbindet angegebene Advisors mit den im PointCut beschriebenen Klassen (it's magic) -->
<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

Die @Trace-Annotation sieht dann folgendermaßen aus:


@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Trace {}

Der Pointcut wird als StaticMethodMatcherPointcut definiert:


public class TracePointcut extends StaticMethodMatcherPointcut {
/** @see org.springframework.aop.MethodMatcher#matches(java.lang.reflect.Method, java.lang.Class) */
public boolean matches(Method method, Class clazz) {
return (method.getAnnotation(Trace.class) != null);
}
}

Der benötigte Advice ist ebenfalls relativ simpel:


public class TraceInterceptor implements MethodInterceptor {
/** @see org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation) */
public Object invoke(MethodInvocation invocation) throws Throwable {
long start = System.currentTimeMillis();
Object result = invocation.proceed();
log.info("Das Ausführen von " + invocation.getMethod().getName() + " dauerte " + (System.currentTimeMillis() - start) + " ms");
return result;
}
}

Und der Advisor wird einfach wie folgt implementiert:


public class TraceAdvisor implements PointcutAdvisor {
/** @see org.springframework.aop.PointcutAdvisor#getPointcut() */
public Pointcut getPointcut() {
return new TracePointcut();
}

/** @see org.springframework.aop.Advisor#isPerInstance() */
public boolean isPerInstance() {
return false;
}

/** @see org.springframework.aop.Advisor#getAdvice() */
public Advice getAdvice() {
return new TraceInterceptor();
}
}

Ich hoffe, dieses kleine Beispiel hilft auch anderen weiter, schnell mit Java5 Annotations und SpringAOP zu einem Ergebniss zu kommen.

Der Einstieg

Dienstag, Oktober 18th, 2005

Heute bei blogg.de angemeldet. Mal schauen, ob ich zum Blogger avanciere. Es soll hier meistens um meine technologischen Herausforderungen gehen. Sollten die dann zu einer Lösung führen, dann hoffe ich, dass diese auch anderen nutzt.
Das ist auch die eigentliche Intention und Motivation für diese Blogg-Tätigkeit. Das ständige ergebnislose googeln brachte mich immer wieder zu der Gewissheit, gefundene Lösungen irgendwo zur Verfügung stellen zu wollen.
Jetzt schaun mer mal, ob ich das auch so einhalten kann.