Programowanie zorientowane aspektowo

1,099 views

Published on

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,099
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Programowanie zorientowane aspektowo

  1. 1. Programowanie zorientowane aspektowo (AOP) Java Department   XSolve sp. z o. o. 
  2. 2. Spis treści •  Czym jest programowanie aspektowe?  •  Podstawowe pojęcia w prostych słowach  •  Przykłady  •  AOP vs. msejf 
  3. 3. Czym jest programowanie aspektowe? •  AOP powstało po OOP  •  Pozwala odseparować logikę aplikacji od  powtarzających się, nadmiarowych operacji  •  Mechanizm dynamicznie tworzący kod  wynikowy  •  Mechanizm poprawiający jakość kodu 
  4. 4. Podstawowe pojęcia w prostych słowach •  Aspekt ‐ wyodrębniona, powtarzająca (przecinająca)  się część logiki aplikacji  •  Join points ‐ wszystkie możliwe miejsca, w które można  wpiąć aspekt podczas uruchomienia programu  •  Pointcuts ‐ miejsca, w których dany aspekt faktycznie  zachodzi (wykonuje się)  •  Advice ‐ konkretne działania mające miejsce w chwili  wykonania odpowiedniego punktu złączenia  •  Tkacz – mechanizm spinający to wszystko w całość 
  5. 5. Przykłady (1) @Aspect public class LoggerAspect { private long start; private Logger logger; @Before("execution(* eu.lukaszbachman.blog.data.*.*(..))") public void logBeforeMethod(JoinPoint joinPoint) { logger.debug("n--------------------------- BEFORE ---------------------------"); logger.debug("Method name:t" + joinPoint.getSignature().getName()); logger.debug("Method args:t"); for (int i = 0; i < joinPoint.getArgs().length; i++){ logger.debug(joinPoint.getArgs()[i]); logger.debug((i == joinPoint.getArgs().length - 1) ? "n" : ", "); } start = System.currentTimeMillis(); } @After("execution(* eu.lukaszbachman.blog.data.*.*(..))") public void logAfterMethod() { logger.debug("Exec time:t" + (System.currentTimeMillis() - start) + "msn"); logger.debug("--------------------------- AFTER ----------------------------"); } } 
  6. 6. Przykłady (2) Wynik:    ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ BEFORE ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐  Method name:     getArXcleByUrlTitle  Method args:      ff  Exec Xme:        1164ms  ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ AFTER ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐      ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ BEFORE ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐  Method name:     getLatestArXcles  Method args:      10  Exec Xme:        18ms  ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ AFTER ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐   
  7. 7. Przykłady (3) @Pointcut("execution(public * *(..))") private void anyPublicOperation() {} @Pointcut("within(com.xyz.someapp.trading..*)") private void inTrading() {} @Pointcut("anyPublicOperation() && inTrading()") private void tradingOperation() {} @AfterThrowing( pointcut="com.xyz.myapp.SystemArchitecture.dataAccessOperation()", throwing="ex") public void doRecoveryActions(DataAccessException ex) {} @Pointcut("com.xyz.myapp.SystemArchitecture.dataAccessOperation() &&" + "args(account,..)") private void accountDataAccessOperation(Account account) {}  
  8. 8. AOP vs. msejf •  AuthenXcaXonPointcut  @Before("execuXon(* pl.msejf.ws.services.*.*(..)) && !execuXon(*  pl.msejf.ws.services.MiscServices.checkEmail(..)) &&  @annotaXon(org.springframework.web.bind.annotaXon.RequestMapping) && args(..,request)")   public void verifyControlString(ClientRequest request) throws WebServiceAuthenXcaXonExcepXon  { … }  •  ValidUserEmailPointcut   @Before("execuXon(* pl.msejf.ws.services.UserInfoService.getUserInfo(..)) &&  @annotaXon(org.springframework.web.bind.annotaXon.RequestMapping) && args(..,email,  request)")  public void emailsMatch(String email, ClientRequest request) throws  WebServiceAuthenXcaXonExcepXon   { … } 
  9. 9. Dziękuję za uwagę!

×