SlideShare uma empresa Scribd logo
1 de 9
Baixar para ler offline
Programowanie zorientowane
aspektowo
(AOP)
Java Department  
XSolve sp. z o. o. 
Spis treści
•  Czym jest programowanie aspektowe? 
•  Podstawowe pojęcia w prostych słowach 
•  Przykłady 
•  AOP vs. msejf 
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 
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ść 
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 ----------------------------");
}
} 
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 ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ 
 
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) {}
 
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  
{ … } 
Dziękuję za uwagę!

Mais conteúdo relacionado

Destaque

Destaque (20)

Xsolve presentation - programming, bodyleasing, e-commerce
Xsolve presentation - programming, bodyleasing, e-commerceXsolve presentation - programming, bodyleasing, e-commerce
Xsolve presentation - programming, bodyleasing, e-commerce
 
Solid vs php
Solid vs phpSolid vs php
Solid vs php
 
Debugowanie skryptow php za pomoca xdebug
Debugowanie skryptow php za pomoca xdebugDebugowanie skryptow php za pomoca xdebug
Debugowanie skryptow php za pomoca xdebug
 
Zarządzanie projektami w XSolve
Zarządzanie projektami w XSolveZarządzanie projektami w XSolve
Zarządzanie projektami w XSolve
 
meet.php #11 - Huston, we have an airbrake
meet.php #11 - Huston, we have an airbrakemeet.php #11 - Huston, we have an airbrake
meet.php #11 - Huston, we have an airbrake
 
Tailoring of PRINCE2
Tailoring of PRINCE2Tailoring of PRINCE2
Tailoring of PRINCE2
 
Dlaczego git to nie svn oraz dlaczego to dobrze ?
Dlaczego git to nie svn oraz dlaczego to dobrze ?Dlaczego git to nie svn oraz dlaczego to dobrze ?
Dlaczego git to nie svn oraz dlaczego to dobrze ?
 
Zwiększanie produktywności programisty php (v2)
Zwiększanie produktywności programisty php (v2)Zwiększanie produktywności programisty php (v2)
Zwiększanie produktywności programisty php (v2)
 
Piątek z XSolve - TravisCI & Continuous Delivery
Piątek z XSolve - TravisCI & Continuous DeliveryPiątek z XSolve - TravisCI & Continuous Delivery
Piątek z XSolve - TravisCI & Continuous Delivery
 
How to be agile at Agile Hack?! - agilehack.pl
How to be agile at Agile Hack?! - agilehack.plHow to be agile at Agile Hack?! - agilehack.pl
How to be agile at Agile Hack?! - agilehack.pl
 
Wzorce projektowe
Wzorce projektowe Wzorce projektowe
Wzorce projektowe
 
Grafowa baza danych i integracja z symfony
Grafowa baza danych  i integracja z symfonyGrafowa baza danych  i integracja z symfony
Grafowa baza danych i integracja z symfony
 
Xlab #1: Advantages of functional programming in Java 8
Xlab #1: Advantages of functional programming in Java 8Xlab #1: Advantages of functional programming in Java 8
Xlab #1: Advantages of functional programming in Java 8
 
Mongo db baza danych zorientowana dokumentowo
Mongo db  baza danych zorientowana dokumentowo Mongo db  baza danych zorientowana dokumentowo
Mongo db baza danych zorientowana dokumentowo
 
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
 
xlab #7 - ReactJS & NodeJS
xlab #7 - ReactJS & NodeJSxlab #7 - ReactJS & NodeJS
xlab #7 - ReactJS & NodeJS
 
Xlab #2: wzorce projektowe
Xlab #2: wzorce projektoweXlab #2: wzorce projektowe
Xlab #2: wzorce projektowe
 
Piątek z XSolve - Bezpieczne nagłówki HTTP
Piątek z XSolve - Bezpieczne nagłówki HTTPPiątek z XSolve - Bezpieczne nagłówki HTTP
Piątek z XSolve - Bezpieczne nagłówki HTTP
 
PHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolvePHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolve
 
What the Hack?!
What the Hack?!What the Hack?!
What the Hack?!
 

Semelhante a Programowanie zorientowane aspektowo

Programowanie Komponentowe: #1 Wprowadzenie
Programowanie Komponentowe: #1 WprowadzenieProgramowanie Komponentowe: #1 Wprowadzenie
Programowanie Komponentowe: #1 Wprowadzenie
Mikołaj Olszewski
 
Wprowadzenie do Pythona i Django
Wprowadzenie do Pythona i DjangoWprowadzenie do Pythona i Django
Wprowadzenie do Pythona i Django
Marek Stępniowski
 

Semelhante a Programowanie zorientowane aspektowo (20)

CI oraz CD w złożonym projekcie o małym budżecie
CI oraz CD w złożonym projekcie o małym budżecieCI oraz CD w złożonym projekcie o małym budżecie
CI oraz CD w złożonym projekcie o małym budżecie
 
Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatyczny
 
Ext js
Ext jsExt js
Ext js
 
Testowanie na 101 sposobów
Testowanie na 101 sposobówTestowanie na 101 sposobów
Testowanie na 101 sposobów
 
