/20@yegor256 1
Practical Example of AOP
with AspectJ
Yegor Bugayenko
/20@yegor256 2
Aspect Oriented Programming (AOP)
AspectJ in 2000

by 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 21
class 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();
}
}

Practical Example of AOP with AspectJ