Successfully reported this slideshow.

Practical Example of AOP with AspectJ

0

Share

Upcoming SlideShare
bioinfolec7th20071005
bioinfolec7th20071005
Loading in …3
×
1 of 23
1 of 23

Practical Example of AOP with AspectJ

0

Share

Download to read offline

JavaDayKyiv 2016; 14 October 2016; Kyiv, Ukraine. Video is here: https://www.youtube.com/watch?v=4SRoLYxvIQ8 (in Russian, with English subtitles)

JavaDayKyiv 2016; 14 October 2016; Kyiv, Ukraine. Video is here: https://www.youtube.com/watch?v=4SRoLYxvIQ8 (in Russian, with English subtitles)

More Related Content

Related Books

Free with a 14 day trial from Scribd

See all

Related Audiobooks

Free with a 14 day trial from Scribd

See all

Practical Example of AOP with AspectJ

  1. 1. /20@yegor256 1 Practical Example of AOP with AspectJ Yegor Bugayenko
  2. 2. /20@yegor256 2 Aspect Oriented Programming (AOP) AspectJ in 2000
 by Gregor Kiczales in Xerox PARC
  3. 3. /20@yegor256 3 class Page { public String html() { // load HTML and return } } class Directory { public void delete() { // remove all files } } class File { public long length() { // return file size } }
  4. 4. /20@yegor256 4 while (true) { try { return load_html(); } catch (Exception ex) { // nothing, just ignore } }
  5. 5. /20@yegor256 5 code duplication
  6. 6. /20@yegor256 6 class Page { @Retry public String html() { // load HTML and return } }
  7. 7. /20@yegor256 7 @Retention(value=RUNTIME) @Target(value=METHOD) public @interface Retry { }
  8. 8. /20@yegor256 8 @Aspect class Robustness { @Around("execution(* *(..)) && @annotation(Retry)") public Object around(ProceedingJoinPoint point) { while (true) { try { return point.proceed(); } catch (Exception ex) { // just ignore it } } } }
  9. 9. /20@yegor256 9 class Page { @Retry public String html() { // load HTML and return } } @Aspect class Robustness { @Around(“…”) public Object around(point) { while (true) { try { return point.proceed(); } catch (Exception ex) { // just ignore it } } } } Page.class Robustness.class
  10. 10. /20@yegor256 10 binary aspect weaving javac + ajc
  11. 11. /20@yegor256 11 class Page { private Robustness r; public String html() { return this.r.around(point); } public String html_aroundBody() { // load HTML and return } } @Aspect class Robustness { @Around(“…”) public Object around(point) { while (true) { try { return point.proceed(); } catch (Exception ex) { // just ignore it } } } } Page.class Robustness.class
  12. 12. /20@yegor256 12 <plugin> <groupId>com.jcabi</groupId> <artifactId>jcabi-maven-plugin</artifactId> <executions> <execution> <goals> <goal>ajc</goal> </goals> </execution> </executions> </plugin> jcabi-maven-plugin
  13. 13. /20@yegor256 13 <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> </dependency> </dependencies>
  14. 14. /20@yegor256 14 no code duplication
  15. 15. /20@yegor256 15 procedural and clumsy
  16. 16. /20@yegor256 16 @Aspect class Robustness { @Around("execution(* *(..)) && @annotation(Retry)") public Object around(ProceedingJoinPoint point) { while (true) { try { return point.proceed(); } catch (Exception ex) { // just ignore it } } } }
  17. 17. /20@yegor256 17 class RobustPage { private final Page page; public String html() { while (true) { try { return this.page.html(); } catch (Exception ex) { // ignore } } } }
  18. 18. /20@yegor256 18 new RobustPage(new Page());
  19. 19. /20@yegor256 19 a better Java with AOP?
  20. 20. /20@yegor256 20 @yegor256
  21. 21. /20@yegor256 21 class Page { public String html() around retry() { // load HTML and return } advice Object retry() { while (true) { try { return proceed; } catch (Exception ex) { // ignore } } } }
  22. 22. /20@yegor256 22 class Robust<T> decorates T { advice Object retry() { while (true) { try { return proceed; } catch (Exception ex) { // ignore } } } }
  23. 23. /20@yegor256 23 page = new Robust<Page>(new Page()) { @Override public String html() around retry() { return origin.html(); } }

×