Programowanie Komponentowe: #1 Wprowadzenie
Programowanie Komponentowe: #1 WprowadzenieProgramowanie Komponentowe: #1 Wprowadzenie
Programowanie Komponentowe: #1 Wprowadzenie
 
PHP meetup#4 Godek
PHP meetup#4 GodekPHP meetup#4 Godek
PHP meetup#4 Godek
 
4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piot...
4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piot...4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piot...
4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piot...
 
ES2015 / ES6 Podstawy nowoczesnego JavaScriptu
ES2015 / ES6 Podstawy nowoczesnego JavaScriptuES2015 / ES6 Podstawy nowoczesnego JavaScriptu
ES2015 / ES6 Podstawy nowoczesnego JavaScriptu
 
Wprowadzenie do Pythona i Django
Wprowadzenie do Pythona i DjangoWprowadzenie do Pythona i Django
Wprowadzenie do Pythona i Django
 
Produkcja aplikacji internetowych
Produkcja aplikacji internetowychProdukcja aplikacji internetowych
Produkcja aplikacji internetowych
 
[TestWarez 2017] Skomplikowane testowanie, skomplikowane terminy. Testowanie ...
[TestWarez 2017] Skomplikowane testowanie, skomplikowane terminy. Testowanie ...[TestWarez 2017] Skomplikowane testowanie, skomplikowane terminy. Testowanie ...
[TestWarez 2017] Skomplikowane testowanie, skomplikowane terminy. Testowanie ...
 
Testy jednostkowe - PHPUnit
Testy jednostkowe - PHPUnitTesty jednostkowe - PHPUnit
Testy jednostkowe - PHPUnit
 
Wzorce Repository, Unity of Work, Devexpress MVC w architekturze Asp.net MVC
Wzorce Repository, Unity of Work, Devexpress MVC  w architekturze Asp.net MVCWzorce Repository, Unity of Work, Devexpress MVC  w architekturze Asp.net MVC
Wzorce Repository, Unity of Work, Devexpress MVC w architekturze Asp.net MVC
 
Mikrousługi w allegro
Mikrousługi w allegroMikrousługi w allegro
Mikrousługi w allegro
 
Integracja systemow od strony praktycznej
Integracja systemow od strony praktycznejIntegracja systemow od strony praktycznej
Integracja systemow od strony praktycznej
 
Wzorce projektowe (w ASP.NET i nie tylko)
Wzorce projektowe (w ASP.NET i nie tylko)Wzorce projektowe (w ASP.NET i nie tylko)
Wzorce projektowe (w ASP.NET i nie tylko)
 
Techniczna organizacja zespołu
Techniczna organizacja zespołuTechniczna organizacja zespołu
Techniczna organizacja zespołu
 
HYC - Angular stań się kanciastym
HYC - Angular stań się kanciastymHYC - Angular stań się kanciastym
HYC - Angular stań się kanciastym
 
Activiti - BPMN 2.0 nadchodzi
Activiti - BPMN 2.0 nadchodziActiviti - BPMN 2.0 nadchodzi
Activiti - BPMN 2.0 nadchodzi
 
Jaki framework wybrać
Jaki framework wybraćJaki framework wybrać
Jaki framework wybrać
 

Mais de XSolve

Mais de XSolve (7)

Jak migrować kod legacy do Symfony? Tips & tricks
Jak migrować kod legacy do Symfony? Tips & tricksJak migrować kod legacy do Symfony? Tips & tricks
Jak migrować kod legacy do Symfony? Tips & tricks
 
How to Create an Agile Office
How to Create an Agile OfficeHow to Create an Agile Office
How to Create an Agile Office
 
Xlab #10: Integracja zewnętrznych API z wykorzystaniem platformy Spring
Xlab #10: Integracja zewnętrznych API z wykorzystaniem platformy SpringXlab #10: Integracja zewnętrznych API z wykorzystaniem platformy Spring
Xlab #10: Integracja zewnętrznych API z wykorzystaniem platformy Spring
 
How to build a Tesla car for the price of a Chevrolet
How to build a Tesla car for the price of a ChevroletHow to build a Tesla car for the price of a Chevrolet
How to build a Tesla car for the price of a Chevrolet
 
xlab #8 - Architektura mikroserwisów na platformie Spring Boot
xlab #8 - Architektura mikroserwisów na platformie Spring Bootxlab #8 - Architektura mikroserwisów na platformie Spring Boot
xlab #8 - Architektura mikroserwisów na platformie Spring Boot
 
How to outsource Scrum projects - a guide
How to outsource Scrum projects - a guideHow to outsource Scrum projects - a guide
How to outsource Scrum projects - a guide
 
Prezentacja firmy XSolve - programowanie, e-commerce, bodyleasing
Prezentacja firmy XSolve - programowanie, e-commerce, bodyleasingPrezentacja firmy XSolve - programowanie, e-commerce, bodyleasing
Prezentacja firmy XSolve - programowanie, e-commerce, bodyleasing
 

Programowanie zorientowane aspektowo

  • 2. Spis treści •  Czym jest programowanie aspektowe?  •  Podstawowe pojęcia w prostych słowach  •  Przykłady  •  AOP vs. msejf 
  • 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. 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. 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. 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. 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. 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   { … }