More Related Content

Practical Example of AOP with AspectJ

  1. /20@yegor256 1 Practical Example of AOP with AspectJ Yegor Bugayenko
  2. /20@yegor256 2 Aspect Oriented Programming (AOP) AspectJ in 2000
 by Gregor Kiczales in Xerox PARC
  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. /20@yegor256 4 while (true) { try { return load_html(); } catch (Exception ex) { // nothing, just ignore } }
  5. /20@yegor256 5 code duplication
  6. /20@yegor256 6 class Page { @Retry public String html() { // load HTML and return } }
  7. /20@yegor256 7 @Retention(value=RUNTIME) @Target(value=METHOD) public @interface Retry { }
  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. /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. /20@yegor256 10 binary aspect weaving javac + ajc
  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. /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. /20@yegor256 13 <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> </dependency> </dependencies>
  14. /20@yegor256 14 no code duplication
  15. /20@yegor256 15 procedural and clumsy
  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. /20@yegor256 17 class RobustPage { private final Page page; public String html() { while (true) { try { return this.page.html(); } catch (Exception ex) { // ignore } } } }
  18. /20@yegor256 18 new RobustPage(new Page());
  19. /20@yegor256 19 a better Java with AOP?
  20. /20@yegor256 20 @yegor256
  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. /20@yegor256 22 class Robust<T> decorates T { advice Object retry() { while (true) { try { return proceed; } catch (Exception ex) { // ignore } } } }
  23. /20@yegor256 23 page = new Robust<Page>(new Page()) { @Override public String html() around retry() { return origin.html(); } }