Projektowanie warstwy serwera Programowanie aspektowe
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 2 Programowanie aspektowe Metoda programowania mająca na celu modularyzację kodu i likwidację nakładających się problemów przekrojowych
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 3 AOP - przykłady zastosowania – logowanie, profilowanie, cacheowanie – autoryzacja i uwierzytelnianie – zarządzanie błędami, transakcje – sprawdzanie poprawności danych – rejestracja zmian
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 4 AOP – podstawowe pojęcia (I) Aspekt - wydzielona funkcjonalnie cześć programu, realizująca konkretne zadanie i koncentrująca sie tylko na problemie, którego dotyczy (np. logowanie, monitorowanie aplikacji, zarządzanie transakcjami). Podstawowe pojęcia AOP –aspekt (aspect): nazwany problem przekrojowy, inaczej to zbiory rad i punktów cięć/złączeń –rada (advice): dodatkowe zachowanie/czynność które zostaje zaninicjowane w punkcie złączenia, –punkt złączenia (join point): miejsce w strukturze wykonywania się aplikacji w którym powinna zostać zastosowana rada.
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 5 AOP – podstawowe pojęcia (II)
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 6 Spring AOP framework Rodzaje rad: –around advice: wykonuje się przed i po punkcie styku, ma możliwość przerwania przepływu kontroli programu przez zwrócenie własnej wartości lub wyjątku, –before advice: wykonuje się przed punktem styku, nie może zablokować przepływu kontroli programu, –throws advice: wykonuje się w momencie zgłoszenia wyjątku, –after returning advice: wykonuje się po poprawnym wykonaniu.
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 7 Around Advice Zgodność z AOP Alliance. Przechwycenie wywołania metody. Może zastąpić Before, After oraz Throws Advice. Możliwość zatrzymania wywołania metody. Możliwość zwrócenia innego obiektu niż przechwycona metoda.
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 8 Before Advice Wplatany przed wywołaniem metody. Zatrzymanie wykonania metody tylko poprzez wyrzucenie wyjątku. Ograniczone możliwości modyfikacji parametrów wywołania metody.
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 9 After Advice Wplatany przy udanym powrocie z metody. Ograniczone możliwości zmiany wyniku zwróconego przez metodę.
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 10 Throws Advice Wplatany w przypadku wyrzucenia wyjątku przez metodę. Możliwość zaimplementowania różnych metod dla różnych wyjątków w jednej klasie. Brak możliwości zatrzymania wyjątku.
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 11 Implementacja (I) public class TracingBeforeAdvice implements MethodBeforeAdvice { public void before(Method m, Object[] args, Object target) throwsThrowable { System.out.println("Before method : "+ m.getName() ); }
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 12 Implementacja (II) public class TracingAfterAdvice implements AfterReturningAdvice { public void afterReturning(Object object, Method m, Object[] args, Object target) throwsThrowable { System.out.println("After method : "+ m.getName()); }
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 13 Konfiguracja (I) <bean id=proxybean" class="org.springframework.aop.framework.ProxyFactoryBean"> theTracingBeforeAdvisor theTracingAfterAdvisor
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 14 Konfiguracja (II) <bean id="theTracingBeforeAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">.*
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 15 Przykład public class TimeInterceptor implements MethodInterceptor { public Object invoke(MethodInvocation method) throwsThrowable { long start = System.currentTimeMillis(); try {Objectresult= method.proceed(); return result; } finally { long end= System.currentTimeMillis(); long timeMs= end-start; System.out.println("Method: " + method.toString() + " took: " + timeMs+"ms."); }}}
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego public class MyAspect {..... }
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu transfer(..))") private void my() {} execution target args
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 18 execution execution(public * *(..)) execution(* set*(..)) execution(* com.xyz.service.*.*(..)) execution(* com.xyz.service..*.*(..)) execution (public * dao.commons..*.update(..)))
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 19 @Around(ProceedingJoinPoint)
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu dao..*.get(..))") public Object applySecurity(ProceedingJoinPoint joinpoint) throws Throwable { logger.debug("Applying Security"); Object obj = joinpoint.proceed();..... return obj; }
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 21 public class DataUpdateInterceptor *dao.commons..*.update(..)) || " + "execution(public *dao.commons..*.save(..)) ) && " + " target(dao.GenericDAO)") public void updateDataAspect(JoinPoint jp) { logger.debug("nastapila zmiana w danych"); }
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 22 Konfiguracja
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu @Target(ElementType.TYPE) Auditable { }
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu @Target(ElementType.FIELD) NonAuditableField { }
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 25 public class = true, length = 64) private String haslo;....
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 26 AudytInterceptor = Propagation.MANDATORY) public class AudytInterceptor extends EmptyInterceptor { private AuditLoggerService auditLoggerService;...
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 27 AudytInterceptor public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { if (entity.getClass().isAnnotationPresent(Auditable.class)) { auditLoggerService.logSave(entity, id, state, propertyNames, types); } return super.onSave(entity, id, state, propertyNames, types); }
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 28 AudytInterceptor public void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { if (entity.getClass().isAnnotationPresent(Auditable.class)) { auditLoggerService.logDelete(entity, id); } super.onDelete(entity, id, state, propertyNames, types); }
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 29 Interceptor (III) <bean id="audytInterceptor" class="commons.interceptor.AudytInterceptor">