1、 idea专业版本 (非专业版不支持aspectj)
2、创建个maven项目
加入如下依赖 plugin尤其重要 ,需要运行编译后版本,才能发现生效
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.6</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.9.6</version>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<plugin>
<groupId>com.nickwongdev</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.12.6</version>
<!-- <groupId>org.codehaus.mojo</groupId>-->
<!-- <artifactId>aspectj-maven-plugin</artifactId>-->
<!-- <version>1.11</version>-->
<configuration>
<complianceLevel>1.8</complianceLevel>
<source>1.8</source>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
3、配置AJC编译jar
4、 写拦截器类
@Slf4j
@Aspect
public class SimpleIntercept {
@Pointcut("execution(public * org.simple.aop.web..*(..))")
public void traceLogAspect() {
}
@Before(value = "traceLogAspect()")
public void doBefore() {
System.out.println("-------------before");
}
@Around(value = "traceLogAspect()")
public Object doAround(ProceedingJoinPoint pjp) {
System.out.println("-------------doAround--start");
Object ob = null;
try {
//请求埋点
ob = pjp.proceed();
//成功埋点
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("-------------doAround--end");
return ob;
}
@AfterReturning(returning = "obj", pointcut = "traceLogAspect()")
public void doAfterReturning(Object obj) {
System.out.println("-------------doAfterReturning");
}
@AfterThrowing(throwing = "ex" ,pointcut = "traceLogAspect()")
public void AfterThrowing(Throwable ex) {
System.out.println("-------------AfterThrowing");
}
@After(value = "traceLogAspect()")
public void doAfter() {
System.out.println("-------------doAfter");
}
}
5、写业务类
public class SimpleWepApp {
public String simple() {
return this.getClass().getName();
}
}
6、写启动类
public class Application {
public static void main(String[] args) {
SimpleWepApp app = new SimpleWepApp();
String simple = app.simple();
System.out.println(simple);
}
}
7、 编译当前应用,并运行启动函数
最终AOP --aspectj的执行顺序如下
-------------before
-------------doAround--start
-------------doAround--end
-------------doAfterReturning
-------------doAfter
org.simple.aop.web.SimpleWepApp
8、懵逼问题
1、业务类抛异常case 并且支持顺序存在差异 另外AfterThrowing 并没有生效(最终解决之后发现完全是大意了)
-------------before
-------------doAround--start
java.lang.RuntimeException
at org.simple.aop.web.SimpleWepApp.simple_aroundBody0(SimpleWepApp.java:8)
at org.simple.aop.web.SimpleWepApp.simple_aroundBody1$advice(SimpleWepApp.java:27)
at org.simple.aop.web.SimpleWepApp.simple(SimpleWepApp.java:8)
at org.simple.aop.Application.main(Application.java:9)
-------------doAround--end
-------------doAfterReturning
-------------doAfter
null
-------------before
-------------doAround--start
-------------doAround--end
-------------doAfterReturning
-------------doAfter
null
java.lang.RuntimeException
at org.simple.aop.web.SimpleWepApp.simple_aroundBody0(SimpleWepApp.java:8)
at org.simple.aop.web.SimpleWepApp.simple_aroundBody1$advice(SimpleWepApp.java:27)
at org.simple.aop.web.SimpleWepApp.simple(SimpleWepApp.java:8)
at org.simple.aop.Application.main(Application.java:9)
编译后业务代码如下 看着感觉流程很正常
public class SimpleWepApp {
public SimpleWepApp() {
}
public String simple() {
JoinPoint var1 = Factory.makeJP(ajc$tjp_0, this, this);
String var6;
try {
try {
SimpleIntercept.aspectOf().doBefore();
String var2;
String var3 = var2 = (String)simple_aroundBody1$advice(this, var1, SimpleIntercept.aspectOf(), (ProceedingJoinPoint)var1);
SimpleIntercept.aspectOf().doAfterReturning(var3);
var6 = var2;
} catch (Throwable var7) {
SimpleIntercept.aspectOf().AfterThrowing(var7);
throw var7;
}
} catch (Throwable var8) {
SimpleIntercept.aspectOf().doAfter();
throw var8;
}
SimpleIntercept.aspectOf().doAfter();
return var6;
}
static {
ajc$preClinit();
}
}
找到问题原因 替换如下两种case均可 around的case 把 异常处理了 导致最终没有出现异常 AfterThrowing 在around之后 导致无法触发
@Around(value = "traceLogAspect()")
public Object doAround(ProceedingJoinPoint pjp) {
System.out.println("-------------doAround--start");
Object ob = null;
try {
//请求埋点
ob = pjp.proceed();
//成功埋点
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("-------------doAround--end");
return ob;
}
@Around(value = "traceLogAspect()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("-------------doAround--start");
Object ob = null;
try {
//请求埋点
ob = pjp.proceed();
//成功埋点
} catch (Throwable e) {
throw e;
}
System.out.println("-------------doAround--end");
return ob;
}
@Around(value = "traceLogAspect()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("-------------doAround--start");
Object ob = null;
ob = pjp.proceed();
System.out.println("-------------doAround--end");
return ob;
}
最终结果如下
-------------before
-------------doAround--start
-------------AfterThrowing
-------------doAfter
Exception in thread "main" java.lang.RuntimeException
at org.simple.aop.web.SimpleWepApp.simple_aroundBody0(SimpleWepApp.java:8)
at org.simple.aop.web.SimpleWepApp.simple_aroundBody1$advice(SimpleWepApp.java:25)
at org.simple.aop.web.SimpleWepApp.simple(SimpleWepApp.java:8)
at org.simple.aop.Application.main(Application.java:9)