Practical Example of AOP with AspectJ

Post on 16-Jan-2017

389 views 0 download

Transcript of Practical Example of AOP with AspectJ

/20@yegor256 1

Practical Example of AOP with AspectJ

Yegor Bugayenko

/20@yegor256 2

Aspect Oriented Programming (AOP)

AspectJ in 2000by Gregor Kiczales

in Xerox PARC

/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 } }

/20@yegor256 4

while (true) { try { return load_html(); } catch (Exception ex) { // nothing, just ignore } }

/20@yegor256 5

code duplication

/20@yegor256 6

class Page { @Retry public String html() { // load HTML and return } }

/20@yegor256 7

@Retention(value=RUNTIME) @Target(value=METHOD) public @interface Retry { }

/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 } } } }

/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

/20@yegor256 10

binary aspect weaving

javac + ajc

/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

/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

/20@yegor256 13

<dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> </dependency> </dependencies>

/20@yegor256 14

no code duplication

/20@yegor256 15

procedural and clumsy

/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 } } } }

/20@yegor256 17

class RobustPage { private final Page page; public String html() { while (true) { try { return this.page.html(); } catch (Exception ex) { // ignore } } } }

/20@yegor256 18

new RobustPage(new Page());

/20@yegor256 19

a better Java with AOP?

/20@yegor256 20

@yegor256

/20@yegor256 21class Page { public String html() around retry() { // load HTML and return } advice Object retry() { while (true) { try { return proceed; } catch (Exception ex) { // ignore } } } }

/20@yegor256 22

class Robust<T> decorates T { advice Object retry() { while (true) { try { return proceed; } catch (Exception ex) { // ignore } } } }

/20@yegor256 23

page = new Robust<Page>(new Page()) { @Override public String html() around retry() { return origin.html(); } }