Practical Example of AOP with AspectJ
-
Upload
yegor-bugayenko -
Category
Software
-
view
388 -
download
0
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(); } }