AOP – Aspect Oriented Programming
AOP – Aspect Oriented Programming 11/15/2018 AOP – Aspect Oriented Programming KArol Muszyński, PJWSTK 13-12-2004 HP_presentation_template
Agenda Wprowadzenie do tematu Hello World 11/15/2018 Agenda Wprowadzenie do tematu Hello World Implementacje. Dlaczego AspectWerkz 2.X !? Wykorzystanie AOP November 15, 2018 HP_presentation_template
11/15/2018 Idea AOP November 15, 2018 HP_presentation_template
AOP – podstawowe pojęcia Pointcut (join point) – definiuje punkt w trakcie wykonywania programu Advice – definiuje część implementacji aspektu, która ma być wykonynana w momencie natrafienia na pointcut Aspect – jest złączeniem powyższych dwóch elementów Weaving – wplatanie aspektów w istniejący kod November 15, 2018
Punkty wplatania aspektów method execution (wykonanie metody) method call (wywołanie metody) constructor execution (wykonanie konstruktora) constructor call (wywołanie konstruktora) field access (dostęp do pola) field modification (modyfikacja pola) catch handlers (przechwycenie wyjątku) static initialization (statyczna inicjalizacja klasy) November 15, 2018
Agenda Wprowadzenie do tematu Hello World 11/15/2018 Agenda Wprowadzenie do tematu Hello World Implementacje. Dlaczego AspectWerkz 2.X !? Wykorzystanie AOP November 15, 2018 HP_presentation_template
Hello World 1 – aop.xml <aspectwerkz> <system id="samples"> <aspect class="MyAspects"> <pointcut name="methodsToLog" expression="execution(* examples.TraceMe*.*(..))"/> <advice name="logMethod(StaticJoinPoint)" type="around" bind-to="methodsToLog"/> <advice name="logBefore(StaticJoinPoint)" type="before" bind-to="methodsToLog"/> <advice name="logAfter(StaticJoinPoint)" type="after" bind-to="methodsToLog"/> </aspect> </system> </aspectwerkz> November 15, 2018
Hello World 1 – klasy public class TraceMe { public static void main(String args[]) throws Throwable { TraceMe tm = new TraceMe (); tm.targetB(); tm.targetA(); } public void targetB() {} public void targetA() {} public static class MyAspects { public void logMethod(JoinPoint jp) { } public void logBefore(JoinPoint jp) { } public void logAfter(JoinPoint jp) { } November 15, 2018
Hello World 2 – klasa /* @Aspect(”perJVM”) */ public static class MyAspects { /* @Expression(”execution(* TraceMe*.*(..))”) */ Pointcut methodsPointCut; /* @Around(”methodsPointCut”) */ public void logMethod(JoinPoint jp) { } /* @Before(”methodsPointCut”) */ public void logBefore(JoinPoint jp) { } /* @AfterFinally(”methodsPointCut”) */ public void logAfter(JoinPoint jp) { } } November 15, 2018
Hello World 2 – aop.xml <aspectwerkz> <system id="samples"> <aspect class="MyAspects"/> </system> </aspectwerkz> November 15, 2018
Hello World 3 (Java 5) – aspekty @Aspect(”perJVM”) public static class MyAspects { @Expression(”execution(* TraceMe*.*(..))”) Pointcut methodsPointCut; @Around(”methodsPointCut”) public void logMethod(JoinPoint jp) { } @Before(”methodsPointCut”) public void logBefore(JoinPoint jp) { } @AfterFinally(”methodsPointCut”) public void logAfter(JoinPoint jp) { } } November 15, 2018
Agenda Wprowadzenie do tematu Hello World 11/15/2018 Agenda Wprowadzenie do tematu Hello World Implementacje. Dlaczego AspectWerkz 2.X !? Wykorzystanie AOP November 15, 2018 HP_presentation_template
Implementacje AOP Aspectj 1.2 - http://eclipse.org/aspectj 11/15/2018 Implementacje AOP Aspectj 1.2 - http://eclipse.org/aspectj Jboss AOP 1.0 - http://www.jboss.org/developers/projects/kboss/aop AspectWerkz 1.0 - http://aspectwerkz.codehaus.org AspectWerkz 2.X RC 2 - http://aspectwerkz.codehaus.org November 15, 2018 HP_presentation_template
Dlaczego AspectWerkz 2.X !? Nie trzeba wkompilowywać aspektów w źródła naszej aplikacji Hot deployment and undeployment of aspects AspectWerkz Extensible Aspect Container StaticJoinPoint vs. JoinPoint New annotation backend and Java 5 annotations support November 15, 2018
Architektura November 15, 2018
Benchmark http://www.theserverside.com/articles/article.tss?l=AspectWerkzP1 Z aktualizowany benchmark http://docs.codehaus.org/display/AW/AOP+Benchmark?decorator=printable November 15, 2018
Wydajność AspectWerkz 2.x Since the weaver in AspectWerkz 2.X is compiling everything statically, meaning that the output of the weaver is code that is statically compiled and verified, spring (and any other framework) will benefit from that. Statically compiled code can be highly tuned and optimized and no reflection is needed. This means that we don't have to perform all the expensive plumbing needed in a reflective model. E.G.: No casting No boxing and unboxing of primitives No wrapping (and unwrapping) of parameters in an object array that needs to be allocated at each invocation (and maintained throughout the invocation flow) No reflective invocations November 15, 2018
Agenda Wprowadzenie do tematu Hello World 11/15/2018 Agenda Wprowadzenie do tematu Hello World Implementacje. Dlaczego AspectWerkz 2.0 !? Wykorzystanie AOP November 15, 2018 HP_presentation_template
Wykorzystanie i przyszłość AOP AOP, a OOP Jeśli wydaje Ci się, że AOP jest idealnym rozwiązaniem Twojego problemu to znaczy, że źle do niego podchodzisz używając OOP Powstanie wzorców projektowych opartych na AOP SpringAOP i JBossAOP AOP jako narzędzie do debug-owania aplikacji Logowanie November 15, 2018
Linki http://www.javaworld.com/javaworld/jw-01-2002/jw-0118-aspect_p.html http://www.theserverside.com/articles/content/AspectWerkzP2/article.html http://radio.javaranch.com/channel/val/2004/06/01/1086086742000 http://docs.codehaus.org/display/AW/AOP+Benchmark?decorator=printable November 15, 2018