Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałGabrysz Kliszcz Został zmieniony 10 lat temu
1
Projektowanie warstwy serwera Programowanie aspektowe
2
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
3
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
4
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.
5
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 5 AOP – podstawowe pojęcia (II)
6
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.
7
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.
8
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.
9
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ę.
10
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.
11
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() ); }
12
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()); }
13
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
14
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">.*
15
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."); }}}
16
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 16 @Aspect public class MyAspect {..... }
17
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 17 @Pointcut @Pointcut("execution(* transfer(..))") private void my() {} execution target args
18
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(..)))
19
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 19 Stosowane adnotacje @Before() @AfterReturning(Object) @AfterThrowing(Exception) @After() @Around(ProceedingJoinPoint)
20
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 20 @Around @Around("execution(* dao..*.get(..))") public Object applySecurity(ProceedingJoinPoint joinpoint) throws Throwable { logger.debug("Applying Security"); Object obj = joinpoint.proceed();..... return obj; }
21
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 21 Przykład @Aspect public class DataUpdateInterceptor { @After("(execution(public *dao.commons..*.update(..)) || " + "execution(public *dao.commons..*.save(..)) ) && " + " target(dao.GenericDAO)") public void updateDataAspect(JoinPoint jp) { logger.debug("nastapila zmiana w danych"); }
22
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 22 Konfiguracja
23
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 23 @Auditable @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Auditable { }
24
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 24 @NonAuditableField @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface NonAuditableField { }
25
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 25 Klasa domenowa @Auditable @Entity public class Uzytkownik {.... @NonAuditableField @Column(nullable = true, length = 64) private String haslo;....
26
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 26 AudytInterceptor (I) @Transactional(propagation = Propagation.MANDATORY) public class AudytInterceptor extends EmptyInterceptor { private AuditLoggerService auditLoggerService;...
27
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 27 AudytInterceptor (II) @Override 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); }
28
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 28 AudytInterceptor (III) @Override 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); }
29
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">
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